USM(Minimalist USD v1)攻击全过程可视化:1×fund() + 64×defund()

攻击交易 0xfae5e751…cf559b050e(区块 25,716,150,2026-08-09 08:12:47 UTC,攻击者 0xb92b2E47…a50Fc)· 净利 70.830977367697708372 ETH · 合约 USM 0x2a7FFf44…D591675 · 所有数值由页面内 BigInt 引擎按合约代码实时计算(未预计算),与链上逐 wei 校验

同一资金池,两种卖法:拆分几乎抽空,一次性只抽走一半

两条路径共享完全相同的 fund() 后状态。左侧按同一总量尺度拆解 ETH 去向;右侧按卖出进度比较池余额(纵轴为对数尺度,以清楚显示 61.76 ETH 与 104.20 ETH 债务线)。
共同起点 · fund() 后资金池
实际 · 64 次卖出链上 64/64 逐 wei 匹配
赎回给攻击者
留在池中
偿还闪贷后
实时负债率
反事实 · 1 次全卖
赎回给攻击者
留在池中
偿还闪贷后
实时负债率
池余额轨迹(共享坐标)卖出进度 0% → 100% · 纵轴对数
64 次拆分与一次性卖出的资金池余额轨迹 绿色曲线逐步下降到 61.76 ETH;红色虚线在一次交易后下降到 5887.16 ETH;黄色线是 104.20 ETH 实时债务线。
实际 64 次 一次性全卖 实时债务线

中间变量因果链:为什么一次性卖出把均价砍到约一半

FUM 输入lowerBoundEthQty1 = pool − FUM × p0debtRatio2 = min(debtRatio1, 80%)netFumDelta2adjShrinkFactorp2avg = (p0 + p2) / 2ETH out
计算阶段
实际当前分块
反事实 · 一次性全卖
对最终结果的作用
步骤 0 / 66

资金池拆分(按实时预言机价 $1921.813593)

蓝色 = 用于归还 USM 债权人的 ETH;绿色 = FUM 可兑换的残值部分;红色 = 池子低于债务线的穿仓缺口
资金池总 ETH
实时负债率
攻击者净盈亏 ETH
USM 债务部分 FUM 残值部分 穿仓缺口 USM 债务线
USM 债务部分(ETH)
FUM 残值部分(ETH)
缺口(ETH,穿仓时)

系统因子与中间变量(引擎实时计算,全部 67 步轨迹 + 当前值)

条形 = 当前值相对全程 min–max 的大小;曲线 = 全步轨迹(白色圆点 = 当前位置,亮色 = 已走过的轨迹)

完整事件流(点击任意行跳转)

引擎 = WadMath.sol(wad 定点 + Yield 式 log₂/2ˣ 近似,含 57 位掩码逐字提取)与 USM.sol(checkForFreshOraclePrice / checkIfUnderwater / fumFromFund / ethFromDefund / _storeState / loadState)的 BigInt 精确移植。 初始状态取自区块 25,716,149 链上存储:池 132.588942983107019337 ETH、USM 总量 200,251.453135834662058063、FUM 总量 329,463.502710697641576863、陈旧中间价 $2257.793612、缓存预言机价 $2304.031122、最后活动 2026-05-02(距攻击 )。 第一次 fund() 触发价格刷新:实时中位数 $1921.813593(Chainlink 8 位小数 192181359300 × 1e10,为三源中位数)。校验锚点(仅用于比对,不参与计算):链上 FUM 铸造量、64 笔 defund 真实赎回额(Blockscout internal-transactions)、最终池子与净利润。