Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cleopatra DTL #8

Draft
wants to merge 47 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
03c4aef
Initial version of Ramses V1 DTL
0xJem Jul 22, 2024
01dbcac
Add Ramses imported files into .solhintignore
0xJem Jul 22, 2024
89afe88
Add Ramses V2 interfaces
0xJem Jul 22, 2024
0675ad4
Amend BaseDirectToLiquidity to shift pool token transfers into an imp…
0xJem Jul 23, 2024
eabbf8f
Amend Ramses V1 DTL to adhere to new interface
0xJem Jul 23, 2024
78e1170
Implement DTL for Ramses V2
0xJem Jul 23, 2024
2595b1c
Fix stack too deep error
0xJem Jul 23, 2024
eb8edf9
Documentation
0xJem Jul 23, 2024
4c51e71
Update test salts
0xJem Jul 23, 2024
0816228
Test TODOs
0xJem Jul 23, 2024
0ae4879
chore: linting
0xJem Jul 23, 2024
0c60eef
Ramses V1: shift maxSlippage into onCreate params. Remove pool check.
0xJem Jul 25, 2024
4451130
Ramses V1: Store parameters in a single mapping. Add check on length …
0xJem Jul 25, 2024
a290588
Ramses V1: cleanup
0xJem Jul 25, 2024
2eee49a
Ramses V2: shift maxSlippage and veRamTokenId into onCreate callback …
0xJem Jul 25, 2024
0fe0158
Add note
0xJem Jul 25, 2024
c2bbf8b
Add salt and deploy scripts
0xJem Jul 25, 2024
ed147e2
Test salts for Ramses DTL contracts
0xJem Jul 25, 2024
8f64c10
Add initial (copied) version of Ramses V1 tests
0xJem Jul 25, 2024
0a1aeca
TODOs for other DTL tests
0xJem Jul 25, 2024
2ab2257
Remove redundant storage in Ramses DTL contracts
0xJem Jul 25, 2024
de73a9d
Update test TODOs
0xJem Jul 25, 2024
6de62eb
Update salts
0xJem Jul 25, 2024
a0b036d
test: remove leftover onCreate test is pool is created already
Oighty Jul 25, 2024
13f0c01
test: fix ramses v1 settle tests
Oighty Jul 25, 2024
5bfe27b
Complete tests for Ramses V1 DTL
0xJem Jul 26, 2024
b883788
Check for completed auction lots in onCancel and onCurate callback fu…
0xJem Jul 26, 2024
98c5c11
Add ARBITRUM_RPC_URL to environment in CI, required for fork test
0xJem Jul 26, 2024
7664575
Add storage of tokenId to Ramses V2 DTL
0xJem Jul 26, 2024
30c4c65
Initial version of Ramses V2 tests
0xJem Jul 26, 2024
470d982
Fix failing tests
0xJem Jul 26, 2024
bfb113b
Complete remaining tests
0xJem Jul 26, 2024
15b4f51
Remove veRamTokenId support from Ramses V2 DTL
0xJem Jul 26, 2024
482c4df
Update remaining test salts
0xJem Jul 26, 2024
1dd77d5
Update test TODOs for Uniswap DTL
0xJem Jul 26, 2024
8100ee9
Disable accessing veRam() (not supported on Cleo)
0xJem Jul 26, 2024
3f64371
Rename contracts reference Cleopatra instead of Ramses
0xJem Jul 29, 2024
c9aa1ef
Remove/disable redundant code
0xJem Jul 29, 2024
3fa7730
chore: linting
0xJem Jul 29, 2024
19e58e5
Remove/disable redundant code
0xJem Jul 29, 2024
4a642eb
Remove/disable redundant code
0xJem Jul 29, 2024
ec1067c
Update Cleopatra interfaces
0xJem Jul 29, 2024
bcf6fb6
Update tests for new interfaces
0xJem Jul 29, 2024
78eed6a
Adjust fork settings
0xJem Jul 29, 2024
bda8344
Test salts
0xJem Jul 29, 2024
ea70b21
Fix test failures
0xJem Jul 29, 2024
f33c3a2
Add deployment sequence file. Fix deployment script. Salts.
0xJem Jul 29, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ jobs:
run: |
forge test -vvv
id: test
env:
ARBITRUM_RPC_URL: ${{ secrets.ARBITRUM_RPC_URL }}

- name: Contract Sizes
run: |
Expand Down
1 change: 1 addition & 0 deletions .solhintignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ test/lib/uniswap-v2/**
test/lib/uniswap-v3/**

src/callbacks/liquidity/BaselineV2/lib/**
src/callbacks/liquidity/Cleopatra/lib/**
99 changes: 99 additions & 0 deletions script/deploy/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ import {BALwithCappedAllowlist} from
"../../src/callbacks/liquidity/BaselineV2/BALwithCappedAllowlist.sol";
import {BALwithTokenAllowlist} from
"../../src/callbacks/liquidity/BaselineV2/BALwithTokenAllowlist.sol";
import {CleopatraV1DirectToLiquidity} from
"../../src/callbacks/liquidity/Cleopatra/CleopatraV1DTL.sol";
import {CleopatraV2DirectToLiquidity} from
"../../src/callbacks/liquidity/Cleopatra/CleopatraV2DTL.sol";

// Cleopatra
import {ICleopatraV1Router} from
"../../src/callbacks/liquidity/Cleopatra/lib/ICleopatraV1Router.sol";
import {ICleopatraV2PositionManager} from
"../../src/callbacks/liquidity/Cleopatra/lib/ICleopatraV2PositionManager.sol";

// Baseline
import {
Expand Down Expand Up @@ -972,6 +982,95 @@ contract Deploy is Script, WithDeploySequence, WithSalts {
return (address(batchAllowlist), _PREFIX_CALLBACKS, deploymentKey);
}

function deployBatchCleopatraV1DirectToLiquidity(string memory sequenceName_)
public
returns (address, string memory, string memory)
{
// Get configuration variables
address batchAuctionHouse = _getAddressNotZero("deployments.BatchAuctionHouse");
address cleopatraV1PairFactory = _getEnvAddressOrOverride(
"constants.cleopatraV1.pairFactory", sequenceName_, "args.pairFactory"
);
address payable cleopatraV1Router = payable(
_getEnvAddressOrOverride("constants.cleopatraV1.router", sequenceName_, "args.router")
);
string memory deploymentKey = _getDeploymentKey(sequenceName_);
console2.log(" deploymentKey:", deploymentKey);

// Check that the router and factory match
require(
ICleopatraV1Router(cleopatraV1Router).factory() == cleopatraV1PairFactory,
"ICleopatraV1Router.factory() does not match given Cleopatra V1 pair factory address"
);

// Get the salt
bytes32 salt_ = _getSalt(
deploymentKey,
type(CleopatraV1DirectToLiquidity).creationCode,
abi.encode(batchAuctionHouse, cleopatraV1PairFactory, cleopatraV1Router)
);

// Revert if the salt is not set
require(salt_ != bytes32(0), "Salt not set");

// Deploy the module
console2.log(" salt:", vm.toString(salt_));

vm.broadcast();
CleopatraV1DirectToLiquidity dtl = new CleopatraV1DirectToLiquidity{salt: salt_}(
batchAuctionHouse, cleopatraV1PairFactory, cleopatraV1Router
);
console2.log("");
console2.log(" deployed at:", address(dtl));

return (address(dtl), _PREFIX_CALLBACKS, deploymentKey);
}

function deployBatchCleopatraV2DirectToLiquidity(string memory sequenceName_)
public
returns (address, string memory, string memory)
{
// Get configuration variables
address batchAuctionHouse = _getAddressNotZero("deployments.BatchAuctionHouse");
address cleopatraV2Factory =
_getEnvAddressOrOverride("constants.cleopatraV2.factory", sequenceName_, "args.factory");
address payable cleopatraV2PositionManager = payable(
_getEnvAddressOrOverride(
"constants.cleopatraV2.positionManager", sequenceName_, "args.positionManager"
)
);
string memory deploymentKey = _getDeploymentKey(sequenceName_);
console2.log(" deploymentKey:", deploymentKey);

// Check that the router and factory match
require(
ICleopatraV2PositionManager(cleopatraV2PositionManager).factory() == cleopatraV2Factory,
"ICleopatraV2PositionManager.factory() does not match given Cleopatra V2 factory address"
);

// Get the salt
bytes32 salt_ = _getSalt(
deploymentKey,
type(CleopatraV2DirectToLiquidity).creationCode,
abi.encode(batchAuctionHouse, cleopatraV2Factory, cleopatraV2PositionManager)
);

// Revert if the salt is not set
require(salt_ != bytes32(0), "Salt not set");

// Deploy the module
console2.log(" salt:", vm.toString(salt_));

vm.broadcast();
CleopatraV2DirectToLiquidity dtl = new CleopatraV2DirectToLiquidity{salt: salt_}(
batchAuctionHouse, cleopatraV2Factory, cleopatraV2PositionManager
);
console2.log("");
console2.log(" deployed at:", address(dtl));

return (address(dtl), _PREFIX_CALLBACKS, deploymentKey);
}

// ========== HELPER FUNCTIONS ========== //

function _configureDeployment(string memory data_, string memory name_) internal {
Expand Down
10 changes: 10 additions & 0 deletions script/deploy/sequences/cleopatra-dtl.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"sequence": [
{
"name": "BatchCleopatraV1DirectToLiquidity"
},
{
"name": "BatchCleopatraV2DirectToLiquidity"
}
]
}
14 changes: 6 additions & 8 deletions script/env.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,15 +160,13 @@
},
"mantle": {
"constants": {
"gUni": {
"factory": "0x0000000000000000000000000000000000000000"
},
"uniswapV2": {
"factory": "0x0000000000000000000000000000000000000000",
"router": "0x0000000000000000000000000000000000000000"
"cleopatraV1": {
"pairFactory": "0xAAA16c016BF556fcD620328f0759252E29b1AB57",
"router": "0xAAA45c8F5ef92a000a121d102F4e89278a711Faa"
},
"uniswapV3": {
"factory": "0x0000000000000000000000000000000000000000"
"cleopatraV2": {
"factory": "0xAAA32926fcE6bE95ea2c51cB4Fcb60836D320C42",
"positionManager": "0xAAA78E8C4241990B4ce159E105dA08129345946A"
}
}
},
Expand Down
122 changes: 122 additions & 0 deletions script/salts/dtl-cleopatra/CleopatraDTLSalts.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
/// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

// Scripting libraries
import {Script, console2} from "@forge-std-1.9.1/Script.sol";
import {WithSalts} from "../WithSalts.s.sol";
import {WithDeploySequence} from "../../deploy/WithDeploySequence.s.sol";

// Cleopatra
import {CleopatraV1DirectToLiquidity} from
"../../../src/callbacks/liquidity/Cleopatra/CleopatraV1DTL.sol";
import {CleopatraV2DirectToLiquidity} from
"../../../src/callbacks/liquidity/Cleopatra/CleopatraV2DTL.sol";

contract CleopatraDTLSalts is Script, WithDeploySequence, WithSalts {
string internal constant _ADDRESS_PREFIX = "E6";

function _setUp(string calldata chain_, string calldata sequenceFilePath_) internal {
_loadSequence(chain_, sequenceFilePath_);
_createBytecodeDirectory();
}

function generate(string calldata chain_, string calldata deployFilePath_) public {
_setUp(chain_, deployFilePath_);

// Iterate over the deployment sequence
string[] memory sequenceNames = _getSequenceNames();
for (uint256 i; i < sequenceNames.length; i++) {
string memory sequenceName = sequenceNames[i];
console2.log("");
console2.log("Generating salt for :", sequenceName);

string memory deploymentKey = _getDeploymentKey(sequenceName);
console2.log(" deploymentKey: %s", deploymentKey);

// Atomic Cleopatra V1
if (
keccak256(abi.encodePacked(sequenceName))
== keccak256(abi.encodePacked("AtomicCleopatraV1DirectToLiquidity"))
) {
address auctionHouse = _envAddressNotZero("deployments.AtomicAuctionHouse");

_generateV1(sequenceName, auctionHouse, deploymentKey);
}
// Batch Cleopatra V1
else if (
keccak256(abi.encodePacked(sequenceName))
== keccak256(abi.encodePacked("BatchCleopatraV1DirectToLiquidity"))
) {
address auctionHouse = _envAddressNotZero("deployments.BatchAuctionHouse");

_generateV1(sequenceName, auctionHouse, deploymentKey);
}
// Atomic Cleopatra V2
else if (
keccak256(abi.encodePacked(sequenceName))
== keccak256(abi.encodePacked("AtomicCleopatraV2DirectToLiquidity"))
) {
address auctionHouse = _envAddressNotZero("deployments.AtomicAuctionHouse");

_generateV2(sequenceName, auctionHouse, deploymentKey);
}
// Batch Cleopatra V2
else if (
keccak256(abi.encodePacked(sequenceName))
== keccak256(abi.encodePacked("BatchCleopatraV2DirectToLiquidity"))
) {
address auctionHouse = _envAddressNotZero("deployments.BatchAuctionHouse");

_generateV2(sequenceName, auctionHouse, deploymentKey);
}
// Something else
else {
console2.log(" Skipping unknown sequence: %s", sequenceName);
}
}
}

function _generateV1(
string memory sequenceName_,
address auctionHouse_,
string memory deploymentKey_
) internal {
// Get input variables or overrides
address envCleopatraV1PairFactory = _getEnvAddressOrOverride(
"constants.cleopatraV1.pairFactory", sequenceName_, "args.pairFactory"
);
address envCleopatraV1Router =
_getEnvAddressOrOverride("constants.cleopatraV1.router", sequenceName_, "args.router");

// Calculate salt for the CleopatraV1DirectToLiquidity
bytes memory contractCode = type(CleopatraV1DirectToLiquidity).creationCode;
(string memory bytecodePath, bytes32 bytecodeHash) = _writeBytecode(
deploymentKey_,
contractCode,
abi.encode(auctionHouse_, envCleopatraV1PairFactory, envCleopatraV1Router)
);
_setSalt(bytecodePath, _ADDRESS_PREFIX, deploymentKey_, bytecodeHash);
}

function _generateV2(
string memory sequenceName_,
address auctionHouse_,
string memory deploymentKey_
) internal {
// Get input variables or overrides
address envCleopatraV2Factory =
_getEnvAddressOrOverride("constants.cleopatraV2.factory", sequenceName_, "args.factory");
address envCleopatraV2PositionManager = _getEnvAddressOrOverride(
"constants.cleopatraV2.positionManager", sequenceName_, "args.positionManager"
);

// Calculate salt for the CleopatraV2DirectToLiquidity
bytes memory contractCode = type(CleopatraV2DirectToLiquidity).creationCode;
(string memory bytecodePath, bytes32 bytecodeHash) = _writeBytecode(
deploymentKey_,
contractCode,
abi.encode(auctionHouse_, envCleopatraV2Factory, envCleopatraV2PositionManager)
);
_setSalt(bytecodePath, _ADDRESS_PREFIX, deploymentKey_, bytecodeHash);
}
}
49 changes: 49 additions & 0 deletions script/salts/dtl-cleopatra/dtl_salts.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#!/bin/bash

# Usage:
# ./dtl_salts.sh --deployFile <path> --envFile <.env>
#
# Expects the following environment variables:
# CHAIN: The chain to deploy to, based on values from the ./script/env.json file.

# Iterate through named arguments
# Source: https://unix.stackexchange.com/a/388038
while [ $# -gt 0 ]; do
if [[ $1 == *"--"* ]]; then
v="${1/--/}"
declare $v="$2"
fi

shift
done

DEPLOY_FILE=$deployFile

# Get the name of the .env file or use the default
ENV_FILE=${envFile:-".env"}
echo "Sourcing environment variables from $ENV_FILE"

# Load environment file
set -a # Automatically export all variables
source $ENV_FILE
set +a # Disable automatic export

# Check that the CHAIN environment variable is set
if [ -z "$CHAIN" ]
then
echo "CHAIN environment variable is not set. Please set it in the .env file or provide it as an environment variable."
exit 1
fi

# Check if DEPLOY_FILE is set
if [ -z "$DEPLOY_FILE" ]
then
echo "No deploy file specified. Provide the relative path after the --deployFile flag."
exit 1
fi

echo "Using chain: $CHAIN"
echo "Using RPC at URL: $RPC_URL"
echo "Using deploy file: $DEPLOY_FILE"

forge script ./script/salts/dtl-cleopatra/CleopatraDTLSalts.s.sol:CleopatraDTLSalts --sig "generate(string,string)()" $CHAIN $DEPLOY_FILE
26 changes: 19 additions & 7 deletions script/salts/salts.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
"0xaa5c1bd02f7b04980f0e4ef0778e9165f8404f41c1c2bc372f2902f80dc646b0": "0x3c781e03bd8272c21052708923b6b00b60d976b84bc792a25a8eeb527d166944",
"0xc329d36cea27b1f8e044c99a5eda27503fd6087f50b6d27b7bb12ac4493507e1": "0xb724ad108002e85a8144c2b305013b4d302fb1ef4a39d477f6d18e96bc219a3d"
},
"BatchCleopatraV1DirectToLiquidity": {
"0x214daf0edf11bf09aaa737f0eb7d75e2a8d78e8f84cd0fc355c51e0fb3471de1": "0xb5ded029c8eef0136f18c6898b79b9a38972352ba7f2223e4e8d826ac35e5373"
},
"BatchCleopatraV2DirectToLiquidity": {
"0xde101247ba561eba6901aa19a1c718f71765f182b32e1be09a7f8cb664253de4": "0x59c7481d2d7cd383969401c474b1a88f2a3073387c97877752766392988d1c7c"
},
"CappedMerkleAllowlist": {
"0x0249dded8310d17581f166a526ea9ded65b81112ccac0ee8a144e9770d2b8432": "0xf5746fa34aeff9866dc5ec58712f7f47045aea15db39a0aabf4dadc9d35c8854",
"0x0ae7777d88dd21a8b9ca3dd9212307295a83aed438fef9dad0b62d57fbaf1025": "0x1de5ae5b126bd2cee8eb4f083080f5c30baa692580cf823fa5f382a7bfc70ac5",
Expand Down Expand Up @@ -53,24 +59,30 @@
"0x3e786da8306fcbed7cac84942338a1270f92283628b6c00f68be021274a9398c": "0x0f25886775a191f8793d3da1493fe07c98943f0d34227e3ceebae3dfb555b56a"
},
"Test_BaselineAllocatedAllowlist": {
"0x5d746474bd6f58dea871b468d53e3ab576b19043d224904750600a2d128829a1": "0x8452e66de7fac583f0fc44105edcef467d77d8edcf4c938a71aa76596ecfb67c"
"0x5d746474bd6f58dea871b468d53e3ab576b19043d224904750600a2d128829a1": "0x54b0050dbb650e1e968be88b75dc8354fd668ba1c9d404303f33dac5ffa0d9fa"
},
"Test_BaselineAllowlist": {
"0x5994dd0cafe772dd48a75ac3eba409d0654bf2cac96c9f15c8096296038e2a00": "0xf6689b20de39181dd95dcd925b9bc3b10e545bf381bedaaa54dbac2d54a8334b"
"0x5994dd0cafe772dd48a75ac3eba409d0654bf2cac96c9f15c8096296038e2a00": "0x9fefe6be328d53df69523f980edaf65730c4938eac67dd0ab3aa32fde0c6d24f"
},
"Test_BaselineAxisLaunch": {
"0x52496df1c08f8ccb2ff3d5890297b3619ae3d670581df798367699ac94530d12": "0x9a04d55297d9a3348f8fe51141f2c75825152eb31e306f1411ddbd741d4d14dc"
"0x52496df1c08f8ccb2ff3d5890297b3619ae3d670581df798367699ac94530d12": "0x2041068fbbad4940b256c7e16cf6a283248a550bb0b524e30c58ddf22e1662de"
},
"Test_BaselineCappedAllowlist": {
"0x1ed7b5269875d6fd24f19a8b6a1906cca2ca94bba1d23cf1fb3e95877b8b0338": "0x6f2e4acbd33ef40152b0e5679bd694d0f60f4a9af611cded049d04f3598d8f10"
"0x1ed7b5269875d6fd24f19a8b6a1906cca2ca94bba1d23cf1fb3e95877b8b0338": "0xaba1c15b4006c6584a63f6ee625f9486ce3edf34139f6b9b52289837d32d6f95"
},
"Test_BaselineTokenAllowlist": {
"0x3f8ca4e10bd4e9daa2aee9c323586dc24d4a3358d7599a3668eed1dd1860a829": "0xee3f8d4ffa9ffed5fa846f99d80c6080722f07cca9e388c72bfd5c49b007d8b4"
"0x3f8ca4e10bd4e9daa2aee9c323586dc24d4a3358d7599a3668eed1dd1860a829": "0xe5893ce7eff3f88fda53743fa9b06fda694a726bcdcc76b23ab0974559d70342"
},
"Test_CappedMerkleAllowlist": {
"0x1dc038ba91f15889eedf059525478d760c3b01dbf5288c0c995ef5c8f1395e8b": "0x6bfac83b21063468377650c02a19f8b39750ffa72f1763596c48d62833e54e12",
"0xb092f03e11d329d47afaec052626436946facd0fa3cb8821145d3dcfc13f6dff": "0x89152c018a4041b7ae10dacb9da894f32cdb91bd07774c0b61ac105db77f12ba"
},
"Test_CleopatraV1DirectToLiquidity": {
"0xc5fdd09bf3deb40dadc05bcec48fce4be48191e7f2413d537c8f52b27549a1d6": "0xc34811ce2ea63c87da00e769e3963413fb9140d8d05c518168e3a20d918b1fd0"
},
"Test_CleopatraV2DirectToLiquidity": {
"0x26c36d9cca50ed8dd922d52f9237db0e6b79696b1bdd94faaa39ad9f12e3a589": "0x873b1c35209448361c305aa3d658b7b6361e0897668adc2770b286bc3b7b6919"
},
"Test_GUniFactory": {
"0x049627578a379e876af59b3ba6d1971a2095f048ea7dafb5449c84380e8bfd15": "0x32842bb4a2d9dcf8ae6970d43167191b5de3e3faca6c89d40cc1376d75ab61f0"
},
Expand Down Expand Up @@ -102,13 +114,13 @@
"0xdb5689fd93b97ad35ee469bbcb38d4472c005f1ae951b154f2437bd1207a03f3": "0xf35c7565f04f89db7d1783343067728c4db35f70d7aea4d7dbd732fa462bb956"
},
"Test_UniswapV2DirectToLiquidity": {
"0x44d9f5974232d8dc047dadc9a93a66dde3b1938d906428d1c52dc9e356988d87": "0xd3cddc8f40b0d22205b1eaf044af0e3131bbd63922c5c14a38e2440552c8fd5f"
"0xc6457ead866939ba79fbe24976c01de6a4e5350b66873ae2444500fcf3d0a68a": "0x34d7d49c713c6454e5d96bb09e9496895a1faf94d45e3a6c8550b81c9ba15117"
},
"Test_UniswapV2Router": {
"0x3aeb5c743a058e3c9d871533d2537013b819c4e401acaca3619f046cd9422258": "0x4c096423447dffd4ffce23f8e15e2d1b08619f72abc81536b5492d95b7c8f03f"
},
"Test_UniswapV3DirectToLiquidity": {
"0x5bd1c45b9f8ee81f6de61284469b1e580289694e339da3bf7f89422b2f6acee2": "0xf4188c3dde8973a334f65d1f532e5b4e022e75a69140173cd2ee38fa05f1d789"
"0xfea4b3d341404a1e1c342f18c0eef626604a03f4293ad8eeabe8e66df65f89b5": "0xa4fad84e0fc223785c278b66da03e1ded6ad816e80401a05f24840367aa11846"
},
"Test_UniswapV3Factory": {
"0x33479a3955b5801da918af0aa61f4501368d483ac02e8ae036d4e6f9c56d2038": "0x715638753ed78c13d0d385c1758204daad3b308083604fb0d555eb285199ed30"
Expand Down
Loading
Loading