Summary:
Enable a 1bp, 1tick fee tier on optimism (L2).
The rationale and initial temperature check for this proposal can be found here: https://gov.uniswap.org/t/deploy-a-1bp-fee-tier-to-uniswapv3-on-optimism/16930
Process:
The complete process is described in Uniswap’s Governance Reference here 4 and can be summarized as:
• A proposal is posted in GovernorBravo on Mainnet (GovernorAlpha for Kovan)
• The proposal is voted, queued and executed via Timelock.
• When all the conditions are meet and is executed, Timelock contract, which is authorized to execute administrative actions on the protected contracts, will execute the requested actions in the proposal.
Since this proposal needs to be executed on a different network, in this case L2 Optimism, the executing action needs to be forwarded to the proper target. In order to do that, Timelock will send the transaction to OVM_L1CrossDomainMessenger (Optimism mechanism to forward transactions from L1 to L2).
The transaction will then be sent via Optimism contracts to Uniswap’s CrossChainAccount, that is the privileged contract that can execute administrative tasks on protected contracts on L2 Optimism, and CrossChainAccount will forward the transaction, if it has the right origin, to the target Contract, in this case to UniswapV3Factory. The sequence of contract interactions is the following:
• GovernorBravo.propose(targets, values, signatures, calldatas, description) ◦ where targets are the address of the contracts to interact with, ◦ calldatas the calldatas to execute on those contracts, and ◦ description, the description of the proposal (or name)
• OVM_L1CrossDomainMessenger.sendMessage(target, calldata, gas) ◦ where target is the address of the contracts to interact with on L2, ◦ calldata the calldata to execute on that contract, and ◦ gas, the gas to be used on that transaction
• CrossChainAccount.forward(target, calldata) ◦ where target is the address of the Uniswap contracts to interact with on L2, and ◦ calldata the calldata to execute on that contract
• UniswapV3Factory.enableFeeAmount(fee,tickSpacing) ◦ where fee is the fee to enable (in hundredths of a bip), and ◦ tickSpacing the spacing between ticks
Compiling all the calls together it can be seen as:
GovernorBravo.propose( [OVM_L1CrossDomainMessenger address], [ 0 ], [ “” ], [ encodedCalldata( OVM_L1CrossDomainMessenger.sendMessage( CrossChainAccount address, encodedCalldata(CrossChainAccount.forward( UniswapV3Factory address, encodedCalldata( UniswapV3Factory.enableFeeAmount( 100, 1 ) ) ) ), 8000000 ) ], “Enable 1bp fee tier on Optimism” )
Test network execution (Kovan)
Proposer Address: 0xF526Eb7D2d4445FA8d258959A000400cca4A93f4
Addresses
• GovernorAlpha (No GovernorBravo in kovan): ◦ 0x5e4be8Bc9637f0EAA1A755019e06A68ce081D58F ◦ https://kovan.etherscan.io/address/0x5e4be8bc9637f0eaa1a755019e06a68ce081d58f
• OVM_L1CrossDomainMessenger: ◦ 0x4361d0F75A0186C05f971c566dC6bEa5957483fD ◦ https://kovan.etherscan.io/address/0x4361d0F75A0186C05f971c566dC6bEa5957483fD
• CrossChainAccount: ◦ 0x3D7E0d4BD24F556767ccFC9c54092447BA88e926 ◦ https://kovan-optimistic.etherscan.io/address/0x3D7E0d4BD24F556767ccFC9c54092447BA88e926
• UniswapV3Factory: ◦ 0x1F98431c8aD98523631AE4a59f267346ea31F984 ◦ https://kovan-optimistic.etherscan.io/address/0x1F98431c8aD98523631AE4a59f267346ea31F984
Proposal
Proposal: { targets: [ ‘0x4361d0F75A0186C05f971c566dC6bEa5957483fD’ ], values: [ ‘0’ ], signatures: [ ‘’ ], calldatas: [ ‘0x3dbb202b0000000000000000000000003d7e0d4bd24f556767ccfc9c54092447ba88e926000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000000000c46fadcf720000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000448a7c195f000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’ ] }
Proposal’s calldata dissection
• 2nd layer (CrossChainAccount) ◦ forward(address,bytes) ◦ https://rimeissner.dev/transaction-decoder/#/?data=0x6fadcf720000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000448a7c195f0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000
• 3rd layer (UniswapV3Factory) ◦ enableFeeAmount(uint24,int24) ◦ https://rimeissner.dev/transaction-decoder/#/?data=0x8a7c195f00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001
Transactions
• [x] Post Proposal ◦ Transaction: https://kovan.etherscan.io/tx/0x18013fbc91c6d7beff8b7d5eb576e2fb2c03d266fdaa83e47c34ec6e09fa3644 ◦ Proposal ID: 2
• [x] CastVote ◦ Transaction: https://kovan.etherscan.io/tx/0xb7f485094d778a967b61d64e78439ee6dd8d6f4704f8d3de7de7db54994e57ff
• [x] Queue: ◦ Transaction: https://kovan.etherscan.io/tx/0xf24bc0902bcea7e16adfe61419177b66fb074b47497c60bf7e4dfb65c490fe17
• [x] Execute: ◦ Available since: 1655765068 (GMT: Monday, June 20, 2022 10:44:28 PM) ◦ Kovan Transaction: https://kovan.etherscan.io/tx/0xece5b14c411777a5d17c8eb0fda582785033a7ec4676af786ec2e9dfa83b76a1 ◦ Kovan-Optimism Transaction: https://kovan-optimistic.etherscan.io/tx/0x21e372a4b907461e002f38f8da59d3e2e221a50f717a2852df743a8b283c91e4
Mainnet execution
Proposer Address: 0x7B3ee5816a61Fe182Fd7f89844a2BAFdD84AE5b2
Addresses
• GovernorBravo: ◦ 0x408ED6354d4973f66138C91495F2f2FCbd8724C3 ◦ https://etherscan.io/address/0x408ED6354d4973f66138C91495F2f2FCbd8724C3
• OVM_L1CrossDomainMessenger: ◦ 0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1 ◦ https://etherscan.io/address/0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1
• CrossChainAccount: ◦ 0xa1dD330d602c32622AA270Ea73d078B803Cb3518 ◦ https://optimistic.etherscan.io/address/0xa1dd330d602c32622aa270ea73d078b803cb3518
• UniswapV3Factory: ◦ 0x1F98431c8aD98523631AE4a59f267346ea31F984 ◦ https://optimistic.etherscan.io/address/0x1F98431c8aD98523631AE4a59f267346ea31F984
Proposal
Proposal: { targets: [ ‘0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1’ ], values: [ ‘0’ ], signatures: [ ‘’ ], calldatas: [ ‘0x3dbb202b000000000000000000000000a1dd330d602c32622aa270ea73d078b803cb3518000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000002dc6c000000000000000000000000000000000000000000000000000000000000000c46fadcf720000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000448a7c195f000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000’ ] }
Proposal’s calldata dissection
• 2nd layer (CrossChainAccount) ◦ forward(address,bytes) ◦ https://rimeissner.dev/transaction-decoder/#/?data=0x6fadcf720000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000448a7c195f0000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000
• 3rd layer (UniswapV3Factory) ◦ enableFeeAmount(uint24,int24) ◦ https://rimeissner.dev/transaction-decoder/#/?data=0x8a7c195f00000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000001