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

feat: introduces a killswitch for the diamond (EmergencyPauseFacet v1.0.0) #715

Merged
merged 44 commits into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
9a26718
feat: adds EmergencyPauseFacet
0xDEnYO Jul 23, 2024
136b8bb
removes unused diamond cut code
0xDEnYO Jul 23, 2024
69cf5f4
introduces LibDiamondLoupe to avoid external calls for loupe functions
0xDEnYO Jul 23, 2024
70843f1
cleanup
0xDEnYO Jul 23, 2024
9ea09d5
registered EmergencyPauseFacet in BSC staging diamond
0xDEnYO Jul 25, 2024
7cc58e4
adds github action that allows to manually pause the diamond from Git…
0xDEnYO Jul 26, 2024
9e5f6c1
Merge branch 'main' of github.com:lifinance/contracts into EmergencyP…
0xDEnYO Jul 26, 2024
bca51af
add team membership verification to git action
0xDEnYO Jul 26, 2024
c99541a
Merge branch 'main' of github.com:lifinance/contracts into EmergencyP…
0xDEnYO Aug 21, 2024
77441a0
remove push event trigger from git action
0xDEnYO Aug 21, 2024
d5c7244
removes unused imports (audit issue#2)
0xDEnYO Sep 9, 2024
e6cbae6
optimizes modifier (audit issue#3)
0xDEnYO Sep 9, 2024
111a2e4
adds indexed keyword to events (audit issue#5)
0xDEnYO Sep 9, 2024
7ea4c75
inlines a helper function that is only used once (audit issue#6)
0xDEnYO Sep 9, 2024
8effe9a
removes unused helper function (audit issue#7)
0xDEnYO Sep 9, 2024
54d4142
removes unnecessary delete statement (audit issue#11)
0xDEnYO Sep 9, 2024
d70d09b
adds check to prevent accidental removal of EmergencyPauseFacet
0xDEnYO Sep 9, 2024
b3b4710
Merge branch 'main' of github.com:lifinance/contracts into EmergencyP…
0xDEnYO Sep 9, 2024
7709442
adds a check to prevent accidental removal of DiamondCutFacet while u…
0xDEnYO Sep 9, 2024
124fd68
adds test to increase test coverage to 100% (audit issue #15)
0xDEnYO Sep 10, 2024
519a8da
removes duplicate function in helperFunctions.sh
0xDEnYO Sep 10, 2024
0def5d6
minor fixes
0xDEnYO Sep 10, 2024
be2a3bc
adds a test case that checks how many facets we can pause
0xDEnYO Sep 11, 2024
ab63a64
Merge branch 'main' of github.com:lifinance/contracts into EmergencyP…
0xDEnYO Sep 11, 2024
79ad7c2
remove playground.sh (accidentally committed before)
0xDEnYO Sep 11, 2024
72e39cd
removes TODO and adds comment
0xDEnYO Sep 12, 2024
af6b003
adds a check to prevent pausing twice
0xDEnYO Sep 12, 2024
7fcf186
used diamondCut function to remove facets so events get emitted (audi…
0xDEnYO Sep 12, 2024
b0b40f2
audit report added and log updated
0xDEnYO Sep 16, 2024
0366dda
Merge branch 'main' of github.com:lifinance/contracts into EmergencyP…
0xDEnYO Oct 8, 2024
c575c59
emergencyPause script updates and staging deployments
0xDEnYO Oct 8, 2024
80519d6
Update script/tasks/diamondEMERGENCYPause.sh
0xDEnYO Oct 8, 2024
24960d6
remove placeholder git action
0xDEnYO Oct 8, 2024
a609417
Merge branch 'EmergencyPause' of github.com:lifinance/contracts into …
0xDEnYO Oct 8, 2024
36c3852
minor fixes from coderabbit reviews
0xDEnYO Oct 8, 2024
3e532ef
add fake audit entry to make PR mergable
0xDEnYO Oct 8, 2024
9e67824
add 2nd fake audit entry to make PR mergable
0xDEnYO Oct 8, 2024
778f7cd
update warning message text
0xDEnYO Oct 8, 2024
48e8704
test
0xDEnYO Oct 8, 2024
668ad84
Merge branch 'main' into EmergencyPause
0xDEnYO Oct 8, 2024
df210d0
Merge branch 'EmergencyPause' of github.com:lifinance/contracts into …
0xDEnYO Oct 8, 2024
3e1a64c
test
0xDEnYO Oct 8, 2024
6acbdd6
test
0xDEnYO Oct 8, 2024
3d7dcd2
revert changes
0xDEnYO Oct 8, 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
107 changes: 107 additions & 0 deletions .github/workflows/diamondEmergencyPause.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: Pause PRODUCTION diamond (CAREFUL)

on:
workflow_dispatch:
inputs:
Warning:
description: 'By clicking the next button you are pausing all PROUCTION diamonds. Please proceed with extreme caution !!!'
required: true
default: 'Type UNDERSTOOD to continue'

jobs:
diamond-emergency-pause:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/[email protected]

- name: Check input
if: ${{ inputs.Warning != 'UNDERSTOOD' }}
run: |
echo -e "\033[31mYou must type 'UNDERSTOOD' to proceed.\033[0m"
exit 1

# Keeping this code for now until team member authentication has been tested successfully
# - name: Authenticate user
# id: check_user
# run: |
# ALLOWED_USERS=("0xDEnYO" "maxklenk" "ezynda3")
# USER=${{ github.actor }}
# if [[ ! " ${ALLOWED_USERS[@]} " =~ " $USER " ]]; then
# echo "User $USER is not allowed to run this workflow. Only the following users are:"
# echo "$ALLOWED_USERS"
# exit 1
# else
# echo "User $USER is allowed to run this workflow."
# fi
# shell: bash

- name: Authenticate git user (check membership in 'DiamondPauser' group)
if: ${{ inputs.Warning == 'UNDERSTOOD' }}
id: authenticate-user
uses: tspascoal/get-user-teams-membership@v3
with:
username: ${{ github.actor }}
organization: lifinance
team: diamondpauser
GITHUB_TOKEN: ${{ secrets.GIT_ACTIONS_BOT_PAT_CLASSIC }}

- name: Check team membership
if: ${{ inputs.Warning == 'UNDERSTOOD' }}
run: |
if [[ "${{ steps.authenticate-user.outputs.isTeamMember }}" != "true" ]]; then
echo -e "\033[31mUser ${{ github.actor }} is not a member of the DiamondPauser team. Please ask one of the team members to execute this action:\033[0m"
echo "https://github.com/orgs/lifinance/teams/diamondpauser/members"
exit 1
else
echo -e "\033[32mUser is a member of the DiamondPauser team and may execute this action\033[0m"
fi

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1

- name: Pause Diamond
run: |
./script/tasks/utils/diamondEMERGENCYPauseGitHub.sh
env:
ETH_NODE_URI_MAINNET: ${{ secrets.ETH_NODE_URI_MAINNET }}
ETH_NODE_URI_ARBITRUM: ${{ secrets.ETH_NODE_URI_ARBITRUM }}
ETH_NODE_URI_AURORA: ${{ secrets.ETH_NODE_URI_AURORA }}
ETH_NODE_URI_AVALANCHE: ${{ secrets.ETH_NODE_URI_AVALANCHE }}
ETH_NODE_URI_BASE: ${{ secrets.ETH_NODE_URI_BASE }}
ETH_NODE_URI_BLAST: ${{ secrets.ETH_NODE_URI_BLAST }}
ETH_NODE_URI_BOBA: ${{ secrets.ETH_NODE_URI_BOBA }}
ETH_NODE_URI_BSC: ${{ secrets.ETH_NODE_URI_BSC }}
ETH_NODE_URI_CELO: ${{ secrets.ETH_NODE_URI_CELO }}
ETH_NODE_URI_FANTOM: ${{ secrets.ETH_NODE_URI_FANTOM }}
ETH_NODE_URI_FRAXTAL: ${{ secrets.ETH_NODE_URI_FRAXTAL }}
ETH_NODE_URI_FUSE: ${{ secrets.ETH_NODE_URI_FUSE }}
ETH_NODE_URI_GNOSIS: ${{ secrets.ETH_NODE_URI_GNOSIS }}
ETH_NODE_URI_GRAVITY: ${{ secrets.ETH_NODE_URI_GRAVITY }}
ETH_NODE_URI_IMMUTABLEZKEVM: ${{ secrets.ETH_NODE_URI_IMMUTABLEZKEVM }}
ETH_NODE_URI_KAIA: ${{ secrets.ETH_NODE_URI_KAIA }}
ETH_NODE_URI_LINEA: ${{ secrets.ETH_NODE_URI_LINEA }}
ETH_NODE_URI_MANTLE: ${{ secrets.ETH_NODE_URI_MANTLE }}
ETH_NODE_URI_METIS: ${{ secrets.ETH_NODE_URI_METIS }}
ETH_NODE_URI_MODE: ${{ secrets.ETH_NODE_URI_MODE }}
ETH_NODE_URI_MOONBEAM: ${{ secrets.ETH_NODE_URI_MOONBEAM }}
ETH_NODE_URI_MOONRIVER: ${{ secrets.ETH_NODE_URI_MOONRIVER }}
ETH_NODE_URI_OPTIMISM: ${{ secrets.ETH_NODE_URI_OPTIMISM }}
ETH_NODE_URI_OPBNB: ${{ secrets.ETH_NODE_URI_OPBNB }}
ETH_NODE_URI_POLYGON: ${{ secrets.ETH_NODE_URI_POLYGON }}
ETH_NODE_URI_POLYGONZKEVM: ${{ secrets.ETH_NODE_URI_POLYGONZKEVM }}
ETH_NODE_URI_ROOTSTOCK: ${{ secrets.ETH_NODE_URI_ROOTSTOCK }}
ETH_NODE_URI_SCROLL: ${{ secrets.ETH_NODE_URI_SCROLL }}
ETH_NODE_URI_SEI: ${{ secrets.ETH_NODE_URI_SEI }}
ETH_NODE_URI_TAIKO: ${{ secrets.ETH_NODE_URI_TAIKO }}
ETH_NODE_URI_XLAYER: ${{ secrets.ETH_NODE_URI_XLAYER }}
ETH_NODE_URI_ZKSYNC: ${{ secrets.ETH_NODE_URI_ZKSYNC }}
PRIVATE_KEY_PAUSER_WALLET: ${{ secrets.TEST_PRIV_KEY_SECRET }}

- name: Send Discord message
uses: Ilshidur/[email protected]
with:
args: |
:warning: 'ATTENTION - the emergency diamond pause action was just executed by ${{ github.actor }}'
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_DEV_SMARTCONTRACTS }}
1 change: 1 addition & 0 deletions .github/workflows/ensureSCCoreDevApproval.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ jobs:
}

// Filter to only include reviews that have "APPROVED" status
console.log(JSON.stringify(reviews,null,2));
const approvedReviews = reviews.filter(review => review.state === 'APPROVED');

if(!approvedReviews.length) {
Expand Down
34 changes: 0 additions & 34 deletions .github/workflows/triggerableAction.yml

This file was deleted.

2 changes: 1 addition & 1 deletion archive/test/DeBridgeDlnFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ contract DeBridgeDlnFacetTest is TestBaseFacet {
// prepare swap data
address[] memory path = new address[](2);

path[0] = ADDRESS_WETH;
path[0] = ADDRESS_WRAPPED_NATIVE;
path[1] = ADDRESS_USDC;

uint256 amountOut = defaultUSDCAmount;
Expand Down
2 changes: 1 addition & 1 deletion archive/test/MakerTeleportFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ contract MakerTeleportFacetTest is TestBaseFacet {
ADDRESS_UNISWAP = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506;
ADDRESS_USDC = 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8;
ADDRESS_DAI = 0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1;
ADDRESS_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;
ADDRESS_WRAPPED_NATIVE = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1;

initTestBase();

Expand Down
6 changes: 3 additions & 3 deletions archive/test/MultiChainFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ contract MultichainFacetTest is TestBaseFacet {

function testFailWhenUsingNotWhitelistedRouter() public {
// re-deploy multichain facet with adjusted router whitelist
diamond = createDiamond();
diamond = createDiamond(USER_DIAMOND_OWNER, USER_PAUSER);
routers = [
0x55aF5865807b196bD0197e0902746F31FBcCFa58, // TestMultichainToken
0x7782046601e7b9B05cA55A3899780CE6EE6B8B2B // AnyswapV6Router
Expand Down Expand Up @@ -279,7 +279,7 @@ contract MultichainFacetTest is TestBaseFacet {

function testFail_revert_UsingNonWhitelistedRouter() public {
// re-deploy multichain facet with adjusted router whitelist
diamond = createDiamond();
diamond = createDiamond(USER_DIAMOND_OWNER, USER_PAUSER);
routers = [
0x55aF5865807b196bD0197e0902746F31FBcCFa58, // TestMultichainToken
0x7782046601e7b9B05cA55A3899780CE6EE6B8B2B // AnyswapV6Router
Expand Down Expand Up @@ -334,8 +334,8 @@ contract MultichainFacetTest is TestBaseFacet {
}

function test_OwnerCanInitializeFacet() public {
LiFiDiamond diamond2 = createDiamond(USER_DIAMOND_OWNER, USER_PAUSER);
vm.startPrank(USER_DIAMOND_OWNER);
LiFiDiamond diamond2 = createDiamond();

TestMultichainFacet multichainFacet2 = new TestMultichainFacet();
bytes4[] memory functionSelectors = new bytes4[](7);
Expand Down
16 changes: 16 additions & 0 deletions audit/auditLog.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,25 @@
"auditorGitHandle": "sujithsomraaj",
"auditReportPath": "./audit/reports/2024.08.14_StargateFacetV2_ReAudit.pdf",
"auditCommitHash": "d622002440317580b5d0fb90ef22b839d84957e2"
},
"audit20240913": {
"auditCompletedOn": "13.09.2024",
"auditedBy": "Sujith Somraaj (individual security researcher)",
"auditorGitHandle": "sujithsomraaj",
"auditReportPath": "./audit/reports/2024.09.13_EmergencyPauseFacet.pdf",
"auditCommitHash": "77441a088e0789513db4e068f7ef6c5c0988ee42"
}
},
"auditedContracts": {
"EmergencyPauseFacet": {
"1.0.0": ["audit20240913"]
},
"GenericErrors": {
"1.0.0": ["audit20240913"]
},
"LibDiamondLoupe": {
"1.0.0": ["audit20240913"]
},
"StargateFacetV2": {
"1.0.1": ["audit20240814"]
}
Expand Down
Binary file added audit/reports/2024.09.13_EmergencyPauseFacet.pdf
Binary file not shown.
58 changes: 58 additions & 0 deletions deployments/_deployments_log_file.json
Original file line number Diff line number Diff line change
Expand Up @@ -23339,5 +23339,63 @@
]
}
}
},
"EmergencyPauseFacet": {
"polygon": {
"staging": {
"1.0.0": [
{
"ADDRESS": "0x6DCDA5EEb0eb10D61eB9AAF93C3B89704955dA42",
"OPTIMIZER_RUNS": "1000000",
"TIMESTAMP": "2024-07-21 15:50:57",
"CONSTRUCTOR_ARGS": "0x00000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed7",
"SALT": "",
"VERIFIED": "false"
}
]
}
},
"bsc": {
"staging": {
"1.0.0": [
{
"ADDRESS": "0xf03AFcA857918BE01EBD6C6800Fc2974b8a9eBA2",
"OPTIMIZER_RUNS": "1000000",
"TIMESTAMP": "2024-07-25 15:21:33",
"CONSTRUCTOR_ARGS": "0x00000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed7",
"SALT": "",
"VERIFIED": "false"
}
]
}
},
"arbitrum": {
"staging": {
"1.0.0": [
{
"ADDRESS": "0x9a0988b17D4419807DfC8E8fd2182A21eabB1361",
"OPTIMIZER_RUNS": "1000000",
"TIMESTAMP": "2024-10-08 11:23:04",
"CONSTRUCTOR_ARGS": "0x00000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed7",
"SALT": "",
"VERIFIED": "true"
}
]
}
},
"optimism": {
"staging": {
"1.0.0": [
{
"ADDRESS": "0x9a0988b17D4419807DfC8E8fd2182A21eabB1361",
"OPTIMIZER_RUNS": "1000000",
"TIMESTAMP": "2024-10-08 11:25:56",
"CONSTRUCTOR_ARGS": "0x00000000000000000000000029dacdf7ccadf4ee67c923b4c22255a4b2494ed7",
"SALT": "",
"VERIFIED": "true"
}
]
}
}
}
}
21 changes: 21 additions & 0 deletions deployments/arbitrum.diamond.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,13 +116,34 @@
"0x21571D628B0bCBeb954D5933A604eCac35bAF2c7": {
"Name": "SymbiosisFacet",
"Version": "1.0.0"
},
"0xa137Fe4C41A2E04ca34578DC9023ad45cC194389": {
"Name": "",
"Version": ""
},
"0x2b64B62cbCfB38560222eBcfbbc4e65eC34c8Ce8": {
"Name": "",
"Version": ""
},
"0x6124C65B6264bE13f059b7C3A891a5b77DA8Bd95": {
"Name": "",
"Version": ""
},
"0x4352459F6BE1C7D1278F8c34Bb598b0feeB50f8b": {
"Name": "",
"Version": ""
},
"0x9a0988b17D4419807DfC8E8fd2182A21eabB1361": {
"Name": "EmergencyPauseFacet",
"Version": "1.0.0"
}
},
"Periphery": {
"ERC20Proxy": "0xF6d5cf7a12d89BC0fD34E27d2237875b564A6ADf",
"Executor": "0x23f882bA2fa54A358d8599465EB471f58Cc26751",
"FeeCollector": "0x7F8E9bEBd1Dea263A36a6916B99bd84405B9654a",
"GasRebateDistributor": "",
"LiFiDEXAggregator": "",
"LiFuelFeeCollector": "0x94EA56D8049e93E0308B9c7d1418Baf6A7C68280",
"Receiver": "0x36E9B2E8A627474683eF3b1E9Df26D2bF04396f3",
"ReceiverStargateV2": "",
Expand Down
3 changes: 2 additions & 1 deletion deployments/arbitrum.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,6 @@
"CircleBridgeFacet": "0xa73a8BC8d36472269138c3233e24D0Ee0c344bd8",
"HopFacetOptimized": "0xf82135385765f1324257ffF74489F16382EBBb8A",
"LiFuelFeeCollector": "0x94EA56D8049e93E0308B9c7d1418Baf6A7C68280",
"TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70"
"TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70",
"EmergencyPauseFacet": "0x9a0988b17D4419807DfC8E8fd2182A21eabB1361"
}
2 changes: 1 addition & 1 deletion deployments/bsc.diamond.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,4 @@
"LiFiDEXAggregator": ""
}
}
}
}
1 change: 1 addition & 0 deletions deployments/bsc.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"MayanBridgeFacet": "0x5Ba4FeD1DAd2fD057A9f687B399B8e4cF2368214",
"MayanFacet": "0xd596C903d78870786c5DB0E448ce7F87A65A0daD",
"GenericSwapFacetV3": "0xE871874D8AC30E8aCD0eC67529b4a5dDD73Bf0d6",
"EmergencyPauseFacet": "0xf03AFcA857918BE01EBD6C6800Fc2974b8a9eBA2",
"StargateFacetV2": "0x089153117bffd37CBbE0c604dAE8e493D4743fA8",
"LiFiDEXAggregator": "0xD6f02718B9df9FAd2665c7304BC5b26D5bbD8642"
}
12 changes: 12 additions & 0 deletions deployments/optimism.diamond.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,18 @@
"0xa137Fe4C41A2E04ca34578DC9023ad45cC194389": {
"Name": "",
"Version": ""
},
"0x6124C65B6264bE13f059b7C3A891a5b77DA8Bd95": {
"Name": "",
"Version": ""
},
0xDEnYO marked this conversation as resolved.
Show resolved Hide resolved
"0x4352459F6BE1C7D1278F8c34Bb598b0feeB50f8b": {
"Name": "",
"Version": ""
},
0xDEnYO marked this conversation as resolved.
Show resolved Hide resolved
"0x9a0988b17D4419807DfC8E8fd2182A21eabB1361": {
"Name": "EmergencyPauseFacet",
"Version": "1.0.0"
}
},
"Periphery": {
Expand Down
3 changes: 2 additions & 1 deletion deployments/optimism.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,6 @@
"StargateFacet": "0xf0F989caC0600214B564ce07102F7e633680F0Fd",
"LiFuelFeeCollector": "0x94EA56D8049e93E0308B9c7d1418Baf6A7C68280",
"RelayerCelerIM": "0xC1906dC6b43EbE6AE511cc4abeB8711120Ab622e",
"TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70"
"TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70",
"EmergencyPauseFacet": "0x9a0988b17D4419807DfC8E8fd2182A21eabB1361"
}
2 changes: 1 addition & 1 deletion deployments/polygon.diamond.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,4 @@
"TokenWrapper": "0xF63b27AE2Dc887b88f82E2Cc597d07fBB2E78E70"
}
}
}
}
3 changes: 2 additions & 1 deletion deployments/polygon.staging.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,10 @@
"GasRebateDistributor": "0x3116B8F099D7eFA6e24f39F80146Aac423365EB9",
"GenericSwapFacetV3": "0xFf6Fa203573Baaaa4AE375EB7ac2819d539e16FF",
"StargateFacetV2": "0xeb3f9490d8cbD0C34C0642a8d0495e5E0B0745AA",
"EmergencyPauseFacet": "0x6DCDA5EEb0eb10D61eB9AAF93C3B89704955dA42",
"StandardizedCallFacet": "0xA7ffe57ee70Ac4998e9E9fC6f17341173E081A8f",
"CalldataVerificationFacet": "0x90B5b319cA20D9E466cB5b843952363C34d1b54E",
"CelerCircleBridgeFacet": "0x371E073f6A09DCBEE1D2Ac56E940F878a0Ba9DAE",
"HopFacetOptimized": "0xf82135385765f1324257ffF74489F16382EBBb8A",
"SymbiosisFacet": "0x21571D628B0bCBeb954D5933A604eCac35bAF2c7"
}
}
Loading
Loading