SATO 的结构性缺陷:双账本与不可赎回资产
看到推特上有很多人在说 $sato 没有bug,完全是睁着眼说瞎话。
SATO 的 bug 是结构性的,hook 同时存了 ethCum 和 totalMintedFair 两个曲线状态。买入按 ethCum 定价,卖出按 totalMintedFair 反推赎回,在逻辑上两者本该数学绑定,但实际会漂移。
漂移来自于精度问题:
1. Curve.totalMinted() 用 exp(),固定点计算会向下/向内舍入。
2. Curve.burnFor() 用 ln(),它和 exp() 在链上不是字节级互逆。
3. satoFairIn = satoIn * totalMintedFair / actualSupply 是整数除法,直接向下取整。
这导致了漂移方向是ethCum > Curve.ethAt(totalMintedFair),也就是说买的越来越贵,卖的越来越便宜,导致池子里很多ETH“废掉了”(完全取不出来,也对价格毫无影响,和烧掉ETH没啥区别)
而且sato合约设计特性中没有管理员,没有可升级合约,所以无法修复这个bug,只能任凭price impact变得越来越大。
$SAT1 的代码中删掉了 totalMintedFair 这个 storage,改成 Curve.totalMinted(ethCum) 现算,把两个状态变量缩简成一个,就解决了双curve的漂移问题。
$sat1 从发出来(lp 50eth)到现在(lp 210eth),已经涨了2x了。底部2x多一点。这个价格不捡垃圾真没道理。
http://sat1.io
0x8f66337a0c2A02202fd91Dd596c411CF977c6060