LlamaLend v1 Market Deprecation Plan

Summary

Llamalend v2 is preparing to launch with significant improvements to market safety and risk management. As housekeeping before that launch, we propose deprecating all bad-debt and idle v1 markets, including the entire Optimism v1 deployment (already hidden from the UI). Healthy active markets on Ethereum, Arbitrum, and Fraxtal continue to function as usual on v1.

Across Ethereum (47), Arbitrum (22), Fraxtal (12), and Optimism (5), there are 86 v1 markets in total. Of these:

  • 11 bad-debt markets carry ~$1.22M in aggregate bad debt; concentrated in cohorts that emerged from the October 10, 2025 volatility event and from a handful of permissionlessly deployed markets that proved to be misconfigured for their underlying assets.
  • 56 idle markets, of which 37 have no open loans.
  • 19 active markets carry ~$40M in healthy debt.

Action tracks for the markets being deprecated:

  • Bad-debt markets: action depends on liquidity. Liquid bad-debt markets keep their existing monetary policy, accruing interest on underwater positions only inflates the shortfall, and lenders earning yield on the solvent portion of the book aren’t well served by an artificial rate change. Illiquid bad-debt markets have their rate set to 0, since further accrual on positions that won’t repay only deepens the bad debt. In both cases the loan discount is raised to the maximum of 50% to prevent new loans, and the gauge is killed. Per-market remediation of the existing shortfall, including AMM-based recovery along the lines of Michael Egorov’s forum proposal, may be handled as a separate workstream.
  • Idle markets: monetary policy swapped to a singleton MP (a shared, slowly linearly-increasing rate contract; no open loans means the rate doesn’t matter), loan discount raised to 50%, gauges killed where they exist.

This proposal is a companion to the in-flight CRV-long market deprecation, which is being handled with its own per-position analysis.

Current State of LlamaLend v1

Chain Markets Bad-debt Active Idle Total debt Bad debt
Ethereum 47 4 11 32 ~$40.1M $810,500
Arbitrum 22 3 6 13 ~$1.08M $123,520
Fraxtal 12 2 2 8 ~$642K $277,852
Optimism 5 2 0 3 ~$9.4K $5,973
Total 86 11 19 56 ~$41.83M $1,217,845

Track definitions:

  • bad-debt: market carries a shortfall; rate action depends on liquidity (no MP change for liquid markets, rate set to 0 for illiquid markets); loan discount maxed, gauge killed.
  • idle: no open loans; MP swapped to singleton, loan discount maxed, gauge killed (where one exists).
  • active: healthy market with open loans; no action under this proposal (except on Optimism, see chain-wide note), remains operational on v1.

Background

Llamalend v2 is the successor design and will eventually inherit the role v1 plays in the Curve ecosystem. Rather than wind down all of v1 at once, this proposal takes a phased approach: remove the markets that should not exist on v1 going forward (bad-debt and idle) while keeping healthy active markets running.

The bad-debt cohort. Thirteen markets carry shortfalls: CRV-long, UwU, sDOLA-Long2, and WETH-Long2 on Ethereum; IBTC, FXN, ARB-Long2, and WETH on Arbitrum; FXS/FRAX and SQUID on Fraxtal; and OP and CRV on Optimism.
These shortfalls trace to two sources: the October 10, 2025 volatility event together with the subsequent collateral price decay, and a handful of v1 markets that were permissionlessly deployed with parameters that proved to be misconfigured for their underlying assets; primarily long-tail collateral with thin liquidity.

What v2 changes. v2 markets remain permissionlessly deployable, but every new market launches with supply and borrow caps set to zero. Caps can only be raised through DAO governance, which means parameters and risk controls receive direct oversight before any meaningful TVL accrues in a market. Beyond the caps gate, v2 also reworks vault accounting to prevent the share/asset inflation pattern, replaces v1’s immutable price oracle with a DAO-gated set_price_oracle(), makes the LendFactory pausable so new market creation can be halted in an emergency without affecting existing markets, flips Vyper 0.4.2’s # pragma nonreentrancy on so every method and public getter is nonreentrant by default, and consolidates lending and mint-market controllers into a single controller.vy module that removes ~2,000 lines of duplicated logic and the divergence bugs that came with it.

Wind-Down Strategy

Bad-debt markets: liquidity-dependent rate action, max loan discount, kill gauge

Bad-debt markets typically contain a mix of solvent and underwater positions, and the right rate action depends on which cohort dominates and on the market’s liquidity. Underwater positions are unlikely to repay regardless of rate, so interest accrual on those positions tends to flow into shortfall that lenders absorb.

The action therefore splits on market liquidity:

  • Liquid bad-debt markets: No monetary policy change. Lenders chose their exposure, continue to earn yield on the solvent portion of the book, and forcing them out via an artificial rate change neither helps the protocol nor improves recovery on the underwater positions.
  • Illiquid bad-debt markets: Rate set to 0% via a MP. With no meaningful lender base left to serve, the priority shifts to not deepening the bad debt.

In both cases the loan discount is raised to the maximum of 50% to prevent new loans, and the gauge is killed to stop CRV emissions to a known-bad market. Per-market routing is shown in the chain tables below.

Remediation of the existing shortfall is handled as a separate workstream and may be presented per-market. Michael Egorov has already proposed an AMM-based recovery approach in a recent governance forum post, which is a candidate for illiquid bad-debt markets in particular.

Idle markets: singleton MP, max loan discount, kill gauge

Idle markets (no active loans, no user-facing impact) get pointed at the singleton MP for housekeeping uniformity, have their loan discount raised to the maximum, and have their gauges killed (where they exist). The MP swap doesn’t affect anyone β€” there are no loans β€” but having every deprecated market point at the same MP makes the deprecated cohort uniform and removes a class of orphaned Controllers from the surface area.

Active markets: no action (except Optimism)

Active healthy markets on Ethereum, Arbitrum, and Fraxtal remain operational on v1 under this proposal. A follow-up proposal will address their migration once v2 is live and integrators have had time to plan.

Optimism is the exception**.** All five Optimism v1 markets β€” including the two with healthy active loans β€” are being deprecated together as part of a chain-wide wind-down. Optimism v1 has been hidden from the UI for some time and total debt across the chain is ~$9.4K. Active Optimism markets receive the same MP / loan discount / gauge actions as the rest of the deprecated cohort.

Markets by Chain

One row per market, one table per chain. Sorted bad-debt β†’ active β†’ idle, then by debt within each track. All addresses checksummed. Active markets are listed for completeness but receive no action under this proposal.

Data fetched: 2026-04-29 08:47 UTC, from api.curve.finance/api/getLendingVaults/all, prices.curve.finance/v1/lending/markets/{chain}, and prices.curve.finance/v1/lending/liquidations/bad_debt. Gauge is_killed and Controller loan_discount checked on-chain as of the same time.

- Gauge status across the deprecation cohort: 18 already killed, 27 to be killed (mainnet root).
- Loan-discount status: 3 already at 50% (CRV-long mainnet, FXS/FRAX & SQUID on Fraxtal β€” set by votes 1391/1393), 60+ still to be set.

Optimism (5 markets; $5,973 bad debt)

Track Market Controller Loans Debt Bad debt MP LD→50% Gauge
bad-debt OP (oneway-3) 0xC5Cd9f6A1Fb88bed782f475F72fF686ED35b7e8e 8 $7,378 $5,582 set to 0% to be set (currently 17.5%) already killed (0xe042515355e6852dbaec269d04d574e0b8d8c6f4)
bad-debt CRV (oneway-4) 0x88aa928B906b745009B53A31034701Fc377b7C89 4 $1,914 $391 no action to be set (currently 20.0%) already killed (0x3e3d66ad3c707a9fcbb6553da6acec396697e173)
idle WETH (oneway-0) 0x9dba46e6a06FBf24CA11f8912B44338fe1b28Ea9 1 $123 β€” singleton to be set (currently 7.0%) already killed (0x9a002726d7b9d9dc90d3277f7531fe15a31b47df)
idle WBTC (oneway-2) 0x09cEd8b3392bED73B0358e39AaEC0A6e9b0e76DF 1 $0 β€” singleton to be set (currently 6.5%) already killed (0x0c1b39806655a816054d45fdfde8658e2f620bc6)
idle wstETH (oneway-1) 0x6CE5B539367A29d48038A9F3108E6e0f226b83ed 0 $0 β€” singleton to be set (currently 7.0%) already killed (0x19fcbee2956d3436520fb12d2b9024b22a10beba)

Arbitrum (22 markets; $123,520 bad debt)

Track Market Controller Loans Debt Bad debt MP LD→50% Gauge
bad-debt IBTC (oneway-15) 0x3e293dB65c81742e32b74E21A0787d2936beeDf7 16 $78,230 $77,765 set to 0% to be set (currently 7.5%) already killed (0x2656b01a19a790f07e2b875d69007f88241602f0)
bad-debt ARB (oneway-11, β€œARB-long2”) 0xeCF99dE21c31eC75b4Fb97e980F9d084b1d8Da8f 11 $49,202 $19,129 set to 0% to be set (currently 21.0%) to be killed (0x8d1600015ae09eaacaed08531a03ecb8f2bd40fa)
bad-debt FXN (oneway-7) 0x7Adcc491f0B7f9BC12837B8F5Edf0e580d176F1f 1 $26,758 $26,282 set to 0% to be set (currently 17.0%) to be killed (0x033e4b9d481ec8eb01a64ef782548c9056f45068)
active WETH (oneway-0) 0xB5B6f0E69c283AA32425FA18220e64283B51F0A4 21 $38,165 $344 β€” β€”
active asdCRV (oneway-13) 0x83B85f3b08B5EE58dE9EF9604e7Eec087FCCf130 10 $402,472 β€” β€” β€”
active WETH (oneway-9) 0xB5c6082d3307088C98dA8D79991501E113e6365d 43 $239,131 β€” β€” β€”
active WBTC (oneway-10) 0xb9aDddCf4e01c2f64F8F2CD9a050DC35585ea053 40 $220,248 β€” β€” β€”
active CRV (oneway-4) 0x88f88e937Db48bBfe8E3091718576430704e47Ab 21 $10,087 β€” β€” β€”
active WBTC (oneway-1) 0x013be86e1cdb0f384dAF24Bd974FE75EdFfe6B68 7 $10,564 β€” β€” β€”
idle EYWA (oneway-21) 0x7a5A1c91dAF5A41942F90b3f8a9c4d3526294c16 1 $364 β€” singleton to be set (currently 12%) already killed (0xc1b06b52848fd69d4734983d923e0a0101111e21)
idle tBTC (oneway-17) 0x376e6D52F38e0fCe8E94293ce911e2FdEd2d4A4f 1 $5 β€” singleton to be set (currently 7.5%) to be killed (0x6ba9bf35158dcb0dc9f71cfe1eed9d5c75cd3836)
idle stXAI (oneway-19) 0x398e6dd92Df9F792D0107668871e6F49ebdfE028 2 $0 β€” singleton to be set (currently 11.0%) no gauge
idle ARB old (oneway-5) 0x76709bC0dA299Ab0234EEC51385E900922AE98f5 2 $0 β€” singleton to be set (currently 21.0%) to be killed (0xc0d2d2cfbc20badaef4360f577590790f16c3d43)
idle CRV (oneway-12) 0xF4e35f69D0BeE1AFC26EE73f12Fa7fA220F16F40 0 $0 β€” singleton to be set (currently 20.0%) to be killed (0xb7a51f9d5b2903fca3be111beb5a2448f772d9b8)
idle IBTC (oneway-14) 0x991Bf50A34972227e681127D9127a1Dc54f67a3b 0 $0 β€” singleton to be set (currently 6.5%) no gauge
idle tBTC (oneway-16) 0x4153532Eb32D57a1a08cD024c66E79635aFC8e3a 0 $0 β€” singleton to be set (currently 7.5%) no gauge
idle stXAI (oneway-18) 0x5A2b666E6f36CB0a17CF03c9feb421855Ca9751D 0 $0 β€” singleton to be set (currently 11.0%) no gauge
idle WBTC (oneway-2) 0x28c20590de7539C316191F413686dcF794d8898E 0 $0 β€” singleton to be set (currently 9.0%) no gauge
idle stXAI (oneway-20) 0x6c1cD25cC6320f992EDE07F6a6e93810e8855bc2 0 $0 β€” singleton to be set (currently 11.0%) no gauge
idle gmUSDC (oneway-3) 0x5014AB37Fca7201baDEc3C0d0f28Dc7899cdC7D5 0 $0 β€” singleton to be set (currently 3.5%) no gauge
idle FXN (oneway-6) 0xAe659CE8f2f23649E09e92D164244AA127A7a2c7 0 $0 β€” singleton to be set (currently 17.0%) to be killed (0xb75949507127c31a39eae50f1d0fdec6c35aebb6)
idle gmUSDC (oneway-8) 0x4064Ed6Ae070F126F56c47c8a8CdD6B924668b5D 0 $0 β€” singleton to be set (currently 1.3%) no gauge

Fraxtal (12 markets; $277,852 bad debt)

Track Market Controller Loans Debt Bad debt MP LD→50% Gauge
bad-debt FXS/FRAX (oneway-2) 0xf0922934f16DbE5Df9f90F729b2023D5e1FC2F15 18 $194,311 $145,857 already set to 0% already at 50% to be killed (0xfc6891c8482aef6aef71a09a09ce14432617a403)
bad-debt SQUID (oneway-4) 0xBF55Bb9463bBbB6aD724061910a450939E248eA6 5 $137,768 $131,995 already set to 0% already at 50% already killed 0x718Fe7ab113c2e02B61d947B80b6fA0C434ba60b)
active sfrxETH (oneway-0) 0xc68f91FfA2B27147F9AB153267018f5Fe4b6850F 6 $190,140 β€” β€” β€” -
active sfrxUSD (oneway-1) 0xB4EbF87A474569d8eB7f7182B4beBD8aE79ae675 20 $119,788 β€” β€” β€” -
idle CRV (oneway-3) 0x99d5b47D431f1963940F72ffa6F25bC0B9849CbF 0 $0 β€” singleton to be set (currently 20.0%) to be killed (0x2687a11cb2916bffb9406959c6d386c79c621f15)
idle mooCurveFXS-cvxFXS (oneway-5) 0xCdf0D2a3B4e8D334042aE04631137696C7a09a00 0 $0 β€” singleton to be set (currently 24.0%) no gauge
idle mooCurveFXS-cvxFXS (oneway-6) 0x1d174AdBF69D531EE13629a253517Ad3Cf3Aa7AF 0 $0 β€” singleton to be set (currently 28.0%) no gauge
idle cycvxFXS/FXS borrow (oneway-7) 0xCB2b1f2a5d472828eB56d36E9Bdbefb4963ECA79 0 $0 β€” singleton to be set (currently 22.0%) no gauge
idle cycvxFXS/FXS (oneway-8) 0xc52eFB33C8b90d7c1f64c4b5747ae209af2A02e5 0 $0 β€” singleton to be set (currently 22.0%) no gauge
idle cycvxFXS/FXS (oneway-9) 0xCadF8A2Aa79eb80DDFcD204C50E3c7d6d3ed1927 0 $0 β€” singleton to be set (currently 22.0%) no gauge
idle cycvxFXS/FXS (oneway-10) 0x5B425D2a3D9bea2B3a158125b15895D9C34dCFb2 0 $0 β€” singleton to be set (currently 22.0%) no gauge
idle cycvxFXS/FXS (oneway-11) 0x03F98Bcf2A602cBe165Ddc14b2b0B20139A660d2 0 $0 β€” singleton to be set (currently 25.0%) no gauge;to be killed on Fraxtal (child gauge 0x602b80d7daaaa7ea605ccfb6b3af3367cac29bc3);

Ethereum (47 markets; $810,500 bad debt)

Track Market Controller Loans Debt Bad debt MP LD→50% Gauge
bad-debt CRV (oneway-3) 0xEdA215b7666936DEd834f76f3fBC6F323295110A 82 $3.26M $757,509 already set to 0% already at 50% already killed (0x49887df6fe905663cdb46c616bfbfbb50e85a265)
bad-debt UwU (oneway-8) 0x09dBDEB3b301A4753589Ac6dF8A178C7716ce16B 1 $50,802 $48,138 already set to 0% to be set (currently 33.0%) already killed (0xad7b288315b0d71d62827338251a8d89a98132a0)
bad-debt sDOLA (oneway-30, β€œsDOLA-Long2”) 0xaD444663c6C92B497225c6cE65feE2E7F78BFb86 2 $60,240 $4,521 no change to be set (currently 1.3%) to be killed (0xa21043df8d25dc876f38bc5c7e54285f3e1a936b)
bad-debt wstUSR (oneway-34) 0x89707721927d7aaeeee513797A8d6cBbD0e08f41 7 $2,069 $320 no change to be set (currently 1.3%) already killed (0x91d0f7022edb620429b4f63d482fcfbb2cbe7f30)
active WETH (oneway-12, β€œWETH-long2”) 0x23F5a668A9590130940eF55964ead9787976f2CC 29 $650,368 $12 β€” β€”
active sreUSD (oneway-41) 0x4F79Fe450a2BAF833E8f50340BD230f5A3eCaFe9 15 $19.11M β€” β€” β€”
active sfrxUSD (oneway-28) 0x3DE37c38739dFb83b7A902842bF5393040f7BF50 14 $11.20M β€” β€” β€”
active WBTC (oneway-9) 0xcaD85b7fe52B1939DCEebEe9bCf0b2a5Aa0cE617 40 $2.60M β€” β€” β€”
active sUSDe (oneway-11) 0xB536FEa3a01c95Dd09932440eC802A75410139D6 26 $2.00M β€” β€” β€”
active wstETH (oneway-13) 0x5756A035F276a8095A922931F224F4ed06149608 27 $736K β€” β€” β€”
active fxSAVE (oneway-39) 0x8035b16053560b3C351b665b10f6C7dBDb6A1E05 13 $320K β€” β€” β€”
active tBTC (oneway-2) 0x413FD2511BAD510947a91f5c6c79EBD8138C29Fc 5 $34K β€” β€” β€”
active WETH (oneway-1) 0xaade9230AA9161880E13a38C83400d3D1995267b 6 $32K β€” β€” β€”
active XAUM (oneway-27) 0xB4544e705665e0856961a51F7E86Ccf633404b86 2 $7.6K β€” β€” β€”
active sUSDS (oneway-32) 0x2dA313f6DCEE04BA46466E100c4656618E5d3dDd 3 $7.2K β€” β€” β€”
idle ycvxCRV (oneway-35) 0x24174143cCF438f0A1F6dCF93B468C127123A96E 1 $5.9K β€” singleton to be set (currently 33%) to be killed (0xa7b4b02953687fd7f860bb6fe1c09450e01b8a71)
idle sFRAX (oneway-15) 0x8C2537F1a5b1b167A960A14B89f7860dd5F7cD68 3 $5.7K β€” singleton to be set (currently 1.3%) to be killed (0xdff0ed66fddcc440fb3adfb2f12029925799979c)
idle tBTC (oneway-31) 0xc572297c5e995692B972c8eEa1D12b56b6399e1e 1 $4.0K β€” singleton to be set (currently 6.5%) to be killed (0x4ad7ee6648289980240c29e8fcb95d04f5d958e0)
idle ynETHx (oneway-29) 0x6f91f33Ac7122F025b73206239CbC81606F022D4 2 $3.3K β€” singleton to be set (currently 7%) to be killed (0xc74796d3ec1a0165f2c127f3f50caa259823d36a)
idle ynETH (oneway-23) 0x143985860EFaeAcB92Db23E4b0c4d66Be51b08D2 2 $2.6K β€” singleton to be set (currently 13.0%) to be killed (0x8966a85b414620ef460deeacd821c30c442c433f)
idle pufETH (oneway-10) 0x4f87158350c296955966059C50263F711cE0817C 5 $983 β€” singleton to be set (currently 10.0%) to be killed (0x294280254e1c8bcf56f8618623ec9235e8415633)
idle sDOLA (oneway-17) 0xCf3DF6C1B4A6b38496661B31170de9508b867C8E 4 $819 β€” singleton to be set (currently 1.3%) already killed (0x30e06cadfbc54d61b7821dc1e58026bf3435d2fe)
idle USDe (oneway-14) 0x74f88Baa966407b50c10B393bBD789639EFfE78B 9 $749 β€” singleton to be set (currently 1.5%) to be killed (0xeaed59025d6cf575238a9b4905aca11e000baad0)
idle ETHFI (oneway-18) 0xAC9AdD93364Aea685be238dB6c40BF53753f2cF1 1 $167 β€” singleton to be set (currently 13.0%) already killed (0x3ba9d8792fa703ea21b6120e675aa34bda836aeb)
idle PROS (oneway-45) 0x6934ba5ED7B1664F9e04161D7d76291C3f9D8C21 1 $100 β€” singleton to be set (currently 12.0%) no gauge
idle wstETH (oneway-0) 0x1E0165DbD2019441aB7927C018701f3138114D71 2 $2 β€” singleton to be set (currently 7.0%) already killed (0x222d910ef37c06774e1edb9dc9459664f73776f0)
idle UNIT0 (oneway-44) 0xd15d9797c4ECBf1c97c010327602bC51A09Dfb95 1 $1 β€” singleton to be set (currently 12.0%) to be killed (0x173c8b67823a4f7d80cb4d2b4ef375c2137d70cd)
idle sUSDe (oneway-7) 0x98Fc283d6636f6DCFf5a817A00Ac69A3ADd96907 2 $1 β€” singleton to be set (currently 3.5%) to be killed (0x82195f78c313540e0363736b8320a256a019f7dd)
idle ezETH (oneway-16) 0x3c1350aa6FaFF17c87Bde2015BBb45100D37dAD3 0 $0 β€” singleton to be set (currently 10.0%) already killed (0xad52a81d8aea772b8d21fe2bc573ef388bddac69)
idle USD0USD0++ (oneway-19) 0x1F9D988cDeBfA1FD5563C122a987186e516173c2 0 $0 β€” singleton to be set (currently 1.3%) to be killed (0x4b4d4e87cc5cd3995965dada97d7abde376f8426)
idle USD0USD0++ (oneway-20) 0xDC8b1Caf2e10dE76fb67E82C2485E7d4fA098C53 0 $0 β€” singleton to be set (currently 1.3%) to be killed (0x1d701d23ce74d5b721d24d668a79c44db2d5a0ae)
idle swBTC (oneway-21) 0x276B8C8873079eEACCF4Dd241De14be92D733b45 0 $0 β€” singleton to be set (currently 6.5%) already killed (0x34b3a436eefab94cf95dfe20700c43330a5208e7)
idle ynETH (oneway-22) 0xdC5D5EE1223D4C8b7eAc8e876793f2171e7e8dEb 0 $0 β€” singleton to be set (currently 1.3%) to be killed (0xe9ca32785e192abd1bcf4e9fa0160dc47e93ed89)
idle ynETH borrow (oneway-24) 0x757C61d89bD0406BfcBB68178BBfaE79ECa46c0f 0 $0 β€” singleton to be set (currently 13.0%) to be killed (0x7eb2f263fbdace62fca1a49386410f9247c3d553)
idle LBTC (oneway-25) 0xC28C2FD809FC1795f90de1C9dA2131434A77721d 0 $0 β€” singleton to be set (currently 6.5%) no gauge
idle RCH (oneway-26) 0xf8C27436B277734AAA726A8fD5e6D7daDe0296c5 0 $0 β€” singleton to be set (currently 10.5%) already killed (0x11c2a9fac65809c527bcb04fb7ec52080f053dc0)
idle sUSDf (oneway-33) 0xD961B0Da2B0Fb04439c96B552777720B5FC551A0 0 $0 β€” singleton to be set (currently 1.9%) to be killed (0xfc31d6227e8b9341bdbf781b58c87c1ccff7ff2b)
idle yvUSDC-1 (oneway-36) 0xB62B9272679d7A495d7e9698d8663F217224408a 0 $0 β€” singleton to be set (currently 1.3%) no gauge
idle yvUSDS-1 (oneway-37) 0xE786af7faef857C8D850d648723Eec0A27cd8581 0 $0 β€” singleton to be set (currently 1.3%) no gauge
idle yvWETH-2 (oneway-38) 0x5bfEE37053d711F49A0aCf5afEd6496fA68dCE32 0 $0 β€” singleton to be set (currently 7.0%) no gauge
idle CRV borrow (oneway-4) 0xC510d73Ad34BeDECa8978B6914461aA7b50CF3Fc 0 $0 β€” singleton to be set (currently 11.0%) to be killed (0x99440e11485fc623c7a9f2064b97a961a440246b)
idle sdeUSD (oneway-40) 0xFA4f65B3Dc477738ce8618e9145E1f0Ad9E29034 0 $0 β€” singleton to be set (currently 1.9%) already killed (0xcc0214391c24a948308f27e0d5ab4e832082d09a)
idle zkBTC (oneway-42) 0xbe0f8c48776c0433B2b778AE9c076C21683ebe7B 0 $0 β€” singleton to be set (currently 6.5%) no gauge
idle zkBTC (oneway-43) 0xbCc9AcD2E7934bb8B5d734416737694AcDD9E25a 0 $0 β€” singleton to be set (currently 6.5%) to be killed (0x169b6d105e05732ef9e0cd1d279dd81283d90aff)
idle yvCurve-yYB-f (oneway-46) 0x1591F867C42ecA199d59a4f8B0074DeDee5D843A 0 $0 β€” singleton to be set (currently 22.0%) no gauge
idle WETH borrow (oneway-5) 0xa5D9137d2A1Ee912469d911A8E74B6c77503bac8 0 $0 β€” singleton to be set (currently 7.0%) to be killed (0x12b9db644ca8a8e27cd1770adb48513b5f8c5ae5)
idle tBTC borrow (oneway-6) 0xe438658874b0acf4D81c24172E137F0eE00621b8 0 $0 β€” singleton to be set (currently 6.5%) to be killed (0x2605d72e460feff15bf4fd728a5ea31928895c2a)

In-Progress Actions

Chain Market Action Status
Fraxtal FXS/FRAX (oneway-2) Set borrow rate to 0, loan discount to 50% Done β€” vote passed and executed via proposal 1393. Controller now points at the singleton MP 0x7abEB1Dfbe7Dc5e64D1F392F7627162E6D53929F; loan discount = 50%; rate = 0%.
Fraxtal SQUID (oneway-4) Set borrow rate to 0, loan discount to 50%, kill gauge Done β€” vote passed and executed via proposal 1393. Controller now points at the singleton MP 0x7abEB1Dfbe7Dc5e64D1F392F7627162E6D53929F; loan discount = 50%; rate = 0%; gauge kill action included.
Ethereum CRV (oneway-3) Set borrow rate to 0 Done
Ethereum CRV (oneway-3) Set loan discount to 50%, kill gauge Done β€” vote passed and executed via proposal 1391. Loan discount = 50%, gauge is_killed = true confirmed on-chain.

Next Steps

For each bad-debt or idle market, the following procedure applies, with parameters varying by track. All markets are addressed together rather than phased by chain.

  1. Set monetary policy (Controller.set_monetary_policy)

    • Liquid bad-debt markets β†’ no MP change. Existing utilization-driven policy stays in place; lenders earning yield on the solvent portion of the book are left undisturbed.
    • Illiquid bad-debt markets β†’ point at a zero-rate MP, halting further interest accrual on positions that are unlikely to repay so the shortfall stops growing.
    • Idle markets β†’ point at the singleton MP. The rate doesn’t matter (no open loans), but it keeps the deprecated cohort uniform.
  2. Raise loan discount to maximum (Controller.set_borrowing_discounts)

    Call Controller.set_borrowing_discounts(MAX_LOAN_DISCOUNT, MAX_LIQUIDATION_DISCOUNT). The contract enforces a maximum value of 50% (loan_discount <= 5e17). This prevents new borrows from being underwritten against v1 collateral but does not retroactively touch existing positions. Applies to all markets in the deprecation cohort regardless of track.

  3. Kill the gauge

    Set is_killed = true on each market’s gauge (or RootGauges for L2 markets) to stop CRV emissions. Same procedure used in prior deprecations. Markets without a gauge or with is_killed already true are skipped.

  4. UI removal

    All deprecated markets will be hidden from the UI. Users with active positions in those markets will still be able to see and interact with them in order to manage or close their positions.

4 Likes

Thanks @LlamaRisk for the deprecation plan. One line is worth a separate look: the note that per-market remediation β€œmay be handled as a separate workstream.” That workstream fits better as one standing framework β€” a permanent rule rather than a separate vote per market β€” than as eleven votes.

The eleven markets together. The plan identifies eleven bad-debt markets with about $1.22M aggregate shortfall across Ethereum, Arbitrum, Fraxtal, and Optimism: CRV-long, sDOLA-long2, UwU, wstUSR, IBTC, ARB-long2, FXN, FXS/FRAX, SQUID, OP, Optimism CRV. Triggers vary β€” soft-liquidation parameters, oracle design, and other Curve-shipped factors played roles in different cases. The outcome is structurally similar: funds stuck in lending markets that have been wound down, with no working exit.

What the per-case path has produced. The clearest data point is the Fraxtal FXS/FRAX market, $145,857 of bad debt. A compensation proposal landed on 15 March 2026 at /t/11021. One reply on 16 March, silent since. An on-chain audit through 22 April 2026 found no vote, no calldata, no execution; checking Aragon Ownership votes #1396–#1405 through 8 May 2026 also turns up no WFRAX action. Eight weeks plus dormant. That is the realistic baseline for β€œper-case” at cohort scale β€” most cases will not be written, and most of those written will not be voted.

The mechanism is operational. The plan names Egorov’s recovery-pool design at /t/11062 as β€œa candidate for illiquid bad-debt markets in particular.” Vote #1400 deployed the CRV-long recovery pool on 30 April 2026. Gauge weight activated at 0.45% on the epoch starting 7 May 2026. Pool depth has grown from a few hundred dollars at thread-open to over $160K today, and CRV emissions are flowing. What is missing for the broader cohort is a decision on how to distribute the funding, not a redesigned mechanism.

The proposal β€” one standing framework. Apply the recovery-pool template to every bad-debt market in the cohort: deploy where missing, reuse where it exists. A fixed share of DAO admin and L2 fees auto-routes to those pools. The DAO holds the LP β€” an investment on the DAO’s balance sheet, not money sent to anyone. Half of swap fees flow back to the DAO over time. Trapped holders self-pace their exit: take a deeper discount early, or wait as depth fills toward par. The split across markets follows an objective rule β€” choice between bad-debt size, impacted-user count, or per-market floor-plus-cap is the design question below.

Why one rule rather than eleven votes. It works the same regardless of cause: oracle exploit, market drift, or parameter mismatch all produce the same outcome for trapped users. It is capped: a ceiling per market and a stop condition once enough depth is reached. It is paced naturally as fees accrue, not a one-shot allocation β€” which lines up with michwill’s view that this should happen β€œover time” and out of incremental DAO earnings. And it avoids running eleven separate proposals, most of which would track the WFRAX outcome.

Two open design questions. What share of DAO admin and L2 fees is sustainable as ongoing routing β€” given the funding-source picture documented in /t/11069? And how should the flow split across markets β€” by bad-debt size, by impacted-user count, or by a per-market floor-plus-cap that prevents one large market from absorbing early routing?

Happy to draft the calldata and a sizing model if there is interest.

4 Likes

Agree with this approach for all the reasons above.

Re-use an existing idea/pattern and apply to globally to reduce operational overhead.

1 Like