Summary:
This proposal redirects Curveβs L2 fees to the Curve DAO treasury on mainnet (0x6508eF65b0Bd57eaBD0f1D52685A70433B2d290B) by repointing the fee-burning hooks on the chains that run the newly deployed CowSwap burner infrastructure (Arbitrum, Base) and have a substantial amount of unburnt/unclaimed fees. If approved, directing those fees to the treasury can be reversed by the DAO via a vote at any time.
A substantial amount of fee revenue is currently stranded, both as unburnt fee tokens on the old receivers and as already-burned crvUSD on the L2 FeeCollectors. Values verified on 2026-06-17:
| Chain | Description | Value | State |
|---|---|---|---|
| Arbitrum | old fee receiver 0xd4F94D0aaa640BBb72b5EEc2D85F6D114D81a88E |
~$320k | unburnt fee tokens (USDC, USDai, tBTC, WETH) |
| Arbitrum | FeeCollector 0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd |
~$156k | already burned into crvUSD |
| Base | old fee receiver 0xe8269B33E47761f552E1a3070119560d5fa8bBD6 |
~$268k | unburnt fee tokens (USDC, WETH, cbBTC) |
| Base | FeeCollector 0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA |
~$0.8k | burned into crvUSD |
That is roughly $476k of fee revenue on Arbitrum and $268k on Base.
The proposal also updates the AMM factory fee receivers on Arbitrum and Base to the new FeeCollectors which are using CowSwap burner infrastructure, so pool admin fees on those chains frequently enter the burner infrastructure and are bridged to mainnet. Updating the factory fee receivers routes the unburnt amounts into the burner infrastructure, where they are converted to crvUSD over the coming weekly cycles and bridged to the treasury.
Motivation:
Curveβs L2 fee infrastructure was mostly scattered and inconsistent across chains and required setting manual routes to burn the tokens, meaning fees were not frequently burnt and bridged to mainnet and instead accumulated. While they accumulate, the DAO carries the price risk of the unburnt assets and mostly had to rely on liquidity on Curve itself to burn them, which matters for execution quality. By expanding the CowSwap burner fee infrastructure already used on mainnet to these L2s, fee burning and bridging to mainnet will happen on a weekly basis with tight execution by solvers tapping into the chainβs global liquidity.
This is an optionality-preserving change, not a directional one: it does not decide what the DAO does with the fees, only where they are gathered. Once in the treasury, the funds could be put to work to earn yield (for example via scrvUSD) or distributed onward to veCRV, but that decision is left entirely to the DAO. Nothing is locked or spent, and the routing can be reversed by a follow-up vote at any time.
For context, the DAO treasury currently holds only around $150k, almost entirely crvUSD, so recurring L2 fee revenue would add to it meaningfully over time. These fees are also relevant to ongoing DAO efforts: the sDOLA borrower remediation is being funded through a dedicated donation gauge, whose proposal notes that L2 admin fees could supplement the remediation.
Fee infrastructure deployments:
| Chain | FeeCollector | Hooker | CowSwap Burner | crvUSD |
|---|---|---|---|---|
| Ethereum | 0xa2Bcd1a4Efbd04B63cd03f5aFf2561106ebCCE00 |
0x9A9DF35cd8E88565694CA6AD5093c236C7f6f69D |
0xC0fC3dDfec95ca45A0D2393F518D3EA1ccF44f8b |
0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E |
| Arbitrum | 0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd |
0x7DFA49E4F5A6dEB21B1964Bf520Eeaaf1D965c24 |
0xd48503022B2fBBa4ADF5A78F56B988Be57d84C91 |
0x498Bf2B1e120FeD3ad3D42EA2165E9b73f99C1e5 |
| Base | 0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA |
0x7150ba598bA7341b7232AD6A13Fd90D759407cC8 |
0x9c0f9f476b50CF07e704c070366C1aDBF39F264E |
0x417Ac0e078398C154EdFadD9Ef675d30Be60Af93 |
Current hooks and epoch status:
| Chain | FORWARD epoch | Hook target (bridge wrapper) | Hook call | Current receiver |
|---|---|---|---|---|
| Ethereum | live | 0x22530D384cd9915e096ead2Db7F82EE81f8eB468 |
distribute_fees() |
n/a |
| Arbitrum | killed | none set | n/a | n/a |
| Base | killed | 0x2Fb9ef510f1c52fdfDf84dfa8EEa72E431B7651D |
bridge(...) |
mainnet FeeCollector |
On Arbitrum and Base the FORWARD epoch is currently killed, so burned crvUSD is stranded on the FeeCollector rather than being forwarded. Re-enabling FORWARD on those two chains is part of this proposal.
Current fee receivers (AMM factories) and target:
The stableswap, twocrypto, and tricrypto factories on each chain share the same fee_receiver. On Arbitrum and Base they still point at older receivers, so those pool fees bypass the current burner infrastructure; they should be updated to the chainβs FeeCollector.
| Chain | Current factory fee_receiver |
Change to (new FeeCollector) | Action |
|---|---|---|---|
| Arbitrum | 0xd4F94D0aaa640BBb72b5EEc2D85F6D114D81a88E (legacy receiver) |
0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd |
update |
| Base | 0xe8269B33E47761f552E1a3070119560d5fa8bBD6 (previous FeeCollector) |
0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA |
update |
Proposal:
Set the Hooker hooks on Arbitrum and Base to bridge collected crvUSD to the DAO treasury on mainnet, and re-enable the FORWARD epoch on both chains where it is currently disabled. Once the vote passes and executes, fees that are burned into crvUSD on these chains bridge to the treasury each weekly cycle, including the crvUSD already accumulated on each L2 FeeCollector. This applies to all future fees as well: they keep flowing to the treasury indefinitely until the DAO changes the routing with a follow-up vote. Bridged fees arrive on mainnet after each chainβs native L2 to L1 finalization window (roughly 7 days on both Arbitrum and Base), so they reach the treasury with a delay rather than instantly.
A later OWNERSHIP vote can repoint the hooks back to e.g. the mainnet FeeCollector, restoring the prior behaviour. Because the change only sets the bridge destination, the DAO retains full control and can revert it at any later date.
Additionally, update the stableswap, twocrypto, and tricrypto factory fee_receivers on Arbitrum and Base to the chainβs FeeCollector (see the table above), so pool admin fees on those chains enter the newly deployed burner infrastructure.
Scope:
- This proposal addresses Arbitrum and Base, where the unburnt fees have accumulated. The same burner infrastructure also exists on Gnosis, which already routes normally to its FeeCollector and is left unchanged.
- Other L2s are not wired into this infrastructure at all, so this captures part of total L2 fee revenue, not all of it.
Specification:
The vote is created through the OWNERSHIP DAO (agent 0x40907540d8a6C65c637785e8f8B742ae6b0b9968) and relayed to Arbitrum and Base via the xgov broadcaster. The relayed messages are executed by each chainβs ownership agent (Arbitrum 0x452030a5D962d37D97A9D65487663cD5fd9C2B32, Base 0x2c163fe0f079d138b9c04f780d735289344C8B80). Per chain: unkill the FORWARD epoch, set the bridge hook to the treasury, and update the three factory fee receivers to the FeeCollector.
Arbitrum:
Call via agent (0x452030a5D962d37D97A9D65487663cD5fd9C2B32):
ββ To: 0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd (FeeCollector)
ββ Function: set_killed((address,uint256)[])
ββ Inputs: [[['0x0000000000000000000000000000000000000000', 0]]]
Call via agent (0x452030a5D962d37D97A9D65487663cD5fd9C2B32):
ββ To: 0x7DFA49E4F5A6dEB21B1964Bf520Eeaaf1D965c24 (Hooker)
ββ Function: set_hooks((address,bytes,(uint256,(uint64,uint64,uint64),uint256,uint256,bool),bool)[])
ββ Inputs: [[['0x8a5a5299f35614ac558aa290c2d5856edec1b5ad', '0xe5361522000000000000000000000000498bf2b1e120fed3ad3d42ea2165e9b73f99c1e50000000000000000000000006508ef65b0bd57eabd0f1d52685a70433b2d290bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000056bc75e2d63100000', [0, [0, 0, 0], 0, 0, False], True]]]
Call via agent (0x452030a5D962d37D97A9D65487663cD5fd9C2B32):
ββ To: 0x9AF14D26075f142eb3F292D5065EB3faa646167b (stableswap factory)
ββ Function: set_fee_receiver(address,address)
ββ Inputs: ['0x0000000000000000000000000000000000000000', '0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd']
Call via agent (0x452030a5D962d37D97A9D65487663cD5fd9C2B32):
ββ To: 0x98EE851a00abeE0d95D08cF4CA2BdCE32aeaAF7F (twocrypto factory)
ββ Function: set_fee_receiver(address)
ββ Inputs: ['0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd']
Call via agent (0x452030a5D962d37D97A9D65487663cD5fd9C2B32):
ββ To: 0xbC0797015fcFc47d9C1856639CaE50D0e69FbEE8 (tricrypto factory)
ββ Function: set_fee_receiver(address)
ββ Inputs: ['0x68E7F1e30E0BC195B19C0441Cdb34c0eD513F8Dd']
Base:
Call via agent (0x2c163fe0f079d138b9c04f780d735289344C8B80):
ββ To: 0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA (FeeCollector)
ββ Function: set_killed((address,uint256)[])
ββ Inputs: [[['0x0000000000000000000000000000000000000000', 0]]]
Call via agent (0x2c163fe0f079d138b9c04f780d735289344C8B80):
ββ To: 0x7150ba598bA7341b7232AD6A13Fd90D759407cC8 (Hooker)
ββ Function: set_hooks((address,bytes,(uint256,(uint64,uint64,uint64),uint256,uint256,bool),bool)[])
ββ Inputs: [[['0x2Fb9ef510f1c52fdfDf84dfa8EEa72E431B7651D', '0xe5361522000000000000000000000000417ac0e078398c154edfadd9ef675d30be60af930000000000000000000000006508ef65b0bd57eabd0f1d52685a70433b2d290bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000056bc75e2d63100000', [0, [0, 0, 0], 0, 0, False], True]]]
Call via agent (0x2c163fe0f079d138b9c04f780d735289344C8B80):
ββ To: 0xd2002373543Ce3527023C75e7518C274A51ce712 (stableswap factory)
ββ Function: set_fee_receiver(address,address)
ββ Inputs: ['0x0000000000000000000000000000000000000000', '0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA']
Call via agent (0x2c163fe0f079d138b9c04f780d735289344C8B80):
ββ To: 0xc9Fe0C63Af9A39402e8a5514f9c43Af0322b665F (twocrypto factory)
ββ Function: set_fee_receiver(address)
ββ Inputs: ['0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA']
Call via agent (0x2c163fe0f079d138b9c04f780d735289344C8B80):
ββ To: 0xA5961898870943c68037F6848d2D866Ed2016bcB (tricrypto factory)
ββ Function: set_fee_receiver(address)
ββ Inputs: ['0x56Ba5C600db7524c5Ec253567f8821AaadfCdbEA']