2026/04/27

Kelp 事件后的 aWETH 负溢价套利

记录一次发生在 Arbitrum 上的 aWETH 负溢价窗口,以及我如何在 Aave 挤兑时用闪电贷吃到价差。

#arbitrum #aave #morpho #arbitrage #poc

市场最有意思的时候,往往不是价格最平静的时候,而是大家开始怀疑“这个东西到底还能不能兑出来”的时候。

这次机会出现在 Arbitrum 的 Aave WETH 池子。前提很简单:Kelp 事件之后,市场开始恐慌,Aave 上的 WETH 流动性被快速抽干,aWETH 这种本来应该贴着净值交易的资产,在二级市场里被砸出了明显折价。

我一开始并不是把它当成一个普通的价格机会在看。我更关心的是另一件事:Aave 虽然紧,但并没有完全失去兑付能力。只要池子里还有底层 WETHaWETH 仍然可以按 1:1 提出来。

这一步很关键。因为只要这个锚还在,二级市场上的折价就不再只是“恐慌”,而是一个可以被兑现的价差。

我的判断

当时市场里其实同时存在两个事实。

第一个事实是,很多人只想先卖掉 aWETH,不想继续承担 Aave 池子什么时候恢复、能恢复多少的风险。所以在池子里,aWETH 被砸到了低于 1 WETH 的价格。

第二个事实是,Aave 的兑付能力虽然被挤压,但并没有归零。也就是说,只要能在市场里买到足够便宜的 aWETH,再去 Aave 按面值提出 WETH,中间那一截就是确定性的利润。

这个套利并不复杂,核心就是一句话:

先在市场上买折价的 aWETH,再按 1:1 把它提成 WETH

真正的难点不在理解,而在执行。因为这种窗口出现得快,消失得也快,资金规模、池子深度、Aave 剩余可提取流动性、外部可借流动性,都在同时变化。你不是看到折价就一定能赚到,必须在流动性还没被吃干净之前把整条路径打通。

我是怎么做的

我用的是一条很直接的路径:

先借一笔 WETH,去市场里买折价的 aWETH,然后立刻去 Aave 按 1:1 提出底层 WETH,还掉借来的那部分,剩下的就是利润。

这条路径的好处在于不需要我先准备大额本金。真正限制规模的,不是我手里有多少 WETH,而是当时市场上有多少折价 aWETH 可以买,以及 Aave 里还剩多少 WETH 可以提。

从结果上看,这个窗口在两个不同 fee tier 的池子里都出现过,说明恐慌并不是只压在某一个局部流动性点上,而是整个 aWETH/WETH 交易结构都发生了错位。

如果把闪电贷这件事讲得更直白一点,它并不是“额外凭空赚出一笔钱”,而是把原本需要先准备的大额本金,压缩进了一笔交易里即时周转。

正常情况下,如果我想吃这个价差,我至少要先准备一大笔 WETH。先拿这些 WETH 去市场上买折价的 aWETH,再把 aWETH 提回 WETH,最后利润才会回到我手里。问题在于,这种窗口往往只存在很短时间,等你手动搬完资金,机会可能已经没了。

闪电贷解决的就是这个问题。它允许我在同一笔交易里临时借到一大笔 WETH,前提只有一个:这笔钱必须在交易结束前还回去。于是整件事就变成了一个原子化过程:

  1. 先临时借入 WETH
  2. 立刻用这笔 WETH 买折价的 aWETH
  3. 再把买到的 aWETH 立刻按面值提成 WETH
  4. 用提出来的 WETH 归还借款
  5. 交易结束时多出来的那部分,才真正属于利润

如果中间任何一步不成立,比如市场上的 aWETH 不够便宜、Aave 已经提不出足够的 WETH、或者最终剩下的钱不够覆盖借款,那么整笔交易就不会成立。这样反而很好,因为它天然避免了“先买了再想办法退出”的风险。

拿我最大的一笔来说,逻辑其实就是:

  • 临时借入接近 179.49 WETH
  • 在池子里花掉约 179.47 WETH
  • 买到 180 aWETH
  • 再把这 180 aWETH 提成 180 WETH
  • 先还掉借来的部分
  • 留下 0.5292397462808477 WETH 利润

写成伪代码,大概就是下面这个意思:

// mock code,只是示意结算顺序,不对应真实实现
function arbitrage() {
  const borrowedWeth = flashLoan(WETH);

  const boughtAWeth = swapWethForDiscountedAWeth(borrowedWeth);
  const redeemedWeth = redeemAWethToWethOnAave(boughtAWeth);

  repayFlashLoan(borrowedWeth);

  const profit = redeemedWeth - borrowedWeth - fees;
  if (profit <= 0) revert();

  sendProfit(profit);
}

真正限制这条路径规模的,其实有三层:

  • 市场里有多少折价 aWETH 可以买
  • Aave 里还剩多少 WETH 可以提
  • 外部还能借到多少 WETH 来瞬时放大这笔交易

所以这不是一个“看到折价就无脑冲”的机会,更像是一个不断变化的容量问题。你每次能打多大,不取决于胆子,而取决于那一刻这三个池子同时还能不能配平。

最大的一笔

我最想记下来的,就是这笔交易:

0xf1227f61fad9f8e6c28aa559b7a8871e97c3fe634fcc66d3ce2dc6fa70931797

这笔发生在 2026-04-27 00:49:22 UTC

交易里我实际花了大约 179.47076025 WETH 去买 180 aWETH,随后把这 180 aWETH 按面值提出成 180 WETH。扣掉借入和归还的部分,最终这笔交易打回钱包的利润是:

0.5292397462808477 WETH

换句话说,这一笔本质上是在市场里用不到 180 WETH 的成本,拿回了完整的 180 WETH 兑付价值。单笔利润率看起来不算夸张,但对于这种几乎没有方向风险、窗口又短的交易来说,已经足够好了。

另外几笔有代表性的交易

除了最大的一笔,前几天还有几笔也很典型:

这些交易放在一起看,我更愿意把它理解成另一种结构:不是市场在反复给出新的错价,而是底层流动性始终处在紧缺状态,只要池子里短暂释放出一点可用 WETH,就会立刻变成争抢目标。

我做的事情,本质上不是等着“折价一次次重新出现”,而是在这段流动性持续紧绷的时间里,尽量做到第一个把刚释放出来的可用流动性提走。

这一周到底赚了多少

我按钱包 0x4F461e7f7691512419b791993bA716F6f3Ead893 相关套利交易做了一次回看。
如果只看 2026-04-222026-04-27 这不到一周的套利窗口,可确认利润一共是:

1.41363195 WETH

如果按日期分布看,利润主要集中在下面几天:

日期 UTC套利收入
2026-04-220.35440250 WETH
2026-04-230.36625202 WETH
2026-04-240.00604374 WETH
2026-04-250.11383476 WETH
2026-04-260.04385919 WETH
2026-04-270.52923975 WETH

这组数据也说明了一件事:窗口不是线性衰减的。它会在恐慌、补流动性、再次挤兑之间来回摆动,所以真正重要的不是“等一个完美时点”,而是持续盯住结构有没有重新错开。

为什么这种机会能成立

很多人会把这类交易理解成“单纯捡便宜”,但我觉得更准确的说法是:

这是一次典型的赎回价值和交易价格暂时脱锚。

aWETH 的本质不是普通山寨币,它本身有明确的链上赎回逻辑。只要底层池子还没死,面值就还在。市场真正交易的,是“现在卖掉更安心”这件事本身。于是,在极端时刻,价格会先脱离锚,再在兑付逻辑还活着的时候留下空间。

所以这类机会最重要的不是猜方向,而是判断锚有没有真的断。

如果锚断了,折价可能只是风险重定价。

如果锚没断,折价就是利润来源。

我当时最在意的,也正是这个验证本身:这不是一张废纸,而是一张在极端情绪里被短时间错杀的兑付凭证。

激发器层面的意义

这次还有一个我自己很在意的点:真正赚到钱的,不只是套利公式本身,而是机会出现后能不能足够快、足够稳地打出去。

这种窗口的持续时间很短,信号又很杂。市场表面上看只是 “aWETH 折价了”,但真实交易里,你还要面对很多问题:

  • 什么时候池子里真的补回了可提取流动性
  • 哪种补流动性动作是真机会,哪种只是噪音
  • 同一个信号会不会被重复触发
  • 发单时会不会自己和自己冲突
  • 广播链路会不会在关键时刻抖一下

所以我在执行层面其实花了不少精力做“激发器”优化。这里我先只讲执行思路,不展开具体实现;后面如果合适,我可能会再单独公开这部分代码细节。能先讲清楚的结论只有一个:

这种套利拼的不只是判断对不对,更拼谁先确认、谁先下手、谁在噪音里不犯错。

也正因为如此,这次赚到的 1.41363195 WETH,我更愿意把它理解成一次完整的流动性事件交易,而不只是几笔零散的链上价差。

结尾

如果把这件事压成最短的一句话,那就是:

Kelp 事件之后,市场把 aWETH 当成了风险,把 Aave 的剩余兑付能力当成了不确定性;而我做的,只是先确认这个兑付锚还在,然后在恐慌最重的时候,持续把折价换回面值。

这类机会不会天天有,但每次出现,市场都会把同一个问题重新问一遍:

到底是在交易价值,还是在交易恐惧。

这一次,答案显然是后者。