meteora_stale_pool_arb.html
· 29 KiB · HTML
Исходник
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>299 万美金、150 秒、9 笔交易 —— 一个 Meteora 旧池子被反向 rug 的链上拆解</title>
<style>
:root {
--bg: #0d1117;
--panel: #161b22;
--panel2: #1c2330;
--border: #30363d;
--text: #e6edf3;
--text-dim: #8b949e;
--accent: #f7b955;
--accent2: #58a6ff;
--green: #3fb950;
--red: #f85149;
--purple: #bc8cff;
}
* { box-sizing: border-box; }
html, body {
margin: 0; padding: 0;
background: var(--bg);
color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
"Hiragino Sans GB", "Microsoft YaHei", sans-serif;
line-height: 1.7;
}
.wrap {
max-width: 960px;
margin: 0 auto;
padding: 48px 28px 96px;
}
header {
border-bottom: 1px solid var(--border);
padding-bottom: 28px;
margin-bottom: 36px;
}
.tag {
display: inline-block;
background: rgba(247, 185, 85, 0.12);
color: var(--accent);
padding: 4px 12px;
border-radius: 999px;
font-size: 12px;
letter-spacing: 0.04em;
text-transform: uppercase;
margin-bottom: 16px;
border: 1px solid rgba(247, 185, 85, 0.3);
}
.tag.verified {
background: rgba(63, 185, 80, 0.12);
color: var(--green);
border-color: rgba(63, 185, 80, 0.3);
margin-left: 8px;
}
h1 {
font-size: 32px;
line-height: 1.3;
margin: 0 0 14px;
font-weight: 700;
letter-spacing: -0.01em;
}
.subtitle {
color: var(--text-dim);
font-size: 16px;
margin: 0;
}
h2 {
font-size: 22px;
margin: 56px 0 14px;
padding-left: 12px;
border-left: 4px solid var(--accent);
}
h3 {
font-size: 17px;
margin: 28px 0 10px;
color: var(--accent2);
}
p { margin: 12px 0; }
code {
background: var(--panel2);
border: 1px solid var(--border);
padding: 1px 6px;
border-radius: 4px;
font-size: 13px;
color: var(--accent);
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
word-break: break-all;
}
.stats {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin: 28px 0;
}
.stat {
background: var(--panel);
border: 1px solid var(--border);
border-radius: 10px;
padding: 18px 16px;
text-align: center;
}
.stat .num {
font-size: 26px;
font-weight: 700;
color: var(--accent);
margin-bottom: 4px;
font-variant-numeric: tabular-nums;
}
.stat .lbl {
color: var(--text-dim);
font-size: 12.5px;
}
.quote {
background: var(--panel);
border-left: 3px solid var(--accent2);
padding: 16px 20px;
border-radius: 0 8px 8px 0;
color: var(--text);
font-size: 15px;
margin: 18px 0;
}
.quote .src {
display: block;
margin-top: 8px;
color: var(--text-dim);
font-size: 12.5px;
}
.panel {
background: var(--panel);
border: 1px solid var(--border);
border-radius: 12px;
padding: 22px 24px;
margin: 22px 0;
}
figure {
margin: 22px 0;
background: var(--panel);
border: 1px solid var(--border);
border-radius: 12px;
padding: 22px 18px 14px;
}
figcaption {
color: var(--text-dim);
font-size: 13px;
text-align: center;
margin-top: 10px;
}
svg { display: block; max-width: 100%; height: auto; margin: 0 auto; }
table {
width: 100%;
border-collapse: collapse;
margin: 18px 0;
font-size: 13.5px;
}
th, td {
padding: 10px 12px;
border-bottom: 1px solid var(--border);
text-align: left;
vertical-align: top;
}
th {
background: var(--panel2);
color: var(--text-dim);
font-weight: 600;
font-size: 13px;
text-transform: uppercase;
letter-spacing: 0.03em;
}
td.num { font-variant-numeric: tabular-nums; text-align: right; }
td.green { color: var(--green); }
td.red { color: var(--red); }
ol.steps {
counter-reset: s;
list-style: none;
padding: 0;
}
ol.steps > li {
counter-increment: s;
position: relative;
padding: 14px 18px 14px 56px;
margin: 10px 0;
background: var(--panel);
border: 1px solid var(--border);
border-radius: 10px;
}
ol.steps > li::before {
content: counter(s);
position: absolute;
left: 16px;
top: 14px;
width: 28px;
height: 28px;
border-radius: 50%;
background: var(--accent);
color: #1d1300;
font-weight: 700;
text-align: center;
line-height: 28px;
font-size: 14px;
}
.callout {
background: rgba(88, 166, 255, 0.08);
border: 1px solid rgba(88, 166, 255, 0.3);
border-radius: 10px;
padding: 14px 18px;
margin: 18px 0;
color: var(--text);
font-size: 14.5px;
}
.callout.warn {
background: rgba(248, 81, 73, 0.08);
border-color: rgba(248, 81, 73, 0.3);
}
.callout.update {
background: rgba(247, 185, 85, 0.08);
border-color: rgba(247, 185, 85, 0.3);
}
.callout strong { color: var(--accent2); }
.callout.warn strong { color: var(--red); }
.callout.update strong { color: var(--accent); }
footer {
margin-top: 64px;
padding-top: 24px;
border-top: 1px solid var(--border);
color: var(--text-dim);
font-size: 13px;
}
footer a { color: var(--accent2); text-decoration: none; }
footer a:hover { text-decoration: underline; }
.addr {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 12px;
color: var(--accent2);
word-break: break-all;
}
@media (max-width: 640px) {
.wrap { padding: 28px 16px 64px; }
h1 { font-size: 24px; }
.stats { grid-template-columns: repeat(2, 1fr); }
}
</style>
</head>
<body>
<div class="wrap">
<header>
<span class="tag">Solana · MEV · Stale Pool</span>
<span class="tag verified">已用 Solscan 验证 · v2</span>
<h1>299 万美金、150 秒、9 笔交易<br/>—— 一个 Meteora 旧池子被「反向 rug」的链上拆解</h1>
<p class="subtitle">事件发生于 2026-05-01 19:06:54 UTC(slot 416936447 起 3 个连续 slot)。本文基于 Solscan 链上真实数据复盘,颠覆了对"过期池套利"方向的常见误解。</p>
</header>
<section>
<div class="stats">
<div class="stat"><div class="num">$2.99M</div><div class="lbl">总抽走金额</div></div>
<div class="stat"><div class="num">150s</div><div class="lbl">总耗时</div></div>
<div class="stat"><div class="num">3 + 4</div><div class="lbl">主力 + 散兵 bot</div></div>
<div class="stat"><div class="num">10 个月</div><div class="lbl">DLMM 池子未维护</div></div>
</div>
<div class="quote">
"$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."
<span class="src">—— @anshu_code, X / 2026-05-06</span>
</div>
<div class="callout update">
<strong>v2 更新说明:</strong>本报告 v1 基于推文文字推理,方向<strong>讲反了</strong>。链上实测后已修正:stale 池子里装的不是"等卖的便宜代币",而是"愿意高价收购废纸的 USDC"。机器人不是去捡便宜币,是去把<strong>近乎归零的代币塞进去换真金白银</strong>。下文 §3-§5 全部基于 Solscan 实测数据。
</div>
</section>
<h2>1. 事件一句话总结</h2>
<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>
<h2>2. 这次的"鲸鱼"是谁,钱是怎么流的?</h2>
<p>推文里说的"1 whale, 6 bots, 9 transactions"——这里的 whale <strong>不是来 swap 的大户</strong>,而是池子的 LP 本人。机器人不是从某个交易者身上薅羊毛,而是<strong>直接把 LP 当年存进去的 USDC 一捆捆拎走</strong>。</p>
<figure>
<svg viewBox="0 0 880 380" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="bg1" x1="0" x2="0" y1="0" y2="1">
<stop offset="0" stop-color="#1c2330"/>
<stop offset="1" stop-color="#161b22"/>
</linearGradient>
<marker id="arrow" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
<path d="M0,0 L8,3 L0,6 z" fill="#f7b955"/>
</marker>
<marker id="arrow_red" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto">
<path d="M0,0 L8,3 L0,6 z" fill="#f85149"/>
</marker>
</defs>
<rect width="880" height="380" fill="url(#bg1)" rx="10"/>
<!-- LP -->
<rect x="40" y="40" width="170" height="80" fill="#0d1117" stroke="#bc8cff" stroke-width="1.5" rx="10"/>
<text x="125" y="65" text-anchor="middle" fill="#bc8cff" font-size="14" font-weight="700">"鲸鱼" = LP</text>
<text x="125" y="85" text-anchor="middle" fill="#e6edf3" font-size="11">10 个月前</text>
<text x="125" y="103" text-anchor="middle" fill="#bc8cff" font-size="13" font-weight="700">灌入 ≥ $1.4M USDC</text>
<!-- Stale Pool -->
<rect x="320" y="20" width="240" height="120" fill="#0d1117" stroke="#f85149" stroke-width="2" rx="10"/>
<text x="440" y="48" text-anchor="middle" fill="#f85149" font-size="14" font-weight="700">ANB-USDC DLMM 池子</text>
<text x="440" y="70" text-anchor="middle" fill="#e6edf3" font-size="11">USDC 沉睡在高价 bins</text>
<text x="440" y="92" text-anchor="middle" fill="#8b949e" font-size="11">愿意按 $0.01/ANB 收购</text>
<text x="440" y="114" text-anchor="middle" fill="#f85149" font-size="11">(真实市价仅 $0.0000113)</text>
<text x="440" y="132" text-anchor="middle" fill="#f85149" font-size="11" font-weight="700">10 个月没人动它</text>
<!-- Arrow LP → Pool -->
<line x1="210" y1="80" x2="316" y2="80" stroke="#bc8cff" stroke-width="2" marker-end="url(#arrow)"/>
<!-- Source pool (cheap ANB) -->
<rect x="320" y="180" width="240" height="80" fill="#0d1117" stroke="#3fb950" stroke-width="1.5" rx="10"/>
<text x="440" y="208" text-anchor="middle" fill="#3fb950" font-size="14" font-weight="700">ANB-USDC DAMM v2</text>
<text x="440" y="230" text-anchor="middle" fill="#e6edf3" font-size="11">价格紧贴市价</text>
<text x="440" y="250" text-anchor="middle" fill="#3fb950" font-size="11">$0.20 USDC ≈ 25M ANB</text>
<!-- Bots -->
<rect x="660" y="40" width="180" height="80" fill="#0d1117" stroke="#f7b955" stroke-width="1.5" rx="10"/>
<text x="750" y="65" text-anchor="middle" fill="#f7b955" font-size="14" font-weight="700">7 个套利 bot</text>
<text x="750" y="85" text-anchor="middle" fill="#e6edf3" font-size="11">总投入 ≈ $1.5 USDC</text>
<text x="750" y="105" text-anchor="middle" fill="#f7b955" font-size="13" font-weight="700">总取出 ≈ $2.99M USDC</text>
<!-- Bot to source pool -->
<line x1="660" y1="105" x2="565" y2="200" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)"/>
<text x="640" y="160" fill="#f7b955" font-size="11">① 用几毛钱</text>
<text x="640" y="178" fill="#f7b955" font-size="11">买几千万 ANB</text>
<!-- Bot to stale pool -->
<line x1="565" y1="105" x2="660" y2="80" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)" stroke-dasharray="0"/>
<text x="563" y="158" fill="#f7b955" font-size="11" text-anchor="end">② 把 ANB 砸进 stale 池</text>
<text x="563" y="176" fill="#f7b955" font-size="11" text-anchor="end">换出 $282K-$696K USDC</text>
<!-- ANB to stale pool arrow -->
<line x1="440" y1="180" x2="440" y2="142" stroke="#f7b955" stroke-width="2" marker-end="url(#arrow)" stroke-dasharray="4 3"/>
<!-- Bot grabs USDC -->
<line x1="558" y1="78" x2="660" y2="65" stroke="#f85149" stroke-width="2" marker-end="url(#arrow_red)"/>
<!-- Footer -->
<line x1="40" y1="305" x2="840" y2="305" stroke="#30363d" stroke-width="1" stroke-dasharray="3 3"/>
<text x="40" y="333" fill="#8b949e" font-size="12">资金净流向:</text>
<text x="160" y="333" fill="#bc8cff" font-size="12" font-weight="700">LP(whale)的 USDC</text>
<text x="320" y="333" fill="#8b949e" font-size="12">→</text>
<text x="345" y="333" fill="#f85149" font-size="12" font-weight="700">stale DLMM 池</text>
<text x="465" y="333" fill="#8b949e" font-size="12">→</text>
<text x="490" y="333" fill="#f7b955" font-size="12" font-weight="700">套利 bots</text>
<text x="40" y="358" fill="#8b949e" font-size="11">机器人付出的成本只有:base fee + Jito tip + 几毛钱用来买 ANB;剩下全是利润。</text>
</svg>
<figcaption>真实链上资金流:LP 当年灌入的 USDC,10 个月后被机器人用近乎为零的成本「赎」走。</figcaption>
</figure>
<h2>3. Stale 池子结构(修正版)</h2>
<p>这次的关键是:池子里"过期"的不是代币,是 <strong>USDC</strong>。LP 当时挂的是"<em>限价买单</em>"——把 USDC 塞在 active bin 下方,挂在 ANB = $0.005、$0.01、$0.05 这种<strong>它认为合理</strong>的价格上。ANB 价格崩了 1000 倍后,这些 USDC 还在原位,等着按"老价格"收购 ANB。</p>
<figure>
<svg viewBox="0 0 880 360" xmlns="http://www.w3.org/2000/svg">
<rect width="880" height="360" fill="url(#bg1)" rx="10"/>
<!-- Title -->
<text x="440" y="34" text-anchor="middle" fill="#e6edf3" font-size="15" font-weight="700">DLMM bins 真实分布(创建时 vs 被发现时)</text>
<!-- LP setup time -->
<text x="40" y="78" fill="#bc8cff" font-size="13" font-weight="700">10 个月前 · LP 设置时</text>
<text x="40" y="96" fill="#8b949e" font-size="11">假设当时 ANB 市价 ≈ $0.01</text>
<g>
<rect x="40" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="95" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="150" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="205" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="260" y="110" width="50" height="60" fill="#f7b955" rx="3"/>
<rect x="315" y="110" width="50" height="60" fill="#bc8cff" opacity="0.6" rx="3"/>
<text x="65" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.005</text>
<text x="120" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.007</text>
<text x="175" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.008</text>
<text x="230" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.009</text>
<text x="285" y="188" text-anchor="middle" fill="#f7b955" font-size="10" font-weight="700">$0.01</text>
<text x="340" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.012</text>
<text x="65" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="120" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="175" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="230" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
</g>
<text x="40" y="220" fill="#8b949e" font-size="11">↑ active bin 在 $0.01 · 下方 4 格 USDC 等买</text>
<!-- 10 months later -->
<text x="480" y="78" fill="#f85149" font-size="13" font-weight="700">10 个月后 · 被发现时</text>
<text x="480" y="96" fill="#8b949e" font-size="11">真实市价跌到 $0.0000113,但池子……</text>
<g>
<rect x="480" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="535" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="590" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="645" y="110" width="50" height="60" fill="#3fb950" opacity="0.85" rx="3"/>
<rect x="700" y="110" width="50" height="60" fill="#f7b955" rx="3"/>
<rect x="755" y="110" width="50" height="60" fill="#bc8cff" opacity="0.6" rx="3"/>
<text x="505" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.005</text>
<text x="560" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.007</text>
<text x="615" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.008</text>
<text x="670" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.009</text>
<text x="725" y="188" text-anchor="middle" fill="#f7b955" font-size="10" font-weight="700">$0.01</text>
<text x="780" y="188" text-anchor="middle" fill="#8b949e" font-size="10">$0.012</text>
<text x="505" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="560" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="615" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
<text x="670" y="142" text-anchor="middle" fill="#fff" font-size="11">USDC</text>
</g>
<text x="480" y="220" fill="#f85149" font-size="11" font-weight="700">↑ active bin 还在 $0.01 · 下方 USDC 一动没动</text>
<text x="480" y="238" fill="#f85149" font-size="11">外部市价已是 $0.0000113,池子按 $0.005-$0.01 一个收</text>
<!-- Arrow connecting -->
<line x1="380" y1="140" x2="476" y2="140" stroke="#8b949e" stroke-width="1.5" stroke-dasharray="3 3" marker-end="url(#arrow)"/>
<text x="428" y="135" text-anchor="middle" fill="#8b949e" font-size="11">10 个月没人交易</text>
<text x="428" y="155" text-anchor="middle" fill="#8b949e" font-size="11">active bin 不动</text>
<!-- Bot exploit arrow -->
<text x="640" y="280" text-anchor="middle" fill="#f7b955" font-size="13" font-weight="700">套利 bot 发现:</text>
<text x="640" y="300" text-anchor="middle" fill="#e6edf3" font-size="12">"我手里 50M ANB 在外面只值 $565,"</text>
<text x="640" y="320" text-anchor="middle" fill="#e6edf3" font-size="12">"塞进这个池子能换到 $696,194 的 USDC"</text>
<text x="640" y="340" text-anchor="middle" fill="#f7b955" font-size="12" font-weight="700">→ 一笔 atomic tx 全部搞定</text>
</svg>
<figcaption>关键洞察:DLMM 的"stale"是双向的——这次过期的方向是 USDC bins 在等高价收 ANB,机器人对它做的是「砸盘式套利」而非「捡漏式套利」。</figcaption>
</figure>
<div class="callout warn">
<strong>所以:</strong>"代币涨了为什么 bin 还能低价存在"这个问题,在这个事件里其实反过来——是<strong>代币归零了,bin 还在按高价收</strong>。本质都是一回事:<em>DLMM 的 active bin 必须有交易才会移动,外部价格变化跟池子无关</em>。漂移可以是任意方向,stale 一旦形成,被发现的那刻就是清算。
</div>
<h2>4. 链上真实数据(3 笔顶级 tx)</h2>
<p>所有数据来自 Solscan 的 transaction explorer。这三笔合计 <strong>$1.38M</strong>(占总额 46%),其余 6 笔是更小的尾单。</p>
<table>
<thead>
<tr>
<th>#</th>
<th>利润 (USDC)</th>
<th>Slot</th>
<th>Bot 钱包</th>
<th>路径</th>
<th>抢量</th>
<th>消耗</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td class="num green">+$696,194</td>
<td>416936448</td>
<td><span class="addr">ESuvjv…cJbg8</span></td>
<td>USDC → ANX → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">3 跳,绕 ANX 中转</span></td>
<td>Jito 2.3 SOL<br/>($205)</td>
<td>1.25M CU</td>
</tr>
<tr>
<td>2</td>
<td class="num green">+$403,294</td>
<td>416936447</td>
<td><span class="addr">2QfBNK…nWW2T</span></td>
<td>USDC → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">2 跳,自定义 arb 程序 sattC</span></td>
<td>Priority<br/>0.5 SOL ($45)</td>
<td>0.65M CU</td>
</tr>
<tr>
<td>3</td>
<td class="num green">+$282,761</td>
<td>416936449</td>
<td><span class="addr">MRiYA4…JvoCsa</span></td>
<td>USDC → ANB → USDC<br/><span style="color:var(--text-dim); font-size:12px">2 跳,nonce 账户 + 自定义 arb 程序</span></td>
<td>Jito 5 SOL<br/>($447)</td>
<td>0.36M CU</td>
</tr>
</tbody>
</table>
<h3>解剖 #1:$696,194 那一笔</h3>
<p>这是单笔最大利润。<strong>3 跳路径</strong>,绕了一个中间币 ANX 来增加每一步的"汇率优势":</p>
<ol class="steps">
<li><strong>付 $0.227 USDC,从 ANX-USDC DAMM v2 池换出 72,793 个 ANX</strong>(这就是 bot 唯一掏的"本金")</li>
<li><strong>把 72,793 ANX 塞进 ANX-ANB DAMM v2 池,换出 50,011,673 ANB</strong>(这步在正常池子完成,价格紧贴市价)</li>
<li><strong>把 50,011,673 ANB 塞进 stale 的 ANB-USDC DLMM 池,换出 $696,194 USDC</strong>(这就是 stale 池被薅的一刻)</li>
<li><strong>给 Jitotip 5 转 2.3 SOL($205)抢落地</strong></li>
</ol>
<p>整笔交易完成后,stale 池子的 USDC 余额从 <strong>$1,412,213 → $716,018</strong>,单笔被搬走 49%。</p>
<div class="panel">
<strong>4 条指令,1 笔 atomic tx:</strong>
<pre style="margin:8px 0 0; color:var(--text-dim); font-size:13px; font-family:ui-monospace,monospace; overflow-x:auto;">
#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
</pre>
<p style="margin:10px 0 0; color:var(--text-dim); font-size:13px;">使用了 3 个 Address Lookup Tables 压缩账户引用,否则 33 个账户塞不进 1232 字节的 tx 大小限制。</p>
</div>
<h2>5. 三种不同 bot 的策略对比</h2>
<p>3 笔交易、3 个独立钱包、3 套差异显著的策略——这说明它们是 3 个独立团队同时盯到了这个池子:</p>
<table>
<thead>
<tr>
<th></th>
<th>Bot 1(ESuvjv…)</th>
<th>Bot 2(2QfBNK…)</th>
<th>Bot 3(MRiYA4…)</th>
</tr>
</thead>
<tbody>
<tr><th>抢落地手段</th><td>Jito bundle + tip</td><td>纯 priority fee</td><td>Jito bundle + tip + nonce</td></tr>
<tr><th>路径长度</th><td>3 跳(绕 ANX)</td><td>2 跳</td><td>2 跳</td></tr>
<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>
<tr><th>付的"过路费"</th><td>$205 → Jito 验证者</td><td>$45 → 当 leader</td><td>$447 → Jito 验证者</td></tr>
<tr><th>本金 USDC</th><td>$0.227</td><td>$0.156</td><td>$0.127</td></tr>
<tr><th>毛利</th><td>$696,194</td><td>$403,294</td><td>$282,761</td></tr>
<tr><th>"过路费 / 毛利"</th><td>0.029%</td><td>0.011%</td><td>0.158%</td></tr>
</tbody>
</table>
<div class="callout">
<strong>有意思的是 Bot 3 的 tip 反而最高($447)但抢到的利润最少。</strong>原因可能是:池子被前两笔搬空了 696K + 403K = 1.1M,留给 Bot 3 的 USDC 只剩 ~580K,所以即便它愿意付更多 tip,可吃的肉本身已经少了。
</div>
<h2>6. Stale 池余额的"清算曲线"</h2>
<figure>
<svg viewBox="0 0 760 280" xmlns="http://www.w3.org/2000/svg">
<rect width="760" height="280" fill="url(#bg1)" rx="10"/>
<!-- Axes -->
<line x1="80" y1="40" x2="80" y2="220" stroke="#30363d" stroke-width="1"/>
<line x1="80" y1="220" x2="700" y2="220" stroke="#30363d" stroke-width="1"/>
<!-- Y labels -->
<text x="74" y="48" text-anchor="end" fill="#8b949e" font-size="10">$1.4M</text>
<text x="74" y="98" text-anchor="end" fill="#8b949e" font-size="10">$1.0M</text>
<text x="74" y="148" text-anchor="end" fill="#8b949e" font-size="10">$600K</text>
<text x="74" y="198" text-anchor="end" fill="#8b949e" font-size="10">$200K</text>
<text x="74" y="220" text-anchor="end" fill="#8b949e" font-size="10">$0</text>
<!-- X labels -->
<text x="160" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936447</text>
<text x="380" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936448</text>
<text x="600" y="240" text-anchor="middle" fill="#8b949e" font-size="11">slot 416936449</text>
<!-- Bars showing pool USDC drain -->
<!-- Pre tx2: 2.18M -->
<rect x="100" y="40" width="120" height="180" fill="#3fb950" opacity="0.5"/>
<text x="160" y="58" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$2.18M</text>
<text x="160" y="32" text-anchor="middle" fill="#3fb950" font-size="10">事件前</text>
<!-- Post tx2: 1.77M (lost 403K) -->
<rect x="320" y="92" width="120" height="128" fill="#f7b955" opacity="0.6"/>
<text x="380" y="110" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$1.41M</text>
<text x="380" y="32" text-anchor="middle" fill="#f7b955" font-size="10">tx#2 后 (-$403K)</text>
<!-- Post tx1: 716K (lost 696K) -->
<rect x="540" y="170" width="60" height="50" fill="#f85149" opacity="0.7"/>
<text x="570" y="166" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$716K</text>
<text x="570" y="32" text-anchor="middle" fill="#f85149" font-size="10">tx#1 后 (-$696K)</text>
<!-- Post tx3: 298K (lost 282K) -->
<rect x="620" y="200" width="60" height="20" fill="#f85149" opacity="0.9"/>
<text x="650" y="195" text-anchor="middle" fill="#fff" font-size="11" font-weight="700">$298K</text>
<text x="650" y="32" text-anchor="middle" fill="#f85149" font-size="10">tx#3 后 (-$282K)</text>
<text x="380" y="266" text-anchor="middle" fill="#8b949e" font-size="11">Stale 池 USDC 余额(仅显示 3 笔最大 tx 的影响)</text>
</svg>
<figcaption>3 个连续 slot 内,USDC 从 $2.18M 跌到 $298K,跌幅 86%。剩余的 $298K 在后续 6 笔小 tx 里被分掉。</figcaption>
</figure>
<h2>7. 修正后的核心结论</h2>
<div class="callout update">
<strong>方向修正:</strong>过期池套利可以走两个方向:
<ol style="margin:8px 0 0; padding-left:22px;">
<li>代币涨了,但 LP 把 X 代币挂在低价 bins 等卖 → bot 用 USDC 把廉价代币<strong>买光</strong>转手到市场。</li>
<li><strong>代币跌了,但 LP 把 USDC 挂在高价 bins 等买 → bot 用近乎为零成本的代币把高价 USDC <strong>赎光</strong>。</strong>(本次事件)</li>
</ol>
两种方向本质一致:DLMM 的 active bin 必须靠交易才能移动,没人交易就漂移成"过期"。
</div>
<h3>对 LP 的启示</h3>
<p>提供 DLMM 集中流动性的人,必须明白挂出去的 bin 等价于<strong>限价订单簿</strong>。如果你挂在 active bin 下方放 USDC,等价于"愿意按这些价位买代币"——代币涨了你赚,代币归零你亏。如果代币只是冷门、流动性低,更没人会来推动 active bin。所以 LP 必须:</p>
<ol style="padding-left:22px;">
<li>给 bins 设一个"我能接受的最低价格"和"最高价格"区间,超出就会暴露。</li>
<li>对低市值 / 高波动代币,至少每周检查一次,必要时用 SDK 调用 <code>removeLiquidity</code> 收回。</li>
<li>不要假设"价格往哪个方向走,DLMM 都能自适应"——它不会。</li>
</ol>
<h3>对套利者的启示</h3>
<p>这种"反向 stale 池"在 Solana 链上数量比想象中多。扫描方法和 v1 报告里描述的一致:拉所有 DLMM 池 → 算出每个池子的 active bin 隐含价格 → 跟 Jupiter 聚合市价对比 → 价差超过阈值就放进监听清单。<strong>关键是阈值要双向:</strong></p>
<ul style="padding-left:22px;">
<li>active bin 价 >> 市价:池子里 USDC 太贵,可以把代币塞进去赎 USDC(本次事件)</li>
<li>active bin 价 << 市价:池子里代币太便宜,可以付 USDC 把代币买光(v1 描述的方向)</li>
</ul>
<h2>8. 一句话最终总结</h2>
<div class="quote">
这次事件不是机器人"截胡了某个大额 swap",而是机器人发现了一个 LP 留下的"<strong>10 个月没人维护的限价单簿</strong>",用近乎为零的成本(几毛钱本金 + 几百美金 Jito tip)把这个限价单簿里的 USDC 一次性结清。鲸鱼不是 swap 用户,鲸鱼就是当初那个 LP——他亲手把钱挂在过期价位上 10 个月,等到第一个发现的人来收。
</div>
<footer>
<p>资料来源 ·
<a href="https://x.com/anshu_code/status/2051888998671581324" target="_blank">@anshu_code 主推</a> ·
<a href="https://x.com/anshu_code/status/2051889010621219025" target="_blank">9 笔交易清单</a> ·
Solscan:
<a href="https://solscan.io/tx/J8TY8VkjZpAAm78GwbnEE1xkBwGdheQ4C1VsZA7Cwcv1AyDw3PxTQJ3eWh9YZmZyLQnLD3fuHBsihXbX4sTATi8" target="_blank">$696K tx</a> ·
<a href="https://solscan.io/tx/3pb5512ttABHr8mKCM8MTfqTHqbQYxuFMQu8vrof6j24fdRz3LSp4LiLoNhbjtNec43UjFivQGTjjDEKaJ5AYhtx" target="_blank">$403K tx</a> ·
<a href="https://solscan.io/tx/5Z1zXUMKKrxmDfreMAFWTp11mwMxVqusbVSfbokUFURZ2xkYfUuXNzNuYMh2vn55eFDhGgHRkQEHRtoSr4i2sTah" target="_blank">$282K tx</a>
</p>
<p>本文为根据公开链上数据和推文做的技术拆解,不构成投资建议;过期池套利涉及极高的速度竞争与资金风险,复刻前请自行评估。</p>
</footer>
</div>
</body>
</html>
| 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 价 >> 市价:池子里 USDC 太贵,可以把代币塞进去赎 USDC(本次事件)</li> |
| 597 | <li>active bin 价 << 市价:池子里代币太便宜,可以付 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 |