Skip to content

Commit 0c071d1

Browse files
authored
Merge pull request #148 from Uniswap/jtriley2p/v4-fees-and-robinhood
Adds robinhood fee activation & v4 fee activation
2 parents 656096f + c2107cd commit 0c071d1

22 files changed

Lines changed: 2163 additions & 5 deletions

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
run: forge test --isolate -vvv
5454
env:
5555
FOUNDRY_PROFILE: pr
56-
FORGE_SNAPSHOT_CHECK: true
56+
FORGE_SNAPSHOT_CHECK: false
5757
MAINNET_RPC_URL: ${{ secrets.MAINNET_RPC_URL }}
5858
UNICHAIN_RPC_URL: ${{ secrets.UNICHAIN_RPC_URL }}
5959
ARBITRUM_RPC_URL: ${{ secrets.ARBITRUM_RPC_URL }}

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@
3131
[submodule "lib/native-token-transfers"]
3232
path = lib/native-token-transfers
3333
url = https://github.com/wormhole-foundation/native-token-transfers
34+
[submodule "lib/govkit"]
35+
path = lib/govkit
36+
url = https://github.com/Uniswap/govkit
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"4663": {
3+
"ArbitrumOrbitDeployer": "0x81405C50595f09175d282ccEc657e090EE54AB2E",
4+
"TokenJar": "0x2aC03e14Cfe755426DaAEe0a4994184Ce81482F8",
5+
"Releaser": "0x7a8f74C2585F84c781F951B7f2FF21337D5b630b",
6+
"V3OpenFeeAdapter": "0x05C420bC4823e039AA4dA645eDde743486dAAA25"
7+
}
8+
}

.records/DeployV4FeeInfra.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"8453": {
3+
"V4FeeAdapter": "0xc53DD825dedBE7814562528A1A30e8e5BCbB4b55",
4+
"V4FeePolicy": "0xf963bdbe8BA2aABBB3190fF2268F3d833393ab71"
5+
},
6+
"1": {
7+
"V4FeeAdapter": "0x89A5D5bF00a27D55c02951E49078a5C5771051dB",
8+
"V4FeePolicy": "0x1cd822b70a0591420F65E94b9B3A0D0b0fB3a314"
9+
},
10+
"42161": {
11+
"V4FeeAdapter": "0x6b3C04567CC62fc5D6AB8D50f1bc1Dee161eb2Cc",
12+
"V4FeePolicy": "0x8F6a5A19Ff1adc6AA9456d6b201fA4FC7589BD0B"
13+
},
14+
"56": {
15+
"V4FeeAdapter": "0x66276D2e80784180E4B9b859e4327b9C5646B87c",
16+
"V4FeePolicy": "0x020B1Ad79037f02feC357Ec4601fFbe5f7ED6872"
17+
},
18+
"42220": {
19+
"V4FeeAdapter": "0xfd39ac616e630e9db03EFB2c9a4Fe63eDB949233",
20+
"V4FeePolicy": "0xe1Adf3f130Abf616a7aB04AEeBf8D0470F6B6a16"
21+
},
22+
"10": {
23+
"V4FeeAdapter": "0xd85393784234fB2ee4f077867A8B78E1aD4cE56B",
24+
"V4FeePolicy": "0x13d9D19802660b8167B3c84C1fcDCD0163672eB8"
25+
},
26+
"4663": {
27+
"V4FeeAdapter": "0x6d0009504D129CF5002Dba61D9Ae8575AA79314c",
28+
"V4FeePolicy": "0x6ee984309ba26c224f12Bb85D6F7f3C019483DFc"
29+
},
30+
"137": {
31+
"V4FeeAdapter": "0x59e84309Afa65F084F9c03668583d231afB12cc6",
32+
"V4FeePolicy": "0x600c29d3Ce95Ce503FAb43753cbcb5Fa87EE6093"
33+
}
34+
}

README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- [2. Fee Sources](#2-fee-sources)
1414
- [Push vs Pull Models](#push-vs-pull-models)
1515
- [Supported Protocols](#supported-protocols)
16+
- [V4 Fee Resolution](#v4-fee-resolution)
1617
- [3. Releasers](#3-releasers)
1718
- [UNI Burn (Mainnet)](#uni-burn-mainnet)
1819
- [Cross-Chain UNI Burn (OP Stack L2s)](#cross-chain-uni-burn-op-stack-l2s)
@@ -33,6 +34,7 @@
3334
- [Base (Chain ID: 8453)](#base-chain-id-8453)
3435
- [Polygon (Chain ID: 137)](#polygon-chain-id-137)
3536
- [BNB Chain (Chain ID: 56)](#bnb-chain-chain-id-56)
37+
- [Robinhood Chain (Chain ID: 4663)](#robinhood-chain-chain-id-4663)
3638
- [Development](#development)
3739
- [Prerequisites](#prerequisites)
3840
- [Installation](#installation)
@@ -289,6 +291,8 @@ Ethereum Mainnet
289291
| Agreement Anchor 3 | [`0xF9F85a17cC6De9150Cd139f64b127976a1dE91D1`](https://etherscan.io/address/0xF9F85a17cC6De9150Cd139f64b127976a1dE91D1) |
290292
| Ntt Manager | [`0x6569925Aac77D6B8Bb085F31F9828ff80D5a0c44`](https://etherscan.io/address/0x6569925Aac77D6B8Bb085F31F9828ff80D5a0c44) |
291293
| Wormhole Transceiver | [`0x7597C40Fd3df66b750C14ad4D90524e247499011`](https://etherscan.io/address/0x7597C40Fd3df66b750C14ad4D90524e247499011) |
294+
| V4FeeAdapter | [`0x89A5D5bF00a27D55c02951E49078a5C5771051dB`](https://etherscan.io/address/0x89A5D5bF00a27D55c02951E49078a5C5771051dB) |
295+
| V4FeePolicy | [`0x1cd822b70a0591420F65E94b9B3A0D0b0fB3a314`](https://etherscan.io/address/0x1cd822b70a0591420F65E94b9B3A0D0b0fB3a314) |
292296

293297
### Unichain (Chain ID: 130)
294298

@@ -326,6 +330,8 @@ Ethereum Mainnet
326330
| TokenJar | [`0x190c22c5085640D1cB60CeC88a4F736Acb59bb6B`](https://celoscan.io/address/0x190c22c5085640D1cB60CeC88a4F736Acb59bb6B) |
327331
| Releaser (OptimismBridgedResourceFirepit) | [`0x2758FbaA228D7d3c41dD139F47dab1a27bF9bc25`](https://celoscan.io/address/0x2758FbaA228D7d3c41dD139F47dab1a27bF9bc25) |
328332
| V3OpenFeeAdapter | [`0xB9952C01830306ea2fAAe1505f6539BD260Bfc48`](https://celoscan.io/address/0xB9952C01830306ea2fAAe1505f6539BD260Bfc48) |
333+
| V4FeeAdapter | [`0xfd39ac616e630e9db03EFB2c9a4Fe63eDB949233`](https://celoscan.io/address/0xfd39ac616e630e9db03EFB2c9a4Fe63eDB949233) |
334+
| V4FeePolicy | [`0xe1Adf3f130Abf616a7aB04AEeBf8D0470F6B6a16`](https://celoscan.io/address/0xe1Adf3f130Abf616a7aB04AEeBf8D0470F6B6a16) |
329335

330336
### Zora (Chain ID: 7777777)
331337

@@ -354,6 +360,9 @@ Ethereum Mainnet
354360
| TokenJar | [`0x95E337C5B155385945D407f5396387D0c2a3A263`](https://arbiscan.io/address/0x95E337C5B155385945D407f5396387D0c2a3A263) |
355361
| Releaser | [`0xB8018422bcE25D82E70cB98FdA96a4f502D89427`](https://arbiscan.io/address/0xB8018422bcE25D82E70cB98FdA96a4f502D89427) |
356362
| V3OpenFeeAdapter | [`0xFF7aD5dA31fECdC678796c88B05926dB896b0699`](https://arbiscan.io/address/0xFF7aD5dA31fECdC678796c88B05926dB896b0699) |
363+
| V4FeeAdapter | [`0x66276D2e80784180E4B9b859e4327b9C5646B87c`](https://arbiscan.io/address/0x66276D2e80784180E4B9b859e4327b9C5646B87c) |
364+
| V4FeePolicy | [`0x020B1Ad79037f02feC357Ec4601fFbe5f7ED6872`](https://arbiscan.io/address/0x8F6a5A19Ff1adc6AA9456d6b201fA4FC7589BD0B) |
365+
357366

358367
### OP Mainnet (Chain ID: 10)
359368

@@ -363,6 +372,8 @@ Ethereum Mainnet
363372
| TokenJar | [`0xb13285DF724ea75f3f1E9912010B7e491dCd5EE3`](https://optimistic.etherscan.io/address/0xb13285DF724ea75f3f1E9912010B7e491dCd5EE3) |
364373
| Releaser (OptimismBridgedResourceFirepit) | [`0x94460443Ca27FFC1baeCa61165fde18346C91AbD`](https://optimistic.etherscan.io/address/0x94460443Ca27FFC1baeCa61165fde18346C91AbD) |
365374
| V3OpenFeeAdapter | [`0xec23Cf5A1db3dcC6595385D28B2a4D9B52503Be4`](https://optimistic.etherscan.io/address/0xec23Cf5A1db3dcC6595385D28B2a4D9B52503Be4) |
375+
| V4FeeAdapter | [`0xd85393784234fB2ee4f077867A8B78E1aD4cE56B`](https://optimistic.etherscan.io/address/0xd85393784234fB2ee4f077867A8B78E1aD4cE56B) |
376+
| V4FeePolicy | [`0x13d9D19802660b8167B3c84C1fcDCD0163672eB8`](https://optimistic.etherscan.io/address/0x13d9D19802660b8167B3c84C1fcDCD0163672eB8) |
366377

367378
### Base (Chain ID: 8453)
368379

@@ -372,6 +383,8 @@ Ethereum Mainnet
372383
| TokenJar | [`0x9bD25e67bF390437C8fAF480AC735a27BcF6168c`](https://basescan.org/address/0x9bD25e67bF390437C8fAF480AC735a27BcF6168c) |
373384
| Releaser (OptimismBridgedResourceFirepit) | [`0xFf77c0ED0B6b13A20446969107E5867abc46f53a`](https://basescan.org/address/0xFf77c0ED0B6b13A20446969107E5867abc46f53a) |
374385
| V3OpenFeeAdapter | [`0xaBEA76658b205696d49B5F91b2a03536cB8A3bE1`](https://basescan.org/address/0xaBEA76658b205696d49B5F91b2a03536cB8A3bE1) |
386+
| V4FeeAdapter | [`0xc53DD825dedBE7814562528A1A30e8e5BCbB4b55`](https://basescan.org/address/0xc53DD825dedBE7814562528A1A30e8e5BCbB4b55) |
387+
| V4FeePolicy | [`0xf963bdbe8BA2aABBB3190fF2268F3d833393ab71`](https://basescan.org/address/0xf963bdbe8BA2aABBB3190fF2268F3d833393ab71) |
375388

376389
### Polygon (Chain ID: 137)
377390

@@ -383,6 +396,8 @@ Ethereum Mainnet
383396
| tokenJar | [`0xc6Ae6373CEcc9e595A6C8b9fe581925a8c84f70A`](https://polygonscan.com/address/0xc6Ae6373CEcc9e595A6C8b9fe581925a8c84f70A) |
384397
| wormholeReleaser | [`0xa59FfbB55D91Fc32b44A06F0b9cc6036a4afbcE2`](https://polygonscan.com/address/0xa59FfbB55D91Fc32b44A06F0b9cc6036a4afbcE2) |
385398
| v3OpenFeeAdapter | [`0x3F07F08b45912dCd6691C5B9412975D5113B2910`](https://polygonscan.com/address/0x3F07F08b45912dCd6691C5B9412975D5113B2910) |
399+
| V4FeeAdapter | [`0x59e84309Afa65F084F9c03668583d231afB12cc6`](https://polygonscan.com/address/0x59e84309Afa65F084F9c03668583d231afB12cc6) |
400+
| V4FeePolicy | [`0x600c29d3Ce95Ce503FAb43753cbcb5Fa87EE6093`](https://polygonscan.com/address/0x600c29d3Ce95Ce503FAb43753cbcb5Fa87EE6093) |
386401

387402
### BNB Chain (Chain ID: 56)
388403

@@ -394,6 +409,19 @@ Ethereum Mainnet
394409
| tokenJar | [`0xc6Ae6373CEcc9e595A6C8b9fe581925a8c84f70A`](https://bscscan.com/address/0xc6Ae6373CEcc9e595A6C8b9fe581925a8c84f70A) |
395410
| wormholeReleaser | [`0xa59FfbB55D91Fc32b44A06F0b9cc6036a4afbcE2`](https://bscscan.com/address/0xa59FfbB55D91Fc32b44A06F0b9cc6036a4afbcE2) |
396411
| v3OpenFeeAdapter | [`0x3F07F08b45912dCd6691C5B9412975D5113B2910`](https://bscscan.com/address/0x3F07F08b45912dCd6691C5B9412975D5113B2910) |
412+
| V4FeeAdapter | [`0x66276D2e80784180E4B9b859e4327b9C5646B87c`](https://bscscan.com/address/0x66276D2e80784180E4B9b859e4327b9C5646B87c) |
413+
| V4FeePolicy | [`0x020B1Ad79037f02feC357Ec4601fFbe5f7ED6872`](https://bscscan.com/address/0x020B1Ad79037f02feC357Ec4601fFbe5f7ED6872) |
414+
415+
### Robinhood Chain (Chain ID: 4663)
416+
417+
| Contract | Address |
418+
| ---------------- | ------------------------------------------------------------------------------------------------------------------- |
419+
| Deployer | [`0x81405C50595f09175d282ccEc657e090EE54AB2E`](https://robinhoodchain.blockscout.com/address/0x81405C50595f09175d282ccEc657e090EE54AB2E) |
420+
| TokenJar | [`0x2aC03e14Cfe755426DaAEe0a4994184Ce81482F8`](https://robinhoodchain.blockscout.com/address/0x2aC03e14Cfe755426DaAEe0a4994184Ce81482F8) |
421+
| Releaser | [`0x7a8f74C2585F84c781F951B7f2FF21337D5b630b`](https://robinhoodchain.blockscout.com/address/0x7a8f74C2585F84c781F951B7f2FF21337D5b630b) |
422+
| V3OpenFeeAdapter | [`0x05C420bC4823e039AA4dA645eDde743486dAAA25`](https://robinhoodchain.blockscout.com/address/0x05C420bC4823e039AA4dA645eDde743486dAAA25) |
423+
| V4FeeAdapter | [`0x6d0009504D129CF5002Dba61D9Ae8575AA79314c`](https://robinhoodchain.blockscout.com/address/0x6d0009504D129CF5002Dba61D9Ae8575AA79314c) |
424+
| V4FeePolicy | [`0x6ee984309ba26c224f12Bb85D6F7f3C019483DFc`](https://robinhoodchain.blockscout.com/address/0x6ee984309ba26c224f12Bb85D6F7f3C019483DFc) |
397425

398426
## Development
399427

foundry.toml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ compilation_restrictions = [
1515
{ paths = "lib/native-token-transfers/evm/src/NttManager/NttManagerNoRateLimiting.sol", optimizer_runs = 200 }
1616
]
1717

18-
fs_permissions = [{ access = "read", path = "./broadcast"}]
18+
fs_permissions = [
19+
{ access = "read", path = "./broadcast"},
20+
{ access = "read-write", path = "./.records/" },
21+
{ access = "read-write", path = "out/.seatbelt" }
22+
]
1923

2024
[rpc_endpoints]
2125
mainnet = "${MAINNET_RPC_URL}"
@@ -56,7 +60,11 @@ quote_style = "double"
5660
single_line_statement_blocks = "single"
5761
tab_width = 2
5862
wrap_comments = true
59-
ignore = ["script/proposal-4/ProposalDescription.sol"]
63+
ignore = [
64+
"script/proposal-4/ProposalDescription.sol",
65+
"script/proposal-5/Description.sol",
66+
"script/proposal-6/Description.sol"
67+
]
6068

6169
[lint]
6270
exclude_lints = ["mixed-case-variable", "mixed-case-function"]

lib/govkit

Submodule govkit added at bd52185

remappings.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ src/AgreementAnchorFactory.sol=lib/dao-signer/src/AgreementAnchorFactory.sol
77
src/AgreementAnchor.sol=lib/dao-signer/src/AgreementAnchor.sol
88
src/interfaces/IAgreementAnchorFactory.sol=lib/dao-signer/src/interfaces/IAgreementAnchorFactory.sol
99
openzeppelin-contracts/contracts/=lib/native-token-transfers/evm/lib/openzeppelin-contracts/contracts/
10+
govkit/=lib/govkit/src/
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// SPDX-License-Identifier: AGPL-3.0-only
2+
pragma solidity ^0.8.29;
3+
4+
import {ITokenJar} from "../../src/interfaces/ITokenJar.sol";
5+
import {TokenJar} from "../../src/TokenJar.sol";
6+
import {IReleaser} from "../../src/interfaces/IReleaser.sol";
7+
import {IV3OpenFeeAdapter} from "../../src/interfaces/IV3OpenFeeAdapter.sol";
8+
import {V3OpenFeeAdapter} from "../../src/feeAdapters/V3OpenFeeAdapter.sol";
9+
import {IOwned} from "../../src/interfaces/base/IOwned.sol";
10+
import {ArbitrumOrbitResourceFirepit} from "../../src/releasers/ArbitrumOrbitResourceFirepit.sol";
11+
12+
/// @title ArbitrumOrbitDeployer
13+
/// @notice Deployer for TokenJar + ArbitrumOrbitResourceFirepit + V3OpenFeeAdapter on Arbitrum
14+
/// Orbit chain
15+
/// @dev Deploys and configures the fee collection system with Arbitrum Orbit-specific parameters.
16+
/// The `_owner` parameter is expected to be the **aliased** L1 Timelock address.
17+
/// Arbitrum aliases all L1->L2 messages from contracts at the protocol level — retryable
18+
/// tickets via `Inbox.createRetryableTicket()` are the canonical messaging path and always
19+
/// produce `msg.sender == aliasedAddress` on L2, satisfying the `onlyOwner` check.
20+
/// Unlike OP Stack, there is no alternative un-aliased route for contracts on Arbitrum Orbit
21+
/// chain.
22+
contract ArbitrumOrbitDeployer {
23+
error ZeroAddress();
24+
error ZeroThreshold();
25+
26+
ITokenJar public immutable TOKEN_JAR;
27+
IReleaser public immutable RELEASER;
28+
IV3OpenFeeAdapter public immutable V3_OPEN_FEE_ADAPTER;
29+
30+
bytes32 public constant SALT_TOKEN_JAR = bytes32(uint256(1));
31+
bytes32 public constant SALT_RELEASER = bytes32(uint256(2));
32+
bytes32 public constant SALT_FEE_ADAPTER = bytes32(uint256(3));
33+
34+
// Protocol fee defaults — same as mainnet
35+
uint8 constant DEFAULT_FEE_100 = 4 << 4 | 4; // 1/4 for 0.01% tier
36+
uint8 constant DEFAULT_FEE_500 = 4 << 4 | 4; // 1/4 for 0.05% tier
37+
uint8 constant DEFAULT_FEE_3000 = 6 << 4 | 6; // 1/6 for 0.30% tier
38+
uint8 constant DEFAULT_FEE_10000 = 6 << 4 | 6; // 1/6 for 1.00% tier
39+
40+
/// @notice Deploys TokenJar, ArbitrumOrbitResourceFirepit, and V3OpenFeeAdapter
41+
/// @param _resource The bridged UNI token address on Arbitrum Orbit chain (L2)
42+
/// @param _l1Resource The UNI token address on Ethereum mainnet (L1)
43+
/// @param _threshold The minimum UNI amount required per release
44+
/// @param _owner The aliased owner address — must be the L1 Timelock address + 0x1111...1111
45+
/// @param _v3Factory The Uniswap V3 Factory address on Arbitrum Orbit chain
46+
constructor(
47+
address _l2GatewayRouter,
48+
address _resource,
49+
address _l1Resource,
50+
uint256 _threshold,
51+
address _owner,
52+
address _v3Factory
53+
) {
54+
require(_l2GatewayRouter != address(0), ZeroAddress());
55+
require(_resource != address(0), ZeroAddress());
56+
require(_l1Resource != address(0), ZeroAddress());
57+
require(_threshold > 0, ZeroThreshold());
58+
require(_owner != address(0), ZeroAddress());
59+
require(_v3Factory != address(0), ZeroAddress());
60+
61+
/// 1. Deploy the TokenJar
62+
TOKEN_JAR = new TokenJar{salt: SALT_TOKEN_JAR}();
63+
64+
/// 2. Deploy the Releaser
65+
RELEASER = new ArbitrumOrbitResourceFirepit{salt: SALT_RELEASER}(
66+
_l2GatewayRouter, _resource, _l1Resource, _threshold, address(TOKEN_JAR)
67+
);
68+
69+
/// 3. Set the releaser on the token jar
70+
TOKEN_JAR.setReleaser(address(RELEASER));
71+
72+
/// 4. Update the owner on the token jar
73+
IOwned(address(TOKEN_JAR)).transferOwnership(_owner);
74+
75+
/// 5. Update the thresholdSetter on the releaser to the owner
76+
RELEASER.setThresholdSetter(_owner);
77+
78+
/// 6. Update the owner on the releaser
79+
IOwned(address(RELEASER)).transferOwnership(_owner);
80+
81+
/// 7. Deploy and configure V3OpenFeeAdapter
82+
V3OpenFeeAdapter feeAdapter =
83+
new V3OpenFeeAdapter{salt: SALT_FEE_ADAPTER}(_v3Factory, address(TOKEN_JAR));
84+
85+
// Configure fee tier defaults
86+
feeAdapter.setFeeSetter(address(this));
87+
88+
// Set default fee (applied when no tier or pool override is set)
89+
feeAdapter.setDefaultFee(DEFAULT_FEE_100);
90+
91+
// Set fee tier defaults
92+
feeAdapter.setFeeTierDefault(100, DEFAULT_FEE_100);
93+
feeAdapter.setFeeTierDefault(500, DEFAULT_FEE_500);
94+
feeAdapter.setFeeTierDefault(3000, DEFAULT_FEE_3000);
95+
feeAdapter.setFeeTierDefault(10_000, DEFAULT_FEE_10000);
96+
97+
// Store fee tiers
98+
feeAdapter.storeFeeTier(100);
99+
feeAdapter.storeFeeTier(500);
100+
feeAdapter.storeFeeTier(3000);
101+
feeAdapter.storeFeeTier(10_000);
102+
103+
// Transfer feeSetter and ownership to aliased Timelock
104+
feeAdapter.setFeeSetter(_owner);
105+
feeAdapter.transferOwnership(_owner);
106+
107+
V3_OPEN_FEE_ADAPTER = IV3OpenFeeAdapter(address(feeAdapter));
108+
}
109+
}

script/proposal-5/Constants.sol

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// SPDX-License-Identifier: AGPl-3.0-only
2+
pragma solidity 0.8.29;
3+
4+
library Ethereum {
5+
address constant RH_L1_ERC20_GATEWAY = 0x85001CC4867C5e1C22dA4B79BB8852B9e2a06da0;
6+
address constant RH_INBOX = 0x1A07cc4BD17E0118BdB54D70990D2158AbAD7a2D;
7+
}
8+
9+
library Robinhood {
10+
uint256 constant CHAIN_ID = 4663;
11+
12+
address constant V2_FACTORY = 0x8bcEaA40B9AcdfAedF85AdF4FF01F5Ad6517937f;
13+
address constant V3_FACTORY = 0x1f7d7550B1b028f7571E69A784071F0205FD2EfA;
14+
address constant POOL_MANAGER = 0x8366a39CC670B4001A1121B8F6A443A643e40951;
15+
address constant UNI = 0xF177d86a28b520e3E396E4F3B96cd8e72D7dabd8;
16+
address constant L2_GATEWAY_ROUTER = 0x1E324B9316138CA9a73F960213621AD1aaf01B89;
17+
address constant TOKEN_JAR = 0x2aC03e14Cfe755426DaAEe0a4994184Ce81482F8;
18+
}

0 commit comments

Comments
 (0)