"$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 → USDC3 跳,绕 ANX 中转
Jito 2.3 SOL ($205)
1.25M CU
2
+$403,294
416936447
2QfBNK…nWW2T
USDC → ANB → USDC2 跳,自定义 arb 程序 sattC
Priority 0.5 SOL ($45)
0.65M CU
3
+$282,761
416936449
MRiYA4…JvoCsa
USDC → ANB → USDC2 跳,nonce 账户 + 自定义 arb 程序
Jito 5 SOL ($447)
0.36M CU
解剖 #1:$696,194 那一笔
这是单笔最大利润。3 跳路径 ,绕了一个中间币 ANX 来增加每一步的"汇率优势":
付 $0.227 USDC,从 ANX-USDC DAMM v2 池换出 72,793 个 ANX (这就是 bot 唯一掏的"本金")
把 72,793 ANX 塞进 ANX-ANB DAMM v2 池,换出 50,011,673 ANB (这步在正常池子完成,价格紧贴市价)
把 50,011,673 ANB 塞进 stale 的 ANB-USDC DLMM 池,换出 $696,194 USDC (这就是 stale 池被薅的一刻)
给 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 fee Jito 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. 修正后的核心结论
方向修正: 过期池套利可以走两个方向:
代币涨了,但 LP 把 X 代币挂在低价 bins 等卖 → bot 用 USDC 把廉价代币买光 转手到市场。
代币跌了,但 LP 把 USDC 挂在高价 bins 等买 → bot 用近乎为零成本的代币把高价 USDC 赎光 。 (本次事件)
两种方向本质一致:DLMM 的 active bin 必须靠交易才能移动,没人交易就漂移成"过期"。
对 LP 的启示
提供 DLMM 集中流动性的人,必须明白挂出去的 bin 等价于限价订单簿 。如果你挂在 active bin 下方放 USDC,等价于"愿意按这些价位买代币"——代币涨了你赚,代币归零你亏。如果代币只是冷门、流动性低,更没人会来推动 active bin。所以 LP 必须:
给 bins 设一个"我能接受的最低价格"和"最高价格"区间,超出就会暴露。
对低市值 / 高波动代币,至少每周检查一次,必要时用 SDK 调用 removeLiquidity 收回。
不要假设"价格往哪个方向走,DLMM 都能自适应"——它不会。
对套利者的启示
这种"反向 stale 池"在 Solana 链上数量比想象中多。扫描方法和 v1 报告里描述的一致:拉所有 DLMM 池 → 算出每个池子的 active bin 隐含价格 → 跟 Jupiter 聚合市价对比 → 价差超过阈值就放进监听清单。关键是阈值要双向:
active bin 价 >> 市价:池子里 USDC 太贵,可以把代币塞进去赎 USDC(本次事件)
active bin 价 << 市价:池子里代币太便宜,可以付 USDC 把代币买光(v1 描述的方向)
8. 一句话最终总结
这次事件不是机器人"截胡了某个大额 swap",而是机器人发现了一个 LP 留下的"10 个月没人维护的限价单簿 ",用近乎为零的成本(几毛钱本金 + 几百美金 Jito tip)把这个限价单簿里的 USDC 一次性结清。鲸鱼不是 swap 用户,鲸鱼就是当初那个 LP——他亲手把钱挂在过期价位上 10 个月,等到第一个发现的人来收。