THORChain 3.19 · ADR-028 · Migrate15to16 · snapshot 2026-05-25

Conciliation Ledger

Vault 2v28 zeroed → POL → Reserve synths → Savers → Treasury LP · attacker bond burned (635,331 RUNE already in reserve, block 26,295,441) · POL total value 4,157,429 RUNE · reserve synths 5,866,466 DOGE + 47,459 USDC + 27,022 USDT · Q15 ✅ Q17 ✅

Waterfall — step summary

Step 0
Zero vault 2v28
First migration action: set all vault.Coins[2v28] to 0 and call keeper.SetVault. Shortfall is then computed with vault 2v28 contributing nothing to vault_L1. No matching existing event type — logged to ctx.Logger() only. L1 assets churn to new vault operationally.
keeper.SetVault · log only
Step 1
POL haircut
Reduce pool.BalanceAsset and pool.BalanceRune by the per-pool shortfall. Burn ΔR from Asgard (mandatory bank pairing). Solve RUNEPool.ReserveUnits so providers stay whole; reserve absorbs the full POL loss. ReserveUnits adjustment logged only (no existing event type).
pool_balance_change · mint_burn reason:"adr028_pol_haircut"
Step 2
Reserve synth burn
Burn reserve module's synth bank balances against remaining shortfall. 5,866,466 DOGE · 47,459 USDC · 27,022 USDT · 143 BNB · 1,133 AVAX · 136 LTC + dust. No RUNE consumed — reserve's 9.33M RUNE bank is off-limits here.
mint_burn reason:"adr028_reserve_synth"
Step 3
Savers haircut
Pro-rata reduce saver.Units, savers pool depth, and burn the released synth supply from Asgard. Savers-owned synths only — free-floating holders (Rujira, swap-derived) unaffected.
pool_balance_change · mint_burn reason:"adr028_saver_haircut"
Step 4 · confirmed
Treasury LP draw
For each asset still uncovered after steps 1–3 (BSC.USDC, BSC.USDT, and any asset with 0 savers): reduce treasury LP units pro-rata and pool.BalanceAsset/Rune, burn ΔR from Asgard. Same pool mechanics as step 1.
pool_balance_change · mint_burn reason:"adr028_treasury_draw"
Fallback
Pool depth loss
Uncovered residual stays as reduced pool.BalanceAsset — absorbed pro-rata by remaining LPs of each pool. No explicit mutation beyond step 1 writes.
LPs absorb

Per-asset absorption · all pools · snapshot 2026-05-25

POL total value
4,157,429 RUNE
PnL −1,842,573 RUNE (−30%)
Reserve POL share
2,318,016 RUNE
3,113,877 units · 55.76%
Depositor share
1,839,413 RUNE
2,470,952 units · 44.24%
Reserve RUNE bank
9,330,671 RUNE
+635,331 slashed bond (to burn)
asset shortfall step 1 POL drain step 2 reserve burn after step 2 savers depth savers / total synths step 3 haircut step 4 treasury
ETH.XRUNE 73,253,586 73,253,586 0 0% treasury
DOGE.DOGE 3,464,758 72,302 3,392,456 0 12,239,813 67.5% 0
ETH.THOR 3,208,326 3,208,326 0 0% treasury
ETH.USDT 1,136,651 198,410 27,022 911,218 3,515,725 98.2% 2591
ETH.TGT 779,500 779,500 0 0% treasury
ETH.FOX 476,224 476,224 0 0% treasury
BSC.USDC 273,164 273,164 0 0% treasury
AVAX.USDC 175,057 175,057 645,147 98.9% 2713
BSC.USDT 119,499 119,499 0 0% treasury
ETH.GUSD 60,220 60,220 0 0% treasury
ETH.LUSD 58,552 58,552 0 0% treasury
BASE.USDC 49,041 49,041 0 n/a treasury
AVAX.USDT 41,191 41,191 0 0% treasury
ETH.USDP 37,906 37,906 0 0% treasury
ETH.VTHOR 34,029 34,029 0 0% treasury
BSC.TWT 32,945 32,945 0 n/a treasury
BSC.BUSD 32,143 32,143 0 n/a treasury
GAIA.ATOM 12,255 12,255 39,254 97.3% 3121
ETH.LINK 1,041 1,041 0 0% treasury
ETH.SNX 998 998 0 0% treasury
ETH.ETH 739 739 4,880 99.5% 1514
AVAX.SOL 389 389 0 0% treasury
BCH.BCH 174 174 0 5,603 99.7% 0
BSC.BNB 45.74 45.74 0 4,845 97.1% 0
BASE.ETH 43.37 43.37 0 n/a treasury
BASE.VVV 29.58 29.58 0 n/a treasury
ETH.AAVE 27.86 27.86 0 0% treasury
BSC.ETH 15.61 15.61 0 n/a treasury
ETH.DPI 11.43 11.43 0 0% treasury
ETH.WBTC 3.78 3.78 0 0% treasury
ETH.YFI 1.05 1.05 0 n/a treasury
BSC.BTCB 0.51 0.51 0 n/a treasury
vault surplus — no waterfall needed
AVAX.AVAX 000
BTC.BTC 000
ETH.DAI 000
ETH.USDC 000
LTC.LTC 000
SOL.SOL 000
TRON.TRX 000
TRON.USDT 000
XRP.XRP 000

Shortfall = pool.BalanceAsset + trade_depth − vault_L1_excluding_2v28. Step 1 POL drain = asset_redeem_value × (ReserveUnits / PoolUnits) — only the reserve-bucket fraction (55.76% at snapshot) of the LP may be drawn; provider bucket is made whole via ReserveUnits_post solve. AVAX.USDC and BSC.BNB return 0 because inflated synth_units collapse the LP share to near-zero. Step 2 reserve synth burn from /cosmos/bank/v1beta1/balances/{reserve}. Step 3 bps = floor(after_step2 / savers_depth × 10000). THOR.RUJI and THOR.TCY excluded — native Cosmos assets with no L1 vault backing. Vault 907x DOGE (3.68M) is UTXO fragmentation, not an ADR-028 waterfall item. All amounts are 2026-05-25 live chain state; re-run at upgrade height.