收益及历史
我的申购记录
查询当前认证用户的所有申购记录。
需要认证
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)
| 字段 | 类型 | 说明 |
|---|---|---|
id | string | 申购记录 UUID |
product_id | string | 产品 UUID |
product_name | string | 产品名称 |
chain_product_id | number | 链上产品 ID |
amount | string | 申购金额(Wei) |
nft_amount | string | NFT 持仓量 |
expected_return | string | 预期利息(Wei) |
actual_return | string | null | 实际利息(结算后可用) |
total_return | string | 总可领取金额:本金 + 利息(Wei) |
nft_status | string | NFT 状态:created / active / matured / redeemed |
claimed | boolean | 是否已领取 |
product_status | string | 所属产品状态 |
annual_rate | string | 申购时的年化利率 |
period_rate | string | 期间利率 |
subscribed_at | string | 申购时间(ISO 8601) |
settle_time | string | 预期结算时间(ISO 8601) |
settled_at | string | null | 实际结算时间 |
claimed_at | string | null | 领取时间 |
subscribe_tx_hash | string | null | 申购链上交易哈希 |
claim_tx_hash | string | null | 领取链上交易哈希 |
判断申购状态
通过 nft_status、claimed 和 product_status 的组合来判断可执行的操作:
nft_status | claimed | product_status | 用户操作 |
|---|---|---|---|
active | false | active | 等待中 — 资金已锁定 |
matured | false | settled | 可领取 — 调用 claim(productId) |
redeemed | true | settled / ended | 已完成 — 已领取 |
active | false | cancelled | 可紧急 退款 — 调用 emergencyClaim(productId) |
历史收益表现
获取已结束产品(ended)的历史收益数据,用于展示平台历史业绩。
GET /earn/performance
查询参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
limit | number | 否 | 返回条数,默认 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_name | string | 产品名称 |
duration_seconds | number | 锁仓时长(秒) |
annual_rate | string | 年化收益率 |
period_rate | string | 期间实际收益率 |
total_subscribed | string | 总申购金额(Wei) |
total_interest_paid | string | 总已付利息(Wei) |
subscriber_count | number | 参与人数 |
settled_at | string | 结算时间(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"