申请提现签名
描述
预留请求数量的 DF,签署 EIP-712 类型化数据 SpotReleaseFunds 释放授权,并返回调用方向链上金库合约提交所需的全部数据。
这是两步提现流程的第一步。收到签名后,调用方需在 BSC 上向 ZtdxSpotVault.withdraw() 提交该签名。关于包含金库调用和状态轮询的完整流程,请参阅 提现流程。
原子性: 在单个数据库事务中,available(可用)余额减少 amount,frozen(冻结)余额增加 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 频率限制。
请求参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
token | STRING | 必填 | 提现的代币。MVP 阶段仅支持 DF。 |
amount | DECIMAL | 必填 | 以字符串表示的十进制金额(例如 "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,防止链上重放攻击。 |
signature | 65 字节、0x 前缀的 EIP-712 签名。直接传入 vault.withdraw() 即可。 |
deadline | Unix 秒时间戳。链上 withdraw() 调用必须严格早于此时间戳执行。 |
vault_address | 需要调用 withdraw() 的金库合约 ZtdxSpotVault 地址。 |
chain_id | 签名所针对的 EVM 网络的 链 id — 97(BSC 测试网)。 |
amount | 已预留金额的十进制字符串。 |
amount_in_wei | 放入 EIP-712 value 字段的 wei 计金额。请将此值传入 vault.withdraw()——优先于 amount,可消除小数精度歧义。 |
响应中不包含 token 或 status 字段——成功时记录始终为 signed;如需完整记录,请调用 GET /spot/withdrawals/:id。
错误响应
| HTTP | error |
|---|---|
400 | unsupported token: <token> — 请求了 DF 以外的代币。 |
400 | amount below minimum <min> — amount 低于服务端配置的最小值。不存在单独的非正数校验——零或负数金额同样在此处失败。 |
400 | insufficient balance — 现货 available < amount。 |
400 | invalid user address — 已认证地址无法解析。 |
403 | API Key permission denied: withdraws not allowed — 调用方通过 API Key 认证。 |
409 | you have a pending withdrawal — submit it on-chain or wait for it to expire before signing a new one — 已存在 nonce 不小于合约当前 nonce 的 signed 提现。 |
409 | withdrawal slot conflict — try again in a moment — 该 nonce 槽位被一条未过期的记录占用。 |
500 | chain query failed — 读取金库链上 nonce 失败。 |
500 | signer unavailable / sign failed — 后端签名器初始化失败或签名失败。 |
500 | internal — 意外的数据库错误,请查看日志。 |
503 | spot subsystem disabled — 服务端已关闭现货子系统。 |
503 | spot 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。