Summary
This proposal outlines a potential strategy to reimburse the 27 borrowers who lost equity in the March 2, 2026 sDOLA/crvUSD LlamaLend exploit. The total loss was ~822,475 crvUSD (7.0% of total collateral value). The focus of this proposal is on the funding source and storage; the reimbursement plan will be addressed at a later stage, after alignment on terms between Inverse and Curve stakeholders.
The proposed funding source is uncollected AMM fees: >$1M in fees that have accumulated across Curve’s L2 deployments and are not yet flowing to either veCRV holders or the DAO Treasury. This avoids redirecting existing revenue streams and can be executed with a limited number of governance actions. The proposed recipient is the DAO Treasury on mainnet.
Background
On March 2, 2026, an oracle manipulation exploit caused 27 borrowers in the sDOLA/crvUSD LlamaLend market to be hard-liquidated. The root cause stemmed from a unique and unlikely combination of factors: the oracle’s interaction with sDOLA’s pricing mechanism, the soft-liquidation health calculation math, and the high concentration of token supply in the LlamaLend market. These combined allowed an attacker to inflate the sDOLA rate, temporarily depress the oracle price, and trigger hard liquidations at distorted values. Borrowers collectively lost ~822,475 crvUSD in equity as a consequence of the exploit.
Full incident analysis: LlamaLend sDOLA Post-Mortem
Proposed Recovery Mechanism
Funding Source: Uncollected L2 AMM Fees
Approximately $1.14M in AMM admin fees has accumulated across Curve’s L1/L2 deployments. These fees have not been burned, bridged, or distributed because the necessary burning infrastructure has not been fully deployed on most chains yet.
As of April 23, 2026, the total uncollected fees breakdown by chain:
| Chain | Fee Receiver | Value (USD) |
|---|---|---|
| Arbitrum | 0xd4F94D0aaa640BBb72b5EEc2D85F6D114D81a88E |
$483,639 |
| Polygon | 0x774D1Dba98cfBD1F2Bc3A1F59c494125e07C48F9 |
$158,393 |
| Base | 0xe8269B33E47761f552E1a3070119560d5fa8bBD6 |
$138,663 |
| Optimism | 0xbF7E49483881C76487b0989CD7d9A8239B20CA41 |
$92,410 |
| Ethereum | 0xa2Bcd1a4Efbd04B63cd03f5aFf2561106ebCCE00 / 0xeCb456EA5365865EbAb8a2661B0c503410e9B347 |
$92,227 |
| Fraxtal | 0x8b3EFBEfa6eD222077455d6f0DCdA3bF4f3F57A6 |
$49,698 |
| Hyperliquid | 0xf3A431008396df8A8b2DF492C913706BDB0874ef |
$29,572 |
| Avalanche | 0x06534b0BF7Ff378F162d4F348390BDA53b15fA35 |
$18,685 |
| Plasma | 0x193110Ce1542d7371e1515BD6A2E470fDefc310D |
$16,737 |
| Monad | 0x193110Ce1542d7371e1515BD6A2E470fDefc310D |
$11,535 |
| Sonic | 0x3c0a405E914337139992625D5100Ea141a9C4d11 |
$10,988 |
| Etherlink | 0x193110Ce1542d7371e1515BD6A2E470fDefc310D |
$10,611 |
| Other (8 chains) | Various | $32,248 |
| Total | $1,137,406 |
Source: Holy Curve Fee Dashboard, April 23 2026
Minimum Viable Subset
The recovery target is 822,475 crvUSD. To cover this, we propose to target Arbitrum + Polygon + Base + Optimism ($873,105 gross)
Two caveats apply:
- None of these four chains are single-call redirects. Each requires either new bridger infrastructure or a DAO arbitrary call (see Step 2). New bridger deployment or arbitrary-call tooling is therefore a hard prerequisite for the baseline recovery path.
- Token composition at each receiver is not yet broken down. Much of the gross value may be illiquid LP positions or long-tail tokens, where swap and bridge slippage meaningfully reduces realized proceeds. A per-token breakdown for the four targeted chains should inform the gross-to-net haircut assumption and may push the target set wider.
- The gross-to-net haircut can be severe. Per Curve core devs, the existing fee-burning contracts hardcode
min_amount_out = 500 crvUSDregardless of input value, so a $100K bag can legitimately settle for as little as $20K (or worse) under thin liquidity or solver-competition failure. Until that is fixed, the DAO should approve a gross funding ceiling (e.g., all four chains’ gross balances) rather than a fixed net target, and accept a partial-payout fallback if net realized < 822,475 crvUSD.
Procedure
The operational procedure to secure and redirect these fees involves the following steps:
Step 1: Ensure DAO ownership of Fee Receiver contracts
All four target Fee Receivers are currently administered by an EOA, not the DAO. Handing control to the DAO requires off-chain cooperation from the current admin on each chain; it cannot be forced by a DAO vote.
| Chain | Fee Receiver | Admin | Controlled By |
|---|---|---|---|
| Arbitrum | 0xd4F94D0aaa640BBb72b5EEc2D85F6D114D81a88E |
0xbABe61887f1de2713c6f97E567623453d3C79f67 |
EOA (“Curve: Deployer 2”) |
| Polygon | 0x774D1Dba98cfBD1F2Bc3A1F59c494125e07C48F9 |
0xB055EbbAcc8Eefc166c169e9Ce2886D0406aB49b (ProxyAdmin) → 0xE6DA683076b7eD6ce7eC972f21Eb8F91e9137a17 |
EOA |
| Base | 0xe8269B33E47761f552E1a3070119560d5fa8bBD6 |
0xbABe61887f1de2713c6f97E567623453d3C79f67 |
EOA (“Curve: Deployer 2”) |
| Optimism | 0xbF7E49483881C76487b0989CD7d9A8239B20CA41 |
0xB055EbbAcc8Eefc166c169e9Ce2886D0406aB49b (ProxyAdmin) → 0xE6DA683076b7eD6ce7eC972f21Eb8F91e9137a17 |
EOA |
Migration uses one of two patterns, depending on whether a ProxyAdmin sits in front of the Fee Receiver. Both patterns rely on the Fee Receiver’s built-in two-step admin transfer (commit_new_admin / accept_new_admin); they differ in who sends the first call.
Option 1: Direct (Arbitrum, Base). The Fee Receiver’s admin is an EOA.
- Current EOA admin calls
commit_new_admin(<L2 Ownership Agent>)on the Fee Receiver. - DAO vote → L2 Ownership Agent calls
accept_new_admin()on the Fee Receiver.
Arbitrum L2 Ownership Agent: 0x452030a5D962d37D97A9D65487663cD5fd9C2B32
Base L2 Ownership Agent: 0x2c163fe0f079d138b9c04f780d735289344C8B80
Option 2: Via ProxyAdmin (Polygon, Optimism). The OP FeeReceiver’s admin is the ProxyAdmin 0xB055EbbAcc8Eefc166c169e9Ce2886D0406aB49b; its own admins are (EOA) and babe.eth. The recommended path re-points the Fee Receiver directly, without changing the ProxyAdmin itself:
- Either ProxyAdmin admin (EOA or
babe.eth, only one signature needed) callsProxyAdmin.execute(<fee_receiver>, <calldata for commit_new_admin(<L2 Ownership Agent>)>). - DAO vote → L2 Ownership Agent calls
accept_new_admin()on the Fee Receiver.
Polygon L2 Ownership Agent: 0x8cB05bFEd65b522a7cF98d590F1711A9Db43af71.
Optimism L2 Ownership Agent: 0x28c4A1Fa47EEE9226F8dE7D6AF0a41C62Ca98267.
After step 2, admin() on each Fee Receiver equals the L2 Ownership Agent and the DAO can execute Step 2 of the procedure.
Step 2: Redirect fee receivers to DAO mainnet treasury
Pre-condition: the burner pipeline that will actually move the tokens (Step 3) must exist and be verified for each targeted chain before redirection. Otherwise, we redirect into a sink that cannot be drained. The intended sequence is therefore: (1) validate burner availability and per-token routes on each target chain, (2) ownership migration (Step 1), (3) redirect (this step), (4) burn (Step 3).
After ownership migration, the DAO redirects the destination of bridged fees on each targeted L2 to the mainnet DAO Treasury (0x6508eF65b0Bd57eaBD0f1D52685A70433B2d290B). The Treasury acts as the intermediate sink so that any over- or undershoot from the gross-to-net conversion is absorbed there rather than at the reimbursement contract; a separate, follow-on vote then transfers the exact 822,475 crvUSD from Treasury to the reimbursement contract (see Step 4).
The exact call to redirect depends on whether the receiver has a compatible bridger wired in:
- L2
**PoolProxySidechain**with a compatible bridger: DAO callsPoolProxySidechain.set_bridge_root_receiver(<DAO Treasury>), which internally invokesBridger.set_root_receiver(<DAO Treasury>). A follow-upPoolProxySidechain.bridge(<token>)pushes the accumulated balance through the bridger to the Treasury on L1. After collection, a second vote reverts the receiver to the canonical L1 sink0xeCb456EA5365865EbAb8a2661B0c503410e9B347. - Chains with no compatible or unwired bridger (e.g., Polygon’s
**PolygonBridger.vy**has no**set_root_receiver**; Optimism has**bridging_contract = 0x0**; Base sits behind a ProxyAdmin): either deploy a new per-chain bridger that targets the Treasury and wire it viaPoolProxySidechain.set_bridging_contract, or have the DAO execute an arbitrary call through the L2 Ownership Agent once it owns the Fee Receiver. Each of the top-four chains falls into this category at time of writing, so new bridger deployment or arbitrary-call tooling is a hard prerequisite for the baseline recovery path
Step 3: Token conversion
The accumulated fees consist of stablecoins, spot tokens, and a meaningful share of LP / underlying-LP tokens. Conversion paths differ materially by token class:
-
Stables and spot tokens (USDC, crvUSD, DAI, USDai, USDe, WETH, ARB, …): can route through CowSwap-based burners on chains where they are deployed (mainnet today; Arbitrum and Gnosis in progress per Swiss Stake). Each route should be validated by fetching swap quotes for the actual notional from the solver and confirming the route makes sense before triggering the burn.
-
LP / underlying-LP tokens (e.g., tricrypto, cbeth-f on Base; 3c-crvUSD, crvUSDARBCRV, sUSDai on Arbitrum): these are the largest single line items at both Base and Arbitrum receivers and have no clean automated path today. Options under discussion with core devs:
- Use the new Curve router with balanced withdrawal: supports balanced exits in principle, but is not battle-tested in production; not appropriate for six-figure positions without prior validation.
- Manual claim by a trusted EOA (e.g., Mich) followed by manual unwinds: functional, but fully trust-based.
- Defer LP-token conversion until L2 burner infrastructure with LP-input support exists.
Burner risks and pre-conditions
The current fee-burning contracts submit CowSwap orders with a hardcoded min_amount_out = 500 crvUSD regardless of input size. Under thin pool liquidity or insufficient solver competition on L2, a $100K balance can legitimately settle for $20K or worse, and the DAO has no on-chain safeguard. A proper fix requires a mainnet redeploy and multiple DAO votes (outside the scope of this proposal). Mitigations applicable here:
- Phased burn. Begin with low-fee, high-liquidity tokens to validate routes and observe solver behavior before escalating to the larger USDC/crvUSD/LP balances.
- Per-pool quote check. Pre-fetch swap quotes from the solver for the full intended notional and abort if the route is unreasonable.
- Avoid the 7-day burner-config window. Configuring a new burner + route via governance takes 7 days, during which liquidity could be removed before execution. Prefer pre-existing burners; if a new one is needed, plan execution timing to minimize the exposed window.
Step 4: Execute a reimbursement plan
The main focus of this proposal is to align on the funding source and storage method for funds earmarked for reimbursement. Final details of the actual reimbursement plan are subject to pending agreements between Inverse and Curve stakeholders.
- Inverse is working on an analysis that may reduce the headline loss figure, accounting for gains made from the sDOLA share price inflation. Pending their analysis, the total reimbursement may be lowered.
- Inverse may agree to an incentive agreement, whereby Inverse commits to a USD value of incentives equal to the reimbursement amount from Curve. The incentives would go toward supporting an sDOLA lend market on LlamaLend v2. Incentives would be spread over a 12-24 month period, and may be structured as either direct incentives or vote incentives to veCRV.
- Pending an agreement with Inverse, Curve may consider a commensurate payment plan that repays affected users over some time span. The funds held in the treasury may be approved for allocation toward stable yield-generating purposes until the time of payment.
- A donation gauge may be deployed and approved by Curve governance that allows Curve stakeholders to assign gauge weight and accrue CRV emissions toward repayment purposes. The cap may be set to 1M CRV. This strategy may further reduce the total fee revenue needed for reimbursement.
Timeline Considerations
- The CowSwap burning infrastructure is actively being developed by Swiss Stake and is expected to be deployed on Arbitrum and Gnosis in the near term
- Burner deployment and per-token route hardening on each L2 is the actual blocker on token conversion (Step 3), not the redirect step (Step 2). Step 2 should not execute on a chain whose burner pipeline is not yet validated.
- A test burn on a low-fee, high-liquidity pool is recommended before scaling to six-figure balances, to observe solver competition and confirm the
min_amount_outconstraint is not exposing the DAO to outsized loss in practice. - The ownership transfer from the current EOA admin to the respective L2 Ownership Agent is a blocking prerequisite on each chain and requires cooperation from that EOA; it cannot be forced by a DAO vote.
- Chains without a compatible bridger (Polygon, Optimism, Base, and most long-tail L2s) will require either new bridger deployments or per-chain DAO arbitrary-call execution before their balances can be redirected. This work is out of scope for this proposal and would need to be scoped separately.
Appendix A: Affected Borrowers
27 addresses were hard-liquidated. Total equity lost: ~822,475 crvUSD.
| Borrower | Collateral (sDOLA) | Debt (crvUSD) | Collateral Value (crvUSD) | Loss (crvUSD) |
|---|---|---|---|---|
0x80c67fe70d7d6cc488782439fad381d8646640c4 |
1,809,065 | 1,862,484 | 2,151,056 | 288,572 |
0xb152fc7e9ddf01a942685e390a74009cd2b9ca52 |
3,172,023 | 3,572,521 | 3,771,671 | 199,150 |
0x6db248100cf4908429ab671f33d105311ed7fef8 |
2,269,436 | 2,528,047 | 2,698,456 | 170,409 |
0xcbcc2b2ecd195ebef03fcb7c7564e4e906485a14 |
748,854 | 853,124 | 890,420 | 37,296 |
0xc8801ffaaa9dfcce7299e7b4eb616741ea01f5de |
523,742 | 587,312 | 622,752 | 35,440 |
0x8fc5777d607171b42a61fed4c74242e54677903f |
371,141 | 420,605 | 441,303 | 20,697 |
0x57f845829140d9d9d8e357fa0d9f943483a12fc5 |
352,469 | 400,103 | 419,100 | 18,997 |
0xc6c77b16a85c3946e0bdfc71fdb7efd3d89359d0 |
222,232 | 250,689 | 264,243 | 13,554 |
0xc8233a46f57add754f32cf9e25a85aae8a7d5f29 |
38,408 | 35,046 | 45,669 | 10,623 |
0xadbafae28c3041ecb74456cd7fb9097bd1287308 |
76,345 | 80,543 | 90,778 | 10,235 |
0xba5aa2a3dbbbb4c7c3a8950fc6251bb8020cf844 |
117,078 | 132,280 | 139,211 | 6,931 |
0x6ce50491faa9fac1dc883a2769ab129e75eb0a75 |
36,508 | 40,042 | 43,409 | 3,367 |
0x3e258aae11d7ea394b2eb1176ccd54d9eb83861b |
29,369 | 32,230 | 34,921 | 2,691 |
0x8467241838bc761d9ef4f8ae6790ede292fba2f9 |
48,240 | 55,503 | 57,359 | 1,857 |
0x2d57740ee18594bcbfa845703fad49882e1567d9 |
31,242 | 35,910 | 37,148 | 1,238 |
0x2b083a0aa6b808a31e9ac749772a285f5cd34fbe |
1,671 | 1,639 | 1,987 | 348 |
0x6ef36f7130d00addf40ce9b040da0bc02491d2e1 |
4,563 | 5,099 | 5,426 | 327 |
0xc69f65d2720df32c244163e0f608284415aaef4b |
3,877 | 4,409 | 4,609 | 200 |
0x21ab0875611da0235bc5b6405b8a08268d859700 |
1,762 | 1,910 | 2,095 | 185 |
0x5b860e2d38f723d5370cf21f82d6adad31ef0b7d |
3,543 | 4,054 | 4,213 | 159 |
0xe9c0df9bd4607850d410c957fec11ec209de5ef6 |
2,128 | 2,409 | 2,531 | 122 |
0x9bf8af305152faddd81c70f8599148e9fc6efa20 |
85 | 80 | 101 | 20 |
0x145e305a6e8979cbefcb75993f7ae5270856c1d2 |
192 | 206 | 228 | 22 |
0xe170ed9d77792397271d564c7161351d69fe9300 |
157 | 171 | 187 | 16 |
0xf60de76791c2f09995df52aa1c6e2e7dcf1e75d7 |
222 | 252 | 264 | 13 |
0xd4ffcd8b6b7ec90f4eac001125f4a7b21dc0f781 |
90 | 101 | 107 | 6 |
0x8db98764ada29b55a23f7a8cb07be6f74f0d0e75 |
0.008 | 0.009 | 0.010 | 0.0004 |
Total loss: ~822,475 crvUSD (7.0% of total collateral value)
Collateral values calculated using sDOLA exchange rate of 1.189042662706965487.
Source: LlamaLend sDOLA Post-Mortem — Appendix: Liquidated Addresses
Appendix B: DAO Fund Balances
For context, the DAO’s existing funds are insufficient to cover the full reimbursement without a significant impact on operations:
- DAO Treasury (
0x6508eF65b0Bd57eaBD0f1D52685A70433B2d290B): ~14,278 crvUSD (depleted after Proposal #1381). Income: ~14.2K crvUSD/week. At full allocation, it would take ~58 weeks to fund the recovery, without accounting for the Treasury’s own operational needs. - Community Fund (
0xe3997288987E6297Ad550A69B31439504F513267): ~845K CRV, 0 crvUSD. Disbursements require annual linear vests via DAO vote; not suitable for a one-time reimbursement. - Grants Multisig (
0xc420C9d507D0E038BD76383AaADCAd576ed0073c): ~10.4M CRV, ~15K scrvUSD. Earmarked for grants, not discretionary spending.