底层机制
充值:CREATE2 代理
每个钱包都有一个由 CREATE2 推导的固定充值地址,其唯一功能是把 USDT 转入 Exchange 并记入该钱包。
充值地址#
用户的充值地址由钱包地址经 CREATE2 计算得出,salt 为 keccak256(wallet)。该地址在合约部署前即可确定,且永不改变。充值页与公开 API 端点 deposit-address 均返回该地址。
代理合约#
充值代理是极简、不可升级的合约,仅存储所属钱包与 Exchange 地址两项数据,只支持两项操作:
- 将全部 USDT 余额转入 Exchange,记入所属钱包;
- 由所属钱包取回误转入该地址的非 USDT 代币。
归集#
Keeper 监听转入充值地址的 USDT。地址余额达到 10 USDT 时,Keeper 部署代理(仅首次充值)并归集余额。Exchange 在同一笔交易内记入用户的交易余额,并校验其 USDT 持仓仍足以覆盖全部账户。
部署与归集均为公开函数。Keeper 不可用时,用户或任何第三方均可直接调用。
示例#
Alice 的钱包对应一个充值地址,她分两次向该地址转入 USDT。
| 步骤 | 地址余额 | 规则 | 结果 |
|---|---|---|---|
| 转入 6 USDT | 6 USDT | 低于 10 USDT 归集下限 | 资金留在地址中 |
| 转入 94 USDT | 100 USDT | 达到 10 USDT | Keeper 部署代理并归集 |
| 归集交易 | 0 USDT | 同一笔交易内记账 | 交易余额 +100 USDT |
6 USDT < 10 USDT → 不归集
6 + 94 = 100 USDT ≥ 10 → 归集 100 USDT,记账 100 USDT
← 公式过长时可横向滑动
低于下限的充值不会丢失,地址余额达到 10 USDT 后将与后续转账一并归集。
设计原因#
该设计无需代币授权、无两步充值、无待确认余额。直接转入 Exchange 合约的 USDT 不会记入任何账户,只能经 24 小时时间锁取回。
注意
请向应用中显示的充值地址转入 USDT(BEP-20),不要直接转入 Exchange 合约。