跳到主要内容

收益及历史

我的申购记录

查询当前认证用户的所有申购记录。

需要认证
Authorization: Bearer <JWT_TOKEN>
GET /earn/subscriptions

响应

返回 UserSubscriptionDetail 对象数组。未申购时返回空数组 []

[
{
"id": "a1b2c3d4-...",
"product_id": "123204f6-...",
"product_name": "USDT Earn 900% APY",
"chain_product_id": 1769524310,
"amount": "100000000",
"nft_amount": "100000000",
"expected_return": "855",
"actual_return": "855",
"total_return": "100000855",
"nft_status": "matured",
"claimed": false,
"product_status": "settled",
"annual_rate": "900.00%",
"period_rate": "0.00%",
"subscribed_at": "2026-01-27T14:35:00Z",
"settle_time": "2026-01-27T14:43:00Z",
"settled_at": "2026-01-27T14:43:12Z",
"claimed_at": null,
"subscribe_tx_hash": "0xabc...",
"claim_tx_hash": null
}
]

申购记录字段(UserSubscriptionDetail

字段类型说明
idstring申购记录 UUID
product_idstring产品 UUID
product_namestring产品名称
chain_product_idnumber链上产品 ID
amountstring申购金额(Wei)
nft_amountstringNFT 持仓量
expected_returnstring预期利息(Wei)
actual_returnstring | null实际利息(结算后可用)
total_returnstring总可领取金额:本金 + 利息(Wei)
nft_statusstringNFT 状态:created / active / matured / redeemed
claimedboolean是否已领取
product_statusstring所属产品状态
annual_ratestring申购时的年化利率
period_ratestring期间利率
subscribed_atstring申购时间(ISO 8601)
settle_timestring预期结算时间(ISO 8601)
settled_atstring | null实际结算时间
claimed_atstring | null领取时间
subscribe_tx_hashstring | null申购链上交易哈希
claim_tx_hashstring | null领取链上交易哈希

判断申购状态

通过 nft_statusclaimedproduct_status 的组合来判断可执行的操作:

nft_statusclaimedproduct_status用户操作
activefalseactive等待中 — 资金已锁定
maturedfalsesettled可领取 — 调用 claim(productId)
redeemedtruesettled / ended已完成 — 已领取
activefalsecancelled可紧急退款 — 调用 emergencyClaim(productId)

历史收益表现

获取已结束产品(ended)的历史收益数据,用于展示平台历史业绩。

GET /earn/performance

查询参数

参数类型必填说明
limitnumber返回条数,默认 10

响应

返回 HistoricalPerformance 数组,从近到远排序。无历史数据时返回空数组 []

[
{
"product_name": "USDT Earn 50% APY",
"duration_seconds": 2592000,
"annual_rate": "50.00%",
"period_rate": "4.11%",
"total_subscribed": "10000000000",
"total_interest_paid": "411000000",
"subscriber_count": 256,
"settled_at": "2026-01-15T00:00:00Z"
}
]

收益表现字段(HistoricalPerformance

字段类型说明
product_namestring产品名称
duration_secondsnumber锁仓时长(秒)
annual_ratestring年化收益率
period_ratestring期间实际收益率
total_subscribedstring总申购金额(Wei)
total_interest_paidstring总已付利息(Wei)
subscriber_countnumber参与人数
settled_atstring结算时间(ISO 8601)
提示

历史收益数据在服务端缓存 60 秒。在此时间窗口内的重复请求将返回缓存结果。

显示转换

// Wei 金额转换显示
const totalSubscribedUSDT = (parseInt(total_subscribed) / 1_000_000).toFixed(2);
const totalInterestUSDT = (parseInt(total_interest_paid) / 1_000_000).toFixed(2);

// 时长转换为可读格式
const durationDays = (duration_seconds / 86400).toFixed(0);

// 示例:
// total_subscribed: "10000000000" → "10000.00 USDT"
// total_interest_paid: "411000000" → "411.00 USDT"
// duration_seconds: 2592000 → "30 天"

代码示例

Python — My Subscriptions (JWT Required)

import requests

BASE_URL = "https://api.ztdx.io"
JWT_TOKEN = "your_jwt_token"

resp = requests.get(
f"{BASE_URL}/earn/subscriptions",
headers={"Authorization": f"Bearer {JWT_TOKEN}"},
)
for sub in resp.json():
status = f"{sub['nft_status']}, claimed={sub['claimed']}"
amount_usdt = int(sub['amount']) / 1e6
print(f" {sub['product_name']}{amount_usdt:.2f} USDT, status={status}")
if sub['nft_status'] == 'matured' and not sub['claimed']:
print(f" ↳ Ready to claim! call earnContract.claim({sub['chain_product_id']})")

Python — Historical Performance (Public)

import requests

BASE_URL = "https://api.ztdx.io"

resp = requests.get(f"{BASE_URL}/earn/performance", params={"limit": 5})
for perf in resp.json():
total = int(perf['total_subscribed']) / 1e6
interest = int(perf['total_interest_paid']) / 1e6
days = perf['duration_seconds'] / 86400
print(f" {perf['product_name']} — APY: {perf['annual_rate']}, {days:.0f}d, "
f"Subscribed: {total:.2f} USDT, Interest: {interest:.2f} USDT")

Display Conversion

// Convert Wei amounts for display
const totalSubscribedUSDT = (parseInt(total_subscribed) / 1_000_000).toFixed(2);
const totalInterestUSDT = (parseInt(total_interest_paid) / 1_000_000).toFixed(2);

// Convert duration to human-readable
const durationDays = (duration_seconds / 86400).toFixed(0);

// Example:
// total_subscribed: "10000000000" → "10000.00 USDT"
// total_interest_paid: "411000000" → "411.00 USDT"
// duration_seconds: 2592000 → "30 days"