充值流程
概述
DF 充值由后端监听器追踪 BSC 金库合约(ZtdxSpotVault)的 SpotDeposit 事件,并将余额记入现货钱包。无充值发起 API — 用户直接在链上与金库合约交互,后端异步完成对账。
当监听器确认 SPOT_BSC_CONFIRMATION_DEPTH 个区块(当前为 20)后,即认为充值最终完成,随即为用户增加 spot_balances.available,并向 spot_deposits 插入一条记录。幂等性由 (chain_id, tx_hash, log_index) 唯一键保证——重放同一事件为无操作。
生命周期
用户钱包
│
│ 1. DF.approve(vault, amount)
▼
DF ERC-20 合约 ─────────────────────────────────────────────▶
│
│ 2. ZtdxSpotVault.deposit(token, amount) │
▼ │
ZtdxSpotVault (0x4Fe0b354c5865ee9deb979a99030d757ae47664a) │
│ │
│ 触发 SpotDeposit(account, token, amount) │
▼ │
BSC 区块 N │
│ │
│ ≥ 20 个确认(约 40 秒) │
▼ │
后端监听器(每 2 秒轮询一次) │
│ │
├─ INSERT spot_deposits (status = "confirmed") │
└─ spot_balances.available += amount ◀────────────────────
第一步 — 授权
用户授权金库合约从其钱包中提取 amount 数量的 DF:
DF.approve(vaultAddress, amount);
// vaultAddress = 0x4Fe0b354c5865ee9deb979a99030d757ae47664a
// amount = wei(DF 有 18 位小数,1 DF = 10**18 wei)
第二步 — 充值
用户调用金库的 deposit 函数:
ZtdxSpotVault.deposit(address token, uint256 amount);
// token = 0x8063a43ed88397c1B10DA23dcC60ba1E7A0Bf555(BSC 测试网上的 DF)
// amount = wei
金库接受转账并触发事件:
event SpotDeposit(address indexed account, address indexed token, uint256 amount);
第三步 — 后端入账
监听器每隔 SPOT_BSC_POLL_INTERVAL_MS(2 000 毫秒)轮询一次 BSC。当某个 SpotDeposit 事件累积 SPOT_BSC_CONFIRMATION_DEPTH(20)个区块确认后:
- 向
spot_deposits插入一条status = "confirmed"的记录。 - 将充值用户的
spot_balances.available增加对应的入账金额。