Skip to content

fix: Recover stranded ACX, UMA, DAI & WBTC from five spokes#3549

Open
droplet-rl wants to merge 2 commits into
masterfrom
droplet/T90K0AL22-C03HPEAU6E4-1783332185-625889
Open

fix: Recover stranded ACX, UMA, DAI & WBTC from five spokes#3549
droplet-rl wants to merge 2 commits into
masterfrom
droplet/T90K0AL22-C03HPEAU6E4-1783332185-625889

Conversation

@droplet-rl

@droplet-rl droplet-rl commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Second batch of #3531 (scripts/recoveries/2026-06-accounting). Same root cause: pre-SDK-4.4.0 HubPoolClient.getRunningBalanceBeforeBlockForChain returned an implicit-zero running balance whenever a pair's inter-bundle gap exceeded the dataworker lookback, physically stranding the prior balance on the spoke.

What this recovers

A single 8-leaf tree under relayerRefundRoot = 0x61bdfa33a7ff9f1d9fa48f189da3500a720858402c3507340b16f09eb7fe0fca, relayed to 5 chains (OP, Polygon, zkSync, Arbitrum, Blast):

leafId symbol chainId amount
0 UMA 10 2,104.084315
1 ACX 10 17,993.760800
2 UMA 137 4,166.163891
3 ACX 137 838.422581
4 DAI 324 70,005.067780
5 ACX 42161 5,857.586666
6 UMA 42161 1,130.009948
7 WBTC 81457 0.32694665

Totals: 24,689.77 ACX + 7,400.26 UMA + 70,005.07 DAI + 0.327 WBTC. Every amount reconciles to the wei against the forgotten running balances (README evidence table cites the carrying bundles' mainnet txs for all 14 documented resets). The ACX/UMA pairs are fully settled (running balances 0, wind-down sweeps executed); the leaves take the full spoke balances. zkSync DAI and Blast WBTC are still-active pairs; the leaves take only the orphaned excess (balanceOf − |runningBalance|), leaving the accounted portion untouched.

The DAI/WBTC additions come from a full audit of all 116 (chain, token) pairs that ever had a pool rebalance route (24 EVM chains, 2026-07-07) — no other reset-bug strandings exist beyond this tree.

Investigated, no leaf needed

  • LGHO/Lens: fully recovered (June leaf 5 + the 2026-07-06 accounted sweep, both landed; Lens spoke holds zero).

Deliberately excluded (pending scope decision)

  • POOL on Scroll: 715.653803 POOL, same bug, wei-exact evidence.
  • BADGER: 20.267294 on the Ethereum spoke (route removed July 2022 with the running balance never returned) + 10.0 unaccounted on Arbitrum + a 20.224242 unpaid refund liability (positive running balance, pre-dates the reset bug).

Verification

yarn ts-node scripts/recoveries/2026-07-accounting/verify.ts

rebuilds the tree, checks the root, every proof, UMIP ordering and leafId sequencing (output: ✓ all valid). The README documents the expected Safe transaction shape (5 SpokePoolAdminFunctionTriggered events, payload 0x493a4f84 ++ root ++ 0x00…00), per-chain topics, and pre-sign balance re-check steps for the two active pairs.

🤖 Generated with Claude Code

Second batch of the 2026-06-accounting recovery. The same pre-SDK-4.4.0
getRunningBalanceBeforeBlockForChain bug (implicit-zero running balance
after inactivity gaps exceeding the dataworker lookback) stranded
24,689.77 ACX and 7,400.26 UMA across the OP, Polygon and Arbitrum
SpokePools. Every leaf amount reconciles to the wei against the forgotten
running balances documented in the README.

LGHO (Lens) was investigated and needs no leaf: the June leaf plus the
2026-07-06 accounted sweep recovered everything; the Lens spoke now holds
zero WGHO/GHO. POOL on Scroll (715.65) remains stranded but is excluded
from this batch; it can be appended as leaf 6 without disturbing the tree
prefix.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full audit of all 116 (chain, token) pool-rebalance-route pairs surfaced
two more reset-bug orphans: 70,005.067780 DAI on zkSync (38d gap, reset
~2026-04) and 0.32694665 WBTC on Blast (two resets, 39d + 47d gaps).
Both reconcile to the wei as spoke balance minus accounted running
balance. Tree grows to 8 leaves across 5 chains; new root documented
with updated Safe verification payload and per-chain topics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@droplet-rl droplet-rl changed the title fix: Recover stranded ACX & UMA from OP, Polygon and Arbitrum spokes fix: Recover stranded ACX, UMA, DAI & WBTC from five spokes Jul 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant