diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 469bc22c1..95188f379 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -56,6 +56,11 @@ jobs: - name: "Install Foundry" uses: "foundry-rs/foundry-toolchain@v1" + + - name: "Show the Foundry version" + run: "forge --version" + + - name: "Show the Foundry config" run: "forge config" @@ -171,7 +176,7 @@ jobs: run: "make coverage" - name: "Upload coverage report to Codecov" - uses: "codecov/codecov-action@v4" + uses: "codecov/codecov-action@v5" env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} with: diff --git a/Makefile b/Makefile index 26c8f9105..0e071eefc 100644 --- a/Makefile +++ b/Makefile @@ -121,7 +121,7 @@ build-sizes: ## Builds the project and shows sizes .PHONY: test-vvv test-vvv: ## Runs tests with verbose output - forge test --match-test test_rebalanceMultiPositions_tokenRefunds_interimDust_allowanceNot0 --evm-version cancun -vvvvv + forge test --match-test test_printConfirmations --evm-version cancun -vvv .PHONY: ftest ftest: ## Runs tests with cancun evm version @@ -177,3 +177,4 @@ help: ## Prints this help @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ | sort \ | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + diff --git a/lib/pigeon b/lib/pigeon index e318c3e06..a468aa963 160000 --- a/lib/pigeon +++ b/lib/pigeon @@ -1 +1 @@ -Subproject commit e318c3e06895c1fa07439bf225bb2c755463e7c8 +Subproject commit a468aa9633d373bcc94a0990895bf18fd3b7fc6b diff --git a/script/forge-scripts/Abstract.Deploy.Single.s.sol b/script/forge-scripts/Abstract.Deploy.Single.s.sol index e547dee6d..a64a1f088 100644 --- a/script/forge-scripts/Abstract.Deploy.Single.s.sol +++ b/script/forge-scripts/Abstract.Deploy.Single.s.sol @@ -57,6 +57,9 @@ import { BatchScript } from "./safe/BatchScript.sol"; import { SuperformRouterPlus } from "src/router-plus/SuperformRouterPlus.sol"; import { SuperformRouterPlusAsync } from "src/router-plus/SuperformRouterPlusAsync.sol"; +import { ILayerZeroEndpointV2, IMessageLibManager } from "src/vendor/layerzero/v2/ILayerZeroEndpointV2.sol"; +import { SetConfigParam } from "src/vendor/layerzero/v2/IMessageLibManager.sol"; + struct SetupVars { uint64 chainId; uint64 dstChainId; @@ -242,6 +245,34 @@ abstract contract AbstractDeploySingle is BatchScript { address(0) ]; + address[] public SuperformDVNs = [ + 0x7518f30bd5867b5fA86702556245Dead173afE46, + 0xF4c489AfD83625F510947e63ff8F90dfEE0aE46C, + 0x8fb0B7D74B557e4b45EF89648BAc197EAb2E4325, + 0x1E4CE74ccf5498B19900649D9196e64BAb592451, + 0x5496d03d9065B08e5677E1c5D1107110Bb05d445, + 0xb0B2EF168F52F6d1e42f461e11117295eF992daf, + 0xEb62f578497Bdc351dD650853a751135212fAF49, + 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b, + 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05, + 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF, + address(0) + ]; + + address[] public LzDVNs = [ + 0x589dEDbD617e0CBcB916A9223F4d1300c294236b, + 0xfD6865c841c2d64565562fCc7e05e619A30615f0, + 0x962F502A63F5FBeB44DC9ab932122648E8352959, + 0x23DE2FE932d9043291f870324B74F820e11dc81A, + 0x2f55C492897526677C5B68fb199ea31E2c126416, + 0x6A02D83e8d433304bba74EF1c427913958187142, + 0x9e059a54699a285714207b43B055483E78FAac25, + 0xE60A3959Ca23a92BF5aAf992EF837cA7F828628a, + 0x129Ee430Cb2Ff2708CCADDBDb408a88Fe4FFd480, + 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f, + address(0) + ]; + address[] public hyperlaneMailboxes = [ 0xc005dc82818d67AF737725bD4bf75435d065D239, 0x2971b9Aec44bE4eb673DF1B88cDB57b96eefe8a4, @@ -329,7 +360,7 @@ abstract contract AbstractDeploySingle is BatchScript { uint64 public constant BLAST = 81_457; uint64 public constant BARTIO = 80_084; - uint256[] public manualNonces = [20, 20, 20, 20, 19, 19, 18, 7, 1, 0, 0]; + uint256[] public manualNonces = [22, 22, 22, 22, 21, 21, 20, 9, 3, 2, 0]; uint64[] public chainIds = [1, 56, 43_114, 137, 42_161, 10, 8453, 250, 59_144, 81_457, 80_084]; string[] public chainNames = [ "Ethereum", @@ -437,9 +468,9 @@ abstract contract AbstractDeploySingle is BatchScript { 0xe6ca8aC2D27A1bAd2Ab6b136Eab87488c3c98Fd1, /// @dev FANTOM https://safe.fantom.network/home?safe=ftm:0xe6ca8aC2D27A1bAd2Ab6b136Eab87488c3c98Fd1 0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77, - /// @dev LINEA https://safe.linea.build/home?safe=linea:0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 + /// @dev LINEA https://app.safe.global/home?safe=linea:0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF, - /// @dev BLAST https://blast-safe.io/home?safe=blastmainnet:0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF + /// @dev BLAST https://app.safe.global/home?safe=blast:0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF address(0) /// @dev BERA ]; @@ -612,11 +643,24 @@ abstract contract AbstractDeploySingle is BatchScript { /// @dev 5.1- deploy Layerzero Implementation vars.lzImplementation = address(new LayerzeroV2Implementation{ salt: salt }(vars.superRegistryC)); contracts[vars.chainId][bytes32(bytes("LayerzeroImplementation"))] = vars.lzImplementation; + if (vars.chainId != BARTIO) { LayerzeroV2Implementation(payable(vars.lzImplementation)).setLzEndpoint(lzV2Endpoint); } else { LayerzeroV2Implementation(payable(vars.lzImplementation)).setLzEndpoint(lzV2Endpoint_TESTNET); } + address protocolAdmin; + + if (env == 0 || env == 2) { + protocolAdmin = PROTOCOL_ADMINS[trueIndex]; + } else if (env == 1) { + protocolAdmin = PROTOCOL_ADMINS_STAGING[trueIndex]; + } else { + revert("INVALID_ENVIRONMENT"); + } + + LayerzeroV2Implementation(vars.lzImplementation).setDelegate(protocolAdmin); + if (vars.chainId != BARTIO) { /// @dev 5.1.1- deploy Layerzero V1 Implementation vars.lzV1Implementation = address(new LayerzeroImplementation{ salt: salt }(vars.superRegistryC)); @@ -624,6 +668,7 @@ abstract contract AbstractDeploySingle is BatchScript { LayerzeroImplementation(payable(vars.lzV1Implementation)).setLzEndpoint(lzEndpoints[trueIndex]); } + /// @dev 5.2- deploy Hyperlane Implementation if (vars.chainId != FANTOM) { vars.hyperlaneImplementation = address(new HyperlaneImplementation{ salt: salt }(vars.superRegistryC)); @@ -1087,8 +1132,7 @@ abstract contract AbstractDeploySingle is BatchScript { _readContractsV1(env, chainNames[trueIndex], vars.chainId, "WormholeARImplementation"); vars.wormholeSRImplementation = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "WormholeSRImplementation"); - //vars.axelarImplementation = _readContractsV1(env, chainNames[trueIndex], vars.chainId, - // "AxelarImplementation"); + vars.axelarImplementation = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "AxelarImplementation"); vars.superRegistry = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "SuperRegistry"); vars.paymentHelper = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "PaymentHelper"); vars.superRegistryC = SuperRegistry(vars.superRegistry); @@ -1118,6 +1162,7 @@ abstract contract AbstractDeploySingle is BatchScript { 0, 0, 0, + 0, "", vars.lzImplementation, vars.lzV1Implementation, @@ -1165,8 +1210,15 @@ abstract contract AbstractDeploySingle is BatchScript { SuperRBAC srbac = SuperRBAC(payable(_readContractsV1(env, chainNames[trueIndex], vars.chainId, "SuperRBAC"))); bytes32 protocolAdminRole = srbac.PROTOCOL_ADMIN_ROLE(); bytes32 emergencyAdminRole = srbac.EMERGENCY_ADMIN_ROLE(); + address protocolAdmin; - address protocolAdmin = env == 0 || env == 2 ? PROTOCOL_ADMINS[trueIndex] : PROTOCOL_ADMINS_STAGING[trueIndex]; + if (env == 0 || env == 2) { + protocolAdmin = PROTOCOL_ADMINS[trueIndex]; + } else if (env == 1) { + protocolAdmin = PROTOCOL_ADMINS_STAGING[trueIndex]; + } else { + revert("INVALID_ENVIRONMENT"); + } if (grantProtocolAdmin) { if (protocolAdmin != address(0)) { @@ -1334,6 +1386,7 @@ abstract contract AbstractDeploySingle is BatchScript { 0, 0, 0, + 0, "", vars.lzImplementation, vars.lzV1Implementation, @@ -1400,6 +1453,7 @@ abstract contract AbstractDeploySingle is BatchScript { struct CurrentChainBasedOnDstvars { uint64 chainId; uint64 dstChainId; + uint256 srcTrueIndex; uint256 dstTrueIndex; uint32 dstLzChainId; uint16 dstLzV1ChainId; @@ -1423,6 +1477,29 @@ abstract contract AbstractDeploySingle is BatchScript { SuperRegistry superRegistryC; } + struct UlnConfig { + uint64 confirmations; + // we store the length of required DVNs and optional DVNs instead of using DVN.length directly to save gas + uint8 requiredDVNCount; // 0 indicate DEFAULT, NIL_DVN_COUNT indicate NONE (to override the value of default) + uint8 optionalDVNCount; // 0 indicate DEFAULT, NIL_DVN_COUNT indicate NONE (to override the value of default) + uint8 optionalDVNThreshold; // (0, optionalDVNCount] + address[] requiredDVNs; // no duplicates. sorted an an ascending order. allowed overlap with optionalDVNs + address[] optionalDVNs; // no duplicates. sorted an an ascending order. allowed overlap with requiredDVNs + } + + struct DVNVars { + uint64 requiredDVNCount; + uint64 optionalDVNCount; + address[] requiredDVNs; + address[] optionalDVNs; + uint64 confirmations; + bytes config; + SetConfigParam[] setConfigParams; + UlnConfig ulnConfig; + address sendLib; + address receiveLib; + } + function _configureCurrentChainBasedOnTargetDestinations( uint256 env, CurrentChainBasedOnDstvars memory vars, @@ -1431,6 +1508,14 @@ abstract contract AbstractDeploySingle is BatchScript { internal returns (IPaymentHelper.PaymentHelperConfig memory addRemoteConfig) { + for (uint256 k = 0; k < chainIds.length; k++) { + if (vars.chainId == chainIds[k]) { + vars.srcTrueIndex = k; + + break; + } + } + for (uint256 k = 0; k < chainIds.length; k++) { if (vars.dstChainId == chainIds[k]) { vars.dstTrueIndex = k; @@ -1545,12 +1630,54 @@ abstract contract AbstractDeploySingle is BatchScript { chainIdsSetAddresses[17] = vars.dstChainId; chainIdsSetAddresses[18] = vars.dstChainId; + /// @dev DVN configuration prep in case we need this in the future - Note this has to be performed after chain + /// is deployed + DVNVars memory dvnVars; + + dvnVars.ulnConfig.requiredDVNCount = 2; + dvnVars.ulnConfig.optionalDVNCount = 0; + + dvnVars.ulnConfig.requiredDVNs = new address[](2); + dvnVars.ulnConfig.requiredDVNs[0] = SuperformDVNs[vars.srcTrueIndex]; + dvnVars.ulnConfig.requiredDVNs[1] = LzDVNs[vars.srcTrueIndex]; + + // Sort DVNs + if (dvnVars.ulnConfig.requiredDVNs[0] > dvnVars.ulnConfig.requiredDVNs[1]) { + (dvnVars.ulnConfig.requiredDVNs[0], dvnVars.ulnConfig.requiredDVNs[1]) = + (dvnVars.ulnConfig.requiredDVNs[1], dvnVars.ulnConfig.requiredDVNs[0]); + } + /// @dev default to 0 + dvnVars.ulnConfig.confirmations = 0; + + dvnVars.setConfigParams = new SetConfigParam[](1); + dvnVars.setConfigParams[0] = + SetConfigParam(uint32(lz_chainIds[vars.dstTrueIndex]), uint32(2), abi.encode(dvnVars.ulnConfig)); + + dvnVars.sendLib = ILayerZeroEndpointV2(lzV2Endpoint).defaultSendLibrary(lz_chainIds[vars.dstTrueIndex]); + + dvnVars.receiveLib = ILayerZeroEndpointV2(lzV2Endpoint).defaultReceiveLibrary(lz_chainIds[vars.dstTrueIndex]); if (!safeExecution) { LayerzeroV2Implementation(payable(vars.lzImplementation)).setPeer( vars.dstLzChainId, bytes32(uint256(uint160(vars.dstLzImplementation))) ); LayerzeroV2Implementation(payable(vars.lzImplementation)).setChainId(vars.dstChainId, vars.dstLzChainId); + + /// @dev DVN configuration - note removed for now as only the delegate can set this and that will be the + /// multisig + /* + + // there is an error that prevents seting config because it thinks it's not the delegate calling this + IMessageLibManager(lzV2Endpoint).setConfig( + vars.lzImplementation, dvnVars.sendLib, dvnVars.setConfigParams + ); + + IMessageLibManager(lzV2Endpoint).setConfig( + vars.lzImplementation, dvnVars.receiveLib, dvnVars.setConfigParams + ); + + */ + if (!(vars.chainId == BARTIO || vars.dstChainId == BARTIO)) { LayerzeroImplementation(payable(vars.lzV1Implementation)).setTrustedRemote( vars.dstLzV1ChainId, abi.encodePacked(vars.dstLzV1Implementation, vars.lzV1Implementation) @@ -1560,20 +1687,7 @@ abstract contract AbstractDeploySingle is BatchScript { vars.dstChainId, vars.dstLzV1ChainId ); } - /// @dev for mainnet - /// @dev do not override default oracle with chainlink for BASE - - /// NOTE: since chainlink oracle is not on BASE, we use the default oracle - // if (vars.chainId != BASE) { - // LayerzeroImplementation(payable(vars.lzImplementation)).setConfig( - // 0, - // /// Defaults To Zero - // vars.dstLzChainId, - // 6, - // /// For Oracle Config - // abi.encode(CHAINLINK_lzOracle) - // ); - // } + if (!(vars.chainId == FANTOM || vars.dstChainId == FANTOM)) { HyperlaneImplementation(payable(vars.hyperlaneImplementation)).setReceiver( vars.dstHypChainId, vars.dstHyperlaneImplementation @@ -1612,12 +1726,12 @@ abstract contract AbstractDeploySingle is BatchScript { ); AxelarImplementation(payable(vars.axelarImplementation)).setReceiver( - vars.dstAxelarChainId, vars.dstAxelarImplementation + vars.dstAxelarChainId, address(0xDEAD) ); } SuperRegistry(payable(vars.superRegistry)).setRequiredMessagingQuorum(vars.dstChainId, 1); - vars.superRegistryC.batchSetAddress(ids, newAddresses, chainIdsSetAddresses); + vars.superRegistryC.setVaultLimitPerDestination(vars.dstChainId, 5); } else { bytes memory txn = abi.encodeWithSelector( LayerzeroV2Implementation.setPeer.selector, @@ -1630,6 +1744,20 @@ abstract contract AbstractDeploySingle is BatchScript { LayerzeroV2Implementation.setChainId.selector, vars.dstChainId, vars.dstLzChainId ); addToBatch(vars.lzImplementation, 0, txn); + /* + txn = abi.encodeWithSelector( + IMessageLibManager.setConfig.selector, vars.lzImplementation, dvnVars.sendLib, dvnVars.setConfigParams + ); + addToBatch(lzV2Endpoint, 0, txn); + + txn = abi.encodeWithSelector( + IMessageLibManager.setConfig.selector, + vars.lzImplementation, + dvnVars.receiveLib, + dvnVars.setConfigParams + ); + */ + addToBatch(lzV2Endpoint, 0, txn); if (!(vars.chainId == BARTIO || vars.dstChainId == BARTIO)) { txn = abi.encodeWithSelector( LayerzeroImplementation.setTrustedRemote.selector, @@ -1643,20 +1771,7 @@ abstract contract AbstractDeploySingle is BatchScript { ); addToBatch(vars.lzV1Implementation, 0, txn); } - /// @dev for mainnet - /// @dev do not override default oracle with chainlink for BASE - - /// NOTE: since chainlink oracle is not on BASE, we use the default oracle - // if (vars.chainId != BASE) { - // LayerzeroImplementation(payable(vars.lzImplementation)).setConfig( - // 0, - // /// Defaults To Zero - // vars.dstLzChainId, - // 6, - // /// For Oracle Config - // abi.encode(CHAINLINK_lzOracle) - // ); - // } + if (!(vars.chainId == FANTOM || vars.dstChainId == FANTOM)) { txn = abi.encodeWithSelector( HyperlaneImplementation.setReceiver.selector, vars.dstHypChainId, vars.dstHyperlaneImplementation @@ -1701,9 +1816,7 @@ abstract contract AbstractDeploySingle is BatchScript { } if (DEPLOY_AXELAR) { - txn = abi.encodeWithSelector( - AxelarImplementation.setReceiver.selector, vars.dstAxelarChainId, vars.dstAxelarImplementation - ); + txn = abi.encodeWithSelector(AxelarImplementation.setReceiver.selector, vars.dstAxelarChainId, 0xDEAD); addToBatch(vars.axelarImplementation, 0, txn); txn = abi.encodeWithSelector( @@ -1959,17 +2072,17 @@ abstract contract AbstractDeploySingle is BatchScript { priceFeeds[FANTOM][BARTIO] = 0x11DdD3d147E5b83D01cee7070027092397d63658; /// LINEA - priceFeeds[LINEA][LINEA] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][OP] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][POLY] = 0x9ce4473B42a639d010eD741df3CA829E6e480803; - priceFeeds[LINEA][AVAX] = 0xD86d65fb17B5E0ee7152da12b4A4D31Bf5f4fDe9; - priceFeeds[LINEA][BSC] = 0x09E929D57969D8B996a62ee176Df214D87565bDE; - priceFeeds[LINEA][ETH] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][BASE] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][ARBI] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][FANTOM] = 0xA40819f13aece3D0C8375522bF44DCC30290f655; - priceFeeds[LINEA][BLAST] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][BARTIO] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; + priceFeeds[LINEA][LINEA] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][OP] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][POLY] = 0x2AFFD07522147fba37Da08f938cA22Eaa02CEF25; + priceFeeds[LINEA][AVAX] = 0xEcD363e4ffe9D0004451648DA2b45E1158c00bF8; + priceFeeds[LINEA][BSC] = 0x7464Cc4f3100Cd2e2169d7918030025C8d3E114C; + priceFeeds[LINEA][ETH] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][BASE] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][ARBI] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][FANTOM] = 0x5CC126760258e319548fc8740d7656B08550BF54; + priceFeeds[LINEA][BLAST] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][BARTIO] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; /// BLAST priceFeeds[BLAST][LINEA] = 0x4AB67C7e24d94bd70502c44051274195215d8071; diff --git a/script/forge-scripts/EnvironmentUtils.s.sol b/script/forge-scripts/EnvironmentUtils.s.sol index 6afccac48..85ed59e49 100644 --- a/script/forge-scripts/EnvironmentUtils.s.sol +++ b/script/forge-scripts/EnvironmentUtils.s.sol @@ -28,6 +28,8 @@ abstract contract EnvironmentUtils is AbstractDeploySingle { function _setEnvironment(uint256 env, bool useNewSalt) internal { /// Production if (env == 0) { + DEPLOY_AXELAR = true; + DEPLOY_7540 = false; TARGET_CHAINS.push(ETH); TARGET_CHAINS.push(BSC); TARGET_CHAINS.push(AVAX); @@ -65,6 +67,9 @@ abstract contract EnvironmentUtils is AbstractDeploySingle { WORMHOLE_VAA_RELAYER = 0x1A86b5c1467331A3A52572663FDBf037A9e29719; // Staging } else if (env == 1) { + DEPLOY_AXELAR = true; + DEPLOY_7540 = true; + TARGET_CHAINS.push(BSC); TARGET_CHAINS.push(ARBI); TARGET_CHAINS.push(OP); @@ -97,6 +102,9 @@ abstract contract EnvironmentUtils is AbstractDeploySingle { // Tenderly } else if (env == 2) { + DEPLOY_AXELAR = true; + DEPLOY_7540 = true; + TARGET_CHAINS.push(ETH); TARGET_CHAINS.push(OP); TARGET_CHAINS.push(ARBI); @@ -123,6 +131,9 @@ abstract contract EnvironmentUtils is AbstractDeploySingle { salt = "Tenderly"; } else if (env == 3) { + DEPLOY_AXELAR = false; + DEPLOY_7540 = false; + salt = "Testnet"; PAYMENT_ADMIN = 0xD911673eAF0D3e15fe662D58De15511c5509bAbB; diff --git a/script/forge-scripts/misc/Abstract.Configure.NewDVN.s.sol b/script/forge-scripts/misc/Abstract.Configure.NewDVN.s.sol index 18057d827..23220f874 100644 --- a/script/forge-scripts/misc/Abstract.Configure.NewDVN.s.sol +++ b/script/forge-scripts/misc/Abstract.Configure.NewDVN.s.sol @@ -48,19 +48,6 @@ abstract contract AbstractConfigureNewDVN is EnvironmentUtils { 0xabC9b1819cc4D9846550F928B985993cF6240439 ]; - address[] public LzDVNs = [ - 0x589dEDbD617e0CBcB916A9223F4d1300c294236b, - 0xfD6865c841c2d64565562fCc7e05e619A30615f0, - 0x962F502A63F5FBeB44DC9ab932122648E8352959, - 0x23DE2FE932d9043291f870324B74F820e11dc81A, - 0x2f55C492897526677C5B68fb199ea31E2c126416, - 0x6A02D83e8d433304bba74EF1c427913958187142, - 0x9e059a54699a285714207b43B055483E78FAac25, - 0xE60A3959Ca23a92BF5aAf992EF837cA7F828628a, - 0x129Ee430Cb2Ff2708CCADDBDb408a88Fe4FFd480, - 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f - ]; - function _configureSendAndReceiveDVN( uint256 env, uint256 i, diff --git a/script/forge-scripts/misc/Abstract.Configure.PreBeraLaunch.s.sol b/script/forge-scripts/misc/Abstract.Configure.PreBeraLaunch.s.sol new file mode 100644 index 000000000..d37a73475 --- /dev/null +++ b/script/forge-scripts/misc/Abstract.Configure.PreBeraLaunch.s.sol @@ -0,0 +1,158 @@ +/// SPDX-License-Identifier: BUSL-1.1 + +pragma solidity ^0.8.23; + +import "../EnvironmentUtils.s.sol"; +import { ILayerZeroEndpointV2, IMessageLibManager } from "src/vendor/layerzero/v2/ILayerZeroEndpointV2.sol"; +import { SetConfigParam } from "src/vendor/layerzero/v2/IMessageLibManager.sol"; + +interface ILayerzeroEndpointV2Delegates is ILayerZeroEndpointV2 { + function delegates(address _impl) external view returns (address); +} + +struct UpdateVars { + uint64 chainId; + uint64 dstChainId; + uint256 srcTrueIndex; + uint256 dstTrueIndex; + address receiveLib; + address dstLzImpl; + address axl; + address srcLzImpl; + bytes config; + SuperRegistry superRegistryC; + AxelarImplementation axelarImpl; + SuperformFactory superformFactory; + SetConfigParam[] setConfigParams; + address sendLib; +} + +abstract contract AbstractPreBeraLaunch is EnvironmentUtils { + function _configure( + uint256 env, + uint256 srcChainIndex, + Cycle cycle, + uint64[] memory finalDeployedChains + ) + internal + setEnvDeploy(cycle) + { + assert(salt.length > 0); + UpdateVars memory vars; + + vars.chainId = finalDeployedChains[srcChainIndex]; + + vars.axl = _readContractsV1(env, chainNames[srcChainIndex], vars.chainId, "AxelarImplementation"); + assert(vars.axl != address(0)); + // Configure for the source chain + vars.srcLzImpl = _readContractsV1(env, chainNames[srcChainIndex], vars.chainId, "LayerzeroImplementation"); + assert(vars.srcLzImpl != address(0)); + + vars.superRegistryC = + SuperRegistry(_readContractsV1(env, chainNames[srcChainIndex], vars.chainId, "SuperRegistry")); + assert(address(vars.superRegistryC) != address(0)); + bytes memory txn; + + txn = abi.encodeWithSelector( + vars.superRegistryC.setAddress.selector, rewardsAdminRole, REWARDS_ADMIN, vars.chainId + ); + addToBatch(address(vars.superRegistryC), 0, txn); + + console.log("Setting config"); + UlnConfig memory ulnConfig; + + ulnConfig.requiredDVNCount = 2; + ulnConfig.optionalDVNCount = 0; + + address[] memory optionalDVNs = new address[](0); + ulnConfig.optionalDVNs = optionalDVNs; + + address[] memory requiredDVNs = new address[](2); + requiredDVNs[0] = SuperformDVNs[srcChainIndex]; + requiredDVNs[1] = LzDVNs[srcChainIndex]; + + // Sort DVNs + if (requiredDVNs[0] > requiredDVNs[1]) { + (requiredDVNs[0], requiredDVNs[1]) = (requiredDVNs[1], requiredDVNs[0]); + } + + ulnConfig.requiredDVNs = requiredDVNs; + + /// @dev default to 0 to use lz v2 defaults + ulnConfig.confirmations = 0; + + address[] memory rescuerAddress = new address[](2); + bytes32[] memory ids = new bytes32[](2); + uint64[] memory targetChains = new uint64[](2); + targetChains[0] = LINEA; + targetChains[1] = BLAST; + + for (uint256 j; j < finalDeployedChains.length; j++) { + if (finalDeployedChains[j] == vars.chainId) { + continue; + } + vars.dstTrueIndex = _getTrueIndex(finalDeployedChains[j]); + + vars.setConfigParams = new SetConfigParam[](1); + + vars.config = abi.encode(ulnConfig); + + vars.setConfigParams[0] = SetConfigParam(uint32(lz_chainIds[vars.dstTrueIndex]), uint32(2), vars.config); + + // Set send config on source chain + vars.sendLib = ILayerZeroEndpointV2(lzV2Endpoint).defaultSendLibrary(lz_chainIds[vars.dstTrueIndex]); + txn = abi.encodeWithSelector( + IMessageLibManager.setConfig.selector, vars.srcLzImpl, vars.sendLib, vars.setConfigParams + ); + addToBatch(lzV2Endpoint, 0, txn); + + // Set receive config on source chain + vars.receiveLib = ILayerZeroEndpointV2(lzV2Endpoint).defaultReceiveLibrary(lz_chainIds[vars.dstTrueIndex]); + txn = abi.encodeWithSelector( + IMessageLibManager.setConfig.selector, vars.srcLzImpl, vars.receiveLib, vars.setConfigParams + ); + addToBatch(lzV2Endpoint, 0, txn); + + // disable Axelar's other chain info on LINEA and BLAST + if (vars.chainId == LINEA || vars.chainId == BLAST) { + /* + if (finalDeployedChains[j] == LINEA || finalDeployedChains[j] == BLAST) { + txn = abi.encodeWithSelector( + AxelarImplementation.setChainId.selector, + finalDeployedChains[j], + axelar_chainIds[vars.dstTrueIndex] + ); + + addToBatch(vars.axl, 0, txn); + } + txn = abi.encodeWithSelector( + AxelarImplementation.setReceiver.selector, axelar_chainIds[vars.dstTrueIndex], address(0xDEAD) + ); + + addToBatch(vars.axl, 0, txn); + */ + } else { + for (uint256 i; i < rescuerAddress.length; i++) { + ids[i] = keccak256("CORE_STATE_REGISTRY_RESCUER_ROLE"); + rescuerAddress[i] = CSR_RESCUER; + } + txn = abi.encodeWithSelector( + vars.superRegistryC.batchSetAddress.selector, ids, rescuerAddress, targetChains + ); + addToBatch(address(vars.superRegistryC), 0, txn); + } + } + + // Send the batch + executeBatch(vars.chainId, PROTOCOL_ADMINS[srcChainIndex], manualNonces[srcChainIndex], true); + } + + function _getTrueIndex(uint256 chainId) public view returns (uint256 index) { + for (uint256 i; i < chainIds.length; i++) { + if (chainId == chainIds[i]) { + index = i; + break; + } + } + } +} diff --git a/script/forge-scripts/misc/Abstract.ConfigureERC5115AndDisableAMBs.s.sol b/script/forge-scripts/misc/Abstract.ConfigureERC5115AndDisableAMBs.s.sol index 9ef93ec9d..6b898fd81 100644 --- a/script/forge-scripts/misc/Abstract.ConfigureERC5115AndDisableAMBs.s.sol +++ b/script/forge-scripts/misc/Abstract.ConfigureERC5115AndDisableAMBs.s.sol @@ -430,11 +430,7 @@ abstract contract AbstractConfigure5115FormAndDisableAMB is EnvironmentUtils { ); addToBatch(address(vars.lzV1Impl), 0, txn); /// @dev set receivers to 0xDEAD - txn = abi.encodeWithSelector( - AxelarImplementation.setReceiver.selector, axelar_chainIds[vars.dstTrueIndex], address(0xDEAD) - ); - - addToBatch(address(vars.axelarImpl), 0, txn); + /// @dev old layerzero, hyperlane and wormhole are only deployed on the previous networks if ( diff --git a/script/forge-scripts/misc/Abstract.Update.PriceFeeds.s.sol b/script/forge-scripts/misc/Abstract.Update.PriceFeeds.s.sol new file mode 100644 index 000000000..4a54e847a --- /dev/null +++ b/script/forge-scripts/misc/Abstract.Update.PriceFeeds.s.sol @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.23; + +import "../EnvironmentUtils.s.sol"; + +struct UpdateVars { + uint64 chainId; + uint64 dstChainId; + uint256 dstTrueIndex; +} + +abstract contract AbstractUpdatePriceFeeds is EnvironmentUtils { + function _updatePriceFeeds( + uint256 env, + uint256 i, + uint256 trueIndex, + Cycle cycle, + uint64[] memory s_superFormChainIds + ) + internal + setEnvDeploy(cycle) + { + assert(salt.length > 0); + UpdateVars memory vars; + + vars.chainId = s_superFormChainIds[i]; + + cycle == Cycle.Dev ? vm.startBroadcast(deployerPrivateKey) : vm.startBroadcast(); + + address superRegistry = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "SuperRegistry"); + address expectedSr = + env == 0 ? 0x17A332dC7B40aE701485023b219E9D6f493a2514 : 0xB2C097ac459aFAc892ae5b35f6bd6a9Dd3071F47; + assert(superRegistry == expectedSr); + + address paymentHelper = _readContractsV1(env, chainNames[trueIndex], vars.chainId, "PaymentHelper"); + address expectedPaymentHelper = + env == 0 ? 0x69c531E5bdf2458FFb4f5E0dB3DE41745151b2Bd : 0xe14BCe82D4a72e4C95402a83fEF3C2299a61fD8C; + assert(paymentHelper == expectedPaymentHelper); + uint256 countFeeds; + for (uint256 j = 0; j < s_superFormChainIds.length; j++) { + vars.dstChainId = s_superFormChainIds[j]; + + for (uint256 k = 0; k < chainIds.length; k++) { + if (vars.dstChainId == chainIds[k]) { + vars.dstTrueIndex = k; + + break; + } + } + if (PRICE_FEEDS[vars.chainId][vars.dstChainId] != address(0)) { + IPaymentHelper(payable(paymentHelper)).updateRemoteChain( + vars.dstChainId, 1, abi.encode(PRICE_FEEDS[vars.chainId][vars.dstChainId]) + ); + countFeeds++; + } + } + console.log("Updated %d feeds", countFeeds); + vm.stopBroadcast(); + } +} diff --git a/script/forge-scripts/misc/DecodeULNConfig.sol b/script/forge-scripts/misc/DecodeULNConfig.sol new file mode 100644 index 000000000..da05618b8 --- /dev/null +++ b/script/forge-scripts/misc/DecodeULNConfig.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import "../EnvironmentUtils.s.sol"; +import "src/vendor/layerzero/v2/ILayerZeroEndpointV2.sol"; + +contract DecodeULNConfig is EnvironmentUtils { + function decodeULNConfig(uint64 chainid, uint64 dstChainId, bytes memory config) public { + _setEnvironment(0, false); + _preDeploymentSetup(); + + UlnConfig memory ulnConfig = abi.decode(config, (UlnConfig)); + + address[] memory requiredDVNsToAssert = new address[](2); + requiredDVNsToAssert[0] = SuperformDVNs[_getTrueIndex(chainid)]; + requiredDVNsToAssert[1] = LzDVNs[_getTrueIndex(chainid)]; + + if (requiredDVNsToAssert[0] > requiredDVNsToAssert[1]) { + (requiredDVNsToAssert[0], requiredDVNsToAssert[1]) = (requiredDVNsToAssert[1], requiredDVNsToAssert[0]); + } + assert(ulnConfig.confirmations == 0); + assert(requiredDVNsToAssert[0] == ulnConfig.requiredDVNs[0]); + assert(requiredDVNsToAssert[1] == ulnConfig.requiredDVNs[1]); + console.log("asserted, SRC, DST: ", chainid, dstChainId); + } + + function _getTrueIndex(uint256 chainId) public view returns (uint256 index) { + for (uint256 i; i < chainIds.length; i++) { + if (chainId == chainIds[i]) { + index = i; + break; + } + } + } +} diff --git a/script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol b/script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol new file mode 100644 index 000000000..e453822e9 --- /dev/null +++ b/script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.23; + +import { AbstractPreBeraLaunch } from "./Abstract.Configure.PreBeraLaunch.s.sol"; +import "forge-std/console.sol"; + +contract MainnetConfigPreBeraDVN is AbstractPreBeraLaunch { + function configure(uint256 env, uint256 selectedChainIndex, uint256 useNewSalt) external { + _setEnvironment(env, useNewSalt == 1 ? true : false); + _preDeploymentSetup(); + + uint256 trueIndex; + for (uint256 i = 0; i < chainIds.length; i++) { + if (TARGET_CHAINS[selectedChainIndex] == chainIds[i]) { + trueIndex = i; + break; + } + } + + _configure(env, trueIndex, Cycle.Prod, TARGET_CHAINS); + } +} diff --git a/script/forge-scripts/misc/Mainnet.UpdatePriceFeeds.s.sol b/script/forge-scripts/misc/Mainnet.UpdatePriceFeeds.s.sol new file mode 100644 index 000000000..48143d0f8 --- /dev/null +++ b/script/forge-scripts/misc/Mainnet.UpdatePriceFeeds.s.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.23; + +import { AbstractUpdatePriceFeeds } from "./Abstract.Update.PriceFeeds.s.sol"; + +contract MainnetUpdatePriceFeeds is AbstractUpdatePriceFeeds { + function updatePriceFeeds(uint256 env, uint256 selectedChainIndex) external { + _setEnvironment(env, false); + _preDeploymentSetup(); + + uint256 trueIndex; + for (uint256 i = 0; i < chainIds.length; i++) { + if (TARGET_CHAINS[selectedChainIndex] == chainIds[i]) { + trueIndex = i; + break; + } + } + + _updatePriceFeeds(env, selectedChainIndex, trueIndex, Cycle.Prod, TARGET_CHAINS); + } +} diff --git a/script/output/1/Ethereum-latest.json b/script/output/1/Ethereum-latest.json index 68f4fb805..294b577a8 100644 --- a/script/output/1/Ethereum-latest.json +++ b/script/output/1/Ethereum-latest.json @@ -1,13 +1,15 @@ { + "AsyncStateRegistry": "0x217D7ED4c370e4f81976A58dc04f5249c59Cd044", "AxelarImplementation": "0x679Cf01eaF7b48aF3Eb13D8D5dd8E8005675B75D", "BroadcastRegistry": "0xCEc20ddF2f26a7f2e213B65bBDc3Dba5a94905dB", "CoreStateRegistry": "0xda4Bc7aD4bfe737f1bAB14E96F345db40A71Ec3D", "DeBridgeForwarderValidator": "0x33A77A6ac571034579690C2B14dF11E3e803A3AC", "DeBridgeValidator": "0x4d6bd7F58B111368F7cAa900E25a3Fc345c145e4", - "DstSwapper": "0x0f0f6e8F7Df71f40F76a6085e68cbADfC3693b3c", + "DstSwapper": "0x90206D750dd8FEBbDdef32ca3eD578a278b133D9", "ERC4626Form": "0xBC696200257Aa524DC33daC962609b1cc5829e7f", "ERC5115Form": "0xE7c419E8697863945498799445EedFb353D3aB7A", "ERC5115To4626WrapperFactory": "0xC3d2303C2D7BD590786b2a161d16756459814A4F", + "ERC7540Form": "0x186504843d4F15A5e98E654484F5BC8EE1a9Cbd8", "EmergencyQueue": "0x97757B4Fbe27844491cda3B766B2Af2C5FC3CdE5", "HyperlaneImplementation": "0xA32C38a1F734D40d4293688f2B401A99eE34211c", "LayerzeroImplementation": "0x05D2543d0b6b50e59f6eB548660289502f6095BE", @@ -15,7 +17,7 @@ "LiFiValidator": "0xF279499555c1F70A1e4412b652c376C881Ad0B89", "OneInchValidator": "0xf4F2b2d0036C5d9be3ddf86fa188B60C73170280", "PayMaster": "0xcBB80F21cE80877EA652BceF97821D7883A219e9", - "PayloadHelper": "0x89e7F61E97fd5E30B58640ea48FE9109F5434aA2", + "PayloadHelper": "0x9Ff35E68409b615110DB0864bd632E9F9770C182", "PaymentHelper": "0x5754BdbD9a19037961aa16d53aB6a97fFeC7c9d6", "RewardsDistributor": "0xBee4aa07Dee132B76d195Bb00eeB7F7B360d2afd", "SocketOneInchValidator": "0xB0F404e09F4D9660970bE7780Bb453ba4E161F96", @@ -25,6 +27,8 @@ "SuperRegistry": "0xD678fDdf21eA7b6722115cb9edBDDC8CF2BFb7d7", "SuperformFactory": "0xC8E70Ef21FaB64B321E8Aea0Ed1fda4eC481Ea24", "SuperformRouter": "0x229C2Cd1C67c1b7ab2D6A07718DC622b6EC3d408", + "SuperformRouterPlus": "0x0000000000000000000000000000000000000000", + "SuperformRouterPlusAsync": "0x0000000000000000000000000000000000000000", "VaultClaimer": "0x36B20e607eDC57da1bcd0475831150E475F58d70", "WormholeARImplementation": "0x7E76F8602194811eA4E1d36d570b5c3c2C6dd3c2", "WormholeSRImplementation": "0x802e93000D4F89A5B3c1D30b0D426bB7bCe3084C" diff --git a/script/output/10/Optimism-latest.json b/script/output/10/Optimism-latest.json index b03e77bc8..294b577a8 100644 --- a/script/output/10/Optimism-latest.json +++ b/script/output/10/Optimism-latest.json @@ -1,35 +1,35 @@ { - "AsyncStateRegistry": "0x0000000000000000000000000000000000000000", - "AxelarImplementation": "0x0000000000000000000000000000000000000000", - "BroadcastRegistry": "0x0000000000000000000000000000000000000000", - "CoreStateRegistry": "0x0000000000000000000000000000000000000000", - "DeBridgeForwarderValidator": "0x0000000000000000000000000000000000000000", - "DeBridgeValidator": "0x0000000000000000000000000000000000000000", - "DstSwapper": "0x0000000000000000000000000000000000000000", - "ERC4626Form": "0x0000000000000000000000000000000000000000", - "ERC5115Form": "0x0000000000000000000000000000000000000000", - "ERC5115To4626WrapperFactory": "0x0000000000000000000000000000000000000000", - "ERC7540Form": "0xE2005E8A9b8A21d6dF752db866fA78a574057052", - "EmergencyQueue": "0x0000000000000000000000000000000000000000", - "HyperlaneImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroV1Implementation": "0x0000000000000000000000000000000000000000", - "LiFiValidator": "0x0000000000000000000000000000000000000000", - "OneInchValidator": "0x0000000000000000000000000000000000000000", - "PayMaster": "0x0000000000000000000000000000000000000000", - "PayloadHelper": "0x0000000000000000000000000000000000000000", - "PaymentHelper": "0x0000000000000000000000000000000000000000", - "RewardsDistributor": "0x0000000000000000000000000000000000000000", - "SocketOneInchValidator": "0x0000000000000000000000000000000000000000", + "AsyncStateRegistry": "0x217D7ED4c370e4f81976A58dc04f5249c59Cd044", + "AxelarImplementation": "0x679Cf01eaF7b48aF3Eb13D8D5dd8E8005675B75D", + "BroadcastRegistry": "0xCEc20ddF2f26a7f2e213B65bBDc3Dba5a94905dB", + "CoreStateRegistry": "0xda4Bc7aD4bfe737f1bAB14E96F345db40A71Ec3D", + "DeBridgeForwarderValidator": "0x33A77A6ac571034579690C2B14dF11E3e803A3AC", + "DeBridgeValidator": "0x4d6bd7F58B111368F7cAa900E25a3Fc345c145e4", + "DstSwapper": "0x90206D750dd8FEBbDdef32ca3eD578a278b133D9", + "ERC4626Form": "0xBC696200257Aa524DC33daC962609b1cc5829e7f", + "ERC5115Form": "0xE7c419E8697863945498799445EedFb353D3aB7A", + "ERC5115To4626WrapperFactory": "0xC3d2303C2D7BD590786b2a161d16756459814A4F", + "ERC7540Form": "0x186504843d4F15A5e98E654484F5BC8EE1a9Cbd8", + "EmergencyQueue": "0x97757B4Fbe27844491cda3B766B2Af2C5FC3CdE5", + "HyperlaneImplementation": "0xA32C38a1F734D40d4293688f2B401A99eE34211c", + "LayerzeroImplementation": "0x05D2543d0b6b50e59f6eB548660289502f6095BE", + "LayerzeroV1Implementation": "0x44F11E68B595cb8f6789700BcF8814909093f553", + "LiFiValidator": "0xF279499555c1F70A1e4412b652c376C881Ad0B89", + "OneInchValidator": "0xf4F2b2d0036C5d9be3ddf86fa188B60C73170280", + "PayMaster": "0xcBB80F21cE80877EA652BceF97821D7883A219e9", + "PayloadHelper": "0x9Ff35E68409b615110DB0864bd632E9F9770C182", + "PaymentHelper": "0x5754BdbD9a19037961aa16d53aB6a97fFeC7c9d6", + "RewardsDistributor": "0xBee4aa07Dee132B76d195Bb00eeB7F7B360d2afd", + "SocketOneInchValidator": "0xB0F404e09F4D9660970bE7780Bb453ba4E161F96", "SocketValidator": "0x0000000000000000000000000000000000000000", - "SuperPositions": "0x0000000000000000000000000000000000000000", - "SuperRBAC": "0x0000000000000000000000000000000000000000", - "SuperRegistry": "0x0000000000000000000000000000000000000000", - "SuperformFactory": "0x0000000000000000000000000000000000000000", - "SuperformRouter": "0x0000000000000000000000000000000000000000", + "SuperPositions": "0x24Bc1C19781a1Bbf5A37b0E1A5F79aac75AF6467", + "SuperRBAC": "0xAEb63A3199d2CB3B2812BBD1dc6Ef62f12182E5d", + "SuperRegistry": "0xD678fDdf21eA7b6722115cb9edBDDC8CF2BFb7d7", + "SuperformFactory": "0xC8E70Ef21FaB64B321E8Aea0Ed1fda4eC481Ea24", + "SuperformRouter": "0x229C2Cd1C67c1b7ab2D6A07718DC622b6EC3d408", "SuperformRouterPlus": "0x0000000000000000000000000000000000000000", "SuperformRouterPlusAsync": "0x0000000000000000000000000000000000000000", - "VaultClaimer": "0x0000000000000000000000000000000000000000", - "WormholeARImplementation": "0x0000000000000000000000000000000000000000", - "WormholeSRImplementation": "0x0000000000000000000000000000000000000000" + "VaultClaimer": "0x36B20e607eDC57da1bcd0475831150E475F58d70", + "WormholeARImplementation": "0x7E76F8602194811eA4E1d36d570b5c3c2C6dd3c2", + "WormholeSRImplementation": "0x802e93000D4F89A5B3c1D30b0D426bB7bCe3084C" } \ No newline at end of file diff --git a/script/output/42161/Arbitrum-latest.json b/script/output/42161/Arbitrum-latest.json index b03e77bc8..294b577a8 100644 --- a/script/output/42161/Arbitrum-latest.json +++ b/script/output/42161/Arbitrum-latest.json @@ -1,35 +1,35 @@ { - "AsyncStateRegistry": "0x0000000000000000000000000000000000000000", - "AxelarImplementation": "0x0000000000000000000000000000000000000000", - "BroadcastRegistry": "0x0000000000000000000000000000000000000000", - "CoreStateRegistry": "0x0000000000000000000000000000000000000000", - "DeBridgeForwarderValidator": "0x0000000000000000000000000000000000000000", - "DeBridgeValidator": "0x0000000000000000000000000000000000000000", - "DstSwapper": "0x0000000000000000000000000000000000000000", - "ERC4626Form": "0x0000000000000000000000000000000000000000", - "ERC5115Form": "0x0000000000000000000000000000000000000000", - "ERC5115To4626WrapperFactory": "0x0000000000000000000000000000000000000000", - "ERC7540Form": "0xE2005E8A9b8A21d6dF752db866fA78a574057052", - "EmergencyQueue": "0x0000000000000000000000000000000000000000", - "HyperlaneImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroV1Implementation": "0x0000000000000000000000000000000000000000", - "LiFiValidator": "0x0000000000000000000000000000000000000000", - "OneInchValidator": "0x0000000000000000000000000000000000000000", - "PayMaster": "0x0000000000000000000000000000000000000000", - "PayloadHelper": "0x0000000000000000000000000000000000000000", - "PaymentHelper": "0x0000000000000000000000000000000000000000", - "RewardsDistributor": "0x0000000000000000000000000000000000000000", - "SocketOneInchValidator": "0x0000000000000000000000000000000000000000", + "AsyncStateRegistry": "0x217D7ED4c370e4f81976A58dc04f5249c59Cd044", + "AxelarImplementation": "0x679Cf01eaF7b48aF3Eb13D8D5dd8E8005675B75D", + "BroadcastRegistry": "0xCEc20ddF2f26a7f2e213B65bBDc3Dba5a94905dB", + "CoreStateRegistry": "0xda4Bc7aD4bfe737f1bAB14E96F345db40A71Ec3D", + "DeBridgeForwarderValidator": "0x33A77A6ac571034579690C2B14dF11E3e803A3AC", + "DeBridgeValidator": "0x4d6bd7F58B111368F7cAa900E25a3Fc345c145e4", + "DstSwapper": "0x90206D750dd8FEBbDdef32ca3eD578a278b133D9", + "ERC4626Form": "0xBC696200257Aa524DC33daC962609b1cc5829e7f", + "ERC5115Form": "0xE7c419E8697863945498799445EedFb353D3aB7A", + "ERC5115To4626WrapperFactory": "0xC3d2303C2D7BD590786b2a161d16756459814A4F", + "ERC7540Form": "0x186504843d4F15A5e98E654484F5BC8EE1a9Cbd8", + "EmergencyQueue": "0x97757B4Fbe27844491cda3B766B2Af2C5FC3CdE5", + "HyperlaneImplementation": "0xA32C38a1F734D40d4293688f2B401A99eE34211c", + "LayerzeroImplementation": "0x05D2543d0b6b50e59f6eB548660289502f6095BE", + "LayerzeroV1Implementation": "0x44F11E68B595cb8f6789700BcF8814909093f553", + "LiFiValidator": "0xF279499555c1F70A1e4412b652c376C881Ad0B89", + "OneInchValidator": "0xf4F2b2d0036C5d9be3ddf86fa188B60C73170280", + "PayMaster": "0xcBB80F21cE80877EA652BceF97821D7883A219e9", + "PayloadHelper": "0x9Ff35E68409b615110DB0864bd632E9F9770C182", + "PaymentHelper": "0x5754BdbD9a19037961aa16d53aB6a97fFeC7c9d6", + "RewardsDistributor": "0xBee4aa07Dee132B76d195Bb00eeB7F7B360d2afd", + "SocketOneInchValidator": "0xB0F404e09F4D9660970bE7780Bb453ba4E161F96", "SocketValidator": "0x0000000000000000000000000000000000000000", - "SuperPositions": "0x0000000000000000000000000000000000000000", - "SuperRBAC": "0x0000000000000000000000000000000000000000", - "SuperRegistry": "0x0000000000000000000000000000000000000000", - "SuperformFactory": "0x0000000000000000000000000000000000000000", - "SuperformRouter": "0x0000000000000000000000000000000000000000", + "SuperPositions": "0x24Bc1C19781a1Bbf5A37b0E1A5F79aac75AF6467", + "SuperRBAC": "0xAEb63A3199d2CB3B2812BBD1dc6Ef62f12182E5d", + "SuperRegistry": "0xD678fDdf21eA7b6722115cb9edBDDC8CF2BFb7d7", + "SuperformFactory": "0xC8E70Ef21FaB64B321E8Aea0Ed1fda4eC481Ea24", + "SuperformRouter": "0x229C2Cd1C67c1b7ab2D6A07718DC622b6EC3d408", "SuperformRouterPlus": "0x0000000000000000000000000000000000000000", "SuperformRouterPlusAsync": "0x0000000000000000000000000000000000000000", - "VaultClaimer": "0x0000000000000000000000000000000000000000", - "WormholeARImplementation": "0x0000000000000000000000000000000000000000", - "WormholeSRImplementation": "0x0000000000000000000000000000000000000000" + "VaultClaimer": "0x36B20e607eDC57da1bcd0475831150E475F58d70", + "WormholeARImplementation": "0x7E76F8602194811eA4E1d36d570b5c3c2C6dd3c2", + "WormholeSRImplementation": "0x802e93000D4F89A5B3c1D30b0D426bB7bCe3084C" } \ No newline at end of file diff --git a/script/output/59144/Linea-latest.json b/script/output/59144/Linea-latest.json index b03e77bc8..e147e2cc6 100644 --- a/script/output/59144/Linea-latest.json +++ b/script/output/59144/Linea-latest.json @@ -1,35 +1,35 @@ { - "AsyncStateRegistry": "0x0000000000000000000000000000000000000000", - "AxelarImplementation": "0x0000000000000000000000000000000000000000", - "BroadcastRegistry": "0x0000000000000000000000000000000000000000", - "CoreStateRegistry": "0x0000000000000000000000000000000000000000", - "DeBridgeForwarderValidator": "0x0000000000000000000000000000000000000000", - "DeBridgeValidator": "0x0000000000000000000000000000000000000000", - "DstSwapper": "0x0000000000000000000000000000000000000000", - "ERC4626Form": "0x0000000000000000000000000000000000000000", - "ERC5115Form": "0x0000000000000000000000000000000000000000", - "ERC5115To4626WrapperFactory": "0x0000000000000000000000000000000000000000", - "ERC7540Form": "0xE2005E8A9b8A21d6dF752db866fA78a574057052", - "EmergencyQueue": "0x0000000000000000000000000000000000000000", - "HyperlaneImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroImplementation": "0x0000000000000000000000000000000000000000", - "LayerzeroV1Implementation": "0x0000000000000000000000000000000000000000", - "LiFiValidator": "0x0000000000000000000000000000000000000000", + "AsyncStateRegistry": "0x217D7ED4c370e4f81976A58dc04f5249c59Cd044", + "AxelarImplementation": "0x679Cf01eaF7b48aF3Eb13D8D5dd8E8005675B75D", + "BroadcastRegistry": "0xCEc20ddF2f26a7f2e213B65bBDc3Dba5a94905dB", + "CoreStateRegistry": "0xda4Bc7aD4bfe737f1bAB14E96F345db40A71Ec3D", + "DeBridgeForwarderValidator": "0x33A77A6ac571034579690C2B14dF11E3e803A3AC", + "DeBridgeValidator": "0x4d6bd7F58B111368F7cAa900E25a3Fc345c145e4", + "DstSwapper": "0x90206D750dd8FEBbDdef32ca3eD578a278b133D9", + "ERC4626Form": "0xBC696200257Aa524DC33daC962609b1cc5829e7f", + "ERC5115Form": "0xE7c419E8697863945498799445EedFb353D3aB7A", + "ERC5115To4626WrapperFactory": "0xC3d2303C2D7BD590786b2a161d16756459814A4F", + "ERC7540Form": "0x186504843d4F15A5e98E654484F5BC8EE1a9Cbd8", + "EmergencyQueue": "0x97757B4Fbe27844491cda3B766B2Af2C5FC3CdE5", + "HyperlaneImplementation": "0xA32C38a1F734D40d4293688f2B401A99eE34211c", + "LayerzeroImplementation": "0x05D2543d0b6b50e59f6eB548660289502f6095BE", + "LayerzeroV1Implementation": "0x44F11E68B595cb8f6789700BcF8814909093f553", + "LiFiValidator": "0xF279499555c1F70A1e4412b652c376C881Ad0B89", "OneInchValidator": "0x0000000000000000000000000000000000000000", - "PayMaster": "0x0000000000000000000000000000000000000000", - "PayloadHelper": "0x0000000000000000000000000000000000000000", - "PaymentHelper": "0x0000000000000000000000000000000000000000", - "RewardsDistributor": "0x0000000000000000000000000000000000000000", + "PayMaster": "0xcBB80F21cE80877EA652BceF97821D7883A219e9", + "PayloadHelper": "0x9Ff35E68409b615110DB0864bd632E9F9770C182", + "PaymentHelper": "0x5754BdbD9a19037961aa16d53aB6a97fFeC7c9d6", + "RewardsDistributor": "0xBee4aa07Dee132B76d195Bb00eeB7F7B360d2afd", "SocketOneInchValidator": "0x0000000000000000000000000000000000000000", "SocketValidator": "0x0000000000000000000000000000000000000000", - "SuperPositions": "0x0000000000000000000000000000000000000000", - "SuperRBAC": "0x0000000000000000000000000000000000000000", - "SuperRegistry": "0x0000000000000000000000000000000000000000", - "SuperformFactory": "0x0000000000000000000000000000000000000000", - "SuperformRouter": "0x0000000000000000000000000000000000000000", + "SuperPositions": "0x24Bc1C19781a1Bbf5A37b0E1A5F79aac75AF6467", + "SuperRBAC": "0xAEb63A3199d2CB3B2812BBD1dc6Ef62f12182E5d", + "SuperRegistry": "0xD678fDdf21eA7b6722115cb9edBDDC8CF2BFb7d7", + "SuperformFactory": "0xC8E70Ef21FaB64B321E8Aea0Ed1fda4eC481Ea24", + "SuperformRouter": "0x229C2Cd1C67c1b7ab2D6A07718DC622b6EC3d408", "SuperformRouterPlus": "0x0000000000000000000000000000000000000000", "SuperformRouterPlusAsync": "0x0000000000000000000000000000000000000000", - "VaultClaimer": "0x0000000000000000000000000000000000000000", + "VaultClaimer": "0x36B20e607eDC57da1bcd0475831150E475F58d70", "WormholeARImplementation": "0x0000000000000000000000000000000000000000", "WormholeSRImplementation": "0x0000000000000000000000000000000000000000" } \ No newline at end of file diff --git a/script/utils/misc/run_script_mainnet_preBera.sh b/script/utils/misc/run_script_mainnet_preBera.sh new file mode 100644 index 000000000..c472490de --- /dev/null +++ b/script/utils/misc/run_script_mainnet_preBera.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# Note: How to set default - https://www.youtube.com/watch?v=VQe7cIpaE54 + +export ETHEREUM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/ETHEREUM_RPC_URL/credential) +export BSC_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BSC_RPC_URL/credential) +export AVALANCHE_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/AVALANCHE_RPC_URL/credential) +export POLYGON_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/POLYGON_RPC_URL/credential) +export ARBITRUM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/ARBITRUM_RPC_URL/credential) +export OPTIMISM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/OPTIMISM_RPC_URL/credential) +export BASE_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BASE_RPC_URL/credential) +export FANTOM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/FANTOM_RPC_URL/credential) +export LINEA_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/LINEA_RPC_URL/credential) +export BLAST_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BLAST_RPC_URL/credential) + +echo Configuring + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 0 0 --rpc-url $ETHEREUM_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 1 0 --rpc-url $BSC_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 2 0 --rpc-url $AVALANCHE_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 3 0 --rpc-url $POLYGON_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 4 0 --rpc-url $ARBITRUM_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 5 0 --rpc-url $OPTIMISM_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 6 0 --rpc-url $BASE_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 7 1 --rpc-url $FANTOM_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 8 0 --rpc-url $LINEA_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait + +FOUNDRY_PROFILE=production forge script script/forge-scripts/misc/Mainnet.Configure.PreBera.s.sol --sig "configure(uint256, uint256, uint256)" 0 9 0 --rpc-url $BLAST_RPC_URL --slow --sender 0x1985df46791BEBb1e3ed9Ec60417F38CECc1D349 +wait diff --git a/script/utils/misc/run_script_mainnet_update_priceFeeds.sh b/script/utils/misc/run_script_mainnet_update_priceFeeds.sh new file mode 100755 index 000000000..b0a319276 --- /dev/null +++ b/script/utils/misc/run_script_mainnet_update_priceFeeds.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# Note: How to set defaultKey - https://www.youtube.com/watch?v=VQe7cIpaE54 + +export ETHEREUM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/ETHEREUM_RPC_URL/credential) +export BSC_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BSC_RPC_URL/credential) +export AVALANCHE_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/AVALANCHE_RPC_URL/credential) +export POLYGON_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/POLYGON_RPC_URL/credential) +export ARBITRUM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/ARBITRUM_RPC_URL/credential) +export OPTIMISM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/OPTIMISM_RPC_URL/credential) +export BASE_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BASE_RPC_URL/credential) +export FANTOM_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/FANTOM_RPC_URL/credential) +export LINEA_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/LINEA_RPC_URL/credential) +export BLAST_RPC_URL=$(op read op://5ylebqljbh3x6zomdxi3qd7tsa/BLAST_RPC_URL/credential) +# Run the script + +#!/usr/bin/env bash +#https://developers.fireblocks.com/docs/ethereum-smart-contract-development + +# Setup Fireblocks +export FIREBLOCKS_API_KEY=$(op read op://zry2qwhqux2w6qtjitg44xb7b4/V1_PAYMASTER_ACTION_KEY/credential) +export FIREBLOCKS_API_PRIVATE_KEY_PATH=$(op read op://zry2qwhqux2w6qtjitg44xb7b4/V1_PAYMASTER_ACTION_SECRET_SSH/private_key) +export FOUNDRY_PROFILE=production +#export FIREBLOCKS_VAULT_ACCOUNT_IDS=13 #PaymentAdmin Staging +export FIREBLOCKS_VAULT_ACCOUNT_IDS=5 #PaymentAdmin Prod + +# Run the script +echo Running Update PriceFeeds: ... + +export FIREBLOCKS_RPC_URL=$LINEA_RPC_URL + +fireblocks-json-rpc --http -- forge script script/forge-scripts/misc/Mainnet.UpdatePriceFeeds.s.sol:MainnetUpdatePriceFeeds --sig "updatePriceFeeds(uint256,uint256)" 0 8 \ + --rpc-url {} --sender 0xD911673eAF0D3e15fe662D58De15511c5509bAbB --unlocked --slow --broadcast diff --git a/script/utils/run_script_tenderly.sh b/script/utils/run_script_tenderly.sh index 5b713bb2f..b517a9263 100755 --- a/script/utils/run_script_tenderly.sh +++ b/script/utils/run_script_tenderly.sh @@ -16,52 +16,52 @@ LINEA_DEVNET=$(tenderly devnet spawn-rpc --project $TENDERLY_PROJECT_SLUG --temp # Run the script echo Running Stage 1: ... -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0xd26b38a64C812403fD3F87717624C80852cD6D61 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x99620a926D68746D5F085B3f7cD62F4fFB71f0C1 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x7Fc07cAFb65d1552849BcF151F7035C5210B76f4 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage1(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 --slow wait echo Running Stage 2: ... -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0xd26b38a64C812403fD3F87717624C80852cD6D61 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x99620a926D68746D5F085B3f7cD62F4fFB71f0C1 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x7Fc07cAFb65d1552849BcF151F7035C5210B76f4 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage2(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 --slow wait echo Running Stage 3: ... -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 0 --rpc-url $ETHEREUM_DEVNET --broadcast --unlocked --sender 0xd26b38a64C812403fD3F87717624C80852cD6D61 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 1 --rpc-url $OPTIMISM_DEVNET --broadcast --unlocked --sender 0x99620a926D68746D5F085B3f7cD62F4fFB71f0C1 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 2 --rpc-url $ARBITRUM_DEVNET --broadcast --unlocked --sender 0x7Fc07cAFb65d1552849BcF151F7035C5210B76f4 --slow wait -FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x0000000000000000000000000000000000000000 --slow +FOUNDRY_PROFILE=production forge script script/forge-scripts/Tenderly.Deploy.s.sol:TenderlyDeploy --sig "deployStage3(uint256,uint256)" 2 3 --rpc-url $LINEA_DEVNET --broadcast --unlocked --sender 0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 --slow diff --git a/script/utils/verify_contracts_staging.sh b/script/utils/verify_contracts_staging.sh index 8fbbfa13b..7f239520f 100644 --- a/script/utils/verify_contracts_staging.sh +++ b/script/utils/verify_contracts_staging.sh @@ -34,7 +34,7 @@ networks=( rpc_urls=( $BSC_RPC_URL $ARBITRUM_RPC_URL - $ETHEREUM_RPC_URL + $OPTIMISM_RPC_URL $BASE_RPC_URL $FANTOM_RPC_URL $LINEA_RPC_URL @@ -96,10 +96,10 @@ file_names=( # "src/crosschain-liquidity/1inch/OneInchValidator.sol" # "src/forms/wrappers/ERC5115To4626WrapperFactory.sol" # "src/crosschain-data/adapters/layerzero/LayerzeroImplementation.sol" - # "src/router-plus/SuperformRouterPlus.sol" - # "src/router-plus/SuperformRouterPlusAsync.sol" + "src/router-plus/SuperformRouterPlus.sol" + "src/router-plus/SuperformRouterPlusAsync.sol" # "src/crosschain-data/extensions/AsyncStateRegistry.sol" - "src/forms/ERC7540Form.sol" + # "src/forms/ERC7540Form.sol" # Add more file names here if needed ) @@ -133,10 +133,10 @@ contract_names=( # "OneInchValidator" # ERC5115To4626WrapperFactory # LayerzeroImplementation - # SuperformRouterPlus - # SuperformRouterPlusAsync + SuperformRouterPlus + SuperformRouterPlusAsync # AsyncStateRegistry - ERC7540Form + # ERC7540Form # Add more contract names here if needed ) @@ -170,10 +170,10 @@ contract_addresses=( # 0x0000000000000000000000000000000000000000 # 0x14Bc2728DaE89FE7c828833a186DdC5E9AE439C3 # 0xF442FC47c5e8b6CA772a9b7345d9E6A663375258 - # 0x12DCd933886D2Dd2436DDF3E52506872f90f2793 - # 0xE3b345E14d063ec58f2A196fa2554a325464F65E + 0x82D3EF5e1005559fc6D577a730Bb201De1F7Cc6d + 0x47aa92F7bb7c018046079BDaA94E5618cbCe151f # 0xcB11480022E5B6D76661441C8eD025d756B5D1Ed - 0xE2005E8A9b8A21d6dF752db866fA78a574057052 + # 0xE2005E8A9b8A21d6dF752db866fA78a574057052 # Add more addresses here if needed ) @@ -207,10 +207,10 @@ contract_addresses_fantom=( # 0x16e9f8549c2b6a026dc2706d746beA76CeFF4098 # 0x0df3d7D6daE058667e49C6b85F7b92458Ab06836 # 0x4c605a697c22254547289092337911078b56d5dc - # 0x08a3D4F3113D449Bdea59C95cb5F7093175EaFfe - # 0x43C3540828510C0f9A9BEf96F3ac810d7640FEC7 + 0x5223a22BB4EecE74ac4f258cf0a4977eaEB0166A + 0x4A4a0042e485CBE61ac4BC495Fab5Ca516040e18 # 0x89dDD49AEa0B3278f51Ec96a6b70bAA19fC73854 - 0x918cEF6ae14316Be0669270BFE3DD7Fbb4fd2aCa + # 0x918cEF6ae14316Be0669270BFE3DD7Fbb4fd2aCa # Add more addresses here if needed ) @@ -244,10 +244,10 @@ constructor_args=( # $super_constructor_arg # $super_constructor_arg # $super_constructor_arg + $super_constructor_arg + $super_constructor_arg # $super_constructor_arg # $super_constructor_arg - # $super_constructor_arg - $super_constructor_arg ) constructor_args_fantom=( @@ -280,10 +280,10 @@ constructor_args_fantom=( # $super_constructor_arg_ftm # $super_constructor_arg_ftm # $super_constructor_arg_ftm + $super_constructor_arg_ftm + $super_constructor_arg_ftm # $super_constructor_arg_ftm # $super_constructor_arg_ftm - # $super_constructor_arg_ftm - $super_constructor_arg_ftm ) # loop through networks diff --git a/script/utils/verify_safe_txs/verify_all_networks.sh b/script/utils/verify_safe_txs/verify_all_networks.sh new file mode 100755 index 000000000..d27537e4b --- /dev/null +++ b/script/utils/verify_safe_txs/verify_all_networks.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# Define array of networks +NETWORKS=( + "ethereum" + "bsc" + "avalanche" + "polygon" + "arbitrum" + "optimism" + "base" + "fantom" + "linea" + "blast" +) + +# Define arrays for networks and their corresponding nonces +declare -A NETWORK_ADDRESSES=( + ["ethereum"]="0xd26b38a64C812403fD3F87717624C80852cD6D61" + ["bsc"]="0xf70A19b67ACC4169cA6136728016E04931D550ae" + ["avalanche"]="0x79DD9868A1a89720981bF077A02a4A43c57080d2" + ["polygon"]="0x5022b05721025159c82E02abCb0Daa87e357f437" + ["arbitrum"]="0x7Fc07cAFb65d1552849BcF151F7035C5210B76f4" + ["optimism"]="0x99620a926D68746D5F085B3f7cD62F4fFB71f0C1" + ["base"]="0x2F973806f8863E860A553d4F2E7c2AB4A9F3b87C" + ["fantom"]="0xe6ca8aC2D27A1bAd2Ab6b136Eab87488c3c98Fd1" + ["linea"]="0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77" + ["blast"]="0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF" +) + +declare -A NETWORK_NONCES=( + ["ethereum"]="22" + ["bsc"]="22" + ["avalanche"]="22" + ["polygon"]="22" + ["arbitrum"]="21" + ["optimism"]="21" + ["base"]="20" + ["fantom"]="9" + ["linea"]="3" + ["blast"]="2" +) + +# Path to the verification script +VERIFY_SCRIPT="./script/utils/verify_safe_txs/verify_dvn_config.sh" + +# Check if the verification script exists +if [ ! -f "$VERIFY_SCRIPT" ]; then + echo "Error: Verification script not found at $VERIFY_SCRIPT" + exit 1 +fi + +# Iterate through each network and execute the verification script +for network in "${NETWORKS[@]}"; do + echo "----------------------------------------" + echo "Verifying network: $network" + echo "Address: ${NETWORK_ADDRESSES[$network]}" + echo "Nonce: ${NETWORK_NONCES[$network]}" + echo "----------------------------------------" + + /opt/homebrew/bin/bash "$VERIFY_SCRIPT" \ + --network "$network" \ + --address "${NETWORK_ADDRESSES[$network]}" \ + --nonce "${NETWORK_NONCES[$network]}" + + echo -e "\n" +done + +echo "Verification complete for all networks!" diff --git a/script/utils/verify_safe_txs/verify_dvn_config.sh b/script/utils/verify_safe_txs/verify_dvn_config.sh new file mode 100755 index 000000000..6ce164b45 --- /dev/null +++ b/script/utils/verify_safe_txs/verify_dvn_config.sh @@ -0,0 +1,466 @@ +#!/bin/bash + +######################## +# Don't trust, verify! # +######################## + +# @license GNU Affero General Public License v3.0 only +# @author pcaversaccio + +# Check the Bash version compatibility. +if [[ "$BASH_VERSINFO" -lt 4 ]]; then + echo "Error: This script requires Bash 4.0 or higher." + echo "Current version: $BASH_VERSION" + echo "Please upgrade your Bash installation." + echo "If you've already upgraded via Homebrew, try running:" + echo "/opt/homebrew/bin/bash $0 $@" + exit 1 +fi + +# Enable strict error handling: +# -e: Exit immediately if a command exits with a non-zero status. +# -u: Treat unset variables as an error and exit. +# -o pipefail: Return the exit status of the first failed command in a pipeline. +set -euo pipefail + +# Set the terminal formatting constants. +readonly GREEN="\e[32m" +readonly RED="\e[31m" +readonly UNDERLINE="\e[4m" +readonly BOLD="\e[1m" +readonly RESET="\e[0m" + +# Set the type hash constants. +# => `keccak256("EIP712Domain(uint256 chainId,address verifyingContract)");` +# See: https://github.com/safe-global/safe-smart-account/blob/a0a1d4292006e26c4dbd52282f4c932e1ffca40f/contracts/Safe.sol#L54-L57. +readonly DOMAIN_SEPARATOR_TYPEHASH="0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218" +# => `keccak256("SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)");` +# See: https://github.com/safe-global/safe-smart-account/blob/a0a1d4292006e26c4dbd52282f4c932e1ffca40f/contracts/Safe.sol#L59-L62. +readonly SAFE_TX_TYPEHASH="0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8" + +# Define the associative arrays for the API URLs and chain IDs. +declare -A API_URLS +declare -A CHAIN_IDS + +# Define the supported networks from the Safe transaction service. +# See https://docs.safe.global/core-api/transaction-service-supported-networks. +API_URLS=( + ["arbitrum"]="https://safe-transaction-arbitrum.safe.global" + ["aurora"]="https://safe-transaction-aurora.safe.global" + ["avalanche"]="https://safe-transaction-avalanche.safe.global" + ["base"]="https://safe-transaction-base.safe.global" + ["base-sepolia"]="https://safe-transaction-base-sepolia.safe.global" + ["blast"]="https://safe-transaction-blast.safe.global" + ["bsc"]="https://safe-transaction-bsc.safe.global" + ["celo"]="https://safe-transaction-celo.safe.global" + ["ethereum"]="https://safe-transaction-mainnet.safe.global" + ["gnosis"]="https://safe-transaction-gnosis-chain.safe.global" + ["gnosis-chiado"]="https://safe-transaction-chiado.safe.global" + ["linea"]="https://safe-transaction-linea.safe.global" + ["mantle"]="https://safe-transaction-mantle.safe.global" + ["optimism"]="https://safe-transaction-optimism.safe.global" + ["polygon"]="https://safe-transaction-polygon.safe.global" + ["polygon-zkevm"]="https://safe-transaction-zkevm.safe.global" + ["scroll"]="https://safe-transaction-scroll.safe.global" + ["sepolia"]="https://safe-transaction-sepolia.safe.global" + ["worldchain"]="https://safe-transaction-worldchain.safe.global" + ["xlayer"]="https://safe-transaction-xlayer.safe.global" + ["zksync"]="https://safe-transaction-zksync.safe.global" +) + +# Define the chain IDs of the supported networks from the Safe transaction service. +CHAIN_IDS=( + ["arbitrum"]="42161" + ["aurora"]="1313161554" + ["avalanche"]="43114" + ["base"]="8453" + ["base-sepolia"]="84532" + ["blast"]="81457" + ["bsc"]="56" + ["celo"]="42220" + ["ethereum"]="1" + ["gnosis"]="100" + ["gnosis-chiado"]="10200" + ["linea"]="59144" + ["mantle"]="5000" + ["optimism"]="10" + ["polygon"]="137" + ["polygon-zkevm"]="1101" + ["scroll"]="534352" + ["sepolia"]="11155111" + ["worldchain"]="480" + ["xlayer"]="195" + ["zksync"]="324" +) + +# Utility function to display the usage information. +usage() { + cat < --address
--nonce + +Options: + --help Display this help message + --list-networks List all supported networks and their chain IDs + --network Specify the network (required) + --address
Specify the Safe multisig address (required) + --nonce Specify the transaction nonce (required) + +Example: + $0 --network ethereum --address 0x1234...5678 --nonce 42 +EOF + exit 1 +} + +# Utility function to list all supported networks. +list_networks() { + echo "Supported Networks:" + for network in "${!CHAIN_IDS[@]}"; do + echo " $network (${CHAIN_IDS[$network]})" + done + exit 0 +} + +# Utility function to print a section header. +print_header() { + local header=$1 + if [ -t 1 ] && tput sgr0 >/dev/null 2>&1; then + # Terminal supports formatting. + printf "\n${UNDERLINE}%s${RESET}\n" "$header" + else + # Fallback for terminals without formatting support. + printf "\n%s\n" "> $header:" + fi +} + +# Utility function to print a labelled value. +print_field() { + local label=$1 + local value=$2 + local empty_line=${3:-false} + + if [ -t 1 ] && tput sgr0 >/dev/null 2>&1; then + # Terminal supports formatting. + printf "%s: ${GREEN}%s${RESET}\n" "$label" "$value" + else + # Fallback for terminals without formatting support. + printf "%s: %s\n" "$label" "$value" + fi + + # Print an empty line if requested. + if [ "$empty_line" == "true" ]; then + echo + fi +} + +# Utility function to format the hash (keep `0x` lowercase, rest uppercase). +format_hash() { + local hash=$1 + local prefix="${hash:0:2}" + local rest="${hash:2}" + echo "${prefix,,}${rest^^}" +} + +# Utility function to print the hash information. +print_hash_info() { + local domain_hash=$1 + local message_hash=$2 + local safe_tx_hash=$3 + + print_header "Hashes" + print_field "Domain hash" "$(format_hash "$domain_hash")" + print_field "Message hash" "$(format_hash "$message_hash")" + print_field "Safe transaction hash" "$safe_tx_hash" +} + +# Utility function to print the ABI-decoded transaction data. +print_decoded_data() { + local data_decoded=$1 + + if [[ "$data_decoded" == "0x" ]]; then + print_field "Method" "0x (ETH Transfer)" + print_field "Parameters" "[]" + else + method=$(echo "$data_decoded" | jq -r ".method") + parameters=$(echo "$data_decoded" | jq -r ".parameters") + + print_field "Method" "$method" + + # Check if the called function is sensitive and print a warning in bold. + case "$method" in + addOwnerWithThreshold | removeOwner | swapOwner | changeThreshold) + echo + echo -e "${BOLD}${RED}WARNING: The \"$method\" function modifies the owners or threshold of the Safe. Proceed with caution!${RESET}" + ;; + esac + + # First process all batchSetAddress methods + echo "$parameters" | jq -c '.[] | .valueDecoded[]? | select(.dataDecoded != null and .dataDecoded.method == "batchSetAddress")' | while read -r nested_param; do + ids=$(echo "$nested_param" | jq -r '.dataDecoded.parameters[0].value') + new_addresses=$(echo "$nested_param" | jq -r '.dataDecoded.parameters[1].value') + chain_ids=$(echo "$nested_param" | jq -r '.dataDecoded.parameters[-1].value') + + # Validate IDs + expected_id="0xf98729ec1ce0343ca1d11c51d1d2d3aa1a7b3f4f6876d0611e0a6fa86520a0cb" + if [[ $(echo "$ids" | jq -r '.[0]') != "$expected_id" || $(echo "$ids" | jq -r '.[1]') != "$expected_id" ]]; then + echo -e "${BOLD}${RED}ERROR: IDs validation failed. Both values must be $expected_id${RESET}" + exit 1 + fi + + # Validate New Addresses + expected_address="0x90ed07A867bDb6a73565D7abBc7434Dd810Fafc5" + if [[ $(echo "$new_addresses" | jq -r '.[0]') != "$expected_address" || $(echo "$new_addresses" | jq -r '.[1]') != "$expected_address" ]]; then + echo -e "${BOLD}${RED}ERROR: New Addresses validation failed. Both values must be $expected_address${RESET}" + exit 1 + fi + + # Validate Chain IDs + expected_chain_id_1="59144" + expected_chain_id_2="81457" + if [[ $(echo "$chain_ids" | jq -r '.[0]') != "$expected_chain_id_1" || $(echo "$chain_ids" | jq -r '.[1]') != "$expected_chain_id_2" ]]; then + echo -e "${BOLD}${RED}ERROR: Chain IDs validation failed. First value must be $expected_chain_id_1 and second value must be $expected_chain_id_2${RESET}" + exit 1 + fi + + echo -e "${GREEN}✓ batchSetAddress parameter validated successfully${RESET}" + done + + # Then process all setConfig methods + echo "$parameters" | jq -c '.[] | .valueDecoded[]? | select(.dataDecoded != null and .dataDecoded.method == "setConfig")' | while read -r nested_param; do + eid=$(echo "$nested_param" | jq -r '.dataDecoded.parameters[-1].value[0][0]') + uln_config=$(echo "$nested_param" | jq -r '.dataDecoded.parameters[-1].value[0][-1]') + # Format EID according to chain mapping + dst_chain_id="" + case "$eid" in + "30101") + formatted_eid="1 (ETH)" + dst_chain_id="1" + ;; + "30102") + formatted_eid="56 (BSC)" + dst_chain_id="56" + ;; + "30106") + formatted_eid="43114 (AVAX)" + dst_chain_id="43114" + ;; + "30109") + formatted_eid="137 (POLY)" + dst_chain_id="137" + ;; + "30110") + formatted_eid="42161 (ARBI)" + dst_chain_id="42161" + ;; + "30111") + formatted_eid="10 (OP)" + dst_chain_id="10" + ;; + "30184") + formatted_eid="8453 (BASE)" + dst_chain_id="8453" + ;; + "30112") + formatted_eid="250 (FANTOM)" + dst_chain_id="250" + ;; + "30183") + formatted_eid="59144 (LINEA)" + dst_chain_id="59144" + ;; + "30243") + formatted_eid="81457 (BLAST)" + dst_chain_id="81457" + ;; + *) + formatted_eid="$eid (Unknown)" + dst_chain_id="0" + ;; + esac + + # Add Foundry decode call to assert confirmations were coded as intended + FOUNDRY_PROFILE=production forge script ./script/forge-scripts/misc/DecodeULNConfig.sol --sig "decodeULNConfig(uint64,uint64,bytes)" "$chain_id" "$dst_chain_id" "$uln_config" + echo -e "${GREEN}✓ setConfig parameter validated successfully${RESET}" + done + + + + fi +} + +# Utility function to calculate the domain and message hashes. +calculate_hashes() { + local chain_id=$1 + local address=$2 + local to=$3 + local value=$4 + local data=$5 + local operation=$6 + local safe_tx_gas=$7 + local base_gas=$8 + local gas_price=$9 + local gas_token=${10} + local refund_receiver=${11} + local nonce=${12} + local data_decoded=${13} + + # Calculate the domain hash. + local domain_hash=$(chisel eval "keccak256(abi.encode($DOMAIN_SEPARATOR_TYPEHASH, $chain_id, $address))" | + awk '/Data:/ {gsub(/\x1b\[[0-9;]*m/, "", $3); print $3}') + + # Calculate the data hash. + # The dynamic value `bytes` is encoded as a `keccak256` hash of its content. + # See: https://eips.ethereum.org/EIPS/eip-712#definition-of-encodedata. + local data_hashed=$(cast keccak "$data") + + # Encode the message. + local message=$(cast abi-encode "SafeTxStruct(bytes32,address,uint256,bytes32,uint8,uint256,uint256,uint256,address,address,uint256)" \ + "$SAFE_TX_TYPEHASH" \ + "$to" \ + "$value" \ + "$data_hashed" \ + "$operation" \ + "$safe_tx_gas" \ + "$base_gas" \ + "$gas_price" \ + "$gas_token" \ + "$refund_receiver" \ + "$nonce") + + # Calculate the message hash. + local message_hash=$(cast keccak "$message") + + # Calculate the Safe transaction hash. + local safe_tx_hash=$(chisel eval "keccak256(abi.encodePacked(bytes1(0x19), bytes1(0x01), bytes32($domain_hash), bytes32($message_hash)))" | + awk '/Data:/ {gsub(/\x1b\[[0-9;]*m/, "", $3); print $3}') + + # Print the ABI-decoded transaction data. + print_decoded_data "$data_decoded" +} + +# Utility function to retrieve the API URL of the selected network. +get_api_url() { + echo "${API_URLS[$1]:-Invalid network}" || exit 1 +} + +# Utility function to retrieve the chain ID of the selected network. +get_chain_id() { + echo "${CHAIN_IDS[$1]:-Invalid network}" || exit 1 +} + +# Safe Transaction Hashes Calculator +# This function orchestrates the entire process of calculating the Safe transaction hashes: +# 1. Parses command-line arguments (`network`, `address`, `nonce`). +# 2. Validates that all required parameters are provided. +# 3. Retrieves the API URL and chain ID for the specified network. +# 4. Constructs the API endpoint URL. +# 5. Fetches the transaction data from the Safe transaction service API. +# 6. Extracts the relevant transaction details from the API response. +# 7. Calls the `calculate_hashes` function to compute and display the results. +calculate_safe_tx_hashes() { + local network="" address="" nonce="" + + # Parse the command line arguments. + while [[ $# -gt 0 ]]; do + case "$1" in + --help) usage ;; + --network) + network="$2" + shift 2 + ;; + --address) + address="$2" + shift 2 + ;; + --nonce) + nonce="$2" + shift 2 + ;; + --list-networks) list_networks ;; + *) + echo "Unknown option: $1" >&2 + usage + ;; + esac + done + + # Check if the required parameters are provided. + [ -z "$network" -o -z "$address" -o -z "$nonce" ] && usage + + # Get the API URL and chain ID for the specified network. + local api_url=$(get_api_url "$network") + local chain_id=$(get_chain_id "$network") + local endpoint="${api_url}/api/v1/safes/${address}/multisig-transactions/?nonce=${nonce}" + + # Fetch the transaction data from the API. + local response=$(curl -s "$endpoint") + local count=$(echo "$response" | jq '.count') + local idx=0 + + # Inform the user that no transactions are available for the specified nonce. + if [[ $count -eq 0 ]]; then + echo "$(tput setaf 3)No transaction is available for this nonce!$(tput setaf 0)" + exit 0 + # Notify the user about multiple transactions with identical nonce values and prompt for user input. + elif [[ $count -gt 1 ]]; then + cat < mapping(uint64 => uint64)) public CONFIRMATIONS; + /*////////////////////////////////////////////////////////////// AMB VARIABLES //////////////////////////////////////////////////////////////*/ @@ -395,6 +397,32 @@ abstract contract BaseSetup is StdInvariant, Test { uint32 public constant LZ_V2_BLAST = 30_243; uint32 public constant LZ_V2_BARTIO = 40_291; + address[] public SuperformDVNs = [ + 0x7518f30bd5867b5fA86702556245Dead173afE46, + 0xF4c489AfD83625F510947e63ff8F90dfEE0aE46C, + 0x8fb0B7D74B557e4b45EF89648BAc197EAb2E4325, + 0x1E4CE74ccf5498B19900649D9196e64BAb592451, + 0x5496d03d9065B08e5677E1c5D1107110Bb05d445, + 0xb0B2EF168F52F6d1e42f461e11117295eF992daf, + 0xEb62f578497Bdc351dD650853a751135212fAF49, + 0x2EdfE0220A74d9609c79711a65E3A2F2A85Dc83b, + 0x7A205ED4e3d7f9d0777594501705D8CD405c3B05, + 0x0E95cf21aD9376A26997c97f326C5A0a267bB8FF + ]; + + address[] public LzDVNs = [ + 0x589dEDbD617e0CBcB916A9223F4d1300c294236b, + 0xfD6865c841c2d64565562fCc7e05e619A30615f0, + 0x962F502A63F5FBeB44DC9ab932122648E8352959, + 0x23DE2FE932d9043291f870324B74F820e11dc81A, + 0x2f55C492897526677C5B68fb199ea31E2c126416, + 0x6A02D83e8d433304bba74EF1c427913958187142, + 0x9e059a54699a285714207b43B055483E78FAac25, + 0xE60A3959Ca23a92BF5aAf992EF837cA7F828628a, + 0x129Ee430Cb2Ff2708CCADDBDb408a88Fe4FFd480, + 0xc097ab8CD7b053326DFe9fB3E3a31a0CCe3B526f + ]; + /*////////////////////////////////////////////////////////////// HYPERLANE VARIABLES //////////////////////////////////////////////////////////////*/ @@ -1791,7 +1819,7 @@ abstract contract BaseSetup is StdInvariant, Test { ? pinnedBlock ? vm.createFork(BSC_TESTNET_RPC_URL_QN, 41_624_319) : vm.createFork(BSC_TESTNET_RPC_URL_QN) : 999; forks[LINEA] = selectedChainIds[LINEA] - ? pinnedBlock ? vm.createFork(LINEA_RPC_URL, 10_568_898) : vm.createFork(LINEA_RPC_URL_QN) + ? pinnedBlock ? vm.createFork(LINEA_RPC_URL, 12_323_016) : vm.createFork(LINEA_RPC_URL_QN) : 999; forks[BLAST] = selectedChainIds[BLAST] ? pinnedBlock ? vm.createFork(BLAST_RPC_URL, 9_880_537) : vm.createFork(BLAST_RPC_URL_QN) @@ -2076,19 +2104,19 @@ abstract contract BaseSetup is StdInvariant, Test { priceFeeds[BSC_TESTNET][BLAST] = 0x143db3CEEfbdfe5631aDD3E50f7614B6ba708BA7; priceFeeds[BSC_TESTNET][BARTIO] = 0x143db3CEEfbdfe5631aDD3E50f7614B6ba708BA7; /// LINEA - priceFeeds[LINEA][LINEA] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][OP] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][POLY] = 0x9ce4473B42a639d010eD741df3CA829E6e480803; - priceFeeds[LINEA][AVAX] = 0xD86d65fb17B5E0ee7152da12b4A4D31Bf5f4fDe9; - priceFeeds[LINEA][BSC] = 0x09E929D57969D8B996a62ee176Df214D87565bDE; - priceFeeds[LINEA][ETH] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][BASE] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][ARBI] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][FANTOM] = 0xA40819f13aece3D0C8375522bF44DCC30290f655; - priceFeeds[LINEA][BLAST] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; + priceFeeds[LINEA][LINEA] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][OP] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][POLY] = 0x2AFFD07522147fba37Da08f938cA22Eaa02CEF25; + priceFeeds[LINEA][AVAX] = 0xEcD363e4ffe9D0004451648DA2b45E1158c00bF8; + priceFeeds[LINEA][BSC] = 0x7464Cc4f3100Cd2e2169d7918030025C8d3E114C; + priceFeeds[LINEA][ETH] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][BASE] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][ARBI] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][FANTOM] = 0x5CC126760258e319548fc8740d7656B08550BF54; + priceFeeds[LINEA][BLAST] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; priceFeeds[LINEA][BSC_TESTNET] = address(0); - priceFeeds[LINEA][SEPOLIA] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; - priceFeeds[LINEA][BARTIO] = 0x3c6Cd9Cc7c7a4c2Cf5a82734CD249D7D593354dA; + priceFeeds[LINEA][SEPOLIA] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; + priceFeeds[LINEA][BARTIO] = 0x22C942d2DE7673435Cc0D10278c8D5e0d8284c65; /// BLAST @@ -2361,6 +2389,118 @@ abstract contract BaseSetup is StdInvariant, Test { 0x5979D7b546E38E414F7E9822514be443A4800529; erc5115ChosenAssets[42_161][0x80c12D5b6Cc494632Bf11b03F09436c8B61Cc5Df].assetOut = 0x5979D7b546E38E414F7E9822514be443A4800529; + + mapping(uint64 => mapping(uint64 => uint64)) storage confirmations = CONFIRMATIONS; + + /// ETH + confirmations[ETH][BSC] = 20; + confirmations[ETH][AVAX] = 12; + confirmations[ETH][POLY] = 512; + confirmations[ETH][OP] = 20; + confirmations[ETH][ARBI] = 20; + confirmations[ETH][BASE] = 10; + confirmations[ETH][FANTOM] = 5; + confirmations[ETH][LINEA] = 20; + confirmations[ETH][BLAST] = 20; + + /// BSC + confirmations[BSC][ETH] = 20; + confirmations[BSC][AVAX] = 20; + confirmations[BSC][POLY] = 20; + confirmations[BSC][OP] = 20; + confirmations[BSC][ARBI] = 20; + confirmations[BSC][BASE] = 20; + confirmations[BSC][FANTOM] = 20; + confirmations[BSC][LINEA] = 20; + confirmations[BSC][BLAST] = 20; + + /// AVAX + confirmations[AVAX][ETH] = 12; + confirmations[AVAX][BSC] = 12; + confirmations[AVAX][POLY] = 12; + confirmations[AVAX][OP] = 12; + confirmations[AVAX][ARBI] = 12; + confirmations[AVAX][BASE] = 12; + confirmations[AVAX][FANTOM] = 12; + confirmations[AVAX][LINEA] = 12; + confirmations[AVAX][BLAST] = 12; + + /// POLYGON + confirmations[POLY][AVAX] = 512; + confirmations[POLY][BSC] = 512; + confirmations[POLY][ETH] = 512; + confirmations[POLY][OP] = 512; + confirmations[POLY][ARBI] = 512; + confirmations[POLY][BASE] = 512; + confirmations[POLY][FANTOM] = 512; + confirmations[POLY][LINEA] = 512; + confirmations[POLY][BLAST] = 512; + + /// OPTIMISM + confirmations[OP][POLY] = 20; + confirmations[OP][AVAX] = 20; + confirmations[OP][BSC] = 20; + confirmations[OP][ETH] = 20; + confirmations[OP][ARBI] = 20; + confirmations[OP][BASE] = 20; + confirmations[OP][FANTOM] = 20; + confirmations[OP][LINEA] = 20; + confirmations[OP][BLAST] = 20; + + /// ARBITRUM + confirmations[ARBI][OP] = 20; + confirmations[ARBI][POLY] = 20; + confirmations[ARBI][AVAX] = 20; + confirmations[ARBI][BSC] = 20; + confirmations[ARBI][ETH] = 20; + confirmations[ARBI][BASE] = 20; + confirmations[ARBI][FANTOM] = 20; + confirmations[ARBI][LINEA] = 20; + confirmations[ARBI][BLAST] = 20; + + /// BASE + confirmations[BASE][OP] = 10; + confirmations[BASE][POLY] = 10; + confirmations[BASE][AVAX] = 10; + confirmations[BASE][BSC] = 10; + confirmations[BASE][ETH] = 10; + confirmations[BASE][ARBI] = 10; + confirmations[BASE][FANTOM] = 10; + confirmations[BASE][LINEA] = 10; + confirmations[BASE][BLAST] = 10; + + /// FANTOM + confirmations[FANTOM][OP] = 5; + confirmations[FANTOM][POLY] = 5; + confirmations[FANTOM][AVAX] = 5; + confirmations[FANTOM][BSC] = 5; + confirmations[FANTOM][ETH] = 5; + confirmations[FANTOM][BASE] = 5; + confirmations[FANTOM][ARBI] = 5; + confirmations[FANTOM][LINEA] = 5; + confirmations[FANTOM][BLAST] = 5; + + /// LINEA + confirmations[LINEA][OP] = 10; + confirmations[LINEA][POLY] = 10; + confirmations[LINEA][AVAX] = 10; + confirmations[LINEA][BSC] = 10; + confirmations[LINEA][ETH] = 10; + confirmations[LINEA][BASE] = 10; + confirmations[LINEA][ARBI] = 10; + confirmations[LINEA][FANTOM] = 10; + confirmations[LINEA][BLAST] = 10; + + /// BLAST + confirmations[BLAST][LINEA] = 15; + confirmations[BLAST][OP] = 15; + confirmations[BLAST][POLY] = 15; + confirmations[BLAST][AVAX] = 15; + confirmations[BLAST][BSC] = 15; + confirmations[BLAST][ETH] = 15; + confirmations[BLAST][BASE] = 15; + confirmations[BLAST][ARBI] = 15; + confirmations[BLAST][FANTOM] = 15; } function _fundNativeTokens() internal { diff --git a/test/utils/MainnetBaseSetup.sol b/test/utils/MainnetBaseSetup.sol index 436067922..80eaadf4d 100644 --- a/test/utils/MainnetBaseSetup.sol +++ b/test/utils/MainnetBaseSetup.sol @@ -31,6 +31,31 @@ abstract contract MainnetBaseSetup is BaseSetup { Prod } + address[] public lzV2SendLib = [ + 0xc02Ab410f0734EFa3F14628780e6e695156024C2, // ETH + 0x9F8C645f2D0b2159767Bd6E0839DE4BE49e823DE, // BSC + 0x197D1333DEA5Fe0D6600E9b396c7f1B1cFCc558a, // AVAX + 0x6c26c61a97006888ea9E4FA36584c7df57Cd9dA3, // POLY + 0x975bcD720be66659e3EB3C0e4F1866a3020E493A, // ARBI + 0x1322871e4ab09Bc7f5717189434f97bBD9546e95, // OP + 0xB5320B0B3a13cC860893E2Bd79FCd7e13484Dda2, // BASE + 0xC17BaBeF02a937093363220b0FB57De04A535D5E, // FANTOM + 0x32042142DD551b4EbE17B6FEd53131dd4b4eEa06, // LINEA + 0xc1B621b18187F74c8F6D52a6F709Dd2780C09821 // BLAST + ]; + address[] public lzV2ReceiveLib = [ + 0xbB2Ea70C9E858123480642Cf96acbcCE1372dCe1, // ETH + 0xB217266c3A98C8B2709Ee26836C98cf12f6cCEC1, // BSC + 0xbf3521d309642FA9B1c91A08609505BA09752c61, // AVAX + 0x1322871e4ab09Bc7f5717189434f97bBD9546e95, // POLY + 0x7B9E184e07a6EE1aC23eAe0fe8D6Be2f663f05e6, // ARBI + 0x3c4962Ff6258dcfCafD23a814237B7d6Eb712063, // OP + 0xc70AB6f32772f59fBfc23889Caf4Ba3376C84bAf, // BASE + 0xe1Dd69A2D08dF4eA6a30a91cC061ac70F98aAbe3, // FANTOM + 0xE22ED54177CE1148C557de74E4873619e6c6b205, // LINEA + 0x377530cdA84DFb2673bF4d145DCF0C4D7fdcB5b6 // BLAST + ]; + uint256 public deployerPrivateKey; address public ownerAddress; @@ -55,10 +80,10 @@ abstract contract MainnetBaseSetup is BaseSetup { /// @dev BASE https://app.onchainden.com/safes/base:0x2f973806f8863e860a553d4f2e7c2ab4a9f3b87c 0xe6ca8aC2D27A1bAd2Ab6b136Eab87488c3c98Fd1, /// @dev FANTOM https://safe.fantom.network/home?safe=ftm:0xe6ca8aC2D27A1bAd2Ab6b136Eab87488c3c98Fd1 - address(0), - /// @dev LINEA - address(0) - /// @dev BLAST + 0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77, + /// @dev LINEA https://safe.linea.build/home?safe=linea:0x62Bbfe3ef3faAb7045d29bC388E5A0c5033D8b77 + 0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF + /// @dev BLAST https://blast-safe.io/home?safe=blastmainnet:0x95B5837CF46E6ab340fFf3844ca5e7d8ead5B8AF ]; address[] public PROTOCOL_ADMINS_STAGING = [ diff --git a/test/utils/merkle/target/jsTreeDump0.json b/test/utils/merkle/target/jsTreeDump0.json index 52c0ff342..00f22c51f 100644 --- a/test/utils/merkle/target/jsTreeDump0.json +++ b/test/utils/merkle/target/jsTreeDump0.json @@ -1 +1,529 @@ -{"format":"standard-v1","tree":["0xf5d9e300f214ac7c9a21a9be4c88db8ac3af824a60e0c55591a472dcd84c785c","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a","0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661","0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a","0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811","0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86","0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b","0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e","0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760","0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362","0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06","0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1","0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306","0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64","0xe29cd828b01d9344784ea8bb5260653ed92482e701b447a511523d591b5d6adf","0xcbfe8888e82b42ea19747fc291d4e4537fbab86fa39911bb2da754f6f2dbf62c","0xa17723f943c9137dc1f8f52f196fa50e4e28e2206c7cbd70eccb8a091dbdd65a","0xa0a4e1da8fda7a183dbca259cc8867b6e0c50720f9243c50f64540db38ae1e27","0x9f0d58715f595ea789c60e04795561517ec5b450f840a428309fb424cdde2592","0x92046102722724a412fe22d1c6a4d590f9111a84e9cd6f83ff2a6feacaf70657","0x86673d8dce3b7645e0e5ba850fa958df2db47155ebe2acb0ea84411244c4ec18","0x77d33811d82964e32e31ef20f16a306cf47fa4773c98f8eb362c188603a0af47","0x534d56782e061c5b0de0c627efa79ec4b009300bd040230bd419b9ca65dc5798","0x521a3da94e5ddd44bb4bda4c89d4817b5989d6f885cb95f8ea1e76cfe9fb30c4","0x4fe6a52dd253031af45c16da282fb387262b30e3a1ca69fc9f2a6f1195759fb8","0x32efe54d227590f9b3e1a17c3c1b3a3b7d0345b98009763407a60aa79a54c4ae","0x171340b2fa1ee96d38dab925c60a34643c7ac46f73432318e29a9ba74ea045ec","0x1564863cdc09aa5711f8371a9581137e024926df0cefd1576312a762f60eea37","0x102725ef346cfe747ae39fb88978e1dcc1e2e936a9895b4d1ef51876680b83c0","0x0b751b36d8be0ad85ed25c955e511e1e33aab0b81cd529cd9438e51d306b9e83"],"values":[{"value":["0x0000000000000000000000000000000000000001","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],[644],"10"],"treeIndex":30,"claimer":"0x0000000000000000000000000000000000000001","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],"amountsClaimed":[644],"chainId":10,"proof":["0x102725ef346cfe747ae39fb88978e1dcc1e2e936a9895b4d1ef51876680b83c0","0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306","0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000002","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[946],"10"],"treeIndex":24,"claimer":"0x0000000000000000000000000000000000000002","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[946],"chainId":10,"proof":["0x534d56782e061c5b0de0c627efa79ec4b009300bd040230bd419b9ca65dc5798","0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1","0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000003","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[760,215],"10"],"treeIndex":22,"claimer":"0x0000000000000000000000000000000000000003","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[760,215],"chainId":10,"proof":["0x86673d8dce3b7645e0e5ba850fa958df2db47155ebe2acb0ea84411244c4ec18","0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760","0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000004","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],[124],"10"],"treeIndex":28,"claimer":"0x0000000000000000000000000000000000000004","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],"amountsClaimed":[124],"chainId":10,"proof":["0x171340b2fa1ee96d38dab925c60a34643c7ac46f73432318e29a9ba74ea045ec","0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64","0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000005","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],[529],"10"],"treeIndex":19,"claimer":"0x0000000000000000000000000000000000000005","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],"amountsClaimed":[529],"chainId":10,"proof":["0x92046102722724a412fe22d1c6a4d590f9111a84e9cd6f83ff2a6feacaf70657","0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362","0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000006","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],[465],"10"],"treeIndex":26,"claimer":"0x0000000000000000000000000000000000000006","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],"amountsClaimed":[465],"chainId":10,"proof":["0x4fe6a52dd253031af45c16da282fb387262b30e3a1ca69fc9f2a6f1195759fb8","0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06","0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000007","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[338,478],"10"],"treeIndex":16,"claimer":"0x0000000000000000000000000000000000000007","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[338,478],"chainId":10,"proof":["0xe29cd828b01d9344784ea8bb5260653ed92482e701b447a511523d591b5d6adf","0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e","0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000008","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[124],"10"],"treeIndex":23,"claimer":"0x0000000000000000000000000000000000000008","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[124],"chainId":10,"proof":["0x521a3da94e5ddd44bb4bda4c89d4817b5989d6f885cb95f8ea1e76cfe9fb30c4","0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1","0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000009","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[592,569],"10"],"treeIndex":21,"claimer":"0x0000000000000000000000000000000000000009","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[592,569],"chainId":10,"proof":["0x77d33811d82964e32e31ef20f16a306cf47fa4773c98f8eb362c188603a0af47","0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760","0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000010","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],[760],"10"],"treeIndex":18,"claimer":"0x0000000000000000000000000000000000000010","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"],"amountsClaimed":[760],"chainId":10,"proof":["0xa17723f943c9137dc1f8f52f196fa50e4e28e2206c7cbd70eccb8a091dbdd65a","0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b","0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000011","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[222],"10"],"treeIndex":15,"claimer":"0x0000000000000000000000000000000000000011","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[222],"chainId":10,"proof":["0xcbfe8888e82b42ea19747fc291d4e4537fbab86fa39911bb2da754f6f2dbf62c","0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e","0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000012","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[718],"10"],"treeIndex":27,"claimer":"0x0000000000000000000000000000000000000012","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[718],"chainId":10,"proof":["0x1564863cdc09aa5711f8371a9581137e024926df0cefd1576312a762f60eea37","0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64","0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000013","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[427,485],"10"],"treeIndex":25,"claimer":"0x0000000000000000000000000000000000000013","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[427,485],"chainId":10,"proof":["0x32efe54d227590f9b3e1a17c3c1b3a3b7d0345b98009763407a60aa79a54c4ae","0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06","0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]},{"value":["0x0000000000000000000000000000000000000014","0",["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[710,629],"10"],"treeIndex":17,"claimer":"0x0000000000000000000000000000000000000014","periodId":0,"rewardTokens":["0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85","0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[710,629],"chainId":10,"proof":["0xa0a4e1da8fda7a183dbca259cc8867b6e0c50720f9243c50f64540db38ae1e27","0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b","0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000015","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[244],"10"],"treeIndex":20,"claimer":"0x0000000000000000000000000000000000000015","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[244],"chainId":10,"proof":["0x9f0d58715f595ea789c60e04795561517ec5b450f840a428309fb424cdde2592","0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362","0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661","0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a"]},{"value":["0x0000000000000000000000000000000000000016","0",["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],[440],"10"],"treeIndex":29,"claimer":"0x0000000000000000000000000000000000000016","periodId":0,"rewardTokens":["0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1"],"amountsClaimed":[440],"chainId":10,"proof":["0x0b751b36d8be0ad85ed25c955e511e1e33aab0b81cd529cd9438e51d306b9e83","0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306","0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811","0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f"]}],"leafEncoding":["address","uint256","address[]","uint256[]","uint256"]} \ No newline at end of file +{ + "format": "standard-v1", + "tree": [ + "0xf5d9e300f214ac7c9a21a9be4c88db8ac3af824a60e0c55591a472dcd84c785c", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a", + "0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661", + "0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a", + "0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811", + "0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86", + "0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b", + "0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e", + "0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760", + "0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362", + "0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06", + "0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1", + "0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306", + "0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64", + "0xe29cd828b01d9344784ea8bb5260653ed92482e701b447a511523d591b5d6adf", + "0xcbfe8888e82b42ea19747fc291d4e4537fbab86fa39911bb2da754f6f2dbf62c", + "0xa17723f943c9137dc1f8f52f196fa50e4e28e2206c7cbd70eccb8a091dbdd65a", + "0xa0a4e1da8fda7a183dbca259cc8867b6e0c50720f9243c50f64540db38ae1e27", + "0x9f0d58715f595ea789c60e04795561517ec5b450f840a428309fb424cdde2592", + "0x92046102722724a412fe22d1c6a4d590f9111a84e9cd6f83ff2a6feacaf70657", + "0x86673d8dce3b7645e0e5ba850fa958df2db47155ebe2acb0ea84411244c4ec18", + "0x77d33811d82964e32e31ef20f16a306cf47fa4773c98f8eb362c188603a0af47", + "0x534d56782e061c5b0de0c627efa79ec4b009300bd040230bd419b9ca65dc5798", + "0x521a3da94e5ddd44bb4bda4c89d4817b5989d6f885cb95f8ea1e76cfe9fb30c4", + "0x4fe6a52dd253031af45c16da282fb387262b30e3a1ca69fc9f2a6f1195759fb8", + "0x32efe54d227590f9b3e1a17c3c1b3a3b7d0345b98009763407a60aa79a54c4ae", + "0x171340b2fa1ee96d38dab925c60a34643c7ac46f73432318e29a9ba74ea045ec", + "0x1564863cdc09aa5711f8371a9581137e024926df0cefd1576312a762f60eea37", + "0x102725ef346cfe747ae39fb88978e1dcc1e2e936a9895b4d1ef51876680b83c0", + "0x0b751b36d8be0ad85ed25c955e511e1e33aab0b81cd529cd9438e51d306b9e83" + ], + "values": [ + { + "value": [ + "0x0000000000000000000000000000000000000001", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + [ + 644 + ], + "10" + ], + "treeIndex": 30, + "claimer": "0x0000000000000000000000000000000000000001", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + "amountsClaimed": [ + 644 + ], + "chainId": 10, + "proof": [ + "0x102725ef346cfe747ae39fb88978e1dcc1e2e936a9895b4d1ef51876680b83c0", + "0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306", + "0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000002", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 946 + ], + "10" + ], + "treeIndex": 24, + "claimer": "0x0000000000000000000000000000000000000002", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 946 + ], + "chainId": 10, + "proof": [ + "0x534d56782e061c5b0de0c627efa79ec4b009300bd040230bd419b9ca65dc5798", + "0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1", + "0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000003", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 760, + 215 + ], + "10" + ], + "treeIndex": 22, + "claimer": "0x0000000000000000000000000000000000000003", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 760, + 215 + ], + "chainId": 10, + "proof": [ + "0x86673d8dce3b7645e0e5ba850fa958df2db47155ebe2acb0ea84411244c4ec18", + "0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760", + "0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000004", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + [ + 124 + ], + "10" + ], + "treeIndex": 28, + "claimer": "0x0000000000000000000000000000000000000004", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + "amountsClaimed": [ + 124 + ], + "chainId": 10, + "proof": [ + "0x171340b2fa1ee96d38dab925c60a34643c7ac46f73432318e29a9ba74ea045ec", + "0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64", + "0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000005", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + [ + 529 + ], + "10" + ], + "treeIndex": 19, + "claimer": "0x0000000000000000000000000000000000000005", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + "amountsClaimed": [ + 529 + ], + "chainId": 10, + "proof": [ + "0x92046102722724a412fe22d1c6a4d590f9111a84e9cd6f83ff2a6feacaf70657", + "0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362", + "0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000006", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + [ + 465 + ], + "10" + ], + "treeIndex": 26, + "claimer": "0x0000000000000000000000000000000000000006", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + "amountsClaimed": [ + 465 + ], + "chainId": 10, + "proof": [ + "0x4fe6a52dd253031af45c16da282fb387262b30e3a1ca69fc9f2a6f1195759fb8", + "0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06", + "0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000007", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 338, + 478 + ], + "10" + ], + "treeIndex": 16, + "claimer": "0x0000000000000000000000000000000000000007", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 338, + 478 + ], + "chainId": 10, + "proof": [ + "0xe29cd828b01d9344784ea8bb5260653ed92482e701b447a511523d591b5d6adf", + "0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e", + "0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000008", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 124 + ], + "10" + ], + "treeIndex": 23, + "claimer": "0x0000000000000000000000000000000000000008", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 124 + ], + "chainId": 10, + "proof": [ + "0x521a3da94e5ddd44bb4bda4c89d4817b5989d6f885cb95f8ea1e76cfe9fb30c4", + "0x4695308a1aa494e8682dc245f0dea7262cc35466cb90fbb3e5259ad7dc9cb8e1", + "0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000009", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 592, + 569 + ], + "10" + ], + "treeIndex": 21, + "claimer": "0x0000000000000000000000000000000000000009", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 592, + 569 + ], + "chainId": 10, + "proof": [ + "0x77d33811d82964e32e31ef20f16a306cf47fa4773c98f8eb362c188603a0af47", + "0x254342999dc03db86047e44af685b068503e22e89aa9d49ed7c5f44709d2c760", + "0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000010", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + [ + 760 + ], + "10" + ], + "treeIndex": 18, + "claimer": "0x0000000000000000000000000000000000000010", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85" + ], + "amountsClaimed": [ + 760 + ], + "chainId": 10, + "proof": [ + "0xa17723f943c9137dc1f8f52f196fa50e4e28e2206c7cbd70eccb8a091dbdd65a", + "0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b", + "0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000011", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 222 + ], + "10" + ], + "treeIndex": 15, + "claimer": "0x0000000000000000000000000000000000000011", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 222 + ], + "chainId": 10, + "proof": [ + "0xcbfe8888e82b42ea19747fc291d4e4537fbab86fa39911bb2da754f6f2dbf62c", + "0x0b1e75629bd7f97ca24c9ff168b35c9ba4606526effa4630da6cf2284970ec0e", + "0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000012", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 718 + ], + "10" + ], + "treeIndex": 27, + "claimer": "0x0000000000000000000000000000000000000012", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 718 + ], + "chainId": 10, + "proof": [ + "0x1564863cdc09aa5711f8371a9581137e024926df0cefd1576312a762f60eea37", + "0x86d2c6bde65936088a2de715a91572483d768fd33f4e015840ffd9abadb3fe64", + "0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000013", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 427, + 485 + ], + "10" + ], + "treeIndex": 25, + "claimer": "0x0000000000000000000000000000000000000013", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 427, + 485 + ], + "chainId": 10, + "proof": [ + "0x32efe54d227590f9b3e1a17c3c1b3a3b7d0345b98009763407a60aa79a54c4ae", + "0xff94e02aab1c3069c83fcfbd6c68236ad50ec65a16ff483293c10168b6675b06", + "0x0a59dca9deda3dd8d9d04ad690836f6242a563d62eef21f6f0438e73afb3bb86", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000014", + "0", + [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 710, + 629 + ], + "10" + ], + "treeIndex": 17, + "claimer": "0x0000000000000000000000000000000000000014", + "periodId": 0, + "rewardTokens": [ + "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 710, + 629 + ], + "chainId": 10, + "proof": [ + "0xa0a4e1da8fda7a183dbca259cc8867b6e0c50720f9243c50f64540db38ae1e27", + "0x4f5d8ba2e76551ee3775748675e1b1f1cb0d62f48cd3c0bcce18e10c0f29d06b", + "0x5a0f0a1a04ed97bc0ab42e8547b00a5800201c49e4d734eaf610f0ef24fb798a", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000015", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 244 + ], + "10" + ], + "treeIndex": 20, + "claimer": "0x0000000000000000000000000000000000000015", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 244 + ], + "chainId": 10, + "proof": [ + "0x9f0d58715f595ea789c60e04795561517ec5b450f840a428309fb424cdde2592", + "0xa837503c418f44384e743b3c3c95a7dcf1c6db0ab0a233836964d6b6a7c0a362", + "0x91b5fce30c60d8aa860936cef46379b544e958896e4963ae9d81b953a6eef661", + "0x6e288209cda02f6c68ed901719924e23f3f504e4fb3c1bc8dc12db30e12d480a" + ] + }, + { + "value": [ + "0x0000000000000000000000000000000000000016", + "0", + [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + [ + 440 + ], + "10" + ], + "treeIndex": 29, + "claimer": "0x0000000000000000000000000000000000000016", + "periodId": 0, + "rewardTokens": [ + "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1" + ], + "amountsClaimed": [ + 440 + ], + "chainId": 10, + "proof": [ + "0x0b751b36d8be0ad85ed25c955e511e1e33aab0b81cd529cd9438e51d306b9e83", + "0x397b4c8e1056529a0dce615c97818b91503bfe3f676029c23aae119e9563d306", + "0xa2dc330755a22a746bff5350a1dd4906c53ad5ed9f0a4b50c4cceb25cd773811", + "0xe91dbeb59620367dc7cab0da75891eb1b81b0f9c2c6387924acc0014eb0adc5f" + ] + } + ], + "leafEncoding": [ + "address", + "uint256", + "address[]", + "uint256[]", + "uint256" + ] +} \ No newline at end of file