跳到主要内容

申请提现签名

描述

预留请求数量的 DF,签署 EIP-712 类型化数据 SpotReleaseFunds 释放授权,并返回调用方向链上金库合约提交所需的全部数据。

这是两步提现流程的第一步。收到签名后,调用方需在 BSC 上向 ZtdxSpotVault.withdraw() 提交该签名。关于包含金库调用和状态轮询的完整流程,请参阅 提现流程

原子性: 在单个数据库事务中,available(可用)余额减少 amountfrozen(冻结)余额增加 amount。若在 deadline 前未完成链上调用,回收任务将把该记录标记为 expired(已过期)并将资金返还至 available。详见 提现流程 → 过期回收任务

MVP 阶段仅支持 DF

HTTP 请求

POST /spot/withdraw/request(仅 JWT)

使用 API Key 认证的调用方将收到 403 API Key permission denied: withdraws not allowed。详见 通用信息 → 认证

权重

0 — 当前 MVP 阶段不设每 IP 频率限制。

请求参数

名称类型必填描述
tokenSTRING必填提现的代币。MVP 阶段仅支持 DF
amountDECIMAL必填以字符串表示的十进制金额(例如 "100"),必须不低于服务端配置的最小值(SPOT_WITHDRAW_MIN_AMOUNT_DF)。

不存在 recipient 参数。EIP-712 的 account 字段始终设置为调用方地址,且金库合约会校验 msg.sender == account——第三方无法将该签名重放到不同的收款人。

响应示例

200 OK

{
"id": "9f2a1c4e-5b67-4d8a-bf93-2e1f4a6c8d10",
"nonce": 42,
"signature": "0x...65-byte hex...",
"deadline": 1778402000,
"vault_address": "0x4Fe0b354c5865ee9deb979a99030d757ae47664a",
"chain_id": 97,
"amount": "100",
"amount_in_wei": "100000000000000000000"
}
字段说明
id提现记录的 UUID。可配合 GET /spot/withdrawals/:id 轮询状态。
nonce每(用户、链)单调递增的 nonce,防止链上重放攻击。
signature65 字节、0x 前缀的 EIP-712 签名。直接传入 vault.withdraw() 即可。
deadlineUnix 秒时间戳。链上 withdraw() 调用必须严格早于此时间戳执行。
vault_address需要调用 withdraw() 的金库合约 ZtdxSpotVault 地址。
chain_id签名所针对的 EVM 网络的链 id — 97(BSC 测试网)。
amount已预留金额的十进制字符串。
amount_in_wei放入 EIP-712 value 字段的 wei 计金额。请将此值传入 vault.withdraw()——优先于 amount,可消除小数精度歧义。

响应中不包含 tokenstatus 字段——成功时记录始终为 signed;如需完整记录,请调用 GET /spot/withdrawals/:id

错误响应

HTTPerror
400unsupported token: <token> — 请求了 DF 以外的代币。
400amount below minimum <min>amount 低于服务端配置的最小值。不存在单独的非正数校验——零或负数金额同样在此处失败。
400insufficient balance — 现货 available < amount
400invalid user address — 已认证地址无法解析。
403API Key permission denied: withdraws not allowed — 调用方通过 API Key 认证。
409you have a pending withdrawal — submit it on-chain or wait for it to expire before signing a new one — 已存在 nonce 不小于合约当前 nonce 的 signed 提现。
409withdrawal slot conflict — try again in a moment — 该 nonce 槽位被一条未过期的记录占用。
500chain query failed — 读取金库链上 nonce 失败。
500signer unavailable / sign failed — 后端签名器初始化失败或签名失败。
500internal — 意外的数据库错误,请查看日志。
503spot subsystem disabled — 服务端已关闭现货子系统。
503spot blockchain not initialized — BSC 区块链服务未运行。

完整列表:错误码

代码示例

cURL(JWT)

JWT="your_jwt_token"

curl -s -X POST "https://api.prex.world/api/v1/spot/withdraw/request" \
-H "Authorization: Bearer ${JWT}" \
-H "Content-Type: application/json" \
-d '{
"token": "DF",
"amount": "100"
}'

Python

import requests

BASE_URL = "https://api.prex.world/api/v1"
JWT = "your_jwt_token"

resp = requests.post(
f"{BASE_URL}/spot/withdraw/request",
headers={
"Authorization": f"Bearer {JWT}",
"Content-Type": "application/json",
},
json={"token": "DF", "amount": "100"},
timeout=5,
)
resp.raise_for_status()
sig = resp.json()

print(f"withdrawal id : {sig['id']}")
print(f"nonce : {sig['nonce']}")
print(f"deadline : {sig['deadline']}")
print(f"signature : {sig['signature'][:20]}...")
# 下一步:调用 vault.withdraw(DF_TOKEN, amount_in_wei, deadline, signature)
# 完整的端到端代码示例请参阅 withdraw-flow.md。