Публикация

详细分析了下ETH的SATO
好消息是我们没这个问题
我看了 SATO 这个 Hook 合约,问题不是简单手续费,也不像典型夹子或项目方直接提走 ETH。
详细分析
核心问题是 Hook 内部维护了两个本应同步的曲线状态:
ethCum
totalMintedFair
理论上它们应该满足:
totalMintedFair = Curve.totalMinted(ethCum)
或者:
ethCum = Curve.ethAt(totalMintedFair)
但实际合约里,买入和卖出用了不同坐标。
买入路径:
Curve.mintFor(ethCum, ethToCurve)
也就是买入按 ethCum 所在的曲线位置定价。
卖出路径:
Curve.burnFor(totalMintedFair, satoFairIn)
也就是卖出按 totalMintedFair 反推出来的位置兑付 ETH。
一旦 ethCum > Curve.ethAt(totalMintedFair),就会出现:
买入按更贵的曲线买,
卖出按更便宜的曲线卖。
这不是普通 0.3% + 0.3% fee。
我复核的一个区块 25,041,403:
Hook balance ≈ 1774.9398 ETH
feesAccrued ≈ 91.1172 ETH
curve reserve ≈ 1683.8226 ETH
但 totalMintedFair 反推出来的卖出侧总负债只有:
≈ 1626.8557 ETH
也就是说当时已经有:
≈ 56.9669 ETH
留在 Hook 里,但卖出函数不会把它当成持有人可赎回价值。
这部分可以定义为:
gap = ethCum - Curve.ethAt(totalMintedFair)
这笔钱没有消失,也不是进了某个夹子地址或项目方钱包。
它还在 Hook 合约里。
但因为卖出路径只认 totalMintedFair,不认 ethCum 多出来的 gap,所以这部分 ETH 变成了当前交易路径无法触达的超额储备。
后果是:
后续买入会继续推高 ethCum,
买入价格越来越靠后,
但卖出赎回仍按 totalMintedFair 那条较低曲线算。
gap 越大,买入即卖出的损耗越大。
这会让 SATO 的实际可赎回价值持续被稀释,极端情况下即使 Hook 里还有很多 ETH,持有人也不能按这些 ETH 余额完整卖回。
我看 Token 本身没有发现 owner / pause / blacklist / tax / upgrade 这类权限;minter 已锁到 Hook。
所以这更像是 Hook 曲线会计设计/实现 bug,不是传统 owner 后门。
但问题很严重:已部署 Hook 没看到 upgrade / admin 修复入口,也没看到 withdraw/rescue 可以正常迁移这部分 gap。
如果项目方要止血,至少应该:
1. 暂停或强提示前端买入
2. 显示 buy price 和 immediate sell value
3. 不再展示单一曲线价格
4. 做迁移/补偿/新 Hook 方案
核心一句话:
SATO 的问题不是 ETH 被偷走,而是 ETH 被锁在 Hook 里,变成卖出曲线不承认的超额储备。
短版可以这样发:
SATO Hook 的问题不是典型夹子,也不像项目方直接提走 ETH。
核心是合约里 ethCum 和 totalMintedFair 两个曲线状态不同步。
买入按 ethCum 定价,卖出按 totalMintedFair 赎回。
当 ethCum > Curve.ethAt(totalMintedFair) 时,用户就是“按高曲线买,按低曲线卖”。
差额 ETH 仍在 Hook 合约里,但卖出路径不承认这部分价值,形成不可赎回 gap。
我复核区块 25,041,403 时 gap ≈ 56.97 ETH。
这不是普通手续费,而是曲线会计错位。
Дисклеймер: контент OKX Orbit предоставляется исключительно в информационных целях. Подробнее
Ответы
Комментариев еще нет. Будьте первым!
