Naposledy aktivní 1 month ago

Revize 54a9cb7762082d7a6f92ff132f78d31860266da3

meteora_stale_pool_arb.html Raw
1<!DOCTYPE html>
2<html lang="zh-CN">
3<head>
4<meta charset="UTF-8" />
5<meta name="viewport" content="width=device-width, initial-scale=1.0" />
6<title>299 万美金、150 秒、9 笔交易 —— 一个 Meteora 旧池子被反向 rug 的链上拆解</title>
7<style>
8 :root {
9 --bg: #0d1117;
10 --panel: #161b22;
11 --panel2: #1c2330;
12 --border: #30363d;
13 --text: #e6edf3;
14 --text-dim: #8b949e;
15 --accent: #f7b955;
16 --accent2: #58a6ff;
17 --green: #3fb950;
18 --red: #f85149;
19 --purple: #bc8cff;
20 }
21 * { box-sizing: border-box; }
22 html, body {
23 margin: 0; padding: 0;
24 background: var(--bg);
25 color: var(--text);
26 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
27 "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
28 line-height: 1.7;
29 }
30 .wrap {
31 max-width: 960px;
32 margin: 0 auto;
33 padding: 48px 28px 96px;
34 }
35 header {
36 border-bottom: 1px solid var(--border);
37 padding-bottom: 28px;
38 margin-bottom: 36px;
39 }
40 .tag {
41 display: inline-block;
42 background: rgba(247, 185, 85, 0.12);
43 color: var(--accent);
44 padding: 4px 12px;
45 border-radius: 999px;
46 font-size: 12px;
47 letter-spacing: 0.04em;
48 text-transform: uppercase;
49 margin-bottom: 16px;
50 border: 1px solid rgba(247, 185, 85, 0.3);
51 }
52 .tag.verified {
53 background: rgba(63, 185, 80, 0.12);
54 color: var(--green);
55 border-color: rgba(63, 185, 80, 0.3);
56 margin-left: 8px;
57 }
58 h1 {
59 font-size: 32px;
60 line-height: 1.3;
61 margin: 0 0 14px;
62 font-weight: 700;
63 letter-spacing: -0.01em;
64 }
65 .subtitle {
66 color: var(--text-dim);
67 font-size: 16px;
68 margin: 0;
69 }
70 h2 {
71 font-size: 22px;
72 margin: 56px 0 14px;
73 padding-left: 12px;
74 border-left: 4px solid var(--accent);
75 }
76 h3 {
77 font-size: 17px;
78 margin: 28px 0 10px;
79 color: var(--accent2);
80 }
81 p { margin: 12px 0; }
82 code {
83 background: var(--panel2);
84 border: 1px solid var(--border);
85 padding: 1px 6px;
86 border-radius: 4px;
87 font-size: 13px;
88 color: var(--accent);
89 font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
90 word-break: break-all;
91 }
92 .stats {
93 display: grid;
94 grid-template-columns: repeat(4, 1fr);
95 gap: 12px;
96 margin: 28px 0;
97 }
98 .stat {
99 background: var(--panel);
100 border: 1px solid var(--border);
101 border-radius: 10px;
102 padding: 18px 16px;
103 text-align: center;
104 }
105 .stat .num {
106 font-size: 26px;
107 font-weight: 700;
108 color: var(--accent);
109 margin-bottom: 4px;
110 font-variant-numeric: tabular-nums;
111 }
112 .stat .lbl {
113 color: var(--text-dim);
114 font-size: 12.5px;
115 }
116 .quote {
117 background: var(--panel);
118 border-left: 3px solid var(--accent2);
119 padding: 16px 20px;
120 border-radius: 0 8px 8px 0;
121 color: var(--text);
122 font-size: 15px;
123 margin: 18px 0;
124 }
125 .quote .src {
126 display: block;
127 margin-top: 8px;
128 color: var(--text-dim);
129 font-size: 12.5px;
130 }
131 .panel {
132 background: var(--panel);
133 border: 1px solid var(--border);
134 border-radius: 12px;
135 padding: 22px 24px;
136 margin: 22px 0;
137 }
138 figure {
139 margin: 22px 0;
140 background: var(--panel);
141 border: 1px solid var(--border);
142 border-radius: 12px;
143 padding: 22px 18px 14px;
144 }
145 figcaption {
146 color: var(--text-dim);
147 font-size: 13px;
148 text-align: center;
149 margin-top: 10px;
150 }
151 svg { display: block; max-width: 100%; height: auto; margin: 0 auto; }
152
153 table {
154 width: 100%;
155 border-collapse: collapse;
156 margin: 18px 0;
157 font-size: 13.5px;
158 }
159 th, td {
160 padding: 10px 12px;
161 border-bottom: 1px solid var(--border);
162 text-align: left;
163 vertical-align: top;
164 }
165 th {
166 background: var(--panel2);
167 color: var(--text-dim);
168 font-weight: 600;
169 font-size: 13px;
170 text-transform: uppercase;
171 letter-spacing: 0.03em;
172 }
173 td.num { font-variant-numeric: tabular-nums; text-align: right; }
174 td.green { color: var(--green); }
175 td.red { color: var(--red); }
176 ol.steps {
177 counter-reset: s;
178 list-style: none;
179 padding: 0;
180 }
181 ol.steps > li {
182 counter-increment: s;
183 position: relative;
184 padding: 14px 18px 14px 56px;
185 margin: 10px 0;
186 background: var(--panel);
187 border: 1px solid var(--border);
188 border-radius: 10px;
189 }
190 ol.steps > li::before {
191 content: counter(s);
192 position: absolute;
193 left: 16px;
194 top: 14px;
195 width: 28px;
196 height: 28px;
197 border-radius: 50%;
198 background: var(--accent);
199 color: #1d1300;
200 font-weight: 700;
201 text-align: center;
202 line-height: 28px;
203 font-size: 14px;
204 }
205 .callout {
206 background: rgba(88, 166, 255, 0.08);
207 border: 1px solid rgba(88, 166, 255, 0.3);
208 border-radius: 10px;
209 padding: 14px 18px;
210 margin: 18px 0;
211 color: var(--text);
212 font-size: 14.5px;
213 }
214 .callout.warn {
215 background: rgba(248, 81, 73, 0.08);
216 border-color: rgba(248, 81, 73, 0.3);
217 }
218 .callout.update {
219 background: rgba(247, 185, 85, 0.08);
220 border-color: rgba(247, 185, 85, 0.3);
221 }
222 .callout strong { color: var(--accent2); }
223 .callout.warn strong { color: var(--red); }
224 .callout.update strong { color: var(--accent); }
225 footer {
226 margin-top: 64px;
227 padding-top: 24px;
228 border-top: 1px solid var(--border);
229 color: var(--text-dim);
230 font-size: 13px;
231 }
232 footer a { color: var(--accent2); text-decoration: none; }
233 footer a:hover { text-decoration: underline; }
234 .addr {
235 font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
236 font-size: 12px;
237 color: var(--accent2);
238 word-break: break-all;
239 }
240
241 @media (max-width: 640px) {
242 .wrap { padding: 28px 16px 64px; }
243 h1 { font-size: 24px; }
244 .stats { grid-template-columns: repeat(2, 1fr); }
245 }
246</style>
247</head>
248<body>
249<div class="wrap">
250
251<header>
252 <span class="tag">Solana · MEV · Stale Pool</span>
253 <span class="tag verified">已用 Solscan 验证 · v2</span>
254 <h1>299 万美金、150 秒、9 笔交易<br/>—— 一个 Meteora 旧池子被「反向 rug」的链上拆解</h1>
255 <p class="subtitle">事件发生于 2026-05-01 19:06:54 UTC(slot 416936447 起 3 个连续 slot)。本文基于 Solscan 链上真实数据复盘,颠覆了对"过期池套利"方向的常见误解。</p>
256</header>
257
258<section>
259 <div class="stats">
260 <div class="stat"><div class="num">$2.99M</div><div class="lbl">总抽走金额</div></div>
261 <div class="stat"><div class="num">150s</div><div class="lbl">总耗时</div></div>
262 <div class="stat"><div class="num">3 + 4</div><div class="lbl">主力 + 散兵 bot</div></div>
263 <div class="stat"><div class="num">10 个月</div><div class="lbl">DLMM 池子未维护</div></div>
264 </div>
265
266 <div class="quote">
267 "$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."
268 <span class="src">—— @anshu_code, X / 2026-05-06</span>
269 </div>
270
271 <div class="callout update">
272 <strong>v2 更新说明:</strong>本报告 v1 基于推文文字推理,方向<strong>讲反了</strong>。链上实测后已修正:stale 池子里装的不是"等卖的便宜代币",而是"愿意高价收购废纸的 USDC"。机器人不是去捡便宜币,是去把<strong>近乎归零的代币塞进去换真金白银</strong>。下文 §3-§5 全部基于 Solscan 实测数据。
273 </div>
274</section>
275
276<h2>1. 事件一句话总结</h2>
277<p>有个 LP 在 2025 年 7 月左右往 Meteora 上一个 ANB-USDC 的 DLMM 池子里塞了至少 <strong>$1.4M 的 USDC</strong>,挂在 ANB ~ $0.01-$0.05/枚的价格档位(bins)上。10 个月后,ANB 真实市价跌到了 <strong>$0.0000113/枚</strong>(缩水 ~1000 倍),LP 没有移除流动性也没人交易这个池子,<strong>active bin 卡在原位不动</strong>。2026/5/1 这个池子被一群套利机器人发现,3 个 slot 内 ~$1.4M USDC 全被搬空,单笔最大利润 <strong>$696,194</strong></p>
278
279<h2>2. 这次的"鲸鱼"是谁,钱是怎么流的?</h2>
280<p>推文里说的"1 whale, 6 bots, 9 transactions"——这里的 whale <strong>不是来 swap 的大户</strong>,而是池子的 LP 本人。机器人不是从某个交易者身上薅羊毛,而是<strong>直接把 LP 当年存进去的 USDC 一捆捆拎走</strong></p>
281
282<figure>
283<svg viewBox="0 0 880 380" xmlns="http://www.w3.org/2000/svg">
284 <defs>
285 <linearGradient id="bg1" x1="0" x2="0" y1="0" y2="1">
286 <stop offset="0" stop-color="#1c2330"/>
287 <stop offset="1" stop-color="#161b22"/>
288 </linearGradient>
289 <marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
290 <path d="M0,0 L8,3 L0,6 z" fill="#f7b955"/>
291 </marker>
292 <marker id="arrow_red" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
293 <path d="M0,0 L8,3 L0,6 z" fill="#f85149"/>
294 </marker>
295 </defs>
296 <rect width="880" height="380" fill="url(#bg1)" rx="10"/>
297
298 <!-- LP -->
299 <rect x="40" y="40" width="170" height="80" fill="#0d1117" stroke="#bc8cff" stroke-width="1.5" rx="10"/>
300 <text x="125" y="65" text-anchor="middle" fill="#bc8cff" font-size="14" font-weight="700">"鲸鱼" = LP</text>
301 <text x="125" y="85" text-anchor="middle" fill="#e6edf3" font-size="11">10 个月前</text>
302 <text x="125" y="103" text-anchor="middle" fill="#bc8cff" font-size="13" font-weight="700">灌入 ≥ $1.4M USDC</text>
303
304 <!-- Stale Pool -->
305 <rect x="320" y="20" width="240" height="120" fill="#0d1117" stroke="#f85149" stroke-width="2" rx="10"/>
306 <text x="440" y="48" text-anchor="middle" fill="#f85149" font-size="14" font-weight="700">ANB-USDC DLMM 池子</text>
307 <text x="440" y="70" text-anchor="middle" fill="#e6edf3" font-size="11">USDC 沉睡在高价 bins</text>
308 <text x="440" y="92" text-anchor="middle" fill="#8b949e" font-size="11">愿意按 $0.01/ANB 收购</text>
309 <text x="440" y="114" text-anchor="middle" fill="#f85149" font-size="11">(真实市价仅 $0.0000113)</text>
310 <text x="440" y="132" text-anchor="middle" fill="#f85149" font-size="11" font-weight="700">10 个月没人动它</text>
311
312 <!-- Arrow LP → Pool -->
313 <line x1="210" y1="80" x2="316" y2="80" stroke="#bc8cff" stroke-width="2" marker-end="url(#arrow)"/>
314
315 <!-- Source pool (cheap ANB) -->
316 <rect x="320" y="180" width="240" height="80" fill="#0d1117" stroke="#3fb950" stroke-width="1.5" rx="10"/>
317 <text x="440" y="208" text-anchor="middle" fill="#3fb950" font-size="14" font-weight="700">ANB-USDC DAMM v2</text>
318 <text x="440" y="230" text-anchor="middle" fill="#e6edf3" font-size="11">价格紧贴市价</text>
319 <text x="440" y="250" text-anchor="middle" fill="#3fb950" font-size="11">$0.20 USDC ≈ 25M ANB</text>
320
321 <!-- Bots -->
322 <rect x="660" y="40" width="180" height="80" fill="#0d1117" stroke="#f7b955" stroke-width="1.5" rx="10"/>
323 <text x="750" y="65" text-anchor="middle" fill="#f7b955" font-size="14" font-weight="700">7 个套利 bot</text>
324 <text x="750" y="85" text-anchor="middle" fill="#e6edf3" font-size="11">总投入 ≈ $1.5 USDC</text>
325 <text x="750" y="105" text-anchor="middle" fill="#f7b955" font-size="13" font-weight="700">总取出 ≈ $2.99M USDC</text>
326
327 <!-- Bot to source pool -->
328 <line x1="660" y1="105" x2="565" y2="200" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)"/>
329 <text x="640" y="160" fill="#f7b955" font-size="11">① 用几毛钱</text>
330 <text x="640" y="178" fill="#f7b955" font-size="11">买几千万 ANB</text>
331
332 <!-- Bot to stale pool -->
333 <line x1="565" y1="105" x2="660" y2="80" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)" stroke-dasharray="0"/>
334 <text x="563" y="158" fill="#f7b955" font-size="11" text-anchor="end">② 把 ANB 砸进 stale 池</text>
335 <text x="563" y="176" fill="#f7b955" font-size="11" text-anchor="end">换出 $282K-$696K USDC</text>
336
337 <!-- ANB to stale pool arrow -->
338 <line x1="440" y1="180" x2="440" y2="142" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)" stroke-dasharray="4 3"/>
339
340 <!-- Bot grabs USDC -->
341 <line x1="558" y1="78" x2="660" y2="65" stroke="#f85149" stroke-width="2" marker-end="url(#arrow_red)"/>
342
343 <!-- Footer -->
344 <line x1="40" y1="305" x2="840" y2="305" stroke="#30363d" stroke-width="1" stroke-dasharray="3 3"/>
345 <text x="40" y="333" fill="#8b949e" font-size="12">资金净流向:</text>
346 <text x="160" y="333" fill="#bc8cff" font-size="12" font-weight="700">LP(whale)的 USDC</text>
347 <text x="320" y="333" fill="#8b949e" font-size="12"></text>
348 <text x="345" y="333" fill="#f85149" font-size="12" font-weight="700">stale DLMM 池</text>
349 <text x="465" y="333" fill="#8b949e" font-size="12"></text>
350 <text x="490" y="333" fill="#f7b955" font-size="12" font-weight="700">套利 bots</text>
351 <text x="40" y="358" fill="#8b949e" font-size="11">机器人付出的成本只有:base fee + Jito tip + 几毛钱用来买 ANB;剩下全是利润。</text>
352</svg>
353<figcaption>真实链上资金流:LP 当年灌入的 USDC,10 个月后被机器人用近乎为零的成本「赎」走。</figcaption>
354</figure>
355
356<h2>3. Stale 池子结构(修正版)</h2>
357<p>这次的关键是:池子里"过期"的不是代币,是 <strong>USDC</strong>。LP 当时挂的是"<em>限价买单</em>"——把 USDC 塞在 active bin 下方,挂在 ANB = $0.005、$0.01、$0.05 这种<strong>它认为合理</strong>的价格上。ANB 价格崩了 1000 倍后,这些 USDC 还在原位,等着按"老价格"收购 ANB。</p>
358
359<figure>
360<svg viewBox="0 0 880 360" xmlns="http://www.w3.org/2000/svg">
361 <rect width="880" height="360" fill="url(#bg1)" rx="10"/>
362
363 <!-- Title -->
364 <text x="440" y="34" text-anchor="middle" fill="#e6edf3" font-size="15" font-weight="700">DLMM bins 真实分布(创建时 vs 被发现时)</text>
365
366 <!-- LP setup time -->
367 <text x="40" y="78" fill="#bc8cff" font-size="13" font-weight="700">10 个月前 · LP 设置时</text>
368 <text x="40" y="96" fill="#8b949e" font-size="11">假设当时 ANB 市价 ≈ $0.01</text>
369 <g>
370 <rect x="40" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
371 <rect x="95" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
372 <rect x="150" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
373 <rect x="205" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
374 <rect x="260" y="110" width="50" height="60" fill="#f7b955" rx="3"/>
375 <rect x="315" y="110" width="50" height="60" fill="#bc8cff" opacity="0.6" rx="3"/>
376 <text x="65" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.005</text>
377 <text x="120" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.007</text>
378 <text x="175" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.008</text>
379 <text x="230" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.009</text>
380 <text x="285" y="188" text-anchor="middle" fill="#f7b955" font-size="10" font-weight="700">$0.01</text>
381 <text x="340" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.012</text>
382 <text x="65" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
383 <text x="120" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
384 <text x="175" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
385 <text x="230" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
386 </g>
387 <text x="40" y="220" fill="#8b949e" font-size="11">↑ active bin 在 $0.01 · 下方 4 格 USDC 等买</text>
388
389 <!-- 10 months later -->
390 <text x="480" y="78" fill="#f85149" font-size="13" font-weight="700">10 个月后 · 被发现时</text>
391 <text x="480" y="96" fill="#8b949e" font-size="11">真实市价跌到 $0.0000113,但池子……</text>
392 <g>
393 <rect x="480" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
394 <rect x="535" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
395 <rect x="590" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
396 <rect x="645" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
397 <rect x="700" y="110" width="50" height="60" fill="#f7b955" rx="3"/>
398 <rect x="755" y="110" width="50" height="60" fill="#bc8cff" opacity="0.6" rx="3"/>
399 <text x="505" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.005</text>
400 <text x="560" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.007</text>
401 <text x="615" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.008</text>
402 <text x="670" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.009</text>
403 <text x="725" y="188" text-anchor="middle" fill="#f7b955" font-size="10" font-weight="700">$0.01</text>
404 <text x="780" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.012</text>
405 <text x="505" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
406 <text x="560" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
407 <text x="615" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
408 <text x="670" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
409 </g>
410 <text x="480" y="220" fill="#f85149" font-size="11" font-weight="700">↑ active bin 还在 $0.01 · 下方 USDC 一动没动</text>
411 <text x="480" y="238" fill="#f85149" font-size="11">外部市价已是 $0.0000113,池子按 $0.005-$0.01 一个收</text>
412
413 <!-- Arrow connecting -->
414 <line x1="380" y1="140" x2="476" y2="140" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="3 3" marker-end="url(#arrow)"/>
415 <text x="428" y="135" text-anchor="middle" fill="#8b949e" font-size="11">10 个月没人交易</text>
416 <text x="428" y="155" text-anchor="middle" fill="#8b949e" font-size="11">active bin 不动</text>
417
418 <!-- Bot exploit arrow -->
419 <text x="640" y="280" text-anchor="middle" fill="#f7b955" font-size="13" font-weight="700">套利 bot 发现:</text>
420 <text x="640" y="300" text-anchor="middle" fill="#e6edf3" font-size="12">"我手里 50M ANB 在外面只值 $565,"</text>
421 <text x="640" y="320" text-anchor="middle" fill="#e6edf3" font-size="12">"塞进这个池子能换到 $696,194 的 USDC"</text>
422 <text x="640" y="340" text-anchor="middle" fill="#f7b955" font-size="12" font-weight="700">→ 一笔 atomic tx 全部搞定</text>
423</svg>
424<figcaption>关键洞察:DLMM 的"stale"是双向的——这次过期的方向是 USDC bins 在等高价收 ANB,机器人对它做的是「砸盘式套利」而非「捡漏式套利」。</figcaption>
425</figure>
426
427<div class="callout warn">
428 <strong>所以:</strong>"代币涨了为什么 bin 还能低价存在"这个问题,在这个事件里其实反过来——是<strong>代币归零了,bin 还在按高价收</strong>。本质都是一回事:<em>DLMM 的 active bin 必须有交易才会移动,外部价格变化跟池子无关</em>。漂移可以是任意方向,stale 一旦形成,被发现的那刻就是清算。
429</div>
430
431<h2>4. 链上真实数据(3 笔顶级 tx)</h2>
432<p>所有数据来自 Solscan 的 transaction explorer。这三笔合计 <strong>$1.38M</strong>(占总额 46%),其余 6 笔是更小的尾单。</p>
433
434<table>
435 <thead>
436 <tr>
437 <th>#</th>
438 <th>利润 (USDC)</th>
439 <th>Slot</th>
440 <th>Bot 钱包</th>
441 <th>路径</th>
442 <th>抢量</th>
443 <th>消耗</th>
444 </tr>
445 </thead>
446 <tbody>
447 <tr>
448 <td>1</td>
449 <td class="num green">+$696,194</td>
450 <td>416936448</td>
451 <td><span class="addr">ESuvjv…cJbg8</span></td>
452 <td>USDC → ANX → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">3 跳,绕 ANX 中转</span></td>
453 <td>Jito 2.3 SOL<br/>($205)</td>
454 <td>1.25M CU</td>
455 </tr>
456 <tr>
457 <td>2</td>
458 <td class="num green">+$403,294</td>
459 <td>416936447</td>
460 <td><span class="addr">2QfBNK…nWW2T</span></td>
461 <td>USDC → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">2 跳,自定义 arb 程序 sattC</span></td>
462 <td>Priority<br/>0.5 SOL ($45)</td>
463 <td>0.65M CU</td>
464 </tr>
465 <tr>
466 <td>3</td>
467 <td class="num green">+$282,761</td>
468 <td>416936449</td>
469 <td><span class="addr">MRiYA4…JvoCsa</span></td>
470 <td>USDC → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">2 跳,nonce 账户 + 自定义 arb 程序</span></td>
471 <td>Jito 5 SOL<br/>($447)</td>
472 <td>0.36M CU</td>
473 </tr>
474 </tbody>
475</table>
476
477<h3>解剖 #1:$696,194 那一笔</h3>
478<p>这是单笔最大利润。<strong>3 跳路径</strong>,绕了一个中间币 ANX 来增加每一步的"汇率优势":</p>
479
480<ol class="steps">
481 <li><strong>付 $0.227 USDC,从 ANX-USDC DAMM v2 池换出 72,793 个 ANX</strong>(这就是 bot 唯一掏的"本金")</li>
482 <li><strong>把 72,793 ANX 塞进 ANX-ANB DAMM v2 池,换出 50,011,673 ANB</strong>(这步在正常池子完成,价格紧贴市价)</li>
483 <li><strong>把 50,011,673 ANB 塞进 stale 的 ANB-USDC DLMM 池,换出 $696,194 USDC</strong>(这就是 stale 池被薅的一刻)</li>
484 <li><strong>给 Jitotip 5 转 2.3 SOL($205)抢落地</strong></li>
485</ol>
486
487<p>整笔交易完成后,stale 池子的 USDC 余额从 <strong>$1,412,213 → $716,018</strong>,单笔被搬走 49%。</p>
488
489<div class="panel">
490 <strong>4 条指令,1 笔 atomic tx:</strong>
491 <pre style="margin:8px 0 0; color:var(--text-dim); font-size:13px; font-family:ui-monospace,monospace; overflow-x:auto;">
492#1 ComputeBudget: SetComputeUnitLimit
493#2 Meteora DAMM v2: swap2 ← USDC → ANX
494#3 Meteora DAMM v2: swap2 ← ANX → ANB
495#4 Meteora DLMM: swap2 ← ANB → USDC(stale 池)
496#5 System Program: transfer ← Jito tip 2.3 SOL
497 </pre>
498 <p style="margin:10px 0 0; color:var(--text-dim); font-size:13px;">使用了 3 个 Address Lookup Tables 压缩账户引用,否则 33 个账户塞不进 1232 字节的 tx 大小限制。</p>
499</div>
500
501<h2>5. 三种不同 bot 的策略对比</h2>
502<p>3 笔交易、3 个独立钱包、3 套差异显著的策略——这说明它们是 3 个独立团队同时盯到了这个池子:</p>
503
504<table>
505 <thead>
506 <tr>
507 <th></th>
508 <th>Bot 1(ESuvjv…)</th>
509 <th>Bot 2(2QfBNK…)</th>
510 <th>Bot 3(MRiYA4…)</th>
511 </tr>
512 </thead>
513 <tbody>
514 <tr><th>抢落地手段</th><td>Jito bundle + tip</td><td>纯 priority fee</td><td>Jito bundle + tip + nonce</td></tr>
515 <tr><th>路径长度</th><td>3 跳(绕 ANX)</td><td>2 跳</td><td>2 跳</td></tr>
516 <tr><th>程序结构</th><td>直接调 Meteora 程序</td><td>自定义 on-chain arb 程序<br/><span class="addr">sattC…</span></td><td>自定义 on-chain arb 程序<br/><span class="addr">AN225k…</span></td></tr>
517 <tr><th>付的"过路费"</th><td>$205 → Jito 验证者</td><td>$45 → 当 leader</td><td>$447 → Jito 验证者</td></tr>
518 <tr><th>本金 USDC</th><td>$0.227</td><td>$0.156</td><td>$0.127</td></tr>
519 <tr><th>毛利</th><td>$696,194</td><td>$403,294</td><td>$282,761</td></tr>
520 <tr><th>"过路费 / 毛利"</th><td>0.029%</td><td>0.011%</td><td>0.158%</td></tr>
521 </tbody>
522</table>
523
524<div class="callout">
525 <strong>有意思的是 Bot 3 的 tip 反而最高($447)但抢到的利润最少。</strong>原因可能是:池子被前两笔搬空了 696K + 403K = 1.1M,留给 Bot 3 的 USDC 只剩 ~580K,所以即便它愿意付更多 tip,可吃的肉本身已经少了。
526</div>
527
528<h2>6. Stale 池余额的"清算曲线"</h2>
529<figure>
530<svg viewBox="0 0 760 280" xmlns="http://www.w3.org/2000/svg">
531 <rect width="760" height="280" fill="url(#bg1)" rx="10"/>
532 <!-- Axes -->
533 <line x1="80" y1="40" x2="80" y2="220" stroke="#30363d" stroke-width="1"/>
534 <line x1="80" y1="220" x2="700" y2="220" stroke="#30363d" stroke-width="1"/>
535
536 <!-- Y labels -->
537 <text x="74" y="48" text-anchor="end" fill="#8b949e" font-size="10">$1.4M</text>
538 <text x="74" y="98" text-anchor="end" fill="#8b949e" font-size="10">$1.0M</text>
539 <text x="74" y="148" text-anchor="end" fill="#8b949e" font-size="10">$600K</text>
540 <text x="74" y="198" text-anchor="end" fill="#8b949e" font-size="10">$200K</text>
541 <text x="74" y="220" text-anchor="end" fill="#8b949e" font-size="10">$0</text>
542
543 <!-- X labels -->
544 <text x="160" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936447</text>
545 <text x="380" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936448</text>
546 <text x="600" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936449</text>
547
548 <!-- Bars showing pool USDC drain -->
549 <!-- Pre tx2: 2.18M -->
550 <rect x="100" y="40" width="120" height="180" fill="#3fb950" opacity="0.5"/>
551 <text x="160" y="58" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$2.18M</text>
552 <text x="160" y="32" text-anchor="middle" fill="#3fb950" font-size="10">事件前</text>
553
554 <!-- Post tx2: 1.77M (lost 403K) -->
555 <rect x="320" y="92" width="120" height="128" fill="#f7b955" opacity="0.6"/>
556 <text x="380" y="110" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$1.41M</text>
557 <text x="380" y="32" text-anchor="middle" fill="#f7b955" font-size="10">tx#2 后 (-$403K)</text>
558
559 <!-- Post tx1: 716K (lost 696K) -->
560 <rect x="540" y="170" width="60" height="50" fill="#f85149" opacity="0.7"/>
561 <text x="570" y="166" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$716K</text>
562 <text x="570" y="32" text-anchor="middle" fill="#f85149" font-size="10">tx#1 后 (-$696K)</text>
563
564 <!-- Post tx3: 298K (lost 282K) -->
565 <rect x="620" y="200" width="60" height="20" fill="#f85149" opacity="0.9"/>
566 <text x="650" y="195" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$298K</text>
567 <text x="650" y="32" text-anchor="middle" fill="#f85149" font-size="10">tx#3 后 (-$282K)</text>
568
569 <text x="380" y="266" text-anchor="middle" fill="#8b949e" font-size="11">Stale 池 USDC 余额(仅显示 3 笔最大 tx 的影响)</text>
570</svg>
571<figcaption>3 个连续 slot 内,USDC 从 $2.18M 跌到 $298K,跌幅 86%。剩余的 $298K 在后续 6 笔小 tx 里被分掉。</figcaption>
572</figure>
573
574<h2>7. 修正后的核心结论</h2>
575
576<div class="callout update">
577 <strong>方向修正:</strong>过期池套利可以走两个方向:
578 <ol style="margin:8px 0 0; padding-left:22px;">
579 <li>代币涨了,但 LP 把 X 代币挂在低价 bins 等卖 → bot 用 USDC 把廉价代币<strong>买光</strong>转手到市场。</li>
580 <li><strong>代币跌了,但 LP 把 USDC 挂在高价 bins 等买 → bot 用近乎为零成本的代币把高价 USDC <strong>赎光</strong></strong>(本次事件)</li>
581 </ol>
582 两种方向本质一致:DLMM 的 active bin 必须靠交易才能移动,没人交易就漂移成"过期"。
583</div>
584
585<h3>对 LP 的启示</h3>
586<p>提供 DLMM 集中流动性的人,必须明白挂出去的 bin 等价于<strong>限价订单簿</strong>。如果你挂在 active bin 下方放 USDC,等价于"愿意按这些价位买代币"——代币涨了你赚,代币归零你亏。如果代币只是冷门、流动性低,更没人会来推动 active bin。所以 LP 必须:</p>
587<ol style="padding-left:22px;">
588 <li>给 bins 设一个"我能接受的最低价格"和"最高价格"区间,超出就会暴露。</li>
589 <li>对低市值 / 高波动代币,至少每周检查一次,必要时用 SDK 调用 <code>removeLiquidity</code> 收回。</li>
590 <li>不要假设"价格往哪个方向走,DLMM 都能自适应"——它不会。</li>
591</ol>
592
593<h3>对套利者的启示</h3>
594<p>这种"反向 stale 池"在 Solana 链上数量比想象中多。扫描方法和 v1 报告里描述的一致:拉所有 DLMM 池 → 算出每个池子的 active bin 隐含价格 → 跟 Jupiter 聚合市价对比 → 价差超过阈值就放进监听清单。<strong>关键是阈值要双向:</strong></p>
595<ul style="padding-left:22px;">
596 <li>active bin 价 &gt;&gt; 市价:池子里 USDC 太贵,可以把代币塞进去赎 USDC(本次事件)</li>
597 <li>active bin 价 &lt;&lt; 市价:池子里代币太便宜,可以付 USDC 把代币买光(v1 描述的方向)</li>
598</ul>
599
600<h2>8. 一句话最终总结</h2>
601<div class="quote">
602 这次事件不是机器人"截胡了某个大额 swap",而是机器人发现了一个 LP 留下的"<strong>10 个月没人维护的限价单簿</strong>",用近乎为零的成本(几毛钱本金 + 几百美金 Jito tip)把这个限价单簿里的 USDC 一次性结清。鲸鱼不是 swap 用户,鲸鱼就是当初那个 LP——他亲手把钱挂在过期价位上 10 个月,等到第一个发现的人来收。
603</div>
604
605<footer>
606 <p>资料来源 ·
607 <a href="https://x.com/anshu_code/status/2051888998671581324" target="_blank">@anshu_code 主推</a> ·
608 <a href="https://x.com/anshu_code/status/2051889010621219025" target="_blank">9 笔交易清单</a> ·
609 Solscan:
610 <a href="https://solscan.io/tx/J8TY8VkjZpAAm78GwbnEE1xkBwGdheQ4C1VsZA7Cwcv1AyDw3PxTQJ3eWh9YZmZyLQnLD3fuHBsihXbX4sTATi8" target="_blank">$696K tx</a> ·
611 <a href="https://solscan.io/tx/3pb5512ttABHr8mKCM8MTfqTHqbQYxuFMQu8vrof6j24fdRz3LSp4LiLoNhbjtNec43UjFivQGTjjDEKaJ5AYhtx" target="_blank">$403K tx</a> ·
612 <a href="https://solscan.io/tx/5Z1zXUMKKrxmDfreMAFWTp11mwMxVqusbVSfbokUFURZ2xkYfUuXNzNuYMh2vn55eFDhGgHRkQEHRtoSr4i2sTah" target="_blank">$282K tx</a>
613 </p>
614 <p>本文为根据公开链上数据和推文做的技术拆解,不构成投资建议;过期池套利涉及极高的速度竞争与资金风险,复刻前请自行评估。</p>
615</footer>
616
617</div>
618</body>
619</html>
620