fix: Recover stranded ACX, UMA, DAI & WBTC from five spokes#3549
Open
droplet-rl wants to merge 2 commits into
Open
fix: Recover stranded ACX, UMA, DAI & WBTC from five spokes#3549droplet-rl wants to merge 2 commits into
droplet-rl wants to merge 2 commits into
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Second batch of #3531 (
scripts/recoveries/2026-06-accounting). Same root cause: pre-SDK-4.4.0HubPoolClient.getRunningBalanceBeforeBlockForChainreturned 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):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
Deliberately excluded (pending scope decision)
Verification
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
SpokePoolAdminFunctionTriggeredevents, payload0x493a4f84 ++ root ++ 0x00…00), per-chain topics, and pre-sign balance re-check steps for the two active pairs.🤖 Generated with Claude Code