Solana · MEV · Stale Pool 已用 Solscan 验证 · v2

299 万美金、150 秒、9 笔交易
—— 一个 Meteora 旧池子被「反向 rug」的链上拆解

事件发生于 2026-05-01 19:06:54 UTC(slot 416936447 起 3 个连续 slot)。本文基于 Solscan 链上真实数据复盘,颠覆了对"过期池套利"方向的常见误解。

$2.99M
总抽走金额
150s
总耗时
3 + 4
主力 + 散兵 bot
10 个月
DLMM 池子未维护
"$2,993,502 drained from a single Solana pool in 150 seconds. 1 whale. 6 bots. 9 transactions. 1 misconfigured Meteora pool that sat for 10 months." —— @anshu_code, X / 2026-05-06
v2 更新说明:本报告 v1 基于推文文字推理,方向讲反了。链上实测后已修正:stale 池子里装的不是"等卖的便宜代币",而是"愿意高价收购废纸的 USDC"。机器人不是去捡便宜币,是去把近乎归零的代币塞进去换真金白银。下文 §3-§5 全部基于 Solscan 实测数据。

1. 事件一句话总结

有个 LP 在 2025 年 7 月左右往 Meteora 上一个 ANB-USDC 的 DLMM 池子里塞了至少 $1.4M 的 USDC,挂在 ANB ~ $0.01-$0.05/枚的价格档位(bins)上。10 个月后,ANB 真实市价跌到了 $0.0000113/枚(缩水 ~1000 倍),LP 没有移除流动性也没人交易这个池子,active bin 卡在原位不动。2026/5/1 这个池子被一群套利机器人发现,3 个 slot 内 ~$1.4M USDC 全被搬空,单笔最大利润 $696,194

2. 这次的"鲸鱼"是谁,钱是怎么流的?

推文里说的"1 whale, 6 bots, 9 transactions"——这里的 whale 不是来 swap 的大户,而是池子的 LP 本人。机器人不是从某个交易者身上薅羊毛,而是直接把 LP 当年存进去的 USDC 一捆捆拎走

"鲸鱼" = LP 10 个月前 灌入 ≥ $1.4M USDC ANB-USDC DLMM 池子 USDC 沉睡在高价 bins 愿意按 $0.01/ANB 收购 (真实市价仅 $0.0000113) 10 个月没人动它 ANB-USDC DAMM v2 价格紧贴市价 $0.20 USDC ≈ 25M ANB 7 个套利 bot 总投入 ≈ $1.5 USDC 总取出 ≈ $2.99M USDC ① 用几毛钱 买几千万 ANB ② 把 ANB 砸进 stale 池 换出 $282K-$696K USDC 资金净流向: LP(whale)的 USDC stale DLMM 池 套利 bots 机器人付出的成本只有:base fee + Jito tip + 几毛钱用来买 ANB;剩下全是利润。
真实链上资金流:LP 当年灌入的 USDC,10 个月后被机器人用近乎为零的成本「赎」走。

3. Stale 池子结构(修正版)

这次的关键是:池子里"过期"的不是代币,是 USDC。LP 当时挂的是"限价买单"——把 USDC 塞在 active bin 下方,挂在 ANB = $0.005、$0.01、$0.05 这种它认为合理的价格上。ANB 价格崩了 1000 倍后,这些 USDC 还在原位,等着按"老价格"收购 ANB。

DLMM bins 真实分布(创建时 vs 被发现时) 10 个月前 · LP 设置时 假设当时 ANB 市价 ≈ $0.01 $0.005 $0.007 $0.008 $0.009 $0.01 $0.012 USDC USDC USDC USDC ↑ active bin 在 $0.01 · 下方 4 格 USDC 等买 10 个月后 · 被发现时 真实市价跌到 $0.0000113,但池子…… $0.005 $0.007 $0.008 $0.009 $0.01 $0.012 USDC USDC USDC USDC ↑ active bin 还在 $0.01 · 下方 USDC 一动没动 外部市价已是 $0.0000113,池子按 $0.005-$0.01 一个收 10 个月没人交易 active bin 不动 套利 bot 发现: "我手里 50M ANB 在外面只值 $565," "塞进这个池子能换到 $696,194 的 USDC" → 一笔 atomic tx 全部搞定
关键洞察:DLMM 的"stale"是双向的——这次过期的方向是 USDC bins 在等高价收 ANB,机器人对它做的是「砸盘式套利」而非「捡漏式套利」。
所以:"代币涨了为什么 bin 还能低价存在"这个问题,在这个事件里其实反过来——是代币归零了,bin 还在按高价收。本质都是一回事:DLMM 的 active bin 必须有交易才会移动,外部价格变化跟池子无关。漂移可以是任意方向,stale 一旦形成,被发现的那刻就是清算。

4. 链上真实数据(3 笔顶级 tx)

所有数据来自 Solscan 的 transaction explorer。这三笔合计 $1.38M(占总额 46%),其余 6 笔是更小的尾单。

# 利润 (USDC) Slot Bot 钱包 路径 抢量 消耗
1 +$696,194 416936448 ESuvjv…cJbg8 USDC → ANX → ANB → USDC
3 跳,绕 ANX 中转
Jito 2.3 SOL
($205)
1.25M CU
2 +$403,294 416936447 2QfBNK…nWW2T USDC → ANB → USDC
2 跳,自定义 arb 程序 sattC
Priority
0.5 SOL ($45)
0.65M CU
3 +$282,761 416936449 MRiYA4…JvoCsa USDC → ANB → USDC
2 跳,nonce 账户 + 自定义 arb 程序
Jito 5 SOL
($447)
0.36M CU

解剖 #1:$696,194 那一笔

这是单笔最大利润。3 跳路径,绕了一个中间币 ANX 来增加每一步的"汇率优势":

  1. 付 $0.227 USDC,从 ANX-USDC DAMM v2 池换出 72,793 个 ANX(这就是 bot 唯一掏的"本金")
  2. 把 72,793 ANX 塞进 ANX-ANB DAMM v2 池,换出 50,011,673 ANB(这步在正常池子完成,价格紧贴市价)
  3. 把 50,011,673 ANB 塞进 stale 的 ANB-USDC DLMM 池,换出 $696,194 USDC(这就是 stale 池被薅的一刻)
  4. 给 Jitotip 5 转 2.3 SOL($205)抢落地

整笔交易完成后,stale 池子的 USDC 余额从 $1,412,213 → $716,018,单笔被搬走 49%。

4 条指令,1 笔 atomic tx:
#1  ComputeBudget: SetComputeUnitLimit
#2  Meteora DAMM v2: swap2  ← USDC → ANX
#3  Meteora DAMM v2: swap2  ← ANX → ANB
#4  Meteora DLMM:    swap2  ← ANB → USDC(stale 池)
#5  System Program:  transfer ← Jito tip 2.3 SOL
  

使用了 3 个 Address Lookup Tables 压缩账户引用,否则 33 个账户塞不进 1232 字节的 tx 大小限制。

5. 三种不同 bot 的策略对比

3 笔交易、3 个独立钱包、3 套差异显著的策略——这说明它们是 3 个独立团队同时盯到了这个池子:

Bot 1(ESuvjv…) Bot 2(2QfBNK…) Bot 3(MRiYA4…)
抢落地手段Jito bundle + tip纯 priority feeJito bundle + tip + nonce
路径长度3 跳(绕 ANX)2 跳2 跳
程序结构直接调 Meteora 程序自定义 on-chain arb 程序
sattC…
自定义 on-chain arb 程序
AN225k…
付的"过路费"$205 → Jito 验证者$45 → 当 leader$447 → Jito 验证者
本金 USDC$0.227$0.156$0.127
毛利$696,194$403,294$282,761
"过路费 / 毛利"0.029%0.011%0.158%
有意思的是 Bot 3 的 tip 反而最高($447)但抢到的利润最少。原因可能是:池子被前两笔搬空了 696K + 403K = 1.1M,留给 Bot 3 的 USDC 只剩 ~580K,所以即便它愿意付更多 tip,可吃的肉本身已经少了。

6. Stale 池余额的"清算曲线"

$1.4M $1.0M $600K $200K $0 slot 416936447 slot 416936448 slot 416936449 $2.18M 事件前 $1.41M tx#2 后 (-$403K) $716K tx#1 后 (-$696K) $298K tx#3 后 (-$282K) Stale 池 USDC 余额(仅显示 3 笔最大 tx 的影响)
3 个连续 slot 内,USDC 从 $2.18M 跌到 $298K,跌幅 86%。剩余的 $298K 在后续 6 笔小 tx 里被分掉。

7. 修正后的核心结论

方向修正:过期池套利可以走两个方向:
  1. 代币涨了,但 LP 把 X 代币挂在低价 bins 等卖 → bot 用 USDC 把廉价代币买光转手到市场。
  2. 代币跌了,但 LP 把 USDC 挂在高价 bins 等买 → bot 用近乎为零成本的代币把高价 USDC 赎光(本次事件)
两种方向本质一致:DLMM 的 active bin 必须靠交易才能移动,没人交易就漂移成"过期"。

对 LP 的启示

提供 DLMM 集中流动性的人,必须明白挂出去的 bin 等价于限价订单簿。如果你挂在 active bin 下方放 USDC,等价于"愿意按这些价位买代币"——代币涨了你赚,代币归零你亏。如果代币只是冷门、流动性低,更没人会来推动 active bin。所以 LP 必须:

  1. 给 bins 设一个"我能接受的最低价格"和"最高价格"区间,超出就会暴露。
  2. 对低市值 / 高波动代币,至少每周检查一次,必要时用 SDK 调用 removeLiquidity 收回。
  3. 不要假设"价格往哪个方向走,DLMM 都能自适应"——它不会。

对套利者的启示

这种"反向 stale 池"在 Solana 链上数量比想象中多。扫描方法和 v1 报告里描述的一致:拉所有 DLMM 池 → 算出每个池子的 active bin 隐含价格 → 跟 Jupiter 聚合市价对比 → 价差超过阈值就放进监听清单。关键是阈值要双向:

8. 一句话最终总结

这次事件不是机器人"截胡了某个大额 swap",而是机器人发现了一个 LP 留下的"10 个月没人维护的限价单簿",用近乎为零的成本(几毛钱本金 + 几百美金 Jito tip)把这个限价单簿里的 USDC 一次性结清。鲸鱼不是 swap 用户,鲸鱼就是当初那个 LP——他亲手把钱挂在过期价位上 10 个月,等到第一个发现的人来收。