← 返回

自持钱包 · 兑换

Best quote in./Minimum out, or nothing./Never retry a stale price.

用户手机 App本地后端接口wallet-api聚合器DEX aggregator区块链DEX 合约扫块服务chain-indexer询价 1–3确认授权 4–6签名广播 7–8成交确认 9–10结果与失败 11–12比价报价 · 最少到手确认额度不够已签名交易广播新块 + 回执失败拿新报价从头再来选币和数量例如 100 USDT 换 ETH设滑点容忍度 0.5%询价并发问聚合器报价有有效期聚合器比价问多家池子挑最多的大单拆到几个池子算最少到手报价 ×(1 − 滑点)amountOutMindeadline 截止时间确认报价看预计和最少到手过期就重新询价查授权额度allowance 够不够不够先组 approve签 approve默认只授本次额度不给无限额额度够就跳过签兑换交易私钥不出手机签名覆盖最少到手广播 + 记订单落 SWAP_ORDERapprove / 兑换两个哈希DEX 执行兑换按池子比例成交不够最少到手整笔回滚回滚手续费照扣扫到 txHash解析 Swap 事件拿实际到手数量回写 SWAP_ORDER看到结果成功:实际到手多少失败:原因 + 新报价失败不自动重试旧报价已作废新报价让用户重新确认123456789101112

手机上可以左右滑动看全图。

异常处理

异常处理

问题方案
报价过期结论:过期就刷新报价,不拿旧价成交
现象:用户点确认时,报价已过期
做:确认按钮变成「刷新报价」
然后:拿新价重算最少到手,再让用户确认
成交价太差结论:整笔回滚,不自动重试
现象:链上实际能换到的,比最少到手还少
结果:合约整笔回滚,USDT 一分没少,只扣手续费
为何不重试:价格已变,自动重试 = 替用户接受更差的价
三明治攻击结论:滑点默认设小,超阈值弹警告
现象:滑点容忍度设太大,被人夹
原理:有人在内存池看到你的大单,抢先买入抬价,等你成交后再卖出,赚走的正是你的滑点
防:默认滑点小;以太坊可走私有通道广播,不进公开内存池
授权没到账结论:等 approve 上链确认,再组兑换交易
现象:approve 还没上链就组兑换交易
兜底:授权没生效时,估算手续费那步直接报错,交易组不出来
广播不上链结论:同 nonce 加价加速或取消,deadline 兜底
现象:交易广播了,迟迟不上链
做:和转账一样,同一个 nonce 加价加速或取消
兜底:交易带 deadline,过了截止时间合约直接拒绝,不会很久以后按旧价成交
无限授权出事结论:默认只授本次额度,出事一键改 0
现象:之前授过无限额,后来这个合约出了问题
做:授权管理页一键把额度改成 0
注意:这也是一笔要付手续费的链上交易
聚合器异常结论:多家比价,离谱的丢掉,全挂就暂停
现象:某个聚合器报价离谱或接口挂了
做:同时问多家聚合器和 DEX,偏离市价超过阈值的直接丢掉
兜底:一家挂了用其他家;全挂就暂停兑换,不硬给价