From a1fd68dd6133f7cd3bde640fe9472eab82a1dbd4 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Mon, 23 Oct 2023 17:43:58 +0200 Subject: [PATCH] Pass destChainSelector to onRamp and allow one offRamp to be responsible for multiple sources (#213) Co-authored-by: Matt Yang --- contracts/foundry.toml | 2 +- contracts/gas-snapshots/ccip.gas-snapshot | 736 +++++++++--------- .../scripts/native_solc_compile_all_ccip | 10 +- contracts/src/v0.8/ccip/Router.sol | 100 +-- .../v0.8/ccip/interfaces/IEVM2AnyOnRamp.sol | 33 +- .../ccip/interfaces/IEVM2AnyOnRampClient.sol | 42 + .../src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol | 35 +- .../pools/ThirdPartyBurnMintTokenPool.sol | 41 - .../test/applications/ImmutableExample.t.sol | 5 +- .../v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol | 126 +-- .../pools/ThirdPartyBurnMintTokenPool.t.sol | 133 ---- .../src/v0.8/ccip/test/router/Router.t.sol | 238 +++++- .../evm_2_evm_onramp/evm_2_evm_onramp.go | 60 +- .../ccip/generated/router/router.go | 23 +- ...rapper-dependency-versions-do-not-edit.txt | 4 +- .../ccip/mocks/evm2_evm_on_ramp_interface.go | 72 +- 16 files changed, 853 insertions(+), 807 deletions(-) create mode 100644 contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRampClient.sol delete mode 100644 contracts/src/v0.8/ccip/pools/ThirdPartyBurnMintTokenPool.sol delete mode 100644 contracts/src/v0.8/ccip/test/pools/ThirdPartyBurnMintTokenPool.t.sol diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 98136530ed..446aae4d2e 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -20,7 +20,7 @@ block_number = 12345 solc_version = '0.8.19' src = 'src/v0.8/ccip' test = 'src/v0.8/ccip/test' -optimizer_runs = 26_000 +optimizer_runs = 10_000 [profile.metatx] solc_version = '0.8.15' diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index e5038cb8fa..dc9e9973b4 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -5,410 +5,408 @@ ARMProxyStandaloneTest:testSetARMzero() (gas: 11176) ARMProxyTest:testARMCallRevertReasonForwarded() (gas: 47992) ARMProxyTest:testARMIsBlessedSuccess() (gas: 44962) ARMProxyTest:testARMIsCursedSuccess() (gas: 47154) -ARM_constructor:testConstructorSuccess() (gas: 48600) -ARM_ownerUnbless:testUnblessSuccess() (gas: 81920) -ARM_ownerUnvoteToCurse:testCanBlessAndCurseAfterRecovery() (gas: 246999) -ARM_ownerUnvoteToCurse:testIsIdempotent() (gas: 204172) -ARM_ownerUnvoteToCurse:testNonOwnerReverts() (gas: 19354) -ARM_ownerUnvoteToCurse:testOwnerUnvoteToCurseSuccess_gas() (gas: 182437) -ARM_setConfig:testBlessVoterIsZeroAddressReverts() (gas: 21801) -ARM_setConfig:testEitherThresholdIsZeroReverts() (gas: 29678) -ARM_setConfig:testNonOwnerReverts() (gas: 18935) -ARM_setConfig:testRepeatedAddressReverts() (gas: 25256) -ARM_setConfig:testSetConfigSuccess_gas() (gas: 111875) -ARM_setConfig:testTotalWeightsSmallerThanEachThresholdReverts() (gas: 45242) -ARM_setConfig:testVoteToBlessByEjectedVoterReverts() (gas: 147387) -ARM_setConfig:testVotersLengthIsZeroReverts() (gas: 18368) -ARM_setConfig:testWeightIsZeroAddressReverts() (gas: 22076) -ARM_unvoteToCurse:testInvalidCurseStateReverts() (gas: 22054) -ARM_unvoteToCurse:testInvalidCursesHash() (gas: 26989) -ARM_unvoteToCurse:testInvalidVoter() (gas: 94802) -ARM_unvoteToCurse:testOwnerSkips() (gas: 33091) -ARM_unvoteToCurse:testOwnerSucceeds() (gas: 30876) -ARM_unvoteToCurse:testValidCursesHash() (gas: 35334) -ARM_voteToBlessRoots:test1RootSuccess_gas() (gas: 45482) -ARM_voteToBlessRoots:test3RootSuccess_gas() (gas: 99624) -ARM_voteToBlessRoots:test5RootSuccess_gas() (gas: 153814) -ARM_voteToBlessRoots:testCurseReverts() (gas: 254526) -ARM_voteToBlessRoots:testInvalidVoterReverts() (gas: 21192) -ARM_voteToBlessRoots:testIsAlreadyBlessedIgnoredSuccess() (gas: 133487) -ARM_voteToBlessRoots:testSenderAlreadyVotedIgnoredSuccess() (gas: 117851) -ARM_voteToCurse:testAlreadyVotedReverts() (gas: 78685) -ARM_voteToCurse:testEmitCurseSuccess() (gas: 252053) -ARM_voteToCurse:testEvenIfAlreadyCursedSuccess() (gas: 284364) -ARM_voteToCurse:testInvalidVoterReverts() (gas: 17761) -ARM_voteToCurse:testOwnerCanCurseAndUncurse() (gas: 199038) -ARM_voteToCurse:testVoteToCurseSuccess_gas() (gas: 70202) -AggregateTokenLimiter__rateLimitValue:testAggregateValueMaxCapacityExceededReverts() (gas: 26343) +ARM_constructor:testConstructorSuccess() (gas: 48702) +ARM_ownerUnbless:testUnblessSuccess() (gas: 82172) +ARM_ownerUnvoteToCurse:testCanBlessAndCurseAfterRecovery() (gas: 249909) +ARM_ownerUnvoteToCurse:testIsIdempotent() (gas: 207382) +ARM_ownerUnvoteToCurse:testNonOwnerReverts() (gas: 19612) +ARM_ownerUnvoteToCurse:testOwnerUnvoteToCurseSuccess_gas() (gas: 184588) +ARM_setConfig:testBlessVoterIsZeroAddressReverts() (gas: 22035) +ARM_setConfig:testEitherThresholdIsZeroReverts() (gas: 29996) +ARM_setConfig:testNonOwnerReverts() (gas: 19133) +ARM_setConfig:testRepeatedAddressReverts() (gas: 25730) +ARM_setConfig:testSetConfigSuccess_gas() (gas: 112614) +ARM_setConfig:testTotalWeightsSmallerThanEachThresholdReverts() (gas: 46616) +ARM_setConfig:testVoteToBlessByEjectedVoterReverts() (gas: 148224) +ARM_setConfig:testVotersLengthIsZeroReverts() (gas: 18434) +ARM_setConfig:testWeightIsZeroAddressReverts() (gas: 22322) +ARM_unvoteToCurse:testInvalidCurseStateReverts() (gas: 22288) +ARM_unvoteToCurse:testInvalidCursesHash() (gas: 27232) +ARM_unvoteToCurse:testInvalidVoter() (gas: 95846) +ARM_unvoteToCurse:testOwnerSkips() (gas: 33370) +ARM_unvoteToCurse:testOwnerSucceeds() (gas: 31125) +ARM_unvoteToCurse:testValidCursesHash() (gas: 35592) +ARM_voteToBlessRoots:test1RootSuccess_gas() (gas: 45566) +ARM_voteToBlessRoots:test3RootSuccess_gas() (gas: 99804) +ARM_voteToBlessRoots:test5RootSuccess_gas() (gas: 154090) +ARM_voteToBlessRoots:testCurseReverts() (gas: 255012) +ARM_voteToBlessRoots:testInvalidVoterReverts() (gas: 21261) +ARM_voteToBlessRoots:testIsAlreadyBlessedIgnoredSuccess() (gas: 134543) +ARM_voteToBlessRoots:testSenderAlreadyVotedIgnoredSuccess() (gas: 118715) +ARM_voteToCurse:testAlreadyVotedReverts() (gas: 78910) +ARM_voteToCurse:testEmitCurseSuccess() (gas: 252485) +ARM_voteToCurse:testEvenIfAlreadyCursedSuccess() (gas: 284871) +ARM_voteToCurse:testInvalidVoterReverts() (gas: 17830) +ARM_voteToCurse:testOwnerCanCurseAndUncurse() (gas: 202020) +ARM_voteToCurse:testVoteToCurseSuccess_gas() (gas: 70262) +AggregateTokenLimiter__rateLimitValue:testAggregateValueMaxCapacityExceededReverts() (gas: 26367) AggregateTokenLimiter__rateLimitValue:testRateLimitValueSuccess_gas() (gas: 28033) -AggregateTokenLimiter__rateLimitValue:testUnknownTokenReverts() (gas: 18240) -AggregateTokenLimiter_constructor:testConstructorSuccess() (gas: 21822) -AggregateTokenLimiter_getTokenBucket:testGetTokenBucketSuccess() (gas: 15863) -AggregateTokenLimiter_getTokenBucket:testRefillSuccess() (gas: 37863) -AggregateTokenLimiter_getTokenBucket:testTimeUnderflowReverts() (gas: 14424) -AggregateTokenLimiter_getTokenLimitAdmin:testGetTokenLimitAdminSuccess() (gas: 7583) +AggregateTokenLimiter__rateLimitValue:testUnknownTokenReverts() (gas: 18252) +AggregateTokenLimiter_constructor:testConstructorSuccess() (gas: 21954) +AggregateTokenLimiter_getTokenBucket:testGetTokenBucketSuccess() (gas: 15875) +AggregateTokenLimiter_getTokenBucket:testRefillSuccess() (gas: 37947) +AggregateTokenLimiter_getTokenBucket:testTimeUnderflowReverts() (gas: 14448) +AggregateTokenLimiter_getTokenLimitAdmin:testGetTokenLimitAdminSuccess() (gas: 7643) AggregateTokenLimiter_setAdmin:testOnlyOwnerOrAdminReverts() (gas: 17184) AggregateTokenLimiter_setAdmin:testOwnerSuccess() (gas: 18631) -AggregateTokenLimiter_setRateLimiterConfig:testOnlyOnlyCallableByAdminOrOwnerReverts() (gas: 21552) -AggregateTokenLimiter_setRateLimiterConfig:testOwnerSuccess() (gas: 41466) -AggregateTokenLimiter_setRateLimiterConfig:testTokenLimitAdminSuccess() (gas: 48072) -BurnMintERC677_burn:testPoolBurnRevertNotHealthyReverts() (gas: 58172) -BurnMintERC677_burn:testPoolBurnSuccess() (gas: 197691) +AggregateTokenLimiter_setRateLimiterConfig:testOnlyOnlyCallableByAdminOrOwnerReverts() (gas: 21600) +AggregateTokenLimiter_setRateLimiterConfig:testOwnerSuccess() (gas: 41514) +AggregateTokenLimiter_setRateLimiterConfig:testTokenLimitAdminSuccess() (gas: 48156) +BurnMintERC677_burn:testPoolBurnRevertNotHealthyReverts() (gas: 58280) +BurnMintERC677_burn:testPoolBurnSuccess() (gas: 197998) BurnMintERC677_mint:testPoolMintNotHealthyReverts() (gas: 55341) BurnMintERC677_mint:testPoolMintSuccess() (gas: 93632) -CCIPClientExample_sanity:testExamples() (gas: 2214478) -CallWithExactGas_callWithExactGas:test_CallWithExactGasSuccess() (gas: 22382) -CallWithExactGas_callWithExactGas:test_NoContractReverts() (gas: 10456) -CallWithExactGas_callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 14030) -CallWithExactGas_callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 15111) +CCIPClientExample_sanity:testExamples() (gas: 2217942) +CallWithExactGas_callWithExactGas:test_CallWithExactGasSuccess() (gas: 22403) +CallWithExactGas_callWithExactGas:test_NoContractReverts() (gas: 10465) +CallWithExactGas_callWithExactGas:test_NoGasForCallExactCheckReverts() (gas: 14036) +CallWithExactGas_callWithExactGas:test_NotEnoughGasForCallReverts() (gas: 15120) CommitStore_constructor:testConstructorSuccess() (gas: 3344466) -CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71312) -CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26312) -CommitStore_report:testInvalidIntervalReverts() (gas: 26231) +CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71321) +CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26324) +CommitStore_report:testInvalidIntervalReverts() (gas: 26243) CommitStore_report:testInvalidRootRevert() (gas: 25562) -CommitStore_report:testOnlyGasPriceUpdatesSuccess() (gas: 52632) -CommitStore_report:testOnlyPriceUpdateStaleReportReverts() (gas: 58393) -CommitStore_report:testOnlyTokenPriceUpdatesSuccess() (gas: 52675) +CommitStore_report:testOnlyGasPriceUpdatesSuccess() (gas: 52656) +CommitStore_report:testOnlyPriceUpdateStaleReportReverts() (gas: 58429) +CommitStore_report:testOnlyTokenPriceUpdatesSuccess() (gas: 52699) CommitStore_report:testPausedReverts() (gas: 21262) -CommitStore_report:testReportAndPriceUpdateSuccess() (gas: 83288) +CommitStore_report:testReportAndPriceUpdateSuccess() (gas: 83324) CommitStore_report:testReportOnlyRootSuccess_gas() (gas: 54050) CommitStore_report:testRootAlreadyCommittedReverts() (gas: 61380) -CommitStore_report:testStaleReportWithRootSuccess() (gas: 111983) -CommitStore_report:testUnhealthyReverts() (gas: 44567) -CommitStore_report:testValidPriceUpdateThenStaleReportWithRootSuccess() (gas: 96232) -CommitStore_report:testZeroEpochAndRoundReverts() (gas: 25234) +CommitStore_report:testStaleReportWithRootSuccess() (gas: 112067) +CommitStore_report:testUnhealthyReverts() (gas: 44570) +CommitStore_report:testValidPriceUpdateThenStaleReportWithRootSuccess() (gas: 96340) +CommitStore_report:testZeroEpochAndRoundReverts() (gas: 25258) CommitStore_resetUnblessedRoots:testOnlyOwnerReverts() (gas: 11290) -CommitStore_resetUnblessedRoots:testResetUnblessedRootsSuccess() (gas: 145219) +CommitStore_resetUnblessedRoots:testResetUnblessedRootsSuccess() (gas: 145339) CommitStore_setDynamicConfig:testInvalidCommitStoreConfigReverts() (gas: 37145) CommitStore_setDynamicConfig:testOnlyOwnerReverts() (gas: 37281) CommitStore_setDynamicConfig:testPriceEpochClearedSuccess() (gas: 124034) CommitStore_setLatestPriceEpochAndRound:testOnlyOwnerReverts() (gas: 10968) CommitStore_setLatestPriceEpochAndRound:testSetLatestPriceEpochAndRoundSuccess() (gas: 13799) CommitStore_setMinSeqNr:testOnlyOwnerReverts() (gas: 10989) -CommitStore_verify:testBlessedSuccess() (gas: 100081) -CommitStore_verify:testNotBlessedSuccess() (gas: 55944) +CommitStore_verify:testBlessedSuccess() (gas: 100153) +CommitStore_verify:testNotBlessedSuccess() (gas: 55968) CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) -DefensiveExampleTest:testHappyPathSuccess() (gas: 174828) -DefensiveExampleTest:testRecovery() (gas: 399728) -E2E:testE2E_3MessagesSuccess_gas() (gas: 881219) -EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 442138) -EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 103096) -EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18133) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 140162) -EVM2EVMOffRamp__report:testReportSuccess() (gas: 126816) -EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 174387) -EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 182709) -EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 235885) -EVM2EVMOffRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 2562444) -EVM2EVMOffRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 17337) -EVM2EVMOffRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 16000) -EVM2EVMOffRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 5181459) -EVM2EVMOffRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 2527193) -EVM2EVMOffRamp_applyPoolUpdates:testTokenPoolMismatchReverts() (gas: 5183789) +DefensiveExampleTest:testHappyPathSuccess() (gas: 174862) +DefensiveExampleTest:testRecovery() (gas: 399786) +E2E:testE2E_3MessagesSuccess_gas() (gas: 887246) +EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 443866) +EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 103420) +EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18202) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokensSuccess() (gas: 140615) +EVM2EVMOffRamp__report:testReportSuccess() (gas: 127123) +EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 174918) +EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 183240) +EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 236663) +EVM2EVMOffRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 2435136) +EVM2EVMOffRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 17445) +EVM2EVMOffRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 16012) +EVM2EVMOffRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 4926374) +EVM2EVMOffRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 2399537) +EVM2EVMOffRamp_applyPoolUpdates:testTokenPoolMismatchReverts() (gas: 4928727) EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 17072) -EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 169257) -EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 6007540) -EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145623) -EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2666128) -EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 136751) -EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 18992) -EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 33964) -EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49188) -EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 43978) -EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 149952) -EVM2EVMOffRamp_execute:testPausedReverts() (gas: 74597) -EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 163132) -EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 38854) -EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413294) -EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 172574) -EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 245967) -EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114218) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 322846) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51709) -EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 130359) -EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49549) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 441217) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 400490) -EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 32945) -EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 417647) -EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61077) -EVM2EVMOffRamp_execute:testUnsupportedTokenReverts() (gas: 129738) -EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20494) -EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 47799) -EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20042) -EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 204618) -EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 139650) -EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 233335) -EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48344) -EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 231004) -EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 278385) -EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 259696) -EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 223627) -EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 130886) -EVM2EVMOffRamp_getDestinationToken:testGetDestinationTokenSuccess() (gas: 32642) -EVM2EVMOffRamp_getDestinationToken:testUnsupportedTokenReverts() (gas: 13727) -EVM2EVMOffRamp_getDestinationTokens:testGetDestinationTokensSuccess() (gas: 26043) -EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3047472) +EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 168848) +EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5728147) +EVM2EVMOffRamp_constructor:testTokenConfigMismatchReverts() (gas: 145215) +EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 2538111) +EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 137175) +EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 19016) +EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 34063) +EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49347) +EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 44104) +EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 150111) +EVM2EVMOffRamp_execute:testPausedReverts() (gas: 74942) +EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 163541) +EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 38980) +EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413610) +EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 173239) +EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 246243) +EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114519) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 323942) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51868) +EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 130741) +EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49702) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 443058) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 402232) +EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 33032) +EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 419659) +EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61416) +EVM2EVMOffRamp_execute:testUnsupportedTokenReverts() (gas: 130374) +EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20545) +EVM2EVMOffRamp_executeSingleMessage:testNoTokensSuccess() (gas: 47920) +EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20105) +EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 205101) +EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 140016) +EVM2EVMOffRamp_executeSingleMessage:testTokensSuccess() (gas: 233948) +EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48468) +EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 231801) +EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 279573) +EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 260853) +EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 224863) +EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 131256) +EVM2EVMOffRamp_getDestinationToken:testGetDestinationTokenSuccess() (gas: 32786) +EVM2EVMOffRamp_getDestinationToken:testUnsupportedTokenReverts() (gas: 13763) +EVM2EVMOffRamp_getDestinationTokens:testGetDestinationTokensSuccess() (gas: 26091) +EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3047481) EVM2EVMOffRamp_getExecutionState:test_GetExecutionStateSuccess() (gas: 76354) -EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 496045) -EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 25902) -EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43405) -EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 25940) -EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 188725) -EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 189349) -EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1891304) -EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 6074) -EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 44413) -EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38425) -EVM2EVMOffRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 141481) -EVM2EVMOnRamp_applyPoolUpdates:testAddTokenPoolMismatchReverts() (gas: 275638) -EVM2EVMOnRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 301213) -EVM2EVMOnRamp_applyPoolUpdates:testAtomicPoolReplacementSuccess() (gas: 631197) -EVM2EVMOnRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 18451) -EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23110) -EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351554) -EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277860) -EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 615980) -EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5757744) -EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31556) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126628) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 126940) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137359) -EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressEncodePackedReverts() (gas: 23964) -EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24263) -EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23287) -EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 77028) -EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32240) -EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26973) -EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105510) -EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20187) -EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49657) -EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26858) -EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34960) -EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 168606) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104372) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123602) -EVM2EVMOnRamp_forwardFromRouter:testSourceTokenDataTooLargeReverts() (gas: 2903125) -EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28119) -EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42988) -EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 109152) -EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 154668) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 141955) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 184987) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 112885) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 92243) -EVM2EVMOnRamp_getDataAvailabilityCost:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15076) -EVM2EVMOnRamp_getDataAvailabilityCost:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15389) +EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 496653) +EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 25977) +EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43615) +EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 26018) +EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 189333) +EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 189960) +EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFAILS() (gas: 1856089) +EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 6086) +EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 44539) +EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38587) +EVM2EVMOffRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 142222) +EVM2EVMOnRamp_applyPoolUpdates:testAddTokenPoolMismatchReverts() (gas: 275644) +EVM2EVMOnRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 301596) +EVM2EVMOnRamp_applyPoolUpdates:testAtomicPoolReplacementSuccess() (gas: 631555) +EVM2EVMOnRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 18463) +EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23146) +EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351560) +EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277878) +EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 615992) +EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5776797) +EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31698) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126874) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 127198) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137713) +EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressEncodePackedReverts() (gas: 24121) +EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24420) +EVM2EVMOnRamp_forwardFromRouter:testInvalidChainSelectorReverts() (gas: 23164) +EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23451) +EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 77171) +EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32376) +EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 27139) +EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105628) +EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20310) +EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49770) +EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26972) +EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 35115) +EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 169320) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104547) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123825) +EVM2EVMOnRamp_forwardFromRouter:testSourceTokenDataTooLargeReverts() (gas: 2903554) +EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28261) +EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 43092) +EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 109357) +EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 156126) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 142235) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 185403) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 113296) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 92391) +EVM2EVMOnRamp_getDataAvailabilityCost:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15010) +EVM2EVMOnRamp_getDataAvailabilityCost:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15323) EVM2EVMOnRamp_getExpectedNextSequenceNumber:testGetExpectedNextSequenceNumberSuccess() (gas: 7838) -EVM2EVMOnRamp_getFee:testEmptyMessageSuccess() (gas: 67545) -EVM2EVMOnRamp_getFee:testHighGasMessageSuccess() (gas: 223428) -EVM2EVMOnRamp_getFee:testMessageGasLimitTooHighReverts() (gas: 16431) -EVM2EVMOnRamp_getFee:testMessageTooLargeReverts() (gas: 94954) -EVM2EVMOnRamp_getFee:testMessageWithDataAndTokenTransferSuccess() (gas: 132071) -EVM2EVMOnRamp_getFee:testNotAFeeTokenReverts() (gas: 21629) -EVM2EVMOnRamp_getFee:testSingleTokenMessageSuccess() (gas: 98946) -EVM2EVMOnRamp_getFee:testTooManyTokensReverts() (gas: 19622) -EVM2EVMOnRamp_getFee:testZeroDataAvailabilityMultiplierSuccess() (gas: 53658) -EVM2EVMOnRamp_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 51527) -EVM2EVMOnRamp_getTokenPool:testGetTokenPoolSuccess() (gas: 40912) -EVM2EVMOnRamp_getTokenTransferCost:testCustomTokenBpsFeeSuccess() (gas: 35409) -EVM2EVMOnRamp_getTokenTransferCost:testFeeTokenBpsFeeSuccess() (gas: 25738) -EVM2EVMOnRamp_getTokenTransferCost:testLargeTokenTransferChargesMaxFeeAndGasSuccess() (gas: 21062) -EVM2EVMOnRamp_getTokenTransferCost:testMixedTokenTransferFeeSuccess() (gas: 104898) -EVM2EVMOnRamp_getTokenTransferCost:testNoTokenTransferChargesZeroFeeSuccess() (gas: 11717) -EVM2EVMOnRamp_getTokenTransferCost:testSmallTokenTransferChargesMinFeeAndGasSuccess() (gas: 20872) -EVM2EVMOnRamp_getTokenTransferCost:testUnsupportedTokenReverts() (gas: 20292) -EVM2EVMOnRamp_getTokenTransferCost:testValidatedPriceStalenessReverts() (gas: 37406) -EVM2EVMOnRamp_getTokenTransferCost:testWETHTokenBpsFeeSuccess() (gas: 31628) -EVM2EVMOnRamp_getTokenTransferCost:testZeroAmountTokenTransferChargesMinFeeAndAgasSuccess() (gas: 20892) -EVM2EVMOnRamp_getTokenTransferCost:testZeroFeeConfigChargesMinFeeSuccess() (gas: 30305) -EVM2EVMOnRamp_linkAvailableForPayment:testInsufficientLinkBalanceSuccess() (gas: 37935) -EVM2EVMOnRamp_linkAvailableForPayment:testLinkAvailableForPaymentSuccess() (gas: 138246) -EVM2EVMOnRamp_payNops:testAdminPayNopsSuccess() (gas: 146336) -EVM2EVMOnRamp_payNops:testInsufficientBalanceReverts() (gas: 32130) -EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131437) -EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136535) -EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149589) -EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144225) -EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299419) -EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19445) -EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37165) -EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25929) -EVM2EVMOnRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 44410) -EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17697) -EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20606) -EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13970) -EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65272) -EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434819) -EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57302) -EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18842) -EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85822) -EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63460) -EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170930) +EVM2EVMOnRamp_getFee:testEmptyMessageSuccess() (gas: 67817) +EVM2EVMOnRamp_getFee:testHighGasMessageSuccess() (gas: 223711) +EVM2EVMOnRamp_getFee:testMessageGasLimitTooHighReverts() (gas: 16629) +EVM2EVMOnRamp_getFee:testMessageTooLargeReverts() (gas: 95147) +EVM2EVMOnRamp_getFee:testMessageWithDataAndTokenTransferSuccess() (gas: 132367) +EVM2EVMOnRamp_getFee:testNotAFeeTokenReverts() (gas: 21825) +EVM2EVMOnRamp_getFee:testSingleTokenMessageSuccess() (gas: 99241) +EVM2EVMOnRamp_getFee:testTooManyTokensReverts() (gas: 19795) +EVM2EVMOnRamp_getFee:testZeroDataAvailabilityMultiplierSuccess() (gas: 53822) +EVM2EVMOnRamp_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 51817) +EVM2EVMOnRamp_getTokenPool:testGetTokenPoolSuccess() (gas: 41465) +EVM2EVMOnRamp_getTokenTransferCost:testCustomTokenBpsFeeSuccess() (gas: 35475) +EVM2EVMOnRamp_getTokenTransferCost:testFeeTokenBpsFeeSuccess() (gas: 25804) +EVM2EVMOnRamp_getTokenTransferCost:testLargeTokenTransferChargesMaxFeeAndGasSuccess() (gas: 21104) +EVM2EVMOnRamp_getTokenTransferCost:testMixedTokenTransferFeeSuccess() (gas: 105102) +EVM2EVMOnRamp_getTokenTransferCost:testNoTokenTransferChargesZeroFeeSuccess() (gas: 11759) +EVM2EVMOnRamp_getTokenTransferCost:testSmallTokenTransferChargesMinFeeAndGasSuccess() (gas: 20914) +EVM2EVMOnRamp_getTokenTransferCost:testUnsupportedTokenReverts() (gas: 20346) +EVM2EVMOnRamp_getTokenTransferCost:testValidatedPriceStalenessReverts() (gas: 37508) +EVM2EVMOnRamp_getTokenTransferCost:testWETHTokenBpsFeeSuccess() (gas: 31742) +EVM2EVMOnRamp_getTokenTransferCost:testZeroAmountTokenTransferChargesMinFeeAndAgasSuccess() (gas: 20934) +EVM2EVMOnRamp_getTokenTransferCost:testZeroFeeConfigChargesMinFeeSuccess() (gas: 30353) +EVM2EVMOnRamp_linkAvailableForPayment:testInsufficientLinkBalanceSuccess() (gas: 37959) +EVM2EVMOnRamp_linkAvailableForPayment:testLinkAvailableForPaymentSuccess() (gas: 138303) +EVM2EVMOnRamp_payNops:testAdminPayNopsSuccess() (gas: 146415) +EVM2EVMOnRamp_payNops:testInsufficientBalanceReverts() (gas: 32221) +EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131583) +EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136598) +EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149668) +EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144304) +EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299692) +EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19524) +EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37121) +EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25909) +EVM2EVMOnRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 44388) +EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17690) +EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20599) +EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13951) +EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65282) +EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434986) +EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57312) +EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18854) +EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85990) +EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63505) +EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170908) EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190427) -EVM2EVMOnRamp_setNops:testZeroAddressCannotBeNopReverts() (gas: 53607) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17699) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20608) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetTokenTransferFeeSuccess() (gas: 54700) -EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15094) -EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84260) -EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19453) -EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244614) -EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50104) -EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12913) -LockReleaseTokenPool_addLiquidity:testLiquidityNotAcceptedReverts() (gas: 2523406) -LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquiditySuccess() (gas: 2523878) -LockReleaseTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21718) -LockReleaseTokenPool_lockOrBurn:testLockOrBurnWithAllowListSuccess() (gas: 60504) -LockReleaseTokenPool_lockOrBurn:testPoolBurnRevertNotHealthyReverts() (gas: 64707) -LockReleaseTokenPool_releaseOrMint:testPoolMintNotHealthyReverts() (gas: 57696) -LockReleaseTokenPool_removeLiquidity:testInsufficientLiquidityReverts() (gas: 83083) -LockReleaseTokenPool_supportsInterface:testSupportsInterfaceSuccess() (gas: 8326) +EVM2EVMOnRamp_setNops:testZeroAddressCannotBeNopReverts() (gas: 53616) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17714) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20623) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetTokenTransferFeeSuccess() (gas: 54709) +EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15116) +EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84454) +EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19487) +EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244800) +EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50126) +EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12935) +LockReleaseTokenPool_addLiquidity:testLiquidityNotAcceptedReverts() (gas: 2395750) +LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquiditySuccess() (gas: 2396234) +LockReleaseTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21838) +LockReleaseTokenPool_lockOrBurn:testLockOrBurnWithAllowListSuccess() (gas: 60780) +LockReleaseTokenPool_lockOrBurn:testPoolBurnRevertNotHealthyReverts() (gas: 64875) +LockReleaseTokenPool_releaseOrMint:testPoolMintNotHealthyReverts() (gas: 57852) +LockReleaseTokenPool_removeLiquidity:testInsufficientLiquidityReverts() (gas: 83287) +LockReleaseTokenPool_supportsInterface:testSupportsInterfaceSuccess() (gas: 8362) MerkleMultiProofTest:testCVE_2023_34459() (gas: 5458) MerkleMultiProofTest:testEmptyLeafReverts() (gas: 3575) MerkleMultiProofTest:testMerkleRoot256() (gas: 408119) MerkleMultiProofTest:testMerkleRootSingleLeafSuccess() (gas: 808) MerkleMultiProofTest:testSpecSync_gas() (gas: 31255) -OCR2BaseNoChecks_setOCR2Config:testFMustBePositiveReverts() (gas: 12268) -OCR2BaseNoChecks_setOCR2Config:testRepeatAddressReverts() (gas: 42201) -OCR2BaseNoChecks_setOCR2Config:testSetConfigSuccess_gas() (gas: 84744) -OCR2BaseNoChecks_setOCR2Config:testTooManyTransmitterReverts() (gas: 35829) -OCR2BaseNoChecks_setOCR2Config:testTransmitterCannotBeZeroAddressReverts() (gas: 23615) -OCR2BaseNoChecks_transmit:testConfigDigestMismatchReverts() (gas: 17379) -OCR2BaseNoChecks_transmit:testForkedChainReverts() (gas: 30841) -OCR2BaseNoChecks_transmit:testTransmitSuccess_gas() (gas: 27490) -OCR2BaseNoChecks_transmit:testUnAuthorizedTransmitterReverts() (gas: 21229) -OCR2Base_setOCR2Config:testFMustBePositiveReverts() (gas: 12252) -OCR2Base_setOCR2Config:testFTooHighReverts() (gas: 12436) -OCR2Base_setOCR2Config:testOracleOutOfRegisterReverts() (gas: 14819) -OCR2Base_setOCR2Config:testRepeatAddressReverts() (gas: 44961) -OCR2Base_setOCR2Config:testSetConfigSuccess_gas() (gas: 154772) -OCR2Base_setOCR2Config:testSingerCannotBeZeroAddressReverts() (gas: 23755) -OCR2Base_setOCR2Config:testTooManySignersReverts() (gas: 19839) -OCR2Base_setOCR2Config:testTransmitterCannotBeZeroAddressReverts() (gas: 46583) -OCR2Base_transmit:testConfigDigestMismatchReverts() (gas: 19609) -OCR2Base_transmit:testForkedChainReverts() (gas: 41762) -OCR2Base_transmit:testNonUniqueSignatureReverts() (gas: 59621) -OCR2Base_transmit:testSignatureOutOfRegistrationReverts() (gas: 20951) -OCR2Base_transmit:testTransmit2SignersSuccess_gas() (gas: 51741) -OCR2Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 23441) -OCR2Base_transmit:testUnauthorizedSignerReverts() (gas: 43661) -OCR2Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 20507) -OnRampTokenPoolReentrancy:testSuccess() (gas: 332559) -PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146039) +OCR2BaseNoChecks_setOCR2Config:testFMustBePositiveReverts() (gas: 12289) +OCR2BaseNoChecks_setOCR2Config:testRepeatAddressReverts() (gas: 42402) +OCR2BaseNoChecks_setOCR2Config:testSetConfigSuccess_gas() (gas: 84845) +OCR2BaseNoChecks_setOCR2Config:testTooManyTransmitterReverts() (gas: 37050) +OCR2BaseNoChecks_setOCR2Config:testTransmitterCannotBeZeroAddressReverts() (gas: 24137) +OCR2BaseNoChecks_transmit:testConfigDigestMismatchReverts() (gas: 17388) +OCR2BaseNoChecks_transmit:testForkedChainReverts() (gas: 30856) +OCR2BaseNoChecks_transmit:testTransmitSuccess_gas() (gas: 27496) +OCR2BaseNoChecks_transmit:testUnAuthorizedTransmitterReverts() (gas: 21235) +OCR2Base_setOCR2Config:testFMustBePositiveReverts() (gas: 12273) +OCR2Base_setOCR2Config:testFTooHighReverts() (gas: 12457) +OCR2Base_setOCR2Config:testOracleOutOfRegisterReverts() (gas: 14963) +OCR2Base_setOCR2Config:testRepeatAddressReverts() (gas: 45249) +OCR2Base_setOCR2Config:testSetConfigSuccess_gas() (gas: 154873) +OCR2Base_setOCR2Config:testSingerCannotBeZeroAddressReverts() (gas: 24277) +OCR2Base_setOCR2Config:testTooManySignersReverts() (gas: 20244) +OCR2Base_setOCR2Config:testTransmitterCannotBeZeroAddressReverts() (gas: 47105) +OCR2Base_transmit:testConfigDigestMismatchReverts() (gas: 19618) +OCR2Base_transmit:testForkedChainReverts() (gas: 41777) +OCR2Base_transmit:testNonUniqueSignatureReverts() (gas: 59630) +OCR2Base_transmit:testSignatureOutOfRegistrationReverts() (gas: 20957) +OCR2Base_transmit:testTransmit2SignersSuccess_gas() (gas: 51747) +OCR2Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 23447) +OCR2Base_transmit:testUnauthorizedSignerReverts() (gas: 43673) +OCR2Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 20513) +OnRampTokenPoolReentrancy:testSuccess() (gas: 334413) +PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146529) PingPong_plumbing:testPausingSuccess() (gas: 14471) -PingPong_startPingPong:testStartPingPongSuccess() (gas: 171037) +PingPong_startPingPong:testStartPingPongSuccess() (gas: 171743) PriceRegistry_applyFeeTokensUpdates:testApplyFeeTokensUpdatesSuccess() (gas: 77463) PriceRegistry_applyFeeTokensUpdates:testOnlyCallableByOwnerReverts() (gas: 16532) PriceRegistry_applyPriceUpdatersUpdates:testApplyPriceUpdaterUpdatesSuccess() (gas: 80844) PriceRegistry_applyPriceUpdatersUpdates:testOnlyCallableByOwnerReverts() (gas: 16598) -PriceRegistry_constructor:testInvalidStalenessThresholdReverts() (gas: 66156) -PriceRegistry_constructor:testSetupSuccess() (gas: 1658294) -PriceRegistry_convertTokenAmount:testConvertTokenAmountSuccess() (gas: 65026) -PriceRegistry_convertTokenAmount:testLinkTokenNotSupportedReverts() (gas: 22707) -PriceRegistry_convertTokenAmount:testStaleFeeTokenReverts() (gas: 31901) -PriceRegistry_convertTokenAmount:testStaleLinkTokenReverts() (gas: 31371) -PriceRegistry_getTokenAndGasPrices:testGetFeeTokenAndGasPricesSuccess() (gas: 64650) -PriceRegistry_getTokenAndGasPrices:testStaleGasPriceReverts() (gas: 16688) -PriceRegistry_getTokenAndGasPrices:testStaleTokenPriceReverts() (gas: 29702) -PriceRegistry_getTokenAndGasPrices:testUnsupportedChainReverts() (gas: 16030) -PriceRegistry_getTokenAndGasPrices:testZeroGasPriceSuccess() (gas: 40311) -PriceRegistry_getTokenPrices:testGetTokenPricesSuccess() (gas: 73698) -PriceRegistry_getValidatedTokenPrice:testGetValidatedTokenPriceSuccess() (gas: 55577) -PriceRegistry_getValidatedTokenPrice:testStaleFeeTokenReverts() (gas: 16896) -PriceRegistry_getValidatedTokenPrice:testTokenNotSupportedReverts() (gas: 11313) -PriceRegistry_updatePrices:testOnlyCallableByUpdaterOrOwnerReverts() (gas: 18174) -PriceRegistry_updatePrices:testOnlyGasPriceSuccess() (gas: 23032) -PriceRegistry_updatePrices:testOnlyTokenPriceSuccess() (gas: 27699) -PriceRegistry_updatePrices:testUpdateMultiplePricesSuccess() (gas: 142171) +PriceRegistry_constructor:testInvalidStalenessThresholdReverts() (gas: 66159) +PriceRegistry_constructor:testSetupSuccess() (gas: 1658297) +PriceRegistry_convertTokenAmount:testConvertTokenAmountSuccess() (gas: 65134) +PriceRegistry_convertTokenAmount:testLinkTokenNotSupportedReverts() (gas: 22731) +PriceRegistry_convertTokenAmount:testStaleFeeTokenReverts() (gas: 31925) +PriceRegistry_convertTokenAmount:testStaleLinkTokenReverts() (gas: 31395) +PriceRegistry_getTokenAndGasPrices:testGetFeeTokenAndGasPricesSuccess() (gas: 64890) +PriceRegistry_getTokenAndGasPrices:testStaleGasPriceReverts() (gas: 16748) +PriceRegistry_getTokenAndGasPrices:testStaleTokenPriceReverts() (gas: 29822) +PriceRegistry_getTokenAndGasPrices:testUnsupportedChainReverts() (gas: 16102) +PriceRegistry_getTokenAndGasPrices:testZeroGasPriceSuccess() (gas: 40407) +PriceRegistry_getTokenPrices:testGetTokenPricesSuccess() (gas: 74070) +PriceRegistry_getValidatedTokenPrice:testGetValidatedTokenPriceSuccess() (gas: 55781) +PriceRegistry_getValidatedTokenPrice:testStaleFeeTokenReverts() (gas: 16968) +PriceRegistry_getValidatedTokenPrice:testTokenNotSupportedReverts() (gas: 11349) +PriceRegistry_updatePrices:testOnlyCallableByUpdaterOrOwnerReverts() (gas: 18198) +PriceRegistry_updatePrices:testOnlyGasPriceSuccess() (gas: 23104) +PriceRegistry_updatePrices:testOnlyTokenPriceSuccess() (gas: 27759) +PriceRegistry_updatePrices:testUpdateMultiplePricesSuccess() (gas: 142567) RateLimiter_constructor:testConstructorSuccess() (gas: 15362) -RateLimiter_consume:testAggregateValueMaxCapacityExceededReverts() (gas: 15669) -RateLimiter_consume:testAggregateValueRateLimitReachedReverts() (gas: 21950) -RateLimiter_consume:testConsumeAggregateValueSuccess() (gas: 27658) -RateLimiter_consume:testConsumeTokensSuccess() (gas: 20300) -RateLimiter_consume:testConsumeUnlimitedSuccess() (gas: 34588) -RateLimiter_consume:testConsumingMoreThanUint128Reverts() (gas: 15508) -RateLimiter_consume:testRateLimitReachedOverConsecutiveBlocksReverts() (gas: 25269) -RateLimiter_consume:testRefillSuccess() (gas: 33464) -RateLimiter_consume:testTokenMaxCapacityExceededReverts() (gas: 18044) -RateLimiter_consume:testTokenRateLimitReachedReverts() (gas: 24382) +RateLimiter_consume:testAggregateValueMaxCapacityExceededReverts() (gas: 15699) +RateLimiter_consume:testAggregateValueRateLimitReachedReverts() (gas: 22004) +RateLimiter_consume:testConsumeAggregateValueSuccess() (gas: 27724) +RateLimiter_consume:testConsumeTokensSuccess() (gas: 20330) +RateLimiter_consume:testConsumeUnlimitedSuccess() (gas: 34738) +RateLimiter_consume:testConsumingMoreThanUint128Reverts() (gas: 15541) +RateLimiter_consume:testRateLimitReachedOverConsecutiveBlocksReverts() (gas: 25338) +RateLimiter_consume:testRefillSuccess() (gas: 33572) +RateLimiter_consume:testTokenMaxCapacityExceededReverts() (gas: 18098) +RateLimiter_consume:testTokenRateLimitReachedReverts() (gas: 24448) RateLimiter_currentTokenBucketState:testCurrentTokenBucketStateSuccess() (gas: 32403) RateLimiter_currentTokenBucketState:testRefillSuccess() (gas: 41673) RateLimiter_setTokenBucketConfig:testSetRateLimiterConfigSuccess() (gas: 35459) -Router_applyRampUpdates:testOffRampDisable() (gas: 192261) -Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 108518) -Router_applyRampUpdates:testOnRampDisable() (gas: 52147) -Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12224) -Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110180) -Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188763) -Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122231) -Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200815) -Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61287) -Router_ccipSend:testInvalidMsgValue() (gas: 31860) -Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 63780) -Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 161785) -Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161126) -Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51137) -Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 232113) -Router_ccipSend:testUnsupportedDestinationChainReverts() (gas: 24624) -Router_ccipSend:testWhenNotHealthyReverts() (gas: 44650) -Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 163225) -Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 228916) -Router_constructor:testConstructorSuccess() (gas: 9929) -Router_getFee:testGetFeeSupportedChainSuccess() (gas: 38786) -Router_getFee:testUnsupportedDestinationChainReverts() (gas: 17079) -Router_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 33435) -Router_getSupportedTokens:testUnknownChainSuccess() (gas: 8542) -Router_recoverTokens:testRecoverTokensInvalidRecipientReverts() (gas: 11211) -Router_recoverTokens:testRecoverTokensNoFundsReverts() (gas: 17675) -Router_recoverTokens:testRecoverTokensNonOwnerReverts() (gas: 15283) -Router_recoverTokens:testRecoverTokensSuccess() (gas: 48461) -Router_recoverTokens:testRecoverTokensValueReceiverReverts() (gas: 444668) -Router_routeMessage:testAutoExecSuccess() (gas: 39257) -Router_routeMessage:testExecutionEventSuccess() (gas: 209305) -Router_routeMessage:testManualExecSuccess() (gas: 31364) -Router_routeMessage:testOnlyOffRampReverts() (gas: 22048) -Router_routeMessage:testWhenNotHealthyReverts() (gas: 45570) -Router_setWrappedNative:testOnlyOwnerReverts() (gas: 10976) -ThirdPartyBurnMintTokenPool_applyRampUpdates:testInvalidOffRampReverts() (gas: 23397) -ThirdPartyBurnMintTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21754) -ThirdPartyBurnMintTokenPool_lockOrBurn:testLockOrBurnWithAllowListSuccess() (gas: 99993) -TokenPoolWithAllowList_applyAllowListUpdates:testOnlyOwnerReverts() (gas: 12072) -TokenPoolWithAllowList_applyAllowListUpdates:testSetAllowListSkipsZeroSuccess() (gas: 20409) -TokenPoolWithAllowList_applyAllowListUpdates:testSetAllowListSuccess() (gas: 175191) -TokenPoolWithAllowList_getAllowList:testGetAllowListSuccess() (gas: 20069) -TokenPoolWithAllowList_getAllowListEnabled:testGetAllowListEnabledSuccess() (gas: 5479) -TokenPool_applyRampUpdates:testApplyRampUpdatesSuccess() (gas: 474749) -TokenPool_applyRampUpdates:testOnlyCallableByOwnerReverts() (gas: 15902) -TokenPool_constructor:testZeroAddressNotAllowedReverts() (gas: 67852) -TokenPool_setOffRampRateLimiterConfig:testNonExistentRampReverts() (gas: 14130) -TokenPool_setOffRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17975) -TokenPool_setOnRampRateLimiterConfig:testNonExistentRampReverts() (gas: 14143) -TokenPool_setOnRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17999) -TokenProxy_ccipSend:testCcipSendGasShouldBeZeroReverts() (gas: 17053) -TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127459) -TokenProxy_ccipSend:testCcipSendInvalidTokenReverts() (gas: 15839) -TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229774) -TokenProxy_ccipSend:testCcipSendNoDataAllowedReverts() (gas: 16167) -TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249677) +Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 89355) +Router_applyRampUpdates:testOffRampUpdatesWithRouting() (gas: 8484115) +Router_applyRampUpdates:testOnRampDisable() (gas: 52544) +Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12305) +Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110664) +Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 189563) +Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122727) +Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 201628) +Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61613) +Router_ccipSend:testInvalidMsgValue() (gas: 31947) +Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 64073) +Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 162515) +Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161862) +Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51406) +Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 232593) +Router_ccipSend:testUnsupportedDestinationChainReverts() (gas: 24711) +Router_ccipSend:testWhenNotHealthyReverts() (gas: 44713) +Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 164009) +Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 229660) +Router_constructor:testConstructorSuccess() (gas: 9956) +Router_getFee:testGetFeeSupportedChainSuccess() (gas: 39014) +Router_getFee:testUnsupportedDestinationChainReverts() (gas: 17138) +Router_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 33682) +Router_getSupportedTokens:testUnknownChainSuccess() (gas: 8577) +Router_recoverTokens:testRecoverTokensInvalidRecipientReverts() (gas: 11306) +Router_recoverTokens:testRecoverTokensNoFundsReverts() (gas: 17770) +Router_recoverTokens:testRecoverTokensNonOwnerReverts() (gas: 15354) +Router_recoverTokens:testRecoverTokensSuccess() (gas: 48644) +Router_recoverTokens:testRecoverTokensValueReceiverReverts() (gas: 444763) +Router_routeMessage:testAutoExecSuccess() (gas: 39277) +Router_routeMessage:testExecutionEventSuccess() (gas: 210166) +Router_routeMessage:testManualExecSuccess() (gas: 31374) +Router_routeMessage:testOnlyOffRampReverts() (gas: 27270) +Router_routeMessage:testWhenNotHealthyReverts() (gas: 43002) +Router_setWrappedNative:testOnlyOwnerReverts() (gas: 10978) +TokenPoolWithAllowList_applyAllowListUpdates:testOnlyOwnerReverts() (gas: 12120) +TokenPoolWithAllowList_applyAllowListUpdates:testSetAllowListSkipsZeroSuccess() (gas: 20517) +TokenPoolWithAllowList_applyAllowListUpdates:testSetAllowListSuccess() (gas: 175853) +TokenPoolWithAllowList_getAllowList:testGetAllowListSuccess() (gas: 20177) +TokenPoolWithAllowList_getAllowListEnabled:testGetAllowListEnabledSuccess() (gas: 5491) +TokenPool_applyRampUpdates:testApplyRampUpdatesSuccess() (gas: 476496) +TokenPool_applyRampUpdates:testOnlyCallableByOwnerReverts() (gas: 15950) +TokenPool_constructor:testZeroAddressNotAllowedReverts() (gas: 67888) +TokenPool_setOffRampRateLimiterConfig:testNonExistentRampReverts() (gas: 14157) +TokenPool_setOffRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 18041) +TokenPool_setOnRampRateLimiterConfig:testNonExistentRampReverts() (gas: 14170) +TokenPool_setOnRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 18065) +TokenProxy_ccipSend:testCcipSendGasShouldBeZeroReverts() (gas: 17077) +TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127729) +TokenProxy_ccipSend:testCcipSendInvalidTokenReverts() (gas: 15863) +TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 230581) +TokenProxy_ccipSend:testCcipSendNoDataAllowedReverts() (gas: 16191) +TokenProxy_ccipSend:testCcipSendSuccess() (gas: 250504) TokenProxy_constructor:testConstructor() (gas: 10651) -TokenProxy_getFee:testGetFeeGasShouldBeZeroReverts() (gas: 16734) -TokenProxy_getFee:testGetFeeInvalidTokenReverts() (gas: 12616) -TokenProxy_getFee:testGetFeeNoDataAllowedReverts() (gas: 15763) -TokenProxy_getFee:testGetFeeSuccess() (gas: 73961) -USDCTokenPool__validateMessage:testValidateInvalidMessageReverts() (gas: 25239) -USDCTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21848) -USDCTokenPool_lockOrBurn:testPermissionsErrorReverts() (gas: 12450) -USDCTokenPool_lockOrBurn:testUnknownDomainReverts() (gas: 183254) -USDCTokenPool_releaseOrMint:testReleaseOrMintRealTxSuccess() (gas: 55891) -USDCTokenPool_releaseOrMint:testTokenMaxCapacityExceededReverts() (gas: 27790) -USDCTokenPool_releaseOrMint:testUnlockingUSDCFailedReverts() (gas: 50632) -USDCTokenPool_setConfig:testInvalidConfigReverts() (gas: 15085) -USDCTokenPool_setConfig:testInvalidMessageVersionReverts() (gas: 11681) -USDCTokenPool_setConfig:testInvalidTokenMessengerVersionReverts() (gas: 287388) -USDCTokenPool_setConfig:testOnlyOwnerReverts() (gas: 15613) -USDCTokenPool_setConfig:testSetConfigSuccess() (gas: 345224) -USDCTokenPool_setDomains:testInvalidDomainReverts() (gas: 66025) -USDCTokenPool_setDomains:testOnlyOwnerReverts() (gas: 15367) -USDCTokenPool_supportsInterface:testSupportsInterfaceSuccess() (gas: 8369) \ No newline at end of file +TokenProxy_getFee:testGetFeeGasShouldBeZeroReverts() (gas: 16746) +TokenProxy_getFee:testGetFeeInvalidTokenReverts() (gas: 12628) +TokenProxy_getFee:testGetFeeNoDataAllowedReverts() (gas: 15775) +TokenProxy_getFee:testGetFeeSuccess() (gas: 74453) +USDCTokenPool__validateMessage:testValidateInvalidMessageReverts() (gas: 25338) +USDCTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21968) +USDCTokenPool_lockOrBurn:testPermissionsErrorReverts() (gas: 12498) +USDCTokenPool_lockOrBurn:testUnknownDomainReverts() (gas: 183561) +USDCTokenPool_releaseOrMint:testReleaseOrMintRealTxSuccess() (gas: 56035) +USDCTokenPool_releaseOrMint:testTokenMaxCapacityExceededReverts() (gas: 27922) +USDCTokenPool_releaseOrMint:testUnlockingUSDCFailedReverts() (gas: 50764) +USDCTokenPool_setConfig:testInvalidConfigReverts() (gas: 15241) +USDCTokenPool_setConfig:testInvalidMessageVersionReverts() (gas: 11741) +USDCTokenPool_setConfig:testInvalidTokenMessengerVersionReverts() (gas: 287496) +USDCTokenPool_setConfig:testOnlyOwnerReverts() (gas: 15709) +USDCTokenPool_setConfig:testSetConfigSuccess() (gas: 345812) +USDCTokenPool_setDomains:testInvalidDomainReverts() (gas: 66100) +USDCTokenPool_setDomains:testOnlyOwnerReverts() (gas: 15427) +USDCTokenPool_supportsInterface:testSupportsInterfaceSuccess() (gas: 8405) \ No newline at end of file diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 3373362062..1c054a61cf 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -4,6 +4,7 @@ set -e SOLC_VERSION="0.8.19" OPTIMIZE_RUNS=26000 +OPTIMIZE_RUNS_LOW=10000 SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" @@ -21,8 +22,15 @@ compileContract () { $ROOT/contracts/src/v0.8/$1 } +compileContractLowOpts () { + solc --overwrite --optimize --optimize-runs $OPTIMIZE_RUNS_LOW --metadata-hash none \ + -o $ROOT/contracts/solc/v$SOLC_VERSION \ + --abi --bin --allow-paths $ROOT/contracts/src/v0.8 \ + $ROOT/contracts/src/v0.8/$1 +} + compileContract ccip/Router.sol -compileContract ccip/onRamp/EVM2EVMOnRamp.sol +compileContractLowOpts ccip/onRamp/EVM2EVMOnRamp.sol compileContract ccip/CommitStore.sol compileContract ccip/offRamp/EVM2EVMOffRamp.sol compileContract ccip/ARM.sol diff --git a/contracts/src/v0.8/ccip/Router.sol b/contracts/src/v0.8/ccip/Router.sol index 2c1ee63e9d..f477243c5a 100644 --- a/contracts/src/v0.8/ccip/Router.sol +++ b/contracts/src/v0.8/ccip/Router.sol @@ -14,7 +14,7 @@ import {Internal} from "./libraries/Internal.sol"; import {CallWithExactGas} from "./libraries/CallWithExactGas.sol"; import {OwnerIsCreator} from "./../shared/access/OwnerIsCreator.sol"; -import {EnumerableMap} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/utils/structs/EnumerableMap.sol"; +import {EnumerableSet} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/utils/structs/EnumerableSet.sol"; import {SafeERC20} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC20} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC20/IERC20.sol"; @@ -23,11 +23,11 @@ import {IERC20} from "../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC /// @dev This contract is used as a router for both on-ramps and off-ramps contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { using SafeERC20 for IERC20; - using EnumerableMap for EnumerableMap.AddressToUintMap; + using EnumerableSet for EnumerableSet.UintSet; error FailedToSendValue(); error InvalidRecipientAddress(address to); - error OffRampMismatch(); + error OffRampMismatch(uint64 chainSelector, address offRamp); error BadARMSignal(); event OnRampSet(uint64 indexed destChainSelector, address onRamp); @@ -46,7 +46,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { } // solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables - string public constant override typeAndVersion = "Router 1.0.0"; + string public constant override typeAndVersion = "Router 1.2.0"; // We limit return data to a selector plus 4 words. This is to avoid // malicious contracts from returning large amounts of data and causing // repeated out-of-gas scenarios. @@ -60,10 +60,9 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { // destChainSelector => onRamp address // Only ever one onRamp enabled at a time for a given destChainSelector. mapping(uint256 destChainSelector => address onRamp) private s_onRamps; - // Mapping of offRamps to source chain ids - // Can be multiple offRamps enabled at a time for a given sourceChainSelector, - // for example during an no downtime upgrade while v1 messages are being flushed. - EnumerableMap.AddressToUintMap private s_offRamps; + // Stores [sourceChainSelector << 160 + offramp] as a pair to allow for + // lookups for specific chain/offramp pairs. + EnumerableSet.UintSet private s_chainSelectorAndOffRamps; constructor(address wrappedNative, address armProxy) { // Zero address indicates unsupported auto-wrapping, therefore, unsupported @@ -87,7 +86,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { } address onRamp = s_onRamps[destinationChainSelector]; if (onRamp == address(0)) revert UnsupportedDestinationChain(destinationChainSelector); - return IEVM2AnyOnRamp(onRamp).getFee(message); + return IEVM2AnyOnRamp(onRamp).getFee(destinationChainSelector, message); } /// @inheritdoc IRouterClient @@ -95,7 +94,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { if (!isChainSupported(chainSelector)) { return new address[](0); } - return IEVM2AnyOnRamp(s_onRamps[uint256(chainSelector)]).getSupportedTokens(); + return IEVM2AnyOnRamp(s_onRamps[uint256(chainSelector)]).getSupportedTokens(chainSelector); } /// @inheritdoc IRouterClient @@ -117,7 +116,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { // as part of the native fee coin payment. message.feeToken = s_wrappedNative; // We rely on getFee to validate that the feeToken is whitelisted. - feeTokenAmount = IEVM2AnyOnRamp(onRamp).getFee(message); + feeTokenAmount = IEVM2AnyOnRamp(onRamp).getFee(destinationChainSelector, message); // Ensure sufficient native. if (msg.value < feeTokenAmount) revert InsufficientFeeTokenAmount(); // Wrap and send native payment. @@ -128,7 +127,7 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { } else { if (msg.value > 0) revert InvalidMsgValue(); // We rely on getFee to validate that the feeToken is whitelisted. - feeTokenAmount = IEVM2AnyOnRamp(onRamp).getFee(message); + feeTokenAmount = IEVM2AnyOnRamp(onRamp).getFee(destinationChainSelector, message); IERC20(message.feeToken).safeTransferFrom(msg.sender, onRamp, feeTokenAmount); } @@ -138,12 +137,12 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { // We rely on getPoolBySourceToken to validate that the token is whitelisted. token.safeTransferFrom( msg.sender, - address(IEVM2AnyOnRamp(onRamp).getPoolBySourceToken(token)), + address(IEVM2AnyOnRamp(onRamp).getPoolBySourceToken(destinationChainSelector, token)), message.tokenAmounts[i].amount ); } - return IEVM2AnyOnRamp(onRamp).forwardFromRouter(message, feeTokenAmount, msg.sender); + return IEVM2AnyOnRamp(onRamp).forwardFromRouter(destinationChainSelector, message, feeTokenAmount, msg.sender); } // ================================================================ @@ -157,13 +156,12 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { uint16 gasForCallExactCheck, uint256 gasLimit, address receiver - ) - external - override - onlyOffRamp(message.sourceChainSelector) - whenHealthy - returns (bool success, bytes memory retData) - { + ) external override whenHealthy returns (bool success, bytes memory retData) { + // We only permit offRamps to call this function. We have to encode the sourceChainSelector + // and msg.sender into a uint256 to use as a key in the set. + if (!s_chainSelectorAndOffRamps.contains(_mergeChainSelectorAndOffRamp(message.sourceChainSelector, msg.sender))) + revert OnlyOffRamp(); + // We encode here instead of the offRamps to constrain specifically what functions // can be called from the router. bytes memory data = abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message); @@ -180,6 +178,15 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { return (success, retData); } + // @notice Merges a chain selector and offRamp address into a single uint256 by shifting the + // chain selector 160 bits to the left. + function _mergeChainSelectorAndOffRamp( + uint64 sourceChainSelector, + address offRampAddress + ) internal pure returns (uint256) { + return (uint256(sourceChainSelector) << 160) + uint160(offRampAddress); + } + // ================================================================ // │ Config │ // ================================================================ @@ -209,21 +216,21 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { return s_onRamps[destChainSelector]; } - /// @notice Return a full list of configured offRamps. function getOffRamps() external view returns (OffRamp[] memory) { - OffRamp[] memory offRamps = new OffRamp[](s_offRamps.length()); - for (uint256 i = 0; i < offRamps.length; ++i) { - (address offRamp, uint256 sourceChainSelector) = s_offRamps.at(i); - offRamps[i] = OffRamp({sourceChainSelector: uint64(sourceChainSelector), offRamp: offRamp}); + uint256[] memory encodedOffRamps = s_chainSelectorAndOffRamps.values(); + OffRamp[] memory offRamps = new OffRamp[](encodedOffRamps.length); + for (uint256 i = 0; i < encodedOffRamps.length; ++i) { + uint256 encodedOffRamp = encodedOffRamps[i]; + offRamps[i] = OffRamp({ + sourceChainSelector: uint64(encodedOffRamp >> 160), + offRamp: address(uint160(encodedOffRamp)) + }); } return offRamps; } - /// @notice Returns true if the given address is a permissioned offRamp - /// and sourceChainSelector if so. - function isOffRamp(address offRamp) external view returns (bool, uint64) { - (bool exists, uint256 sourceChainSelector) = s_offRamps.tryGet(offRamp); - return (exists, uint64(sourceChainSelector)); + function isOffRamp(uint64 sourceChainSelector, address offRamp) external view returns (bool) { + return s_chainSelectorAndOffRamps.contains(_mergeChainSelectorAndOffRamp(sourceChainSelector, offRamp)); } /// @notice applyRampUpdates applies a set of ramp changes which provides @@ -240,24 +247,25 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { s_onRamps[onRampUpdate.destChainSelector] = onRampUpdate.onRamp; emit OnRampSet(onRampUpdate.destChainSelector, onRampUpdate.onRamp); } + // Apply ingress updates. - // We permit an empty list as a way to disable ingress. for (uint256 i = 0; i < offRampRemoves.length; ++i) { - uint64 rampSelector = offRampRemoves[i].sourceChainSelector; - address rampAddress = offRampRemoves[i].offRamp; + uint64 sourceChainSelector = offRampRemoves[i].sourceChainSelector; + address offRampAddress = offRampRemoves[i].offRamp; - if (s_offRamps.get(rampAddress) != uint256(rampSelector)) revert OffRampMismatch(); + // If the selector-offRamp pair does not exist, revert. + if (!s_chainSelectorAndOffRamps.remove(_mergeChainSelectorAndOffRamp(sourceChainSelector, offRampAddress))) + revert OffRampMismatch(sourceChainSelector, offRampAddress); - if (s_offRamps.remove(rampAddress)) { - emit OffRampRemoved(rampSelector, rampAddress); - } + emit OffRampRemoved(sourceChainSelector, offRampAddress); } + for (uint256 i = 0; i < offRampAdds.length; ++i) { - uint64 rampSelector = offRampAdds[i].sourceChainSelector; - address rampAddress = offRampAdds[i].offRamp; + uint64 sourceChainSelector = offRampAdds[i].sourceChainSelector; + address offRampAddress = offRampAdds[i].offRamp; - if (s_offRamps.set(rampAddress, rampSelector)) { - emit OffRampAdded(rampSelector, rampAddress); + if (s_chainSelectorAndOffRamps.add(_mergeChainSelectorAndOffRamp(sourceChainSelector, offRampAddress))) { + emit OffRampAdded(sourceChainSelector, offRampAddress); } } } @@ -282,14 +290,6 @@ contract Router is IRouter, IRouterClient, ITypeAndVersion, OwnerIsCreator { // │ Access │ // ================================================================ - /// @notice only lets permissioned offRamps execute - /// @dev We additionally restrict offRamps to specific source chains for defense in depth. - modifier onlyOffRamp(uint64 expectedSourceChainSelector) { - (bool exists, uint256 sourceChainSelector) = s_offRamps.tryGet(msg.sender); - if (!exists || expectedSourceChainSelector != uint64(sourceChainSelector)) revert OnlyOffRamp(); - _; - } - /// @notice Ensure that the ARM has not emitted a bad signal, and that the latest heartbeat is not stale. modifier whenHealthy() { if (IARM(i_armProxy).isCursed()) revert BadARMSignal(); diff --git a/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRamp.sol b/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRamp.sol index 8e5c911afb..98670d1b14 100644 --- a/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRamp.sol +++ b/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRamp.sol @@ -1,28 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IPool} from "./pools/IPool.sol"; +import {IEVM2AnyOnRampClient} from "./IEVM2AnyOnRampClient.sol"; -import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; -import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC20/IERC20.sol"; - -interface IEVM2AnyOnRamp { - /// @notice Get the fee for a given ccip message - /// @param message The message to calculate the cost for - /// @return fee The calculated fee - function getFee(Client.EVM2AnyMessage calldata message) external view returns (uint256 fee); - - /// @notice Get the pool for a specific token - /// @param sourceToken The source chain token to get the pool for - /// @return pool Token pool - function getPoolBySourceToken(IERC20 sourceToken) external view returns (IPool); - - /// @notice Gets a list of all supported source chain tokens. - /// @return tokens The addresses of all tokens that this onRamp supports for sending. - function getSupportedTokens() external view returns (address[] memory tokens); - +interface IEVM2AnyOnRamp is IEVM2AnyOnRampClient { /// @notice Gets the next sequence number to be used in the onRamp /// @return the next sequence number to be used function getExpectedNextSequenceNumber() external view returns (uint64); @@ -36,16 +19,4 @@ interface IEVM2AnyOnRamp { /// @param removes The tokens and pools to be removed /// @param adds The tokens and pools to be added. function applyPoolUpdates(Internal.PoolUpdate[] memory removes, Internal.PoolUpdate[] memory adds) external; - - /// @notice Send a message to the remote chain - /// @dev only callable by the Router - /// @dev approve() must have already been called on the token using the this ramp address as the spender. - /// @dev if the contract is paused, this function will revert. - /// @param message Message struct to send - /// @param originalSender The original initiator of the CCIP request - function forwardFromRouter( - Client.EVM2AnyMessage memory message, - uint256 feeTokenAmount, - address originalSender - ) external returns (bytes32); } diff --git a/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRampClient.sol b/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRampClient.sol new file mode 100644 index 0000000000..0249214e79 --- /dev/null +++ b/contracts/src/v0.8/ccip/interfaces/IEVM2AnyOnRampClient.sol @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import {IPool} from "./pools/IPool.sol"; + +import {Client} from "../libraries/Client.sol"; + +import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ERC20/IERC20.sol"; + +interface IEVM2AnyOnRampClient { + /// @notice Get the fee for a given ccip message + /// @param destChainSelector The destination chain selector + /// @param message The message to calculate the cost for + /// @return fee The calculated fee + function getFee(uint64 destChainSelector, Client.EVM2AnyMessage calldata message) external view returns (uint256 fee); + + /// @notice Get the pool for a specific token + /// @param destChainSelector The destination chain selector + /// @param sourceToken The source chain token to get the pool for + /// @return pool Token pool + function getPoolBySourceToken(uint64 destChainSelector, IERC20 sourceToken) external view returns (IPool); + + /// @notice Gets a list of all supported source chain tokens. + /// @param destChainSelector The destination chain selector + /// @return tokens The addresses of all tokens that this onRamp supports the given destination chain + function getSupportedTokens(uint64 destChainSelector) external view returns (address[] memory tokens); + + /// @notice Send a message to the remote chain + /// @dev only callable by the Router + /// @dev approve() must have already been called on the token using the this ramp address as the spender. + /// @dev if the contract is paused, this function will revert. + /// @param destChainSelector The destination chain selector + /// @param message Message struct to send + /// @param feeTokenAmount Amount of fee tokens for payment + /// @param originalSender The original initiator of the CCIP request + function forwardFromRouter( + uint64 destChainSelector, + Client.EVM2AnyMessage memory message, + uint256 feeTokenAmount, + address originalSender + ) external returns (bytes32); +} diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index 230017cf33..4cf216c2f8 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -6,6 +6,7 @@ import {IPool} from "../interfaces/pools/IPool.sol"; import {IARM} from "../interfaces/IARM.sol"; import {IPriceRegistry} from "../interfaces/IPriceRegistry.sol"; import {IEVM2AnyOnRamp} from "../interfaces/IEVM2AnyOnRamp.sol"; +import {IEVM2AnyOnRampClient} from "../interfaces/IEVM2AnyOnRampClient.sol"; import {ILinkAvailable} from "../interfaces/automation/ILinkAvailable.sol"; import {AggregateRateLimiter} from "../AggregateRateLimiter.sol"; @@ -56,6 +57,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, error NotAFeeToken(address token); error CannotSendZeroTokens(); error SourceTokenDataTooLarge(address token); + error InvalidChainSelector(uint64 chainSelector); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); event NopPaid(address indexed nop, uint256 amount); @@ -252,8 +254,9 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, return uint64(senderNonce); } - /// @inheritdoc IEVM2AnyOnRamp + /// @inheritdoc IEVM2AnyOnRampClient function forwardFromRouter( + uint64 destChainSelector, Client.EVM2AnyMessage calldata message, uint256 feeTokenAmount, address originalSender @@ -262,6 +265,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, if (originalSender == address(0)) revert RouterMustSetOriginalSender(); // Router address may be zero intentionally to pause. if (msg.sender != s_dynamicConfig.router) revert MustBeCalledByRouter(); + if (destChainSelector != i_destChainSelector) revert InvalidChainSelector(destChainSelector); // EVM destination addresses should be abi encoded and therefore always 32 bytes long // Not duplicately validated in `getFee`. Invalid address is uncommon, gas cost outweighs UX gain. @@ -272,7 +276,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, uint256 gasLimit = _fromBytes(message.extraArgs).gasLimit; // Validate the message with various checks - uint256 numberOfTokens = message.tokenAmounts.length; _validateMessage(message.data.length, gasLimit, numberOfTokens); @@ -324,7 +327,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, // There should be no state changes after external call to TokenPools. for (uint256 i = 0; i < numberOfTokens; ++i) { Client.EVMTokenAmount memory tokenAndAmount = message.tokenAmounts[i]; - bytes memory tokenData = getPoolBySourceToken(IERC20(tokenAndAmount.token)).lockOrBurn( + bytes memory tokenData = getPoolBySourceToken(destChainSelector, IERC20(tokenAndAmount.token)).lockOrBurn( originalSender, message.receiver, tokenAndAmount.amount, @@ -433,8 +436,8 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, // │ Tokens and pools │ // ================================================================ - /// @inheritdoc IEVM2AnyOnRamp - function getSupportedTokens() external view returns (address[] memory) { + /// @inheritdoc IEVM2AnyOnRampClient + function getSupportedTokens(uint64 /*destChainSelector*/) external view returns (address[] memory) { address[] memory sourceTokens = new address[](s_poolsBySourceToken.length()); for (uint256 i = 0; i < sourceTokens.length; ++i) { (sourceTokens[i], ) = s_poolsBySourceToken.at(i); @@ -442,8 +445,8 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, return sourceTokens; } - /// @inheritdoc IEVM2AnyOnRamp - function getPoolBySourceToken(IERC20 sourceToken) public view returns (IPool) { + /// @inheritdoc IEVM2AnyOnRampClient + function getPoolBySourceToken(uint64 /*destChainSelector*/, IERC20 sourceToken) public view returns (IPool) { if (!s_poolsBySourceToken.contains(address(sourceToken))) revert UnsupportedToken(sourceToken); return IPool(s_poolsBySourceToken.get(address(sourceToken))); } @@ -489,20 +492,26 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, // │ Fees │ // ================================================================ - /// @inheritdoc IEVM2AnyOnRamp + /// @inheritdoc IEVM2AnyOnRampClient /// @dev getFee MUST revert if the feeToken is not listed in the fee token config, as the router assumes it does. + /// @param destChainSelector The destination chain selector. /// @param message The message to get quote for. /// @return feeTokenAmount The amount of fee token needed for the fee, in smallest denomination of the fee token. - function getFee(Client.EVM2AnyMessage calldata message) external view returns (uint256 feeTokenAmount) { - Client.EVMExtraArgsV1 memory extraArgs = _fromBytes(message.extraArgs); + function getFee( + uint64 destChainSelector, + Client.EVM2AnyMessage calldata message + ) external view returns (uint256 feeTokenAmount) { + if (destChainSelector != i_destChainSelector) revert InvalidChainSelector(destChainSelector); + + uint256 gasLimit = _fromBytes(message.extraArgs).gasLimit; // Validate the message with various checks - _validateMessage(message.data.length, extraArgs.gasLimit, message.tokenAmounts.length); + _validateMessage(message.data.length, gasLimit, message.tokenAmounts.length); FeeTokenConfig memory feeTokenConfig = s_feeTokenConfig[message.feeToken]; if (!feeTokenConfig.enabled) revert NotAFeeToken(message.feeToken); (uint224 feeTokenPrice, uint224 packedGasPrice) = IPriceRegistry(s_dynamicConfig.priceRegistry) - .getTokenAndGasPrices(message.feeToken, i_destChainSelector); + .getTokenAndGasPrices(message.feeToken, destChainSelector); uint112 executionGasPrice = uint112(packedGasPrice); // Calculate premiumFee in USD with 18 decimals precision first. @@ -530,7 +539,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, // We add the message gas limit, the overhead gas, and the data availability gas together. // We then multiply this destination gas total with the gas multiplier and convert it into USD. uint256 executionCost = executionGasPrice * - ((extraArgs.gasLimit + + ((gasLimit + s_dynamicConfig.destGasOverhead + (message.data.length * s_dynamicConfig.destGasPerPayloadByte) + tokenTransferGas) * feeTokenConfig.gasMultiplierWeiPerEth); diff --git a/contracts/src/v0.8/ccip/pools/ThirdPartyBurnMintTokenPool.sol b/contracts/src/v0.8/ccip/pools/ThirdPartyBurnMintTokenPool.sol deleted file mode 100644 index 87718232eb..0000000000 --- a/contracts/src/v0.8/ccip/pools/ThirdPartyBurnMintTokenPool.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.19; - -import {IBurnMintERC20} from "../../shared/token/ERC20/IBurnMintERC20.sol"; - -import {BurnMintTokenPool} from "./BurnMintTokenPool.sol"; -import {Router} from "../Router.sol"; - -/// @notice This pool mints and burns a 3rd-party token. This pool is not owned by the DON -// and therefor has an additional check on adding offRamps. -contract ThirdPartyBurnMintTokenPool is BurnMintTokenPool { - error InvalidOffRamp(address offRamp); - - /// @notice the trusted Router address to validate new offRamps through. - address private s_router; - - constructor( - IBurnMintERC20 token, - address[] memory allowlist, - address router, - address armProxy - ) BurnMintTokenPool(token, allowlist, armProxy) { - s_router = router; - } - - /// @notice Sets permissions for all on and offRamps. - /// @dev Only callable by the owner - /// @param onRamps A list of onRamps and their new permission status - /// @param offRamps A list of offRamps and their new permission status - function applyRampUpdates(RampUpdate[] calldata onRamps, RampUpdate[] calldata offRamps) external override onlyOwner { - // Sanity check the offramps are enabled - for (uint256 i = 0; i < offRamps.length; ++i) { - // If the offRamp is being added do an additional check if the offRamp is - // permission by the router. If not, we revert because we tried to add an - // invalid offRamp. - (bool exists, ) = Router(s_router).isOffRamp(offRamps[i].ramp); - if (!exists) revert InvalidOffRamp(offRamps[i].ramp); - } - _applyRampUpdates(onRamps, offRamps); - } -} diff --git a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol index f725a5ddae..befc2cc07c 100644 --- a/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol +++ b/contracts/src/v0.8/ccip/test/applications/ImmutableExample.t.sol @@ -28,7 +28,10 @@ contract CCIPClientExample_sanity is EVM2EVMOnRampSetup { exampleContract.sendDataPayFeeToken(DEST_CHAIN_ID, abi.encode(toAddress), bytes("hello")); // Can send data tokens - assertEq(address(s_onRamp.getPoolBySourceToken(IERC20(s_sourceTokens[1]))), address(s_sourcePools[1])); + assertEq( + address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(s_sourceTokens[1]))), + address(s_sourcePools[1]) + ); deal(s_sourceTokens[1], OWNER, 100 ether); IERC20(s_sourceTokens[1]).approve(address(exampleContract), 1 ether); Client.EVMTokenAmount[] memory tokenAmounts = new Client.EVMTokenAmount[](1); diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol index 808feb2691..8ee14bdf66 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol @@ -62,7 +62,7 @@ contract EVM2EVMOnRamp_constructor is EVM2EVMOnRampSetup { assertEq(dynamicConfig.maxPerMsgGasLimit, gotDynamicConfig.maxPerMsgGasLimit); // Tokens - assertEq(s_sourceTokens, s_onRamp.getSupportedTokens()); + assertEq(s_sourceTokens, s_onRamp.getSupportedTokens(DEST_CHAIN_ID)); // Initial values assertEq("EVM2EVMOnRamp 1.2.0", s_onRamp.typeAndVersion()); @@ -81,7 +81,7 @@ contract EVM2EVMOnRamp_payNops_fuzz is EVM2EVMOnRampSetup { // Set Nop fee juels deal(s_sourceFeeToken, address(s_onRamp), nopFeesJuels); changePrank(address(s_sourceRouter)); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), nopFeesJuels, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), nopFeesJuels, OWNER); changePrank(OWNER); @@ -109,7 +109,7 @@ contract EVM2EVMNopsFeeSetup is EVM2EVMOnRampSetup { // Send a bunch of messages, increasing the juels in the contract for (uint256 i = 0; i < numberOfMessages; ++i) { IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), feeAmount, OWNER); } assertEq(s_onRamp.getNopFeesJuels(), feeAmount * numberOfMessages); @@ -169,7 +169,7 @@ contract EVM2EVMOnRamp_payNops is EVM2EVMNopsFeeSetup { changePrank(address(s_sourceRouter)); uint256 feeAmount = 1234567890; IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), feeAmount, OWNER); changePrank(newNop); uint256 prevNopBalance = IERC20(s_sourceFeeToken).balanceOf(prevNop); @@ -271,7 +271,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 1, 1, feeAmount, OWNER)); - s_onRamp.forwardFromRouter(message, feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeAmount, OWNER); } function testForwardFromRouterSuccessLegacyExtraArgs() public { @@ -287,7 +287,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { // We expect the message to be emitted with strict = false. emit CCIPSendRequested(_messageToEvent(message, 1, 1, feeAmount, OWNER)); - s_onRamp.forwardFromRouter(message, feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeAmount, OWNER); } function testForwardFromRouterSuccess() public { @@ -299,7 +299,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 1, 1, feeAmount, OWNER)); - s_onRamp.forwardFromRouter(message, feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeAmount, OWNER); } function testShouldIncrementSeqNumAndNonceSuccess() public { @@ -311,7 +311,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, i, i, 0, OWNER)); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); uint64 nonceAfter = s_onRamp.getSenderNonce(OWNER); assertEq(nonceAfter, nonceBefore + 1); @@ -326,7 +326,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { uint256 feeAmount = 1234567890; IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_onRamp.forwardFromRouter(message, feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeAmount, OWNER); assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), feeAmount); assertEq(s_onRamp.getNopFeesJuels(), feeAmount); @@ -339,7 +339,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { uint256 feeAmount = 1234567890; IERC20(s_sourceTokens[1]).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_onRamp.forwardFromRouter(message, feeAmount, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeAmount, OWNER); assertEq(IERC20(s_sourceTokens[1]).balanceOf(address(s_onRamp)), feeAmount); @@ -375,7 +375,10 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { emit CCIPSendRequested(expectedEvent); // Assert the message Id is correct - assertEq(expectedEvent.messageId, s_onRamp.forwardFromRouter(message, feeTokenAmount, originalSender)); + assertEq( + expectedEvent.messageId, + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, feeTokenAmount, originalSender) + ); // Assert the fee token amount is correctly assigned to the nop fee pool assertEq(feeTokenAmount, s_onRamp.getNopFeesJuels()); } @@ -388,7 +391,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { address router = address(0); s_onRamp.setDynamicConfig(generateDynamicOnRampConfig(router, address(2))); vm.expectRevert(EVM2EVMOnRamp.MustBeCalledByRouter.selector); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), 0, OWNER); } function testInvalidExtraArgsTagReverts() public { @@ -397,24 +400,24 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(EVM2EVMOnRamp.InvalidExtraArgsTag.selector); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } function testUnhealthyReverts() public { s_mockARM.voteToCurse(0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); vm.expectRevert(EVM2EVMOnRamp.BadARMSignal.selector); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), 0, OWNER); } function testPermissionsReverts() public { changePrank(OWNER); vm.expectRevert(EVM2EVMOnRamp.MustBeCalledByRouter.selector); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), 0, OWNER); } function testOriginalSenderReverts() public { vm.expectRevert(EVM2EVMOnRamp.RouterMustSetOriginalSender.selector); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), 0, address(0)); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), 0, address(0)); } function testMessageTooLargeReverts() public { @@ -422,7 +425,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { message.data = new bytes(MAX_DATA_SIZE + 1); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.MessageTooLarge.selector, MAX_DATA_SIZE, message.data.length)); - s_onRamp.forwardFromRouter(message, 0, STRANGER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, STRANGER); } function testTooManyTokensReverts() public { @@ -430,7 +433,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { uint256 tooMany = MAX_TOKENS_LENGTH + 1; message.tokenAmounts = new Client.EVMTokenAmount[](tooMany); vm.expectRevert(EVM2EVMOnRamp.UnsupportedNumberOfTokens.selector); - s_onRamp.forwardFromRouter(message, 0, STRANGER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, STRANGER); } function testCannotSendZeroTokensReverts() public { @@ -439,7 +442,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { message.tokenAmounts[0].amount = 0; message.tokenAmounts[0].token = s_sourceTokens[0]; vm.expectRevert(EVM2EVMOnRamp.CannotSendZeroTokens.selector); - s_onRamp.forwardFromRouter(message, 0, STRANGER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, STRANGER); } function testUnsupportedTokenReverts() public { @@ -461,7 +464,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { changePrank(address(s_sourceRouter)); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.UnsupportedToken.selector, wrongToken)); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } function testMaxCapacityExceededReverts() public { @@ -480,7 +483,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { ) ); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } function testPriceNotFoundForTokenReverts() public { @@ -493,7 +496,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, fakeToken)); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } // Asserts gasLimit must be <=maxGasLimit @@ -501,7 +504,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: MAX_GAS_LIMIT + 1})); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.MessageGasLimitTooHigh.selector)); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } function testInvalidAddressEncodePackedReverts() public { @@ -510,7 +513,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.InvalidAddress.selector, message.receiver)); - s_onRamp.forwardFromRouter(message, 1, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 1, OWNER); } function testInvalidAddressReverts() public { @@ -519,7 +522,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.InvalidAddress.selector, message.receiver)); - s_onRamp.forwardFromRouter(message, 1, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 1, OWNER); } // We disallow sending to addresses 0-9. @@ -531,7 +534,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.InvalidAddress.selector, message.receiver)); - s_onRamp.forwardFromRouter(message, 1, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 1, OWNER); } } @@ -540,7 +543,16 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { vm.expectRevert(EVM2EVMOnRamp.MaxFeeBalanceReached.selector); - s_onRamp.forwardFromRouter(message, MAX_NOP_FEES_JUELS + 1, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, MAX_NOP_FEES_JUELS + 1, OWNER); + } + + function testInvalidChainSelectorReverts() public { + Client.EVM2AnyMessage memory message = _generateEmptyMessage(); + + uint64 wrongChainId = DEST_CHAIN_ID + 1; + vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.InvalidChainSelector.selector, wrongChainId)); + + s_onRamp.forwardFromRouter(wrongChainId, message, 1, OWNER); } function testSourceTokenDataTooLargeReverts() public { @@ -589,7 +601,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { changePrank(address(s_sourceRouter)); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.SourceTokenDataTooLarge.selector, sourceETH)); - s_onRamp.forwardFromRouter(message, 0, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); } } @@ -638,7 +650,7 @@ contract EVM2EVMOnRamp_forwardFromRouter_upgrade is EVM2EVMOnRampSetup { vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 1, 1, FEE_AMOUNT, OWNER)); - s_onRamp.forwardFromRouter(message, FEE_AMOUNT, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, OWNER); } function testV2SenderNoncesReadsPreviousRampSuccess() public { @@ -646,7 +658,7 @@ contract EVM2EVMOnRamp_forwardFromRouter_upgrade is EVM2EVMOnRampSetup { uint64 startNonce = s_onRamp.getSenderNonce(OWNER); for (uint64 i = 1; i < 4; ++i) { - s_prevOnRamp.forwardFromRouter(message, 0, OWNER); + s_prevOnRamp.forwardFromRouter(DEST_CHAIN_ID, message, 0, OWNER); assertEq(startNonce + i, s_onRamp.getSenderNonce(OWNER)); } @@ -658,21 +670,21 @@ contract EVM2EVMOnRamp_forwardFromRouter_upgrade is EVM2EVMOnRampSetup { uint64 startNonce = s_onRamp.getSenderNonce(OWNER); // send 1 message from previous onramp - s_prevOnRamp.forwardFromRouter(message, FEE_AMOUNT, OWNER); + s_prevOnRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, OWNER); assertEq(startNonce + 1, s_onRamp.getSenderNonce(OWNER)); // new onramp nonce should start from 2, while sequence number start from 1 vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 1, startNonce + 2, FEE_AMOUNT, OWNER)); - s_onRamp.forwardFromRouter(message, FEE_AMOUNT, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, OWNER); assertEq(startNonce + 2, s_onRamp.getSenderNonce(OWNER)); // after another send, nonce should be 3, and sequence number be 2 vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 2, startNonce + 3, FEE_AMOUNT, OWNER)); - s_onRamp.forwardFromRouter(message, FEE_AMOUNT, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, OWNER); assertEq(startNonce + 3, s_onRamp.getSenderNonce(OWNER)); } @@ -681,13 +693,13 @@ contract EVM2EVMOnRamp_forwardFromRouter_upgrade is EVM2EVMOnRampSetup { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); // send 1 message from previous onramp from OWNER - s_prevOnRamp.forwardFromRouter(message, FEE_AMOUNT, OWNER); + s_prevOnRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, OWNER); address newSender = address(1234567); // new onramp nonce should start from 1 for new sender vm.expectEmit(); emit CCIPSendRequested(_messageToEvent(message, 1, 1, FEE_AMOUNT, newSender)); - s_onRamp.forwardFromRouter(message, FEE_AMOUNT, newSender); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, message, FEE_AMOUNT, newSender); } } @@ -1153,7 +1165,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { message.feeToken = testTokens[i]; EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); - uint256 feeAmount = s_onRamp.getFee(message); + uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_ID, message); uint256 gasUsed = GAS_LIMIT + DEST_GAS_OVERHEAD; uint256 gasFeeUSD = (gasUsed * feeTokenConfig.gasMultiplierWeiPerEth * USD_PER_GAS); @@ -1179,7 +1191,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); - uint256 feeAmount = s_onRamp.getFee(message); + uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_ID, message); uint256 gasUsed = GAS_LIMIT + DEST_GAS_OVERHEAD; uint256 gasFeeUSD = (gasUsed * feeTokenConfig.gasMultiplierWeiPerEth * USD_PER_GAS); @@ -1206,7 +1218,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { }); EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); - uint256 feeAmount = s_onRamp.getFee(message); + uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_ID, message); uint256 gasUsed = customGasLimit + DEST_GAS_OVERHEAD + customDataSize * DEST_GAS_PER_PAYLOAD_BYTE; uint256 gasFeeUSD = (gasUsed * feeTokenConfig.gasMultiplierWeiPerEth * USD_PER_GAS); @@ -1236,7 +1248,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { uint32 tokenGasOverhead = s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[0].token).destGasOverhead; uint32 tokenBytesOverhead = s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[0].token).destBytesOverhead; - uint256 feeAmount = s_onRamp.getFee(message); + uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_ID, message); uint256 gasUsed = GAS_LIMIT + DEST_GAS_OVERHEAD + tokenGasOverhead; uint256 gasFeeUSD = (gasUsed * feeTokenConfig.gasMultiplierWeiPerEth * USD_PER_GAS); @@ -1286,7 +1298,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { tokenBytesOverhead += s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[j].token).destBytesOverhead; } - uint256 feeAmount = s_onRamp.getFee(message); + uint256 feeAmount = s_onRamp.getFee(DEST_CHAIN_ID, message); uint256 gasUsed = customGasLimit + DEST_GAS_OVERHEAD + @@ -1321,7 +1333,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.NotAFeeToken.selector, notAFeeToken)); - s_onRamp.getFee(message); + s_onRamp.getFee(DEST_CHAIN_ID, message); } function testMessageTooLargeReverts() public { @@ -1329,7 +1341,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { message.data = new bytes(MAX_DATA_SIZE + 1); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.MessageTooLarge.selector, MAX_DATA_SIZE, message.data.length)); - s_onRamp.getFee(message); + s_onRamp.getFee(DEST_CHAIN_ID, message); } function testTooManyTokensReverts() public { @@ -1337,7 +1349,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { uint256 tooMany = MAX_TOKENS_LENGTH + 1; message.tokenAmounts = new Client.EVMTokenAmount[](tooMany); vm.expectRevert(EVM2EVMOnRamp.UnsupportedNumberOfTokens.selector); - s_onRamp.getFee(message); + s_onRamp.getFee(DEST_CHAIN_ID, message); } // Asserts gasLimit must be <=maxGasLimit @@ -1345,7 +1357,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); message.extraArgs = Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: MAX_GAS_LIMIT + 1})); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.MessageGasLimitTooHigh.selector)); - s_onRamp.getFee(message); + s_onRamp.getFee(DEST_CHAIN_ID, message); } } @@ -1393,7 +1405,7 @@ contract EVM2EVMOnRamp_setNops is EVM2EVMOnRampSetup { // Set Nop fee juels deal(s_sourceFeeToken, address(s_onRamp), nopFeesJuels); changePrank(address(s_sourceRouter)); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), nopFeesJuels, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), nopFeesJuels, OWNER); changePrank(OWNER); // We don't care about the fee calculation logic in this test @@ -1435,7 +1447,7 @@ contract EVM2EVMOnRamp_setNops is EVM2EVMOnRampSetup { // Set Nop fee juels but don't transfer LINK. This can happen when users // pay in non-link tokens. changePrank(address(s_sourceRouter)); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), nopFeesJuels, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), nopFeesJuels, OWNER); changePrank(OWNER); vm.expectRevert(EVM2EVMOnRamp.InsufficientBalance.selector); @@ -1499,7 +1511,7 @@ contract EVM2EVMOnRamp_withdrawNonLinkFees is EVM2EVMOnRampSetup { // Set Nop fee juels uint96 nopFeesJuels = 10000000; changePrank(address(s_sourceRouter)); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), nopFeesJuels, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), nopFeesJuels, OWNER); changePrank(OWNER); vm.expectRevert(EVM2EVMOnRamp.LinkBalanceNotSettled.selector); @@ -1519,7 +1531,7 @@ contract EVM2EVMOnRamp_withdrawNonLinkFees is EVM2EVMOnRampSetup { // Set Nop fee juels uint96 nopFeesJuels = 10000000; changePrank(address(s_sourceRouter)); - s_onRamp.forwardFromRouter(_generateEmptyMessage(), nopFeesJuels, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_ID, _generateEmptyMessage(), nopFeesJuels, OWNER); changePrank(OWNER); vm.expectRevert(EVM2EVMOnRamp.LinkBalanceNotSettled.selector); @@ -1654,11 +1666,11 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { // #getTokenPool contract EVM2EVMOnRamp_getTokenPool is EVM2EVMOnRampSetup { function testGetTokenPoolSuccess() public { - assertEq(s_sourcePools[0], address(s_onRamp.getPoolBySourceToken(IERC20(s_sourceTokens[0])))); - assertEq(s_sourcePools[1], address(s_onRamp.getPoolBySourceToken(IERC20(s_sourceTokens[1])))); + assertEq(s_sourcePools[0], address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(s_sourceTokens[0])))); + assertEq(s_sourcePools[1], address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(s_sourceTokens[1])))); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.UnsupportedToken.selector, IERC20(s_destTokens[0]))); - s_onRamp.getPoolBySourceToken(IERC20(s_destTokens[0])); + s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(s_destTokens[0])); } } @@ -1678,7 +1690,7 @@ contract EVM2EVMOnRamp_applyPoolUpdates is EVM2EVMOnRampSetup { s_onRamp.applyPoolUpdates(new Internal.PoolUpdate[](0), adds); - assertEq(adds[0].pool, address(s_onRamp.getPoolBySourceToken(IERC20(adds[0].token)))); + assertEq(adds[0].pool, address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(adds[0].token)))); vm.expectEmit(); emit PoolRemoved(adds[0].token, adds[0].pool); @@ -1686,7 +1698,7 @@ contract EVM2EVMOnRamp_applyPoolUpdates is EVM2EVMOnRampSetup { s_onRamp.applyPoolUpdates(adds, new Internal.PoolUpdate[](0)); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.UnsupportedToken.selector, adds[0].token)); - s_onRamp.getPoolBySourceToken(IERC20(adds[0].token)); + s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(adds[0].token)); } function testAtomicPoolReplacementSuccess() public { @@ -1701,7 +1713,7 @@ contract EVM2EVMOnRamp_applyPoolUpdates is EVM2EVMOnRampSetup { s_onRamp.applyPoolUpdates(new Internal.PoolUpdate[](0), adds); - assertEq(adds[0].pool, address(s_onRamp.getPoolBySourceToken(IERC20(token)))); + assertEq(adds[0].pool, address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(token)))); MockTokenPool newMockPool = new MockTokenPool(token); @@ -1715,7 +1727,7 @@ contract EVM2EVMOnRamp_applyPoolUpdates is EVM2EVMOnRampSetup { s_onRamp.applyPoolUpdates(adds, updates); - assertEq(updates[0].pool, address(s_onRamp.getPoolBySourceToken(IERC20(token)))); + assertEq(updates[0].pool, address(s_onRamp.getPoolBySourceToken(DEST_CHAIN_ID, IERC20(token)))); } // Reverts @@ -1803,7 +1815,7 @@ contract EVM2EVMOnRamp_applyPoolUpdates is EVM2EVMOnRampSetup { // #getSupportedTokens contract EVM2EVMOnRamp_getSupportedTokens is EVM2EVMOnRampSetup { function testGetSupportedTokensSuccess() public { - address[] memory supportedTokens = s_onRamp.getSupportedTokens(); + address[] memory supportedTokens = s_onRamp.getSupportedTokens(DEST_CHAIN_ID); assertEq(s_sourceTokens, supportedTokens); @@ -1812,7 +1824,7 @@ contract EVM2EVMOnRamp_getSupportedTokens is EVM2EVMOnRampSetup { s_onRamp.applyPoolUpdates(removes, new Internal.PoolUpdate[](0)); - supportedTokens = s_onRamp.getSupportedTokens(); + supportedTokens = s_onRamp.getSupportedTokens(DEST_CHAIN_ID); assertEq(address(s_sourceTokens[1]), supportedTokens[0]); assertEq(s_sourceTokens.length - 1, supportedTokens.length); diff --git a/contracts/src/v0.8/ccip/test/pools/ThirdPartyBurnMintTokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/ThirdPartyBurnMintTokenPool.t.sol deleted file mode 100644 index 129f0de338..0000000000 --- a/contracts/src/v0.8/ccip/test/pools/ThirdPartyBurnMintTokenPool.t.sol +++ /dev/null @@ -1,133 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity 0.8.19; - -import {IBurnMintERC20} from "../../../shared/token/ERC20/IBurnMintERC20.sol"; - -import "../BaseTest.t.sol"; -import {ThirdPartyBurnMintTokenPool} from "../../pools/ThirdPartyBurnMintTokenPool.sol"; -import {TokenPool} from "../../pools/TokenPool.sol"; -import {Router} from "../../Router.sol"; -import {BurnMintERC677} from "../../../shared/token/ERC677/BurnMintERC677.sol"; - -contract ThirdPartyBurnMintTokenPoolSetup is BaseTest { - IERC20 internal s_token; - address internal s_routerAllowedOffRamp = address(234); - Router internal s_router; - - ThirdPartyBurnMintTokenPool internal s_thirdPartyPool; - ThirdPartyBurnMintTokenPool internal s_thirdPartyPoolWithAllowList; - address[] internal s_allowedList; - address internal s_allowedOnRamp = address(123456789); - - function setUp() public virtual override { - BaseTest.setUp(); - s_token = new BurnMintERC677("LINK", "LNK", 18, 0); - deal(address(s_token), OWNER, type(uint256).max); - - s_router = new Router(address(s_token), address(s_mockARM)); - - Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0); - Router.OffRamp[] memory offRampUpdates = new Router.OffRamp[](1); - address[] memory offRamps = new address[](1); - offRamps[0] = s_routerAllowedOffRamp; - offRampUpdates[0] = Router.OffRamp({sourceChainSelector: SOURCE_CHAIN_ID, offRamp: s_routerAllowedOffRamp}); - - s_router.applyRampUpdates(onRampUpdates, new Router.OffRamp[](0), offRampUpdates); - - s_thirdPartyPool = new ThirdPartyBurnMintTokenPool( - IBurnMintERC20(address(s_token)), - new address[](0), - address(s_router), - address(s_mockARM) - ); - - s_allowedList.push(USER_1); - s_allowedList.push(DUMMY_CONTRACT_ADDRESS); - s_thirdPartyPoolWithAllowList = new ThirdPartyBurnMintTokenPool( - IBurnMintERC20(address(s_token)), - s_allowedList, - address(s_router), - address(s_mockARM) - ); - - BurnMintERC677(address(s_token)).grantMintAndBurnRoles(address(s_thirdPartyPool)); - BurnMintERC677(address(s_token)).grantMintAndBurnRoles(address(s_thirdPartyPoolWithAllowList)); - - TokenPool.RampUpdate[] memory poolOnRampsUpdates = new TokenPool.RampUpdate[](1); - poolOnRampsUpdates[0] = TokenPool.RampUpdate({ - ramp: s_allowedOnRamp, - allowed: true, - rateLimiterConfig: rateLimiterConfig() - }); - TokenPool.RampUpdate[] memory poolOffRampUpdates = new TokenPool.RampUpdate[](0); - - s_thirdPartyPool.applyRampUpdates(poolOnRampsUpdates, poolOffRampUpdates); - s_thirdPartyPoolWithAllowList.applyRampUpdates(poolOnRampsUpdates, poolOffRampUpdates); - } -} - -contract ThirdPartyBurnMintTokenPool_lockOrBurn is ThirdPartyBurnMintTokenPoolSetup { - error SenderNotAllowed(address sender); - event Burned(address indexed sender, uint256 amount); - event TokensConsumed(uint256 amount); - - function setUp() public virtual override { - ThirdPartyBurnMintTokenPoolSetup.setUp(); - - deal(address(s_token), address(s_thirdPartyPool), type(uint256).max); - deal(address(s_token), address(s_thirdPartyPoolWithAllowList), type(uint256).max); - } - - function testFuzz_LockOrBurnNoAllowListSuccess(uint256 amount) public { - amount = bound(amount, 1, rateLimiterConfig().capacity); - changePrank(s_allowedOnRamp); - - vm.expectEmit(); - emit TokensConsumed(amount); - vm.expectEmit(); - emit Burned(s_allowedOnRamp, amount); - - s_thirdPartyPool.lockOrBurn(STRANGER, bytes(""), amount, DEST_CHAIN_ID, bytes("")); - } - - function testLockOrBurnWithAllowListSuccess() public { - uint256 amount = 100; - changePrank(s_allowedOnRamp); - - vm.expectEmit(); - emit TokensConsumed(amount); - vm.expectEmit(); - emit Burned(s_allowedOnRamp, amount); - - s_thirdPartyPoolWithAllowList.lockOrBurn(s_allowedList[0], bytes(""), amount, DEST_CHAIN_ID, bytes("")); - - vm.expectEmit(); - emit TokensConsumed(amount); - vm.expectEmit(); - emit Burned(s_allowedOnRamp, amount); - - s_thirdPartyPoolWithAllowList.lockOrBurn(s_allowedList[1], bytes(""), amount, DEST_CHAIN_ID, bytes("")); - } - - function testLockOrBurnWithAllowListReverts() public { - changePrank(s_allowedOnRamp); - - vm.expectRevert(abi.encodeWithSelector(SenderNotAllowed.selector, STRANGER)); - - s_thirdPartyPoolWithAllowList.lockOrBurn(STRANGER, bytes(""), 100, DEST_CHAIN_ID, bytes("")); - } -} - -contract ThirdPartyBurnMintTokenPool_applyRampUpdates is ThirdPartyBurnMintTokenPoolSetup { - // Note applyRampUpdates inherits from TokenPool so we only need to test the new functionality. - // Reverts - function testInvalidOffRampReverts() public { - address invalidOffRamp = address(23456787654321); - TokenPool.RampUpdate[] memory offRamps = new TokenPool.RampUpdate[](1); - offRamps[0] = TokenPool.RampUpdate({ramp: invalidOffRamp, allowed: true, rateLimiterConfig: rateLimiterConfig()}); - - vm.expectRevert(abi.encodeWithSelector(ThirdPartyBurnMintTokenPool.InvalidOffRamp.selector, invalidOffRamp)); - - s_thirdPartyPool.applyRampUpdates(new TokenPool.RampUpdate[](0), offRamps); - } -} diff --git a/contracts/src/v0.8/ccip/test/router/Router.t.sol b/contracts/src/v0.8/ccip/test/router/Router.t.sol index f1e693b9a6..90155460eb 100644 --- a/contracts/src/v0.8/ccip/test/router/Router.t.sol +++ b/contracts/src/v0.8/ccip/test/router/Router.t.sol @@ -13,7 +13,7 @@ import "../offRamp/EVM2EVMOffRampSetup.t.sol"; /// @notice #constructor contract Router_constructor is EVM2EVMOnRampSetup { function testConstructorSuccess() public { - assertEq("Router 1.0.0", s_sourceRouter.typeAndVersion()); + assertEq("Router 1.2.0", s_sourceRouter.typeAndVersion()); // owner assertEq(OWNER, s_sourceRouter.owner()); } @@ -379,8 +379,11 @@ contract Router_ccipSend is EVM2EVMOnRampSetup { } } +// @notice applyRampUpdates contract Router_applyRampUpdates is RouterSetup { + event OffRampRemoved(uint64 indexed sourceChainSelector, address offRamp); event OffRampAdded(uint64 indexed sourceChainSelector, address offRamp); + event OnRampSet(uint64 indexed destChainSelector, address onRamp); MaybeRevertMessageReceiver internal s_receiver; @@ -389,45 +392,220 @@ contract Router_applyRampUpdates is RouterSetup { s_receiver = new MaybeRevertMessageReceiver(false); } - function testOffRampDisable() public { - // Add ingress - Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0); - Router.OffRamp[] memory offRampUpdates = new Router.OffRamp[](1); - address offRamp = address(uint160(2)); - offRampUpdates[0] = Router.OffRamp(SOURCE_CHAIN_ID, offRamp); - s_sourceRouter.applyRampUpdates(onRampUpdates, new Router.OffRamp[](0), offRampUpdates); - assertEq(1, s_sourceRouter.getOffRamps().length); - Router.OffRamp[] memory gotOffRamps = s_sourceRouter.getOffRamps(); - assertEq(offRampUpdates[0].sourceChainSelector, gotOffRamps[0].sourceChainSelector); - assertEq(offRampUpdates[0].offRamp, gotOffRamps[0].offRamp); - // Remove ingress - s_sourceRouter.applyRampUpdates(onRampUpdates, offRampUpdates, new Router.OffRamp[](0)); - assertEq(0, s_sourceRouter.getOffRamps().length); + function assertOffRampRouteSucceeds(Router.OffRamp memory offRamp) internal { + changePrank(offRamp.offRamp); + + Client.Any2EVMMessage memory message = generateReceiverMessage(offRamp.sourceChainSelector); + vm.expectCall(address(s_receiver), abi.encodeWithSelector(IAny2EVMMessageReceiver.ccipReceive.selector, message)); + s_sourceRouter.routeMessage(message, GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver)); + } + + function assertOffRampRouteReverts(Router.OffRamp memory offRamp) internal { + changePrank(offRamp.offRamp); - // Disabled offramp should not be able to route. vm.expectRevert(IRouter.OnlyOffRamp.selector); - changePrank(offRamp); s_sourceRouter.routeMessage( - generateReceiverMessage(SOURCE_CHAIN_ID), + generateReceiverMessage(offRamp.sourceChainSelector), GAS_FOR_CALL_EXACT_CHECK, 100_000, address(s_receiver) ); + } + + function testFuzz_OffRampUpdates(Router.OffRamp[] memory offRamps) public { + // Test adding offRamps + s_sourceRouter.applyRampUpdates(new Router.OnRamp[](0), new Router.OffRamp[](0), offRamps); + + // There is no uniqueness guarantee on fuzz input, offRamps will not emit in case of a duplicate, + // hence cannot assert on number of offRamps event emissions, we need to use isOffRamp + for (uint256 i = 0; i < offRamps.length; ++i) { + assertTrue(s_sourceRouter.isOffRamp(offRamps[i].sourceChainSelector, offRamps[i].offRamp)); + } + + // Test removing offRamps + s_sourceRouter.applyRampUpdates(new Router.OnRamp[](0), s_sourceRouter.getOffRamps(), new Router.OffRamp[](0)); + + assertEq(0, s_sourceRouter.getOffRamps().length); + for (uint256 i = 0; i < offRamps.length; ++i) { + assertFalse(s_sourceRouter.isOffRamp(offRamps[i].sourceChainSelector, offRamps[i].offRamp)); + } + + // Testing removing and adding in same call + s_sourceRouter.applyRampUpdates(new Router.OnRamp[](0), new Router.OffRamp[](0), offRamps); + s_sourceRouter.applyRampUpdates(new Router.OnRamp[](0), offRamps, offRamps); + for (uint256 i = 0; i < offRamps.length; ++i) { + assertTrue(s_sourceRouter.isOffRamp(offRamps[i].sourceChainSelector, offRamps[i].offRamp)); + } + } + + function testOffRampUpdatesWithRouting() public { + // Explicitly construct chain selectors and ramp addresses so we have ramp uniqueness for the various test scenarios. + uint256 numberOfSelectors = 10; + uint64[] memory sourceChainSelectors = new uint64[](numberOfSelectors); + for (uint256 i = 0; i < numberOfSelectors; ++i) { + sourceChainSelectors[i] = uint64(i); + } + + uint256 numberOfOffRamps = 5; + address[] memory offRamps = new address[](numberOfOffRamps); + for (uint256 i = 0; i < numberOfOffRamps; ++i) { + offRamps[i] = address(uint160(i * 10)); + } + + // 1st test scenario: add offramps. + // Check all the offramps are added correctly, and can route messages. + Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0); + Router.OffRamp[] memory offRampUpdates = new Router.OffRamp[](numberOfSelectors * numberOfOffRamps); + + // Ensure there are multi-offramp source and multi-source offramps + for (uint256 i = 0; i < numberOfSelectors; ++i) { + for (uint256 j = 0; j < numberOfOffRamps; ++j) { + offRampUpdates[(i * numberOfOffRamps) + j] = Router.OffRamp(sourceChainSelectors[i], offRamps[j]); + } + } + + for (uint256 i = 0; i < offRampUpdates.length; ++i) { + vm.expectEmit(); + emit OffRampAdded(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp); + } + s_sourceRouter.applyRampUpdates(onRampUpdates, new Router.OffRamp[](0), offRampUpdates); + + Router.OffRamp[] memory gotOffRamps = s_sourceRouter.getOffRamps(); + assertEq(offRampUpdates.length, gotOffRamps.length); + + for (uint256 i = 0; i < offRampUpdates.length; ++i) { + assertEq(offRampUpdates[i].offRamp, gotOffRamps[i].offRamp); + assertTrue(s_sourceRouter.isOffRamp(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp)); + assertOffRampRouteSucceeds(offRampUpdates[i]); + } + changePrank(OWNER); - // Re-enabling should succeed + // 2nd test scenario: partially remove existing offramps, add new offramps. + // Check offramps are removed correctly. Removed offramps cannot route messages. + // Check new offramps are added correctly. New offramps can route messages. + // Check unmodified offramps remain correct, and can still route messages. + uint256 numberOfPartialUpdates = offRampUpdates.length / 2; + Router.OffRamp[] memory partialOffRampRemoves = new Router.OffRamp[](numberOfPartialUpdates); + Router.OffRamp[] memory partialOffRampAdds = new Router.OffRamp[](numberOfPartialUpdates); + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + partialOffRampRemoves[i] = offRampUpdates[i]; + partialOffRampAdds[i] = Router.OffRamp({ + sourceChainSelector: offRampUpdates[i].sourceChainSelector, + offRamp: address(uint160(offRampUpdates[i].offRamp) + 1e18) // Ensure unique new offRamps addresses + }); + } + + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + vm.expectEmit(); + emit OffRampRemoved(partialOffRampRemoves[i].sourceChainSelector, partialOffRampRemoves[i].offRamp); + } + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + vm.expectEmit(); + emit OffRampAdded(partialOffRampAdds[i].sourceChainSelector, partialOffRampAdds[i].offRamp); + } + s_sourceRouter.applyRampUpdates(onRampUpdates, partialOffRampRemoves, partialOffRampAdds); + + gotOffRamps = s_sourceRouter.getOffRamps(); + assertEq(offRampUpdates.length, gotOffRamps.length); + + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + assertFalse( + s_sourceRouter.isOffRamp(partialOffRampRemoves[i].sourceChainSelector, partialOffRampRemoves[i].offRamp) + ); + assertOffRampRouteReverts(partialOffRampRemoves[i]); + + assertTrue(s_sourceRouter.isOffRamp(partialOffRampAdds[i].sourceChainSelector, partialOffRampAdds[i].offRamp)); + assertOffRampRouteSucceeds(partialOffRampAdds[i]); + } + for (uint256 i = numberOfPartialUpdates; i < offRampUpdates.length; ++i) { + assertTrue(s_sourceRouter.isOffRamp(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp)); + assertOffRampRouteSucceeds(offRampUpdates[i]); + } + + changePrank(OWNER); + + // 3rd test scenario: remove all offramps. + // Check all offramps have been removed, no offramp is able to route messages. + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + vm.expectEmit(); + emit OffRampRemoved(partialOffRampAdds[i].sourceChainSelector, partialOffRampAdds[i].offRamp); + } + s_sourceRouter.applyRampUpdates(onRampUpdates, partialOffRampAdds, new Router.OffRamp[](0)); + + uint256 numberOfRemainingOfframps = offRampUpdates.length - numberOfPartialUpdates; + Router.OffRamp[] memory remainingOffRampRemoves = new Router.OffRamp[](numberOfRemainingOfframps); + for (uint256 i = 0; i < numberOfRemainingOfframps; ++i) { + remainingOffRampRemoves[i] = offRampUpdates[i + numberOfPartialUpdates]; + } + + for (uint256 i = 0; i < numberOfRemainingOfframps; ++i) { + vm.expectEmit(); + emit OffRampRemoved(remainingOffRampRemoves[i].sourceChainSelector, remainingOffRampRemoves[i].offRamp); + } + s_sourceRouter.applyRampUpdates(onRampUpdates, remainingOffRampRemoves, new Router.OffRamp[](0)); + + // Check there are no offRamps. + assertEq(0, s_sourceRouter.getOffRamps().length); + + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + assertFalse(s_sourceRouter.isOffRamp(partialOffRampAdds[i].sourceChainSelector, partialOffRampAdds[i].offRamp)); + assertOffRampRouteReverts(partialOffRampAdds[i]); + } + for (uint256 i = 0; i < offRampUpdates.length; ++i) { + assertFalse(s_sourceRouter.isOffRamp(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp)); + assertOffRampRouteReverts(offRampUpdates[i]); + } + + changePrank(OWNER); + + // 4th test scenario: add initial onramps back. + // Check the offramps are added correctly, and can route messages. + // Check offramps that were not added back remain unset, and cannot route messages. + for (uint256 i = 0; i < offRampUpdates.length; ++i) { + vm.expectEmit(); + emit OffRampAdded(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp); + } s_sourceRouter.applyRampUpdates(onRampUpdates, new Router.OffRamp[](0), offRampUpdates); - assertEq(1, s_sourceRouter.getOffRamps().length); + + // Check initial offRamps are added back and can route to receiver. gotOffRamps = s_sourceRouter.getOffRamps(); - assertEq(offRampUpdates[0].sourceChainSelector, gotOffRamps[0].sourceChainSelector); - assertEq(offRampUpdates[0].offRamp, gotOffRamps[0].offRamp); - changePrank(offRamp); - s_sourceRouter.routeMessage( - generateReceiverMessage(SOURCE_CHAIN_ID), - GAS_FOR_CALL_EXACT_CHECK, - 100_000, - address(s_receiver) - ); + assertEq(offRampUpdates.length, gotOffRamps.length); + + for (uint256 i = 0; i < offRampUpdates.length; ++i) { + assertEq(offRampUpdates[i].offRamp, gotOffRamps[i].offRamp); + assertTrue(s_sourceRouter.isOffRamp(offRampUpdates[i].sourceChainSelector, offRampUpdates[i].offRamp)); + assertOffRampRouteSucceeds(offRampUpdates[i]); + } + + // Check offramps that were not added back remain unset. + for (uint256 i = 0; i < numberOfPartialUpdates; ++i) { + assertFalse(s_sourceRouter.isOffRamp(partialOffRampAdds[i].sourceChainSelector, partialOffRampAdds[i].offRamp)); + assertOffRampRouteReverts(partialOffRampAdds[i]); + } + } + + function testFuzz_OnRampUpdates(Router.OnRamp[] memory onRamps) public { + // Test adding onRamps + for (uint256 i = 0; i < onRamps.length; ++i) { + vm.expectEmit(); + emit OnRampSet(onRamps[i].destChainSelector, onRamps[i].onRamp); + } + + s_sourceRouter.applyRampUpdates(onRamps, new Router.OffRamp[](0), new Router.OffRamp[](0)); + + // Test setting onRamps to unsupported + for (uint256 i = 0; i < onRamps.length; ++i) { + onRamps[i].onRamp = address(0); + + vm.expectEmit(); + emit OnRampSet(onRamps[i].destChainSelector, onRamps[i].onRamp); + } + s_sourceRouter.applyRampUpdates(onRamps, new Router.OffRamp[](0), new Router.OffRamp[](0)); + for (uint256 i = 0; i < onRamps.length; ++i) { + assertEq(address(0), s_sourceRouter.getOnRamp(onRamps[i].destChainSelector)); + assertFalse(s_sourceRouter.isChainSupported(onRamps[i].destChainSelector)); + } } function testOnRampDisable() public { @@ -474,7 +652,7 @@ contract Router_applyRampUpdates is RouterSetup { offRampUpdates[0] = Router.OffRamp(SOURCE_CHAIN_ID, offRamp); - vm.expectRevert(Router.OffRampMismatch.selector); + vm.expectRevert(abi.encodeWithSelector(Router.OffRampMismatch.selector, SOURCE_CHAIN_ID, offRamp)); s_sourceRouter.applyRampUpdates(onRampUpdates, offRampUpdates, offRampUpdates); } } diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go index 833f308be7..e251aa41b9 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go @@ -139,8 +139,8 @@ type RateLimiterTokenBucket struct { } var EVM2EVMOnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b506040516200842a3803806200842a833981016040819052620000359162001e40565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c0826200077f565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b505050505050506200241a565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062002015565b60405180910390a150565b60005b81518110156200074d57600082828151811062000669576200066962002095565b60209081029190910181015160408051608080820183528385015163ffffffff9081168352838501516001600160401b03908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d90985294909620925183549451925195511515600160a01b0260ff60a01b199688166c010000000000000000000000000296909616600160601b600160a81b031993909716640100000000026001600160601b0319909516911617929092179190911692909217179055506200074581620020c1565b905062000648565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e816040516200063a9190620020dd565b60005b8151811015620008b3576000828281518110620007a357620007a362002095565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e909952959097209351845491519651975193518316600160701b0263ffffffff60701b199484166a01000000000000000000000263ffffffff60501b199990971668010000000000000000029890981665ffffffffffff60401b19978416640100000000026001600160401b03199093169190931617179490941693909317919091179190911691909117905550620008ab81620020c1565b905062000782565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e9816040516200063a91906200216c565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021f3565b60079062001025565b509050620009a860078262001043565b505080620009b69062002209565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002095565b6020026020010151600001519050600085838151811062000a085762000a0862002095565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002223565b935050508062000a9e90620020c1565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002243565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002095565b6020026020010151600001519050600084838151811062000b585762000b5862002095565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c4390620020c1565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002095565b6020026020010151600001519050600083838151811062000c955762000c9562002095565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f9190620022b0565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e0590620020c1565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022d0565b62000f5b9190620022ea565b905062000f6981876200230d565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe490620020c1565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001172919062002330565b6200117e91906200234a565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200236d565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002095565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021f3565b8554909150600090620014b290600190620021f3565b90508181146200151e576000866000018281548110620014d657620014d662002095565b9060005260206000200154905080876000018481548110620014fc57620014fc62002095565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200153257620015326200238b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023c7565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023e5565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b60405160a081016001600160401b03811182821017156200179857620017986200175d565b60405160c081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200185e576200185e6200175d565b604052919050565b6001600160a01b03811681146200187c57600080fd5b50565b80516200188c8162001866565b919050565b80516001600160401b03811681146200188c57600080fd5b600060e08284031215620018bc57600080fd5b620018c662001773565b90508151620018d58162001866565b8152620018e56020830162001891565b6020820152620018f86040830162001891565b60408201526200190b6060830162001891565b606082015260808201516001600160601b03811681146200192b57600080fd5b60808201526200193e60a083016200187f565b60a08201526200195160c083016200187f565b60c082015292915050565b805161ffff811681146200188c57600080fd5b805163ffffffff811681146200188c57600080fd5b600061014082840312156200199857600080fd5b620019a26200179e565b9050620019af826200187f565b8152620019bf602083016200195c565b6020820152620019d2604083016200196f565b6040820152620019e5606083016200195c565b6060820152620019f8608083016200196f565b608082015262001a0b60a083016200195c565b60a082015262001a1e60c083016200195c565b60c082015262001a3160e083016200187f565b60e082015261010062001a468184016200196f565b9082015261012062001a5a8382016200196f565b9082015292915050565b60006001600160401b0382111562001a805762001a806200175d565b5060051b60200190565b600082601f83011262001a9c57600080fd5b8151602062001ab562001aaf8362001a64565b62001833565b82815260069290921b8401810191818101908684111562001ad557600080fd5b8286015b8481101562001b2f576040818903121562001af45760008081fd5b62001afe620017c4565b815162001b0b8162001866565b81528185015162001b1c8162001866565b8186015283529183019160400162001ad9565b509695505050505050565b805180151581146200188c57600080fd5b80516001600160801b03811681146200188c57600080fd5b60006060828403121562001b7657600080fd5b604051606081016001600160401b038111828210171562001b9b5762001b9b6200175d565b60405290508062001bac8362001b3a565b815262001bbc6020840162001b4b565b602082015262001bcf6040840162001b4b565b60408201525092915050565b600082601f83011262001bed57600080fd5b8151602062001c0062001aaf8362001a64565b82815260a0928302850182019282820191908785111562001c2057600080fd5b8387015b8581101562001caf5781818a03121562001c3e5760008081fd5b62001c48620017e9565b815162001c558162001866565b815262001c648287016200196f565b86820152604062001c7781840162001891565b90820152606062001c8a83820162001891565b90820152608062001c9d83820162001b3a565b90820152845292840192810162001c24565b5090979650505050505050565b600082601f83011262001cce57600080fd5b8151602062001ce162001aaf8362001a64565b82815260c0928302850182019282820191908785111562001d0157600080fd5b8387015b8581101562001caf5781818a03121562001d1f5760008081fd5b62001d296200180e565b815162001d368162001866565b815262001d458287016200196f565b86820152604062001d588184016200196f565b90820152606062001d6b8382016200195c565b90820152608062001d7e8382016200196f565b9082015260a062001d918382016200196f565b90820152845292840192810162001d05565b600082601f83011262001db557600080fd5b8151602062001dc862001aaf8362001a64565b82815260069290921b8401810191818101908684111562001de857600080fd5b8286015b8481101562001b2f576040818903121562001e075760008081fd5b62001e11620017c4565b815162001e1e8162001866565b815262001e2d8286016200195c565b8186015283529183019160400162001dec565b6000806000806000806000610300888a03121562001e5d57600080fd5b62001e698989620018a9565b965062001e7a8960e08a0162001984565b6102208901519096506001600160401b038082111562001e9957600080fd5b62001ea78b838c0162001a8a565b965062001eb98b6102408c0162001b63565b95506102a08a015191508082111562001ed157600080fd5b62001edf8b838c0162001bdb565b94506102c08a015191508082111562001ef757600080fd5b62001f058b838c0162001cbc565b93506102e08a015191508082111562001f1d57600080fd5b5062001f2c8a828b0162001da3565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f5e602084018261ffff169052565b50604081015162001f77604084018263ffffffff169052565b50606081015162001f8e606084018261ffff169052565b50608081015162001fa7608084018263ffffffff169052565b5060a081015162001fbe60a084018261ffff169052565b5060c081015162001fd560c084018261ffff169052565b5060e081015162001ff160e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f3b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020d657620020d6620020ab565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff1687860152858101516001600160401b03908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101620020fa565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c0909301929085019060010162002189565b818103818111156200101f576200101f620020ab565b6000816200221b576200221b620020ab565b506000190190565b63ffffffff818116838216019080821115620015795762001579620020ab565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b81811015620022a257845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200226e565b509098975050505050505050565b600060208284031215620022c357600080fd5b81516200105a8162001866565b80820281158282048414176200101f576200101f620020ab565b6000826200230857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b03828116828216039080821115620015795762001579620020ab565b6000602082840312156200234357600080fd5b5051919050565b8181036000831280158383131683831282161715620015795762001579620020ab565b6000602082840312156200238057600080fd5b6200105a8262001b3a565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023be578181015183820152602001620023a4565b50506000910152565b60008251620023db818460208701620023a1565b9190910192915050565b602081526000825180602084015262002406816040850160208701620023a1565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615f0962002521600039600081816103340152818161147a0152613d720152600081816103050152818161139c01528181611404015281816119e301528181611a4b0152613d4301526000818161027101528181610b1c01528181611de20152613caf01526000818161024101528181611b160152613c7f01526000818161021201528181610eeb0152818161178e0152818161188f0152818161239201528181612fa5015281816132050152613c500152600081816102d10152818161195b0152613d0f0152600081816102a1015281816125100152613cdf01526000611f290152615f096000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379ba5097116100f9578063c92b283211610097578063e687b40a11610071578063e687b40a1461092b578063eff7cc481461093e578063f25561fd14610946578063f2fde38b1461095957600080fd5b8063c92b2832146108fb578063d09dc3391461090e578063d3c7c2c71461091657600080fd5b80638da5cb5b116100d35780638da5cb5b146107bc5780639a113c36146107cd578063a7d3e02f146108d2578063b06d41bc146108e557600080fd5b806379ba50971461078e5780637ec7575114610796578063856c8247146107a957600080fd5b8063549e946f116101665780635d86f141116101405780635d86f141146105e6578063704b6c02146105f95780637437ff9f1461060c57806376f6ae761461077b57600080fd5b8063549e946f1461058e57806354b71468146105a1578063599f6431146105c157600080fd5b806338724a95116101a257806338724a95146104d35780633a87ac53146104f45780634120fccd14610509578063546719cd1461052a57600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a771461048a575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103719190614a26565b60405180910390f35b61043c610388366004614ac7565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000090920416608082015290565b6040516103719190815163ffffffff908116825260208084015182169083015260408084015161ffff1690830152606080840151821690830152608092830151169181019190915260a00190565b6104c66040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614b52565b6104e66104e1366004614b77565b61096c565b604051908152602001610371565b610507610502366004614d82565b610d92565b005b610511610da8565b60405167ffffffffffffffff9091168152602001610371565b610532610ddc565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61050761059c366004614de6565b610e8c565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b6105ce6105f4366004614ac7565b611041565b610507610607366004614ac7565b6110a0565b61076e6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614efa565b610507610789366004614f09565b61116a565b610507611222565b6105076107a4366004614fad565b611305565b6105116107b7366004614ac7565b61136e565b6000546001600160a01b03166105ce565b6108886107db366004614ac7565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600d60209081526040918290208251608081018452905463ffffffff8116825267ffffffffffffffff64010000000082048116938301939093526c0100000000000000000000000081049092169281019290925260ff74010000000000000000000000000000000000000000909104161515606082015290565b60408051825163ffffffff16815260208084015167ffffffffffffffff90811691830191909152838301511691810191909152606091820151151591810191909152608001610371565b6104e66108e03660046150bd565b611476565b6108ed611f9b565b60405161037192919061516b565b6105076109093660046151bb565b61209f565b6104e6612107565b61091e612111565b6040516103719190615229565b610507610939366004615276565b6121c2565b6105076121d3565b610507610954366004615354565b61246a565b610507610967366004614ac7565b6124d0565b60008061098461097f6080850185615447565b6124e1565b90506109af6109966020850185615447565b83519091506109a860408701876154ac565b90506125d5565b6000600d816109c46080870160608801614ac7565b6001600160a01b0316815260208082019290925260409081016000208151608081018352905463ffffffff81168252640100000000810467ffffffffffffffff908116948301949094526c010000000000000000000000008104909316918101919091527401000000000000000000000000000000000000000090910460ff16151560608201819052909150610aa757610a646080850160608601614ac7565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610ad56080890160608a01614ac7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b849190615540565b9092509050806000808080610b9c60408c018c6154ac565b90501115610bd657610bca610bb760808c0160608d01614ac7565b87610bc560408e018e6154ac565b6126fe565b91945092509050610bf2565b8651610bef9063ffffffff16662386f26fc100006155a2565b92505b6040870151610c0b9067ffffffffffffffff16846155a2565b60208881015160055492955060009267ffffffffffffffff9091169163ffffffff8616917a010000000000000000000000000000000000000000000000000000900461ffff1690610c5e908f018f615447565b610c699291506155a2565b6005548c51610c9891760100000000000000000000000000000000000000000000900463ffffffff16906155b9565b610ca291906155b9565b610cac91906155b9565b610cb691906155a2565b610cd0906dffffffffffffffffffffffffffff87166155a2565b60065490915060009062010000900461ffff1615610d44576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610d40818e8060200190610d269190615447565b90508f8060400190610d3891906154ac565b905087612a08565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610d6e84886155b9565b610d7891906155b9565b610d8291906155cc565b9c9b505050505050505050505050565b610d9a612ada565b610da48282612b50565b5050565b601054600090610dd790700100000000000000000000000000000000900467ffffffffffffffff166001615607565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610dd790612eb0565b6000546001600160a01b03163314801590610eb257506002546001600160a01b03163314155b15610ee9576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f3057506001600160a01b038116155b15610f67576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f71612f62565b1215610fa9576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610da49082906001600160a01b038516906370a0823190602401602060405180830381865afa15801561100c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110309190615628565b6001600160a01b0385169190613022565b600061104e600a836130a2565b61108f576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b61109a600a836130b7565b92915050565b6000546001600160a01b031633148015906110c657506002546001600160a01b03163314155b156110fd576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061119057506002546001600160a01b03163314155b156111c7576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da48282808060200260200160405190810160405280939291908181526020016000905b828210156112185761120960408302860136819003810190615641565b815260200190600101906111ec565b50505050506130cc565b6001546001600160a01b03163314611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a9e565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331480159061132b57506002546001600160a01b03163314155b15611362576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b8161333f565b50565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff16801580156113c757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561109a576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f9190615680565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061569d565b15611531576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611571576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b031633146115b5576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115bf8480615447565b9050602014611606576115d28480615447565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610a9e929190615703565b60006116128580615447565b81019061161f9190615717565b90506001600160a01b038111806116365750600a81105b15611645576115d28580615447565b600061165761097f6080880188615447565b519050600061166960408801886154ac565b9150611686905061167d6020890189615447565b905083836125d5565b80156117845760005b81811015611707576116a460408901896154ac565b828181106116b4576116b4615730565b905060400201602001356000036116f7576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117008161575f565b905061168f565b5061178461171860408901896154ac565b808060200260200160405190810160405280939291908181526020016000905b828210156117645761175560408302860136819003810190615797565b81526020019060010190611738565b505060065464010000000090046001600160a01b03169250613505915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166117be6080890160608a01614ac7565b6001600160a01b03160361182257601080548791906000906117ef9084906bffffffffffffffffffffffff166157d1565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611949565b60065464010000000090046001600160a01b03166241e5be61184a60808a0160608b01614ac7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156118d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fa9190615628565b6010805460009061191a9084906bffffffffffffffffffffffff166157d1565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156119b6576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611a0e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611b06576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611a92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab69190615680565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611b83906157f6565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611be291166157f6565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611c1760808b0160608c01614ac7565b6001600160a01b03168152602001888152602001898060200190611c3b9190615447565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611c8260408b018b6154ac565b808060200260200160405190810160405280939291908181526020016000905b82821015611cce57611cbf60408302860136819003810190615797565b81526020019060010190611ca2565b505050505081526020018367ffffffffffffffff811115611cf157611cf1614bac565b604051908082528060200260200182016040528015611d2457816020015b6060815260200190600190039081611d0f5790505b508152600060209091018190529091505b82811015611f22576000611d4c60408b018b6154ac565b83818110611d5c57611d5c615730565b905060400201803603810190611d729190615797565b90506000611d838260000151611041565b6001600160a01b031663968754458a611d9c8e80615447565b60208088015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611e0a959493927f00000000000000000000000000000000000000000000000000000000000000009160040161581d565b6000604051808303816000875af1158015611e29573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e6f9190810190615875565b82516001600160a01b03166000908152600e602052604090205481519192506e010000000000000000000000000000900463ffffffff161015611eec5781516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a9e565b808461016001518481518110611f0457611f04615730565b6020026020010181905250505080611f1b9061575f565b9050611d35565b50611f4d817f00000000000000000000000000000000000000000000000000000000000000006136c0565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611f839083906159c0565b60405180910390a16101800151979650505050505050565b6060600080611faa6007613839565b90508067ffffffffffffffff811115611fc557611fc5614bac565b60405190808252806020026020018201604052801561200a57816020015b6040805180820190915260008082526020820152815260200190600190039081611fe35790505b50925060005b8181101561207c57600080612026600784613844565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061205e5761205e615730565b60200260200101819052505050806120759061575f565b9050612010565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906120c557506002546001600160a01b03163314155b156120fc576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b600382613862565b6000610dd7612f62565b6060600061211f600a613a3a565b67ffffffffffffffff81111561213757612137614bac565b604051908082528060200260200182016040528015612160578160200160208202803683370190505b50905060005b81518110156121bc5761217a600a82613a45565b5082828151811061218d5761218d615730565b60200260200101816001600160a01b03166001600160a01b031681525050806121b59061575f565b9050612166565b50919050565b6121ca612ada565b61136b81613a54565b6000546001600160a01b031633148015906121f957506002546001600160a01b03163314155b801561220d575061220b600733613dac565b155b15612244576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff166000819003612298576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff16818110156122e3576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122ed612f62565b1215612325576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006123326007613839565b905060005b818110156124275760008061234d600784613844565b909250905060008761236d836bffffffffffffffffffffffff8a166155a2565b61237791906155cc565b90506123838187615b13565b95506123c76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff8416613022565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806124209061575f565b9050612337565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b6000546001600160a01b0316331480159061249057506002546001600160a01b03163314155b156124c7576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b81613dc1565b6124d8612ada565b61136b81613f4c565b60408051602081019091526000815260008290036125375750604080516020810190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815261109a565b7f97a657c9000000000000000000000000000000000000000000000000000000006125628385615b38565b7fffffffff0000000000000000000000000000000000000000000000000000000016146125bb576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125c88260048186615b80565b81019061146f9190615baa565b6006547801000000000000000000000000000000000000000000000000900463ffffffff168084111561263e576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610a9e565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff168311156126a0576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff168211156126f8576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808083815b818110156129fc57600087878381811061272157612721615730565b9050604002018036038101906127379190615797565b80516001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000090920481166080830152825192935090916127d491600a91906130a216565b6128185781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a9e565b604081015160009061ffff161561293c5760008c6001600160a01b031684600001516001600160a01b0316146128df5760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa1580156128b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d89190615bec565b90506128e2565b508a5b620186a0836040015161ffff166129248660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661402790919063ffffffff16565b61292e91906155a2565b61293891906155cc565b9150505b606082015161294b9088615c07565b965081608001518661295d9190615c07565b825190965060009061297c9063ffffffff16662386f26fc100006155a2565b90508082101561299b57612990818a6155b9565b9850505050506129ec565b6000836020015163ffffffff16662386f26fc100006129ba91906155a2565b9050808311156129da576129ce818b6155b9565b995050505050506129ec565b6129e4838b6155b9565b995050505050505b6129f58161575f565b9050612705565b50509450945094915050565b60008063ffffffff8316612a1d6080866155a2565b612a29876102206155b9565b612a3391906155b9565b612a3d91906155b9565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612a7f9061ffff16846155a2565b612a8991906155b9565b60065490915062010000900461ffff16612ab36dffffffffffffffffffffffffffff8916836155a2565b612abd91906155a2565b612acd90655af3107a40006155a2565b925050505b949350505050565b6000546001600160a01b03163314612b4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a9e565b565b60005b8251811015612cb1576000838281518110612b7057612b70615730565b60200260200101516000015190506000848381518110612b9257612b92615730565b6020026020010151602001519050612bb482600a6130a290919063ffffffff16565b612bf5576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b6001600160a01b038116612c0a600a846130b7565b6001600160a01b031614612c4a576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c55600a83614064565b15612c9e57604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612caa9061575f565b9050612b53565b5060005b8151811015612eab576000828281518110612cd257612cd2615730565b60200260200101516000015190506000838381518110612cf457612cf4615730565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612d2a57506001600160a01b038116155b15612d61576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dc39190615c24565b6001600160a01b0316826001600160a01b031614612e0d576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e19600a8383614079565b15612e6657604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1612e98565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612ea49061575f565b9050612cb5565b505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152612f3e82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612f229190615c41565b85608001516fffffffffffffffffffffffffffffffff1661408f565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612ff4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130189190615628565b610dd79190615c54565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612eab9084906140b7565b600061146f836001600160a01b0384166141b6565b600061146f836001600160a01b0384166141c2565b80516040811115613109576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1615801590613157575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b15613164576131646121d3565b60006131706007613839565b90505b80156131b2576000613191613189600184615c41565b600790613844565b50905061319f6007826141ce565b5050806131ab90615c74565b9050613173565b506000805b828110156132c05760008482815181106131d3576131d3615730565b602002602001015160000151905060008583815181106131f5576131f5615730565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061324a57506001600160a01b038216155b1561328c576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b61329c60078361ffff84166141e3565b506132ab61ffff821685615c07565b93505050806132b99061575f565b90506131b7565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906133329083908690615ca9565b60405180910390a1505050565b60005b81518110156134d557600082828151811061335f5761335f615730565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e9099529590972093518454915196519751935183166e010000000000000000000000000000027fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff9484166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff999097166801000000000000000002989098167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff978416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090931691909316171794909416939093179190911791909116919091179055506134ce8161575f565b9050613342565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e98160405161115f9190615cc8565b81516000805b828110156136b2576000846001600160a01b031663d02641a087848151811061353657613536615730565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561359d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c19190615d4d565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613646578582815181106135fc576135fc615730565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a9e565b61369486838151811061365b5761365b615730565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661402790919063ffffffff16565b61369e90846155b9565b925050806136ab9061575f565b905061350b565b506126f860038260006141f9565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016137569897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161378f9190615d80565b604051602081830303815290604052805190602001208761016001516040516020016137bb9190615d93565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b600061109a82614548565b60008080806138538686614553565b909450925050505b9250929050565b815460009061388b90700100000000000000000000000000000000900463ffffffff1642615c41565b9050801561392d57600183015483546138d3916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661408f565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613953916fffffffffffffffffffffffffffffffff908116911661457e565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906133329084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b600061109a82613839565b60008080806138538686613844565b60e08101516001600160a01b0316613a98576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152508260405161115f929190615da6565b600061146f836001600160a01b038416614594565b60005b8151811015613f1c576000828281518110613de157613de1615730565b60209081029190910181015160408051608080820183528385015163ffffffff90811683528385015167ffffffffffffffff908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d9098529490962092518354945192519551151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9688166c0100000000000000000000000002969096167fffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff93909716640100000000027fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090951691161792909217919091169290921717905550613f158161575f565b9050613dc4565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e8160405161115f9190615e30565b336001600160a01b03821603613fbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a9e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a764000061405a837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166155a2565b61146f91906155cc565b600061146f836001600160a01b0384166145a0565b6000612ad2846001600160a01b038516846145ac565b60006140ae8561409f84866155a2565b6140a990876155b9565b61457e565b95945050505050565b600061410c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145c29092919063ffffffff16565b805190915015612eab578080602001905181019061412a919061569d565b612eab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a9e565b600061146f8383614594565b600061146f83836145d1565b600061146f836001600160a01b03841661465b565b6000612ad2846001600160a01b03851684614678565b825474010000000000000000000000000000000000000000900460ff161580614220575081155b1561422a57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061427090700100000000000000000000000000000000900463ffffffff1642615c41565b9050801561433057818311156142b2576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142ec9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661408f565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156143cd576001600160a01b038416614382576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a9e565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a9e565b848310156144c65760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906144119082615c41565b61441b878a615c41565b61442591906155b9565b61442f91906155cc565b90506001600160a01b03861661447b576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a9e565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a9e565b6144d08584615c41565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600061109a82614695565b60008080614561858561469f565b600081815260029690960160205260409095205494959350505050565b600081831061458d578161146f565b5090919050565b600061146f83836146ab565b600061146f838361465b565b6000612ad284846001600160a01b038516614678565b6060612ad284846000856146c3565b6000818152600283016020526040812054801515806145f557506145f58484614594565b61146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610a9e565b6000818152600283016020526040812081905561146f83836147c4565b60008281526002840160205260408120829055612ad284846147d0565b600061109a825490565b600061146f83836147dc565b6000818152600183016020526040812054151561146f565b606082471015614755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a9e565b600080866001600160a01b031685876040516147719190615eb1565b60006040518083038185875af1925050503d80600081146147ae576040519150601f19603f3d011682016040523d82523d6000602084013e6147b3565b606091505b5091509150612acd87838387614806565b600061146f8383614899565b600061146f8383614993565b60008260000182815481106147f3576147f3615730565b9060005260206000200154905092915050565b6060831561488f578251600003614888576001600160a01b0385163b614888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a9e565b5081612ad2565b612ad283836149e2565b600081815260018301602052604081205480156149825760006148bd600183615c41565b85549091506000906148d190600190615c41565b90508181146149365760008660000182815481106148f1576148f1615730565b906000526020600020015490508087600001848154811061491457614914615730565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061494757614947615ecd565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061109a565b600091505061109a565b5092915050565b60008181526001830160205260408120546149da5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561109a565b50600061109a565b8151156149f25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e9190614b52565b60e0810161109a82846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b038116811461136b57600080fd5b8035614ac281614aa2565b919050565b600060208284031215614ad957600080fd5b813561146f81614aa2565b60005b83811015614aff578181015183820152602001614ae7565b50506000910152565b60008151808452614b20816020860160208601614ae4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061146f6020830184614b08565b600060a082840312156121bc57600080fd5b600060208284031215614b8957600080fd5b813567ffffffffffffffff811115614ba057600080fd5b612ad284828501614b65565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614bfe57614bfe614bac565b60405290565b60405160c0810167ffffffffffffffff81118282101715614bfe57614bfe614bac565b604051610140810167ffffffffffffffff81118282101715614bfe57614bfe614bac565b60405160a0810167ffffffffffffffff81118282101715614bfe57614bfe614bac565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614cb557614cb5614bac565b604052919050565b600067ffffffffffffffff821115614cd757614cd7614bac565b5060051b60200190565b600082601f830112614cf257600080fd5b81356020614d07614d0283614cbd565b614c6e565b82815260069290921b84018101918181019086841115614d2657600080fd5b8286015b84811015614d775760408189031215614d435760008081fd5b614d4b614bdb565b8135614d5681614aa2565b815281850135614d6581614aa2565b81860152835291830191604001614d2a565b509695505050505050565b60008060408385031215614d9557600080fd5b823567ffffffffffffffff80821115614dad57600080fd5b614db986838701614ce1565b93506020850135915080821115614dcf57600080fd5b50614ddc85828601614ce1565b9150509250929050565b60008060408385031215614df957600080fd5b8235614e0481614aa2565b91506020830135614e1481614aa2565b809150509250929050565b80516001600160a01b031682526020810151614e41602084018261ffff169052565b506040810151614e59604084018263ffffffff169052565b506060810151614e6f606084018261ffff169052565b506080810151614e87608084018263ffffffff169052565b5060a0810151614e9d60a084018261ffff169052565b5060c0810151614eb360c084018261ffff169052565b5060e0810151614ece60e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff8116848301526126f8565b610140810161109a8284614e1f565b60008060208385031215614f1c57600080fd5b823567ffffffffffffffff80821115614f3457600080fd5b818501915085601f830112614f4857600080fd5b813581811115614f5757600080fd5b8660208260061b8501011115614f6c57600080fd5b60209290920196919550909350505050565b63ffffffff8116811461136b57600080fd5b8035614ac281614f7e565b803561ffff81168114614ac257600080fd5b60006020808385031215614fc057600080fd5b823567ffffffffffffffff811115614fd757600080fd5b8301601f81018513614fe857600080fd5b8035614ff6614d0282614cbd565b81815260c0918202830184019184820191908884111561501557600080fd5b938501935b838510156150b15780858a0312156150325760008081fd5b61503a614c04565b853561504581614aa2565b81528587013561505481614f7e565b8188015260408681013561506781614f7e565b908201526060615078878201614f9b565b9082015260808681013561508b81614f7e565b9082015260a08681013561509e81614f7e565b908201528352938401939185019161501a565b50979650505050505050565b6000806000606084860312156150d257600080fd5b833567ffffffffffffffff8111156150e957600080fd5b6150f586828701614b65565b93505060208401359150604084013561510d81614aa2565b809150509250925092565b600081518084526020808501945080840160005b8381101561516057815180516001600160a01b0316885283015161ffff16838801526040909601959082019060010161512c565b509495945050505050565b60408152600061517e6040830185615118565b90508260208301529392505050565b801515811461136b57600080fd5b80356fffffffffffffffffffffffffffffffff81168114614ac257600080fd5b6000606082840312156151cd57600080fd5b6040516060810181811067ffffffffffffffff821117156151f0576151f0614bac565b60405282356151fe8161518d565b815261520c6020840161519b565b602082015261521d6040840161519b565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b8181101561526a5783516001600160a01b031683529284019291840191600101615245565b50909695505050505050565b6000610140828403121561528957600080fd5b615291614c27565b61529a83614ab7565b81526152a860208401614f9b565b60208201526152b960408401614f90565b60408201526152ca60608401614f9b565b60608201526152db60808401614f90565b60808201526152ec60a08401614f9b565b60a08201526152fd60c08401614f9b565b60c082015261530e60e08401614ab7565b60e0820152610100615321818501614f90565b90820152610120615333848201614f90565b908201529392505050565b67ffffffffffffffff8116811461136b57600080fd5b6000602080838503121561536757600080fd5b823567ffffffffffffffff81111561537e57600080fd5b8301601f8101851361538f57600080fd5b803561539d614d0282614cbd565b81815260a091820283018401918482019190888411156153bc57600080fd5b938501935b838510156150b15780858a0312156153d95760008081fd5b6153e1614c4b565b85356153ec81614aa2565b8152858701356153fb81614f7e565b8188015260408681013561540e8161533e565b908201526060868101356154218161533e565b908201526080868101356154348161518d565b90820152835293840193918501916153c1565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261547c57600080fd5b83018035915067ffffffffffffffff82111561549757600080fd5b60200191503681900382131561385b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126154e157600080fd5b83018035915067ffffffffffffffff8211156154fc57600080fd5b6020019150600681901b360382131561385b57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614ac257600080fd5b6000806040838503121561555357600080fd5b61555c83615514565b915061556a60208401615514565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761109a5761109a615573565b8082018082111561109a5761109a615573565b600082615602577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561498c5761498c615573565b60006020828403121561563a57600080fd5b5051919050565b60006040828403121561565357600080fd5b61565b614bdb565b823561566681614aa2565b815261567460208401614f9b565b60208201529392505050565b60006020828403121561569257600080fd5b815161146f8161533e565b6000602082840312156156af57600080fd5b815161146f8161518d565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612ad26020830184866156ba565b60006020828403121561572957600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361579057615790615573565b5060010190565b6000604082840312156157a957600080fd5b6157b1614bdb565b82356157bc81614aa2565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561498c5761498c615573565b600067ffffffffffffffff80831681810361581357615813615573565b6001019392505050565b6001600160a01b038716815260a06020820152600061584060a0830187896156ba565b85604084015267ffffffffffffffff8516606084015282810360808401526158688185614b08565b9998505050505050505050565b60006020828403121561588757600080fd5b815167ffffffffffffffff8082111561589f57600080fd5b818401915084601f8301126158b357600080fd5b8151818111156158c5576158c5614bac565b6158f660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614c6e565b915080825285602082850101111561590d57600080fd5b61591e816020840160208601614ae4565b50949350505050565b600081518084526020808501945080840160005b8381101561516057815180516001600160a01b03168852830151838801526040909601959082019060010161593b565b600081518084526020808501808196508360051b8101915082860160005b858110156159b35782840389526159a1848351614b08565b98850198935090840190600101615989565b5091979650505050505050565b602081526159db60208201835167ffffffffffffffff169052565b600060208301516159f760408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a0830151615a4060c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615a73818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615aa16101c0860184614b08565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615ae08584615927565b945080880151925050610180818786030181880152615aff858461596b565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561498c5761498c615573565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615b785780818660040360031b1b83161692505b505092915050565b60008085851115615b9057600080fd5b83861115615b9d57600080fd5b5050820193919092039150565b600060208284031215615bbc57600080fd5b6040516020810181811067ffffffffffffffff82111715615bdf57615bdf614bac565b6040529135825250919050565b600060208284031215615bfe57600080fd5b61146f82615514565b63ffffffff81811683821601908082111561498c5761498c615573565b600060208284031215615c3657600080fd5b815161146f81614aa2565b8181038181111561109a5761109a615573565b818103600083128015838313168383128216171561498c5761498c615573565b600081615c8357615c83615573565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612ad26040830184615118565b602080825282518282018190526000919060409081850190868401855b828110156159b357815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c09093019290850190600101615ce5565b600060408284031215615d5f57600080fd5b615d67614bdb565b615d7083615514565b8152602083015161567481614f7e565b60208152600061146f6020830184615927565b60208152600061146f602083018461596b565b6102208101615e2382856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61146f60e0830184614e1f565b602080825282518282018190526000919060409081850190868401855b828110156159b357815180516001600160a01b031685528681015163ffffffff16878601528581015167ffffffffffffffff908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101615e4d565b60008251615ec3818460208701614ae4565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101806040523480156200001257600080fd5b506040516200849a3803806200849a833981016040819052620000359162001e40565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c0826200077f565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b505050505050506200241a565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062002015565b60405180910390a150565b60005b81518110156200074d57600082828151811062000669576200066962002095565b60209081029190910181015160408051608080820183528385015163ffffffff9081168352838501516001600160401b03908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d90985294909620925183549451925195511515600160a01b0260ff60a01b199688166c010000000000000000000000000296909616600160601b600160a81b031993909716640100000000026001600160601b0319909516911617929092179190911692909217179055506200074581620020c1565b905062000648565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e816040516200063a9190620020dd565b60005b8151811015620008b3576000828281518110620007a357620007a362002095565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e909952959097209351845491519651975193518316600160701b0263ffffffff60701b199484166a01000000000000000000000263ffffffff60501b199990971668010000000000000000029890981665ffffffffffff60401b19978416640100000000026001600160401b03199093169190931617179490941693909317919091179190911691909117905550620008ab81620020c1565b905062000782565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e9816040516200063a91906200216c565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021f3565b60079062001025565b509050620009a860078262001043565b505080620009b69062002209565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002095565b6020026020010151600001519050600085838151811062000a085762000a0862002095565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002223565b935050508062000a9e90620020c1565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002243565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002095565b6020026020010151600001519050600084838151811062000b585762000b5862002095565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c4390620020c1565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002095565b6020026020010151600001519050600083838151811062000c955762000c9562002095565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f9190620022b0565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e0590620020c1565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022d0565b62000f5b9190620022ea565b905062000f6981876200230d565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe490620020c1565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001172919062002330565b6200117e91906200234a565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200236d565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002095565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021f3565b8554909150600090620014b290600190620021f3565b90508181146200151e576000866000018281548110620014d657620014d662002095565b9060005260206000200154905080876000018481548110620014fc57620014fc62002095565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200153257620015326200238b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023c7565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023e5565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b60405160a081016001600160401b03811182821017156200179857620017986200175d565b60405160c081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200185e576200185e6200175d565b604052919050565b6001600160a01b03811681146200187c57600080fd5b50565b80516200188c8162001866565b919050565b80516001600160401b03811681146200188c57600080fd5b600060e08284031215620018bc57600080fd5b620018c662001773565b90508151620018d58162001866565b8152620018e56020830162001891565b6020820152620018f86040830162001891565b60408201526200190b6060830162001891565b606082015260808201516001600160601b03811681146200192b57600080fd5b60808201526200193e60a083016200187f565b60a08201526200195160c083016200187f565b60c082015292915050565b805161ffff811681146200188c57600080fd5b805163ffffffff811681146200188c57600080fd5b600061014082840312156200199857600080fd5b620019a26200179e565b9050620019af826200187f565b8152620019bf602083016200195c565b6020820152620019d2604083016200196f565b6040820152620019e5606083016200195c565b6060820152620019f8608083016200196f565b608082015262001a0b60a083016200195c565b60a082015262001a1e60c083016200195c565b60c082015262001a3160e083016200187f565b60e082015261010062001a468184016200196f565b9082015261012062001a5a8382016200196f565b9082015292915050565b60006001600160401b0382111562001a805762001a806200175d565b5060051b60200190565b600082601f83011262001a9c57600080fd5b8151602062001ab562001aaf8362001a64565b62001833565b82815260069290921b8401810191818101908684111562001ad557600080fd5b8286015b8481101562001b2f576040818903121562001af45760008081fd5b62001afe620017c4565b815162001b0b8162001866565b81528185015162001b1c8162001866565b8186015283529183019160400162001ad9565b509695505050505050565b805180151581146200188c57600080fd5b80516001600160801b03811681146200188c57600080fd5b60006060828403121562001b7657600080fd5b604051606081016001600160401b038111828210171562001b9b5762001b9b6200175d565b60405290508062001bac8362001b3a565b815262001bbc6020840162001b4b565b602082015262001bcf6040840162001b4b565b60408201525092915050565b600082601f83011262001bed57600080fd5b8151602062001c0062001aaf8362001a64565b82815260a0928302850182019282820191908785111562001c2057600080fd5b8387015b8581101562001caf5781818a03121562001c3e5760008081fd5b62001c48620017e9565b815162001c558162001866565b815262001c648287016200196f565b86820152604062001c7781840162001891565b90820152606062001c8a83820162001891565b90820152608062001c9d83820162001b3a565b90820152845292840192810162001c24565b5090979650505050505050565b600082601f83011262001cce57600080fd5b8151602062001ce162001aaf8362001a64565b82815260c0928302850182019282820191908785111562001d0157600080fd5b8387015b8581101562001caf5781818a03121562001d1f5760008081fd5b62001d296200180e565b815162001d368162001866565b815262001d458287016200196f565b86820152604062001d588184016200196f565b90820152606062001d6b8382016200195c565b90820152608062001d7e8382016200196f565b9082015260a062001d918382016200196f565b90820152845292840192810162001d05565b600082601f83011262001db557600080fd5b8151602062001dc862001aaf8362001a64565b82815260069290921b8401810191818101908684111562001de857600080fd5b8286015b8481101562001b2f576040818903121562001e075760008081fd5b62001e11620017c4565b815162001e1e8162001866565b815262001e2d8286016200195c565b8186015283529183019160400162001dec565b6000806000806000806000610300888a03121562001e5d57600080fd5b62001e698989620018a9565b965062001e7a8960e08a0162001984565b6102208901519096506001600160401b038082111562001e9957600080fd5b62001ea78b838c0162001a8a565b965062001eb98b6102408c0162001b63565b95506102a08a015191508082111562001ed157600080fd5b62001edf8b838c0162001bdb565b94506102c08a015191508082111562001ef757600080fd5b62001f058b838c0162001cbc565b93506102e08a015191508082111562001f1d57600080fd5b5062001f2c8a828b0162001da3565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f5e602084018261ffff169052565b50604081015162001f77604084018263ffffffff169052565b50606081015162001f8e606084018261ffff169052565b50608081015162001fa7608084018263ffffffff169052565b5060a081015162001fbe60a084018261ffff169052565b5060c081015162001fd560c084018261ffff169052565b5060e081015162001ff160e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f3b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020d657620020d6620020ab565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff1687860152858101516001600160401b03908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101620020fa565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c0909301929085019060010162002189565b818103818111156200101f576200101f620020ab565b6000816200221b576200221b620020ab565b506000190190565b63ffffffff818116838216019080821115620015795762001579620020ab565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b81811015620022a257845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200226e565b509098975050505050505050565b600060208284031215620022c357600080fd5b81516200105a8162001866565b80820281158282048414176200101f576200101f620020ab565b6000826200230857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b03828116828216039080821115620015795762001579620020ab565b6000602082840312156200234357600080fd5b5051919050565b8181036000831280158383131683831282161715620015795762001579620020ab565b6000602082840312156200238057600080fd5b6200105a8262001b3a565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023be578181015183820152602001620023a4565b50506000910152565b60008251620023db818460208701620023a1565b9190910192915050565b602081526000825180602084015262002406816040850160208701620023a1565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615f726200252860003960008181610334015281816116530152613dfb015260008181610305015281816114060152818161146e01528181611c3501528181611c9d0152613dcc0152600081816102710152818161097f01528181611790015281816120350152613d3801526000818161024101528181611d680152613d0801526000818161021201528181610fb4015281816119e001528181611ae1015281816123a301528181613090015281816132c60152613cd90152600081816102d101528181611bad0152613d980152600081816102a1015281816125d30152613d680152600061215e0152615f726000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379ba5097116100f9578063d09dc33911610097578063eff7cc4811610071578063eff7cc481461092d578063f25561fd14610935578063f2fde38b14610948578063fbca3b741461095b57600080fd5b8063d09dc339146108ff578063df0aa9e914610907578063e687b40a1461091a57600080fd5b80638da5cb5b116100d35780638da5cb5b146107c05780639a113c36146107d1578063b06d41bc146108d6578063c92b2832146108ec57600080fd5b806379ba5097146107925780637ec757511461079a578063856c8247146107ad57600080fd5b8063546719cd11610166578063599f643111610140578063599f6431146105ec578063704b6c02146105fd5780637437ff9f1461061057806376f6ae761461077f57600080fd5b8063546719cd14610555578063549e946f146105b957806354b71468146105cc57600080fd5b806320487ded116101a257806320487ded146104d35780633a87ac53146104f45780634120fccd1461050957806348a98aa41461052a57600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a771461048a575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103719190614ac2565b60405180910390f35b61043c610388366004614b63565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000090920416608082015290565b6040516103719190815163ffffffff908116825260208084015182169083015260408084015161ffff1690830152606080840151821690830152608092830151169181019190915260a00190565b6104c66040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614bd0565b6104e66104e1366004614c11565b61097b565b604051908152602001610371565b610507610502366004614e19565b610dfb565b005b610511610e11565b60405167ffffffffffffffff9091168152602001610371565b61053d610538366004614e73565b610e45565b6040516001600160a01b039091168152602001610371565b61055d610ea5565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6105076105c7366004614eac565b610f55565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b031661053d565b61050761060b366004614b63565b61110a565b6107726040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614fa5565b61050761078d366004614fb4565b6111d4565b61050761128c565b6105076107a8366004615058565b61136f565b6105116107bb366004614b63565b6113d8565b6000546001600160a01b031661053d565b61088c6107df366004614b63565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600d60209081526040918290208251608081018452905463ffffffff8116825267ffffffffffffffff64010000000082048116938301939093526c0100000000000000000000000081049092169281019290925260ff74010000000000000000000000000000000000000000909104161515606082015290565b60408051825163ffffffff16815260208084015167ffffffffffffffff90811691830191909152838301511691810191909152606091820151151591810191909152608001610371565b6108de6114d9565b6040516103719291906151bb565b6105076108fa36600461520b565b6115dd565b6104e6611645565b6104e6610915366004615279565b61164f565b6105076109283660046152e5565b6121d3565b6105076121e4565b6105076109433660046153ad565b61247b565b610507610956366004614b63565b6124e1565b61096e6109693660046154a0565b6124f2565b60405161037191906154bd565b60007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168367ffffffffffffffff16146109fb576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6000610a12610a0d608085018561550a565b6125a4565b519050610a3c610a25602085018561550a565b905082610a35604087018761556f565b9050612698565b6000600d81610a516080870160608801614b63565b6001600160a01b0316815260208082019290925260409081016000208151608081018352905463ffffffff81168252640100000000810467ffffffffffffffff908116948301949094526c010000000000000000000000008104909316918101919091527401000000000000000000000000000000000000000090910460ff16151560608201819052909150610b2f57610af16080850160608601614b63565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109f2565b600654600090819064010000000090046001600160a01b031663ffdb4b37610b5d6080890160608a01614b63565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff8a1660248201526044016040805180830381865afa158015610bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bec9190615603565b9092509050806000808080610c0460408c018c61556f565b90501115610c3e57610c32610c1f60808c0160608d01614b63565b87610c2d60408e018e61556f565b6127c1565b91945092509050610c5a565b8651610c579063ffffffff16662386f26fc10000615665565b92505b6040870151610c739067ffffffffffffffff1684615665565b60208881015160055492955060009267ffffffffffffffff9091169163ffffffff8616917a010000000000000000000000000000000000000000000000000000900461ffff1690610cc6908f018f61550a565b610cd1929150615665565b600554610cfe90760100000000000000000000000000000000000000000000900463ffffffff168d61567c565b610d08919061567c565b610d12919061567c565b610d1c9190615665565b610d36906dffffffffffffffffffffffffffff8716615665565b60065490915060009062010000900461ffff1615610daa576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610da6818e8060200190610d8c919061550a565b90508f8060400190610d9e919061556f565b905087612acb565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610dd4848861567c565b610dde919061567c565b610de8919061568f565b9a50505050505050505050505b92915050565b610e03612b9b565b610e0d8282612c11565b5050565b601054600090610e4090700100000000000000000000000000000000900467ffffffffffffffff1660016156ca565b905090565b6000610e52600a83612f71565b610e93576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016109f2565b610e9e600a83612f86565b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e4090612f9b565b6000546001600160a01b03163314801590610f7b57506002546001600160a01b03163314155b15610fb2576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610ff957506001600160a01b038116155b15611030576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061103a61304d565b1215611072576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e0d9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f991906156eb565b6001600160a01b038516919061310d565b6000546001600160a01b0316331480159061113057506002546001600160a01b03163314155b15611167576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b031633148015906111fa57506002546001600160a01b03163314155b15611231576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0d8282808060200260200160405190810160405280939291908181526020016000905b828210156112825761127360408302860136819003810190615704565b81526020019060010190611256565b505050505061318d565b6001546001600160a01b03163314611300576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109f2565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331480159061139557506002546001600160a01b03163314155b156113cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d581613400565b50565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561143157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15610df5576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9e9190615743565b60606000806114e860076135c6565b90508067ffffffffffffffff81111561150357611503614c61565b60405190808252806020026020018201604052801561154857816020015b60408051808201909152600080825260208201528152602001906001900390816115215790505b50925060005b818110156115ba576000806115646007846135d1565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061159c5761159c615760565b60200260200101819052505050806115b39061578f565b905061154e565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b0316331480159061160357506002546001600160a01b03163314155b1561163a576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d56003826135ef565b6000610e4061304d565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d391906157c7565b1561170a576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03821661174a576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b0316331461178e576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168567ffffffffffffffff1614611807576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016109f2565b611811848061550a565b905060201461185857611824848061550a565b6040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016109f292919061580f565b6000611864858061550a565b8101906118719190615823565b90506001600160a01b038111806118885750600a81105b1561189757611824858061550a565b60006118a9610a0d608088018861550a565b51905060006118bb604088018861556f565b91506118d890506118cf602089018961550a565b90508383612698565b80156119d65760005b81811015611959576118f6604089018961556f565b8281811061190657611906615760565b90506040020160200135600003611949576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119528161578f565b90506118e1565b506119d661196a604089018961556f565b808060200260200160405190810160405280939291908181526020016000905b828210156119b6576119a76040830286013681900381019061583c565b8152602001906001019061198a565b505060065464010000000090046001600160a01b031692506137c7915050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016611a106080890160608a01614b63565b6001600160a01b031603611a745760108054879190600090611a419084906bffffffffffffffffffffffff16615876565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611b9b565b60065464010000000090046001600160a01b03166241e5be611a9c60808a0160608b01614b63565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611b28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4c91906156eb565b60108054600090611b6c9084906bffffffffffffffffffffffff16615876565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611c08576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611c6057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611d58576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d089190615743565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611dd59061589b565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611e34911661589b565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611e6960808b0160608c01614b63565b6001600160a01b03168152602001888152602001898060200190611e8d919061550a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611ed460408b018b61556f565b808060200260200160405190810160405280939291908181526020016000905b82821015611f2057611f116040830286013681900381019061583c565b81526020019060010190611ef4565b505050505081526020018367ffffffffffffffff811115611f4357611f43614c61565b604051908082528060200260200182016040528015611f7657816020015b6060815260200190600190039081611f615790505b508152600060209091018190529091505b82811015612157576000611f9e60408b018b61556f565b83818110611fae57611fae615760565b905060400201803603810190611fc4919061583c565b90506000611fd68c8360000151610e45565b6001600160a01b031663968754458a611fef8e8061550a565b60208088015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b16815261205d959493927f0000000000000000000000000000000000000000000000000000000000000000916004016158c2565b6000604051808303816000875af115801561207c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120a4919081019061591a565b82516001600160a01b03166000908152600e602052604090205481519192506e010000000000000000000000000000900463ffffffff1610156121215781516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109f2565b80846101600151848151811061213957612139615760565b60200260200101819052505050806121509061578f565b9050611f87565b50612182817f0000000000000000000000000000000000000000000000000000000000000000613982565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd906121b8908390615a47565b60405180910390a1610180015193505050505b949350505050565b6121db612b9b565b6113d581613add565b6000546001600160a01b0316331480159061220a57506002546001600160a01b03163314155b801561221e575061221c600733613e35565b155b15612255576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1660008190036122a9576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff16818110156122f4576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006122fe61304d565b1215612336576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600061234360076135c6565b905060005b818110156124385760008061235e6007846135d1565b909250905060008761237e836bffffffffffffffffffffffff8a16615665565b612388919061568f565b90506123948187615b7c565b95506123d86001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff841661310d565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806124319061578f565b9050612348565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b6000546001600160a01b031633148015906124a157506002546001600160a01b03163314155b156124d8576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113d581613e4a565b6124e9612b9b565b6113d581613fd5565b60606000612500600a6140b0565b67ffffffffffffffff81111561251857612518614c61565b604051908082528060200260200182016040528015612541578160200160208202803683370190505b50905060005b815181101561259d5761255b600a826140bb565b5082828151811061256e5761256e615760565b60200260200101816001600160a01b03166001600160a01b031681525050806125969061578f565b9050612547565b5092915050565b60408051602081019091526000815260008290036125fa5750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152610df5565b7f97a657c9000000000000000000000000000000000000000000000000000000006126258385615ba1565b7fffffffff00000000000000000000000000000000000000000000000000000000161461267e576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61268b8260048186615be9565b810190610e9e9190615c13565b6006547801000000000000000000000000000000000000000000000000900463ffffffff1680841115612701576040517f8693378900000000000000000000000000000000000000000000000000000000815260048101829052602481018590526044016109f2565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16831115612763576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff168211156127bb576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808083815b81811015612abf5760008787838181106127e4576127e4615760565b9050604002018036038101906127fa919061583c565b80516001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e010000000000000000000000000000909204811660808301528251929350909161289791600a9190612f7116565b6128db5781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109f2565b604081015160009061ffff16156129ff5760008c6001600160a01b031684600001516001600160a01b0316146129a25760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612977573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061299b9190615c55565b90506129a5565b508a5b620186a0836040015161ffff166129e78660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140ca90919063ffffffff16565b6129f19190615665565b6129fb919061568f565b9150505b6060820151612a0e9088615c70565b9650816080015186612a209190615c70565b8251909650600090612a3f9063ffffffff16662386f26fc10000615665565b905080821015612a5e57612a53818a61567c565b985050505050612aaf565b6000836020015163ffffffff16662386f26fc10000612a7d9190615665565b905080831115612a9d57612a91818b61567c565b99505050505050612aaf565b612aa7838b61567c565b995050505050505b612ab88161578f565b90506127c8565b50509450945094915050565b60008063ffffffff8316612ae0608086615665565b612aec8761022061567c565b612af6919061567c565b612b00919061567c565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612b429061ffff1684615665565b612b4c919061567c565b60065490915062010000900461ffff16612b766dffffffffffffffffffffffffffff891683615665565b612b809190615665565b612b9090655af3107a4000615665565b979650505050505050565b6000546001600160a01b03163314612c0f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109f2565b565b60005b8251811015612d72576000838281518110612c3157612c31615760565b60200260200101516000015190506000848381518110612c5357612c53615760565b6020026020010151602001519050612c7582600a612f7190919063ffffffff16565b612cb6576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016109f2565b6001600160a01b038116612ccb600a84612f86565b6001600160a01b031614612d0b576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d16600a83614107565b15612d5f57604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612d6b9061578f565b9050612c14565b5060005b8151811015612f6c576000828281518110612d9357612d93615760565b60200260200101516000015190506000838381518110612db557612db5615760565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612deb57506001600160a01b038116155b15612e22576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190615c8d565b6001600160a01b0316826001600160a01b031614612ece576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612eda600a838361411c565b15612f2757604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1612f59565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612f659061578f565b9050612d76565b505050565b6000610e9e836001600160a01b038416614132565b6000610e9e836001600160a01b03841661413e565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261302982606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261300d9190615caa565b85608001516fffffffffffffffffffffffffffffffff1661414a565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156130df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310391906156eb565b610e409190615cbd565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612f6c908490614172565b805160408111156131ca576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1615801590613218575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b15613225576132256121e4565b600061323160076135c6565b90505b801561327357600061325261324a600184615caa565b6007906135d1565b509050613260600782614271565b50508061326c90615cdd565b9050613234565b506000805b8281101561338157600084828151811061329457613294615760565b602002602001015160000151905060008583815181106132b6576132b6615760565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061330b57506001600160a01b038216155b1561334d576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016109f2565b61335d60078361ffff8416614286565b5061336c61ffff821685615c70565b935050508061337a9061578f565b9050613278565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906133f39083908690615d12565b60405180910390a1505050565b60005b815181101561359657600082828151811061342057613420615760565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e9099529590972093518454915196519751935183166e010000000000000000000000000000027fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff9484166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff999097166801000000000000000002989098167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff978416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909316919093161717949094169390931791909117919091169190911790555061358f8161578f565b9050613403565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e9816040516111c99190615d31565b6000610df58261429c565b60008080806135e086866142a7565b909450925050505b9250929050565b815460009061361890700100000000000000000000000000000000900463ffffffff1642615caa565b905080156136ba5760018301548354613660916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661414a565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546136e0916fffffffffffffffffffffffffffffffff90811691166142d2565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906133f39084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b81516000805b82811015613974576000846001600160a01b031663d02641a08784815181106137f8576137f8615760565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561385f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138839190615db6565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613908578582815181106138be576138be615760565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109f2565b61395686838151811061391d5761391d615760565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166140ca90919063ffffffff16565b613960908461567c565b9250508061396d9061578f565b90506137cd565b506127bb60038260006142e8565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613a189897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613a519190615de9565b60405160208183030381529060405280519060200120876101600151604051602001613a7d9190615dfc565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60e08101516001600160a01b0316613b21576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250826040516111c9929190615e0f565b6000610e9e836001600160a01b038416614637565b60005b8151811015613fa5576000828281518110613e6a57613e6a615760565b60209081029190910181015160408051608080820183528385015163ffffffff90811683528385015167ffffffffffffffff908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d9098529490962092518354945192519551151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9688166c0100000000000000000000000002969096167fffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff93909716640100000000027fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090951691161792909217919091169290921717905550613f9e8161578f565b9050613e4d565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e816040516111c99190615e99565b336001600160a01b03821603614047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109f2565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000610df5826135c6565b60008080806135e086866135d1565b6000670de0b6b3a76400006140fd837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615665565b610e9e919061568f565b6000610e9e836001600160a01b038416614643565b60006121cb846001600160a01b0385168461464f565b6000610e9e8383614637565b6000610e9e8383614665565b60006141698561415a8486615665565b614164908761567c565b6142d2565b95945050505050565b60006141c7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146ef9092919063ffffffff16565b805190915015612f6c57808060200190518101906141e591906157c7565b612f6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016109f2565b6000610e9e836001600160a01b0384166146fe565b60006121cb846001600160a01b0385168461471b565b6000610df582614738565b600080806142b58585614742565b600081815260029690960160205260409095205494959350505050565b60008183106142e15781610e9e565b5090919050565b825474010000000000000000000000000000000000000000900460ff16158061430f575081155b1561431957505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061435f90700100000000000000000000000000000000900463ffffffff1642615caa565b9050801561441f57818311156143a1576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546143db9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661414a565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156144bc576001600160a01b038416614471576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016109f2565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016109f2565b848310156145b55760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906145009082615caa565b61450a878a615caa565b614514919061567c565b61451e919061568f565b90506001600160a01b03861661456a576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016109f2565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016109f2565b6145bf8584615caa565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610e9e838361474e565b6000610e9e83836146fe565b60006121cb84846001600160a01b03851661471b565b60008181526002830160205260408120548015158061468957506146898484614637565b610e9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b6579000060448201526064016109f2565b60606121cb8484600085614766565b60008181526002830160205260408120819055610e9e8383614867565b600082815260028401602052604081208290556121cb8484614873565b6000610df5825490565b6000610e9e838361487f565b60008181526001830160205260408120541515610e9e565b6060824710156147f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016109f2565b600080866001600160a01b031685876040516148149190615f1a565b60006040518083038185875af1925050503d8060008114614851576040519150601f19603f3d011682016040523d82523d6000602084013e614856565b606091505b5091509150612b90878383876148a9565b6000610e9e838361493c565b6000610e9e8383614a2f565b600082600001828154811061489657614896615760565b9060005260206000200154905092915050565b6060831561493257825160000361492b576001600160a01b0385163b61492b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109f2565b50816121cb565b6121cb8383614a7e565b60008181526001830160205260408120548015614a25576000614960600183615caa565b855490915060009061497490600190615caa565b90508181146149d957600086600001828154811061499457614994615760565b90600052602060002001549050808760000184815481106149b7576149b7615760565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806149ea576149ea615f36565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610df5565b6000915050610df5565b6000818152600183016020526040812054614a7657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610df5565b506000610df5565b815115614a8e5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f29190614bd0565b60e08101610df582846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146113d557600080fd5b8035614b5e81614b3e565b919050565b600060208284031215614b7557600080fd5b8135610e9e81614b3e565b60005b83811015614b9b578181015183820152602001614b83565b50506000910152565b60008151808452614bbc816020860160208601614b80565b601f01601f19169290920160200192915050565b602081526000610e9e6020830184614ba4565b67ffffffffffffffff811681146113d557600080fd5b600060a08284031215614c0b57600080fd5b50919050565b60008060408385031215614c2457600080fd5b8235614c2f81614be3565b9150602083013567ffffffffffffffff811115614c4b57600080fd5b614c5785828601614bf9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614cb357614cb3614c61565b60405290565b60405160c0810167ffffffffffffffff81118282101715614cb357614cb3614c61565b604051610140810167ffffffffffffffff81118282101715614cb357614cb3614c61565b60405160a0810167ffffffffffffffff81118282101715614cb357614cb3614c61565b604051601f8201601f1916810167ffffffffffffffff81118282101715614d4c57614d4c614c61565b604052919050565b600067ffffffffffffffff821115614d6e57614d6e614c61565b5060051b60200190565b600082601f830112614d8957600080fd5b81356020614d9e614d9983614d54565b614d23565b82815260069290921b84018101918181019086841115614dbd57600080fd5b8286015b84811015614e0e5760408189031215614dda5760008081fd5b614de2614c90565b8135614ded81614b3e565b815281850135614dfc81614b3e565b81860152835291830191604001614dc1565b509695505050505050565b60008060408385031215614e2c57600080fd5b823567ffffffffffffffff80821115614e4457600080fd5b614e5086838701614d78565b93506020850135915080821115614e6657600080fd5b50614c5785828601614d78565b60008060408385031215614e8657600080fd5b8235614e9181614be3565b91506020830135614ea181614b3e565b809150509250929050565b60008060408385031215614ebf57600080fd5b8235614e9181614b3e565b80516001600160a01b031682526020810151614eec602084018261ffff169052565b506040810151614f04604084018263ffffffff169052565b506060810151614f1a606084018261ffff169052565b506080810151614f32608084018263ffffffff169052565b5060a0810151614f4860a084018261ffff169052565b5060c0810151614f5e60c084018261ffff169052565b5060e0810151614f7960e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff8116848301526127bb565b6101408101610df58284614eca565b60008060208385031215614fc757600080fd5b823567ffffffffffffffff80821115614fdf57600080fd5b818501915085601f830112614ff357600080fd5b81358181111561500257600080fd5b8660208260061b850101111561501757600080fd5b60209290920196919550909350505050565b63ffffffff811681146113d557600080fd5b8035614b5e81615029565b803561ffff81168114614b5e57600080fd5b6000602080838503121561506b57600080fd5b823567ffffffffffffffff81111561508257600080fd5b8301601f8101851361509357600080fd5b80356150a1614d9982614d54565b81815260c091820283018401918482019190888411156150c057600080fd5b938501935b8385101561515c5780858a0312156150dd5760008081fd5b6150e5614cb9565b85356150f081614b3e565b8152858701356150ff81615029565b8188015260408681013561511281615029565b908201526060615123878201615046565b9082015260808681013561513681615029565b9082015260a08681013561514981615029565b90820152835293840193918501916150c5565b50979650505050505050565b600081518084526020808501945080840160005b838110156151b057815180516001600160a01b0316885283015161ffff16838801526040909601959082019060010161517c565b509495945050505050565b6040815260006151ce6040830185615168565b90508260208301529392505050565b80151581146113d557600080fd5b80356fffffffffffffffffffffffffffffffff81168114614b5e57600080fd5b60006060828403121561521d57600080fd5b6040516060810181811067ffffffffffffffff8211171561524057615240614c61565b604052823561524e816151dd565b815261525c602084016151eb565b602082015261526d604084016151eb565b60408201529392505050565b6000806000806080858703121561528f57600080fd5b843561529a81614be3565b9350602085013567ffffffffffffffff8111156152b657600080fd5b6152c287828801614bf9565b9350506040850135915060608501356152da81614b3e565b939692955090935050565b600061014082840312156152f857600080fd5b615300614cdc565b61530983614b53565b815261531760208401615046565b60208201526153286040840161503b565b604082015261533960608401615046565b606082015261534a6080840161503b565b608082015261535b60a08401615046565b60a082015261536c60c08401615046565b60c082015261537d60e08401614b53565b60e082015261010061539081850161503b565b908201526101206153a284820161503b565b908201529392505050565b600060208083850312156153c057600080fd5b823567ffffffffffffffff8111156153d757600080fd5b8301601f810185136153e857600080fd5b80356153f6614d9982614d54565b81815260a0918202830184019184820191908884111561541557600080fd5b938501935b8385101561515c5780858a0312156154325760008081fd5b61543a614d00565b853561544581614b3e565b81528587013561545481615029565b8188015260408681013561546781614be3565b9082015260608681013561547a81614be3565b9082015260808681013561548d816151dd565b908201528352938401939185019161541a565b6000602082840312156154b257600080fd5b8135610e9e81614be3565b6020808252825182820181905260009190848201906040850190845b818110156154fe5783516001600160a01b0316835292840192918401916001016154d9565b50909695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261553f57600080fd5b83018035915067ffffffffffffffff82111561555a57600080fd5b6020019150368190038213156135e857600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155a457600080fd5b83018035915067ffffffffffffffff8211156155bf57600080fd5b6020019150600681901b36038213156135e857600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614b5e57600080fd5b6000806040838503121561561657600080fd5b61561f836155d7565b915061562d602084016155d7565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610df557610df5615636565b80820180821115610df557610df5615636565b6000826156c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561259d5761259d615636565b6000602082840312156156fd57600080fd5b5051919050565b60006040828403121561571657600080fd5b61571e614c90565b823561572981614b3e565b815261573760208401615046565b60208201529392505050565b60006020828403121561575557600080fd5b8151610e9e81614be3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157c0576157c0615636565b5060010190565b6000602082840312156157d957600080fd5b8151610e9e816151dd565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6020815260006121cb6020830184866157e4565b60006020828403121561583557600080fd5b5035919050565b60006040828403121561584e57600080fd5b615856614c90565b823561586181614b3e565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561259d5761259d615636565b600067ffffffffffffffff8083168181036158b8576158b8615636565b6001019392505050565b6001600160a01b038716815260a0602082015260006158e560a0830187896157e4565b85604084015267ffffffffffffffff85166060840152828103608084015261590d8185614ba4565b9998505050505050505050565b60006020828403121561592c57600080fd5b815167ffffffffffffffff8082111561594457600080fd5b818401915084601f83011261595857600080fd5b81518181111561596a5761596a614c61565b61597d6020601f19601f84011601614d23565b915080825285602082850101111561599457600080fd5b6159a5816020840160208601614b80565b50949350505050565b600081518084526020808501945080840160005b838110156151b057815180516001600160a01b0316885283015183880152604090960195908201906001016159c2565b600081518084526020808501808196508360051b8101915082860160005b85811015615a3a578284038952615a28848351614ba4565b98850198935090840190600101615a10565b5091979650505050505050565b60208152615a6260208201835167ffffffffffffffff169052565b60006020830151615a7e60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a0830151615ac760c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615afa818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615b286101c0860184614ba4565b9250808601519050601f19610160818786030181880152615b4985846159ae565b945080880151925050610180818786030181880152615b6885846159f2565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561259d5761259d615636565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615be15780818660040360031b1b83161692505b505092915050565b60008085851115615bf957600080fd5b83861115615c0657600080fd5b5050820193919092039150565b600060208284031215615c2557600080fd5b6040516020810181811067ffffffffffffffff82111715615c4857615c48614c61565b6040529135825250919050565b600060208284031215615c6757600080fd5b610e9e826155d7565b63ffffffff81811683821601908082111561259d5761259d615636565b600060208284031215615c9f57600080fd5b8151610e9e81614b3e565b81810381811115610df557610df5615636565b818103600083128015838313168383128216171561259d5761259d615636565b600081615cec57615cec615636565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff831681526040602082015260006121cb6040830184615168565b602080825282518282018190526000919060409081850190868401855b82811015615a3a57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c09093019290850190600101615d4e565b600060408284031215615dc857600080fd5b615dd0614c90565b615dd9836155d7565b8152602083015161573781615029565b602081526000610e9e60208301846159ae565b602081526000610e9e60208301846159f2565b6102208101615e8c82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b610e9e60e0830184614eca565b602080825282518282018190526000919060409081850190868401855b82811015615a3a57815180516001600160a01b031685528681015163ffffffff16878601528581015167ffffffffffffffff908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101615eb6565b60008251615f2c818460208701614b80565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOnRampABI = EVM2EVMOnRampMetaData.ABI @@ -345,9 +345,9 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetExpectedNextSequenceNumber( return _EVM2EVMOnRamp.Contract.GetExpectedNextSequenceNumber(&_EVM2EVMOnRamp.CallOpts) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetFee(opts *bind.CallOpts, message ClientEVM2AnyMessage) (*big.Int, error) { +func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { var out []interface{} - err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getFee", message) + err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getFee", destChainSelector, message) if err != nil { return *new(*big.Int), err @@ -359,12 +359,12 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetFee(opts *bind.CallOpts, message C } -func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetFee(message ClientEVM2AnyMessage) (*big.Int, error) { - return _EVM2EVMOnRamp.Contract.GetFee(&_EVM2EVMOnRamp.CallOpts, message) +func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _EVM2EVMOnRamp.Contract.GetFee(&_EVM2EVMOnRamp.CallOpts, destChainSelector, message) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetFee(message ClientEVM2AnyMessage) (*big.Int, error) { - return _EVM2EVMOnRamp.Contract.GetFee(&_EVM2EVMOnRamp.CallOpts, message) +func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _EVM2EVMOnRamp.Contract.GetFee(&_EVM2EVMOnRamp.CallOpts, destChainSelector, message) } func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetFeeTokenConfig(opts *bind.CallOpts, token common.Address) (EVM2EVMOnRampFeeTokenConfig, error) { @@ -441,9 +441,9 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetNops() (GetNops, return _EVM2EVMOnRamp.Contract.GetNops(&_EVM2EVMOnRamp.CallOpts) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetPoolBySourceToken(opts *bind.CallOpts, sourceToken common.Address) (common.Address, error) { +func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) { var out []interface{} - err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getPoolBySourceToken", sourceToken) + err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getPoolBySourceToken", arg0, sourceToken) if err != nil { return *new(common.Address), err @@ -455,12 +455,12 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetPoolBySourceToken(opts *bind.CallO } -func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetPoolBySourceToken(sourceToken common.Address) (common.Address, error) { - return _EVM2EVMOnRamp.Contract.GetPoolBySourceToken(&_EVM2EVMOnRamp.CallOpts, sourceToken) +func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetPoolBySourceToken(arg0 uint64, sourceToken common.Address) (common.Address, error) { + return _EVM2EVMOnRamp.Contract.GetPoolBySourceToken(&_EVM2EVMOnRamp.CallOpts, arg0, sourceToken) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetPoolBySourceToken(sourceToken common.Address) (common.Address, error) { - return _EVM2EVMOnRamp.Contract.GetPoolBySourceToken(&_EVM2EVMOnRamp.CallOpts, sourceToken) +func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetPoolBySourceToken(arg0 uint64, sourceToken common.Address) (common.Address, error) { + return _EVM2EVMOnRamp.Contract.GetPoolBySourceToken(&_EVM2EVMOnRamp.CallOpts, arg0, sourceToken) } func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetSenderNonce(opts *bind.CallOpts, sender common.Address) (uint64, error) { @@ -507,9 +507,9 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetStaticConfig() (EVM2EVMOnRa return _EVM2EVMOnRamp.Contract.GetStaticConfig(&_EVM2EVMOnRamp.CallOpts) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetSupportedTokens(opts *bind.CallOpts) ([]common.Address, error) { +func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetSupportedTokens(opts *bind.CallOpts, arg0 uint64) ([]common.Address, error) { var out []interface{} - err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getSupportedTokens") + err := _EVM2EVMOnRamp.contract.Call(opts, &out, "getSupportedTokens", arg0) if err != nil { return *new([]common.Address), err @@ -521,12 +521,12 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetSupportedTokens(opts *bind.CallOpt } -func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetSupportedTokens() ([]common.Address, error) { - return _EVM2EVMOnRamp.Contract.GetSupportedTokens(&_EVM2EVMOnRamp.CallOpts) +func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) GetSupportedTokens(arg0 uint64) ([]common.Address, error) { + return _EVM2EVMOnRamp.Contract.GetSupportedTokens(&_EVM2EVMOnRamp.CallOpts, arg0) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetSupportedTokens() ([]common.Address, error) { - return _EVM2EVMOnRamp.Contract.GetSupportedTokens(&_EVM2EVMOnRamp.CallOpts) +func (_EVM2EVMOnRamp *EVM2EVMOnRampCallerSession) GetSupportedTokens(arg0 uint64) ([]common.Address, error) { + return _EVM2EVMOnRamp.Contract.GetSupportedTokens(&_EVM2EVMOnRamp.CallOpts, arg0) } func (_EVM2EVMOnRamp *EVM2EVMOnRampCaller) GetTokenLimitAdmin(opts *bind.CallOpts) (common.Address, error) { @@ -663,16 +663,16 @@ func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactorSession) ApplyPoolUpdates(removes [ return _EVM2EVMOnRamp.Contract.ApplyPoolUpdates(&_EVM2EVMOnRamp.TransactOpts, removes, adds) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactor) ForwardFromRouter(opts *bind.TransactOpts, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { - return _EVM2EVMOnRamp.contract.Transact(opts, "forwardFromRouter", message, feeTokenAmount, originalSender) +func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactor) ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _EVM2EVMOnRamp.contract.Transact(opts, "forwardFromRouter", destChainSelector, message, feeTokenAmount, originalSender) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) ForwardFromRouter(message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { - return _EVM2EVMOnRamp.Contract.ForwardFromRouter(&_EVM2EVMOnRamp.TransactOpts, message, feeTokenAmount, originalSender) +func (_EVM2EVMOnRamp *EVM2EVMOnRampSession) ForwardFromRouter(destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _EVM2EVMOnRamp.Contract.ForwardFromRouter(&_EVM2EVMOnRamp.TransactOpts, destChainSelector, message, feeTokenAmount, originalSender) } -func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactorSession) ForwardFromRouter(message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { - return _EVM2EVMOnRamp.Contract.ForwardFromRouter(&_EVM2EVMOnRamp.TransactOpts, message, feeTokenAmount, originalSender) +func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactorSession) ForwardFromRouter(destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _EVM2EVMOnRamp.Contract.ForwardFromRouter(&_EVM2EVMOnRamp.TransactOpts, destChainSelector, message, feeTokenAmount, originalSender) } func (_EVM2EVMOnRamp *EVM2EVMOnRampTransactor) PayNops(opts *bind.TransactOpts) (*types.Transaction, error) { @@ -2213,7 +2213,7 @@ type EVM2EVMOnRampInterface interface { GetExpectedNextSequenceNumber(opts *bind.CallOpts) (uint64, error) - GetFee(opts *bind.CallOpts, message ClientEVM2AnyMessage) (*big.Int, error) + GetFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) GetFeeTokenConfig(opts *bind.CallOpts, token common.Address) (EVM2EVMOnRampFeeTokenConfig, error) @@ -2223,13 +2223,13 @@ type EVM2EVMOnRampInterface interface { error) - GetPoolBySourceToken(opts *bind.CallOpts, sourceToken common.Address) (common.Address, error) + GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) GetSenderNonce(opts *bind.CallOpts, sender common.Address) (uint64, error) GetStaticConfig(opts *bind.CallOpts) (EVM2EVMOnRampStaticConfig, error) - GetSupportedTokens(opts *bind.CallOpts) ([]common.Address, error) + GetSupportedTokens(opts *bind.CallOpts, arg0 uint64) ([]common.Address, error) GetTokenLimitAdmin(opts *bind.CallOpts) (common.Address, error) @@ -2245,7 +2245,7 @@ type EVM2EVMOnRampInterface interface { ApplyPoolUpdates(opts *bind.TransactOpts, removes []InternalPoolUpdate, adds []InternalPoolUpdate) (*types.Transaction, error) - ForwardFromRouter(opts *bind.TransactOpts, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) + ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) PayNops(opts *bind.TransactOpts) (*types.Transaction, error) diff --git a/core/gethwrappers/ccip/generated/router/router.go b/core/gethwrappers/ccip/generated/router/router.go index 3b068a2767..a0e64fc6a7 100644 --- a/core/gethwrappers/ccip/generated/router/router.go +++ b/core/gethwrappers/ccip/generated/router/router.go @@ -62,8 +62,8 @@ type RouterOnRamp struct { } var RouterMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidRecipientAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OffRampMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOffRamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"UnsupportedDestinationChain\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"calldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"name\":\"OnRampSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_RET_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OnRamp[]\",\"name\":\"onRampUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampRemoves\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyRampUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getArmProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOffRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWrappedNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"isChainSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"routeMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"retData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"}],\"name\":\"setWrappedNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162002e9238038062002e928339810160408190526200003491620001af565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050600280546001600160a01b0319166001600160a01b039485161790555016608052620001e7565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001aa57600080fd5b919050565b60008060408385031215620001c357600080fd5b620001ce8362000192565b9150620001de6020840162000192565b90509250929050565b608051612c816200021160003960008181610238015281816106920152610b360152612c816000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100a5578063a8d87a3b11610074578063e861e90711610059578063e861e90714610428578063f2fde38b14610453578063fbca3b741461047357600080fd5b8063a8d87a3b146103bb578063da5fcac81461040857600080fd5b80638da5cb5b146102fc57806396f4e9f914610327578063a40e69c71461033a578063a48a90581461035c57600080fd5b80635246492f116100fc5780635f3e849f116100e15780635f3e849f1461029f578063787350e3146102bf57806379ba5097146102e757600080fd5b80635246492f1461022957806352cb60ca1461027d57600080fd5b8063181f5a771461012e5780631d7a74a01461018d57806320487ded146101cd5780633cf97983146101fb575b600080fd5b34801561013a57600080fd5b506101776040518060400160405280600c81526020017f526f7574657220312e302e30000000000000000000000000000000000000000081525081565b60405161018491906120f0565b60405180910390f35b34801561019957600080fd5b506101ad6101a8366004612135565b6104a0565b60408051921515835267ffffffffffffffff909116602083015201610184565b3480156101d957600080fd5b506101ed6101e836600461237e565b6104bc565b604051908152602001610184565b34801561020757600080fd5b5061021b61021636600461247b565b610612565b6040516101849291906124f3565b34801561023557600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b34801561028957600080fd5b5061029d610298366004612135565b610898565b005b3480156102ab57600080fd5b5061029d6102ba36600461250e565b6108e7565b3480156102cb57600080fd5b506102d4608481565b60405161ffff9091168152602001610184565b3480156102f357600080fd5b5061029d610a35565b34801561030857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610258565b6101ed61033536600461237e565b610b32565b34801561034657600080fd5b5061034f6110bd565b604051610184919061254f565b34801561036857600080fd5b506103ab6103773660046125be565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610184565b3480156103c757600080fd5b506102586103d63660046125be565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b34801561041457600080fd5b5061029d61042336600461261e565b6111b4565b34801561043457600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610258565b34801561045f57600080fd5b5061029d61046e366004612135565b6114bf565b34801561047f57600080fd5b5061049361048e3660046125be565b6114d3565b60405161018491906126b8565b60008080806104b06004866115ec565b90969095509350505050565b606081015160009073ffffffffffffffffffffffffffffffffffffffff166104fd5760025473ffffffffffffffffffffffffffffffffffffffff1660608301525b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610575576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6040517f38724a9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906338724a95906105c79086906004016127ef565b602060405180830381865afa1580156105e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106089190612802565b9150505b92915050565b6000606061062660408701602088016125be565b6000806106346004336115ec565b9150915081158061065957508067ffffffffffffffff168367ffffffffffffffff1614155b15610690576040517fd2316ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061071f919061281b565b15610756576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006385572ffb60e01b8a604051602401610771919061294a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506107fe81888a60848d611620565b90965094507f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b68a3561083660408d0160208e016125be565b83516020850120604051610883939291339193845267ffffffffffffffff92909216602084015273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60405180910390a15050505094509492505050565b6108a0611743565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ef611743565b73ffffffffffffffffffffffffffffffffffffffff8216610954576040517f26a78f8f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240161056c565b73ffffffffffffffffffffffffffffffffffffffff8316610a0f5760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146109c9576040519150601f19603f3d011682016040523d82523d6000602084013e6109ce565b606091505b5050905080610a09576040517fe417b80b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b610a3073ffffffffffffffffffffffffffffffffffffffff841683836117c6565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ab6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161056c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc3919061281b565b15610bfa576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610c6d576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161056c565b606083015160009073ffffffffffffffffffffffffffffffffffffffff16610dfd5760025473ffffffffffffffffffffffffffffffffffffffff90811660608601526040517f38724a95000000000000000000000000000000000000000000000000000000008152908316906338724a9590610ced9087906004016127ef565b602060405180830381865afa158015610d0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2e9190612802565b905080341015610d6a576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050836060015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506060850151610df8915073ffffffffffffffffffffffffffffffffffffffff1683836117c6565b610ef2565b3415610e35576040517f1841b4e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f38724a9500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906338724a9590610e879087906004016127ef565b602060405180830381865afa158015610ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec89190612802565b6060850151909150610ef29073ffffffffffffffffffffffffffffffffffffffff1633848461189a565b60005b84604001515181101561101a57600085604001518281518110610f1a57610f1a612a56565b6020908102919091010151516040517f5d86f14100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff808316600483015291925061100991339190871690635d86f14190602401602060405180830381865afa158015610f9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc09190612a85565b88604001518581518110610fd657610fd6612a56565b6020026020010151602001518473ffffffffffffffffffffffffffffffffffffffff1661189a909392919063ffffffff16565b5061101381612ad1565b9050610ef5565b506040517fa7d3e02f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063a7d3e02f9061107190879085903390600401612b09565b6020604051808303816000875af1158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b49190612802565b95945050505050565b606060006110cb60046118f8565b67ffffffffffffffff8111156110e3576110e361216a565b60405190808252806020026020018201604052801561112857816020015b60408051808201909152600080825260208201528152602001906001900390816111015790505b50905060005b81518110156111ae57600080611145600484611903565b9150915060405180604001604052808267ffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681525084848151811061119057611190612a56565b60200260200101819052505050806111a790612ad1565b905061112e565b50919050565b6111bc611743565b60005b858110156112a05760008787838181106111db576111db612a56565b9050604002018036038101906111f19190612b48565b60208181018051835167ffffffffffffffff90811660009081526003855260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055855193519051921682529394509216917f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23910160405180910390a25061129981612ad1565b90506111bf565b5060005b838110156113cc5760008585838181106112c0576112c0612a56565b6112d692602060409092020190810191506125be565b905060008686848181106112ec576112ec612a56565b90506040020160200160208101906113049190612135565b905067ffffffffffffffff821661131c600483611912565b14611353576040517f5737980600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61135e60048261193b565b156113b95760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb9060200160405180910390a25b5050806113c590612ad1565b90506112a4565b5060005b818110156114b65760008383838181106113ec576113ec612a56565b61140292602060409092020190810191506125be565b9050600084848481811061141857611418612a56565b90506040020160200160208101906114309190612135565b905061144860048267ffffffffffffffff851661195d565b156114a35760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b949060200160405180910390a25b5050806114af90612ad1565b90506113d0565b50505050505050565b6114c7611743565b6114d081611988565b50565b606061150d8267ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b61152557505060408051600081526020810190915290565b67ffffffffffffffff82166000908152600360205260408082205481517fd3c7c2c7000000000000000000000000000000000000000000000000000000008152915173ffffffffffffffffffffffffffffffffffffffff9091169263d3c7c2c792600480820193918290030181865afa1580156115a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261060c9190810190612b87565b60008080806116118673ffffffffffffffffffffffffffffffffffffffff8716611a7d565b909450925050505b9250929050565b600060608361ffff1667ffffffffffffffff8111156116415761164161216a565b6040519080825280601f01601f19166020018201604052801561166b576020820181803683370190505b5090507f0c3b563c000000000000000000000000000000000000000000000000000000007fafa32a2c000000000000000000000000000000000000000000000000000000007f37c3be2900000000000000000000000000000000000000000000000000000000883b6116e1578260005260046000fd5b5a868110156116f4578260005260046000fd5b869003604081048103891061170d578160005260046000fd5b506000808b5160208d0160008d8df194503d8781111561172a5750865b808552806000602087013e505050509550959350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161056c565b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610a309084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611ab7565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a099085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611818565b600061060c82611bc3565b60008080806116118686611bce565b60006119348373ffffffffffffffffffffffffffffffffffffffff8416611bf9565b9392505050565b60006119348373ffffffffffffffffffffffffffffffffffffffff8416611c83565b60006119808473ffffffffffffffffffffffffffffffffffffffff851684611ca0565b949350505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611a07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161056c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000818152600283016020526040812054819080611aac57611a9f8585611cbd565b9250600091506116199050565b600192509050611619565b6000611b19826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cc99092919063ffffffff16565b805190915015610a305780806020019051810190611b37919061281b565b610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161056c565b600061060c82611cd8565b60008080611bdc8585611ce2565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081205480151580611c1d5750611c1d8484611cbd565b611934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640161056c565b600081815260028301602052604081208190556119348383611cee565b600082815260028401602052604081208290556119808484611cfa565b60006119348383611d06565b60606119808484600085611d1e565b600061060c825490565b60006119348383611e37565b60006119348383611e61565b60006119348383611f54565b60008181526001830160205260408120541515611934565b606082471015611db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161056c565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611dd99190612c16565b60006040518083038185875af1925050503d8060008114611e16576040519150601f19603f3d011682016040523d82523d6000602084013e611e1b565b606091505b5091509150611e2c87838387611fa3565b979650505050505050565b6000826000018281548110611e4e57611e4e612a56565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611f4a576000611e85600183612c32565b8554909150600090611e9990600190612c32565b9050818114611efe576000866000018281548110611eb957611eb9612a56565b9060005260206000200154905080876000018481548110611edc57611edc612a56565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611f0f57611f0f612c45565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061060c565b600091505061060c565b6000818152600183016020526040812054611f9b5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561060c565b50600061060c565b606083156120395782516000036120325773ffffffffffffffffffffffffffffffffffffffff85163b612032576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161056c565b5081611980565b611980838381511561204e5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056c91906120f0565b60005b8381101561209d578181015183820152602001612085565b50506000910152565b600081518084526120be816020860160208601612082565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061193460208301846120a6565b73ffffffffffffffffffffffffffffffffffffffff811681146114d057600080fd5b803561213081612103565b919050565b60006020828403121561214757600080fd5b813561193481612103565b803567ffffffffffffffff8116811461213057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156121bc576121bc61216a565b60405290565b60405160a0810167ffffffffffffffff811182821017156121bc576121bc61216a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561222c5761222c61216a565b604052919050565b600082601f83011261224557600080fd5b813567ffffffffffffffff81111561225f5761225f61216a565b61229060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016121e5565b8181528460208386010111156122a557600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156122dc576122dc61216a565b5060051b60200190565b600082601f8301126122f757600080fd5b8135602061230c612307836122c2565b6121e5565b82815260069290921b8401810191818101908684111561232b57600080fd5b8286015b8481101561237357604081890312156123485760008081fd5b612350612199565b813561235b81612103565b8152818501358582015283529183019160400161232f565b509695505050505050565b6000806040838503121561239157600080fd5b61239a83612152565b9150602083013567ffffffffffffffff808211156123b757600080fd5b9084019060a082870312156123cb57600080fd5b6123d36121c2565b8235828111156123e257600080fd5b6123ee88828601612234565b82525060208301358281111561240357600080fd5b61240f88828601612234565b60208301525060408301358281111561242757600080fd5b612433888286016122e6565b60408301525061244560608401612125565b606082015260808301358281111561245c57600080fd5b61246888828601612234565b6080830152508093505050509250929050565b6000806000806080858703121561249157600080fd5b843567ffffffffffffffff8111156124a857600080fd5b850160a081880312156124ba57600080fd5b9350602085013561ffff811681146124d157600080fd5b92506040850135915060608501356124e881612103565b939692955090935050565b821515815260406020820152600061198060408301846120a6565b60008060006060848603121561252357600080fd5b833561252e81612103565b9250602084013561253e81612103565b929592945050506040919091013590565b602080825282518282018190526000919060409081850190868401855b828110156125b1578151805167ffffffffffffffff16855286015173ffffffffffffffffffffffffffffffffffffffff1686850152928401929085019060010161256c565b5091979650505050505050565b6000602082840312156125d057600080fd5b61193482612152565b60008083601f8401126125eb57600080fd5b50813567ffffffffffffffff81111561260357600080fd5b6020830191508360208260061b850101111561161957600080fd5b6000806000806000806060878903121561263757600080fd5b863567ffffffffffffffff8082111561264f57600080fd5b61265b8a838b016125d9565b9098509650602089013591508082111561267457600080fd5b6126808a838b016125d9565b9096509450604089013591508082111561269957600080fd5b506126a689828a016125d9565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b8181101561270657835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016126d4565b50909695505050505050565b6000815160a0845261272760a08501826120a6565b90506020808401518583038287015261274083826120a6565b60408681015188830389830152805180845290850195509092506000918401905b808310156127a0578551805173ffffffffffffffffffffffffffffffffffffffff16835285015185830152948401946001929092019190830190612761565b50606087015194506127ca606089018673ffffffffffffffffffffffffffffffffffffffff169052565b6080870151945087810360808901526127e381866120a6565b98975050505050505050565b6020815260006119346020830184612712565b60006020828403121561281457600080fd5b5051919050565b60006020828403121561282d57600080fd5b8151801515811461193457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261287257600080fd5b830160208101925035905067ffffffffffffffff81111561289257600080fd5b80360382131561161957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561293f57813561290d81612103565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016128fa565b509495945050505050565b6020815281356020820152600061296360208401612152565b67ffffffffffffffff8082166040850152612981604086018661283d565b925060a0606086015261299860c0860184836128a1565b9250506129a8606086018661283d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808786030160808801526129de8583856128a1565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1883603018312612a1757600080fd5b60209288019283019235915083821115612a3057600080fd5b8160061b3603831315612a4257600080fd5b8685030160a0870152611e2c8482846128ea565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612a9757600080fd5b815161193481612103565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612b0257612b02612aa2565b5060010190565b606081526000612b1c6060830186612712565b905083602083015273ffffffffffffffffffffffffffffffffffffffff83166040830152949350505050565b600060408284031215612b5a57600080fd5b612b62612199565b612b6b83612152565b81526020830135612b7b81612103565b60208201529392505050565b60006020808385031215612b9a57600080fd5b825167ffffffffffffffff811115612bb157600080fd5b8301601f81018513612bc257600080fd5b8051612bd0612307826122c2565b81815260059190911b82018301908381019087831115612bef57600080fd5b928401925b82841015611e2c578351612c0781612103565b82529284019290840190612bf4565b60008251612c28818460208701612082565b9190910192915050565b8181038181111561060c5761060c612aa2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFeeTokenAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMsgValue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidRecipientAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyOffRamp\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"UnsupportedDestinationChain\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"calldataHash\",\"type\":\"bytes32\"}],\"name\":\"MessageExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"OffRampRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"name\":\"OnRampSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_RET_BYTES\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OnRamp[]\",\"name\":\"onRampUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampRemoves\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"offRampAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyRampUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"ccipSend\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getArmProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destinationChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOffRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"internalType\":\"structRouter.OffRamp[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWrappedNative\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"isChainSupported\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"recoverTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint16\",\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"routeMessage\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"retData\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrappedNative\",\"type\":\"address\"}],\"name\":\"setWrappedNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162002d7538038062002d758339810160408190526200003491620001af565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e7565b5050600280546001600160a01b0319166001600160a01b039485161790555016608052620001e7565b336001600160a01b03821603620001415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001aa57600080fd5b919050565b60008060408385031215620001c357600080fd5b620001ce8362000192565b9150620001de6020840162000192565b90509250929050565b608051612b6462000211600039600081816101f8015281816105de0152610aef0152612b646000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100a5578063a8d87a3b11610074578063e861e90711610059578063e861e90714610408578063f2fde38b14610433578063fbca3b741461045357600080fd5b8063a8d87a3b1461039b578063da5fcac8146103e857600080fd5b80638da5cb5b146102ec57806396f4e9f914610317578063a40e69c71461032a578063a48a90581461034c57600080fd5b806352cb60ca116100fc578063787350e3116100e1578063787350e31461027f57806379ba5097146102a757806383826b2b146102bc57600080fd5b806352cb60ca1461023d5780635f3e849f1461025f57600080fd5b8063181f5a771461012e57806320487ded1461018d5780633cf97983146101bb5780635246492f146101e9575b600080fd5b34801561013a57600080fd5b506101776040518060400160405280600c81526020017f526f7574657220312e322e30000000000000000000000000000000000000000081525081565b6040516101849190611f61565b60405180910390f35b34801561019957600080fd5b506101ad6101a83660046121d2565b610480565b604051908152602001610184565b3480156101c757600080fd5b506101db6101d63660046122cf565b6105d8565b604051610184929190612347565b3480156101f557600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610184565b34801561024957600080fd5b5061025d610258366004612362565b61083b565b005b34801561026b57600080fd5b5061025d61027a36600461237f565b61088a565b34801561028b57600080fd5b50610294608481565b60405161ffff9091168152602001610184565b3480156102b357600080fd5b5061025d6109d8565b3480156102c857600080fd5b506102dc6102d73660046123c0565b610ad5565b6040519015158152602001610184565b3480156102f857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610218565b6101ad6103253660046121d2565b610aeb565b34801561033657600080fd5b5061033f61108c565b60405161018491906123f7565b34801561035857600080fd5b506102dc610367366004612466565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b3480156103a757600080fd5b506102186103b6366004612466565b67ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156103f457600080fd5b5061025d6104033660046124cd565b611199565b34801561041457600080fd5b5060025473ffffffffffffffffffffffffffffffffffffffff16610218565b34801561043f57600080fd5b5061025d61044e366004612362565b6114b8565b34801561045f57600080fd5b5061047361046e366004612466565b6114cc565b6040516101849190612567565b606081015160009073ffffffffffffffffffffffffffffffffffffffff166104c15760025473ffffffffffffffffffffffffffffffffffffffff1660608301525b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610539576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216906320487ded9061058d908790879060040161269e565b602060405180830381865afa1580156105aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ce91906126c1565b9150505b92915050565b600060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066b91906126da565b156106a2576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c66106be6106b86040890160208a01612466565b336115ec565b600490611630565b6106fc576040517fd2316ede00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006385572ffb60e01b876040516024016107179190612809565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506107a481858760848a611648565b90935091507f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b687356107dc60408a0160208b01612466565b83516020850120604051610829939291339193845267ffffffffffffffff92909216602084015273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60405180910390a15094509492505050565b61084361176b565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61089261176b565b73ffffffffffffffffffffffffffffffffffffffff82166108f7576040517f26a78f8f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610530565b73ffffffffffffffffffffffffffffffffffffffff83166109b25760008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d806000811461096c576040519150601f19603f3d011682016040523d82523d6000602084013e610971565b606091505b50509050806109ac576040517fe417b80b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6109d373ffffffffffffffffffffffffffffffffffffffff841683836117ee565b505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a59576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610530565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610ae46106be84846115ec565b9392505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7c91906126da565b15610bb3576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff831660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610c26576040517fae236d9c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610530565b606083015160009073ffffffffffffffffffffffffffffffffffffffff16610db85760025473ffffffffffffffffffffffffffffffffffffffff90811660608601526040517f20487ded000000000000000000000000000000000000000000000000000000008152908316906320487ded90610ca8908890889060040161269e565b602060405180830381865afa158015610cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce991906126c1565b905080341015610d25576040517f07da6ee600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b349050836060015173ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d7457600080fd5b505af1158015610d88573d6000803e3d6000fd5b505050506060850151610db3915073ffffffffffffffffffffffffffffffffffffffff1683836117ee565b610eaf565b3415610df0576040517f1841b4e100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f20487ded00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316906320487ded90610e44908890889060040161269e565b602060405180830381865afa158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8591906126c1565b6060850151909150610eaf9073ffffffffffffffffffffffffffffffffffffffff163384846118c2565b60005b846040015151811015610fe757600085604001518281518110610ed757610ed7612915565b6020908102919091010151516040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8916600482015273ffffffffffffffffffffffffffffffffffffffff8083166024830152919250610fd6913391908716906348a98aa490604401602060405180830381865afa158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190612944565b88604001518581518110610fa357610fa3612915565b6020026020010151602001518473ffffffffffffffffffffffffffffffffffffffff166118c2909392919063ffffffff16565b50610fe081612990565b9050610eb2565b506040517fdf0aa9e900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063df0aa9e9906110409088908890869033906004016129c8565b6020604051808303816000875af115801561105f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108391906126c1565b95945050505050565b6060600061109a6004611920565b90506000815167ffffffffffffffff8111156110b8576110b8611f91565b6040519080825280602002602001820160405280156110fd57816020015b60408051808201909152600080825260208201528152602001906001900390816110d65790505b50905060005b825181101561119257600083828151811061112057611120612915565b60200260200101519050604051806040016040528060a083901c67ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681525083838151811061117557611175612915565b6020026020010181905250508061118b90612990565b9050611103565b5092915050565b6111a161176b565b60005b858110156112855760008787838181106111c0576111c0612915565b9050604002018036038101906111d69190612a18565b60208181018051835167ffffffffffffffff90811660009081526003855260409081902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff948516179055855193519051921682529394509216917f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23910160405180910390a25061127e81612990565b90506111a4565b5060005b838110156113c65760008585838181106112a5576112a5612915565b6112bb9260206040909202019081019150612466565b905060008686848181106112d1576112d1612915565b90506040020160200160208101906112e99190612362565b90506113006112f883836115ec565b60049061192d565b61135e576040517f4964779000000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152604401610530565b60405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb9060200160405180910390a25050806113bf90612990565b9050611289565b5060005b818110156114af5760008383838181106113e6576113e6612915565b6113fc9260206040909202019081019150612466565b9050600084848481811061141257611412612915565b905060400201602001602081019061142a9190612362565b905061144161143983836115ec565b600490611939565b1561149c5760405173ffffffffffffffffffffffffffffffffffffffff8216815267ffffffffffffffff8316907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b949060200160405180910390a25b5050806114a890612990565b90506113ca565b50505050505050565b6114c061176b565b6114c981611945565b50565b60606115068267ffffffffffffffff1660009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b611520576040805160008082526020820190925290611192565b67ffffffffffffffff8216600081815260036020526040908190205490517ffbca3b74000000000000000000000000000000000000000000000000000000008152600481019290925273ffffffffffffffffffffffffffffffffffffffff169063fbca3b7490602401600060405180830381865afa1580156115a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105d29190810190612a57565b6000610ae473ffffffffffffffffffffffffffffffffffffffff83167bffffffffffffffff000000000000000000000000000000000000000060a086901b16612ae6565b60008181526001830160205260408120541515610ae4565b600060608361ffff1667ffffffffffffffff81111561166957611669611f91565b6040519080825280601f01601f191660200182016040528015611693576020820181803683370190505b5090507f0c3b563c000000000000000000000000000000000000000000000000000000007fafa32a2c000000000000000000000000000000000000000000000000000000007f37c3be2900000000000000000000000000000000000000000000000000000000883b611709578260005260046000fd5b5a8681101561171c578260005260046000fd5b8690036040810481038910611735578160005260046000fd5b506000808b5160208d0160008d8df194503d878111156117525750865b808552806000602087013e505050509550959350505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146117ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610530565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109d39084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a3a565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109ac9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611840565b60606000610ae483611b46565b6000610ae48383611ba2565b6000610ae48383611c95565b3373ffffffffffffffffffffffffffffffffffffffff8216036119c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610530565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611a9c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ce49092919063ffffffff16565b8051909150156109d35780806020019051810190611aba91906126da565b6109d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610530565b606081600001805480602002602001604051908101604052809291908181526020018280548015611b9657602002820191906000526020600020905b815481526020019060010190808311611b82575b50505050509050919050565b60008181526001830160205260408120548015611c8b576000611bc6600183612af9565b8554909150600090611bda90600190612af9565b9050818114611c3f576000866000018281548110611bfa57611bfa612915565b9060005260206000200154905080876000018481548110611c1d57611c1d612915565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c5057611c50612b0c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d2565b60009150506105d2565b6000818152600183016020526040812054611cdc575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d2565b5060006105d2565b6060611cf38484600085611cfb565b949350505050565b606082471015611d8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610530565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611db69190612b3b565b60006040518083038185875af1925050503d8060008114611df3576040519150601f19603f3d011682016040523d82523d6000602084013e611df8565b606091505b5091509150611e0987838387611e14565b979650505050505050565b60608315611eaa578251600003611ea35773ffffffffffffffffffffffffffffffffffffffff85163b611ea3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610530565b5081611cf3565b611cf38383815115611ebf5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105309190611f61565b60005b83811015611f0e578181015183820152602001611ef6565b50506000910152565b60008151808452611f2f816020860160208601611ef3565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610ae46020830184611f17565b803567ffffffffffffffff81168114611f8c57600080fd5b919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611fe357611fe3611f91565b60405290565b60405160a0810167ffffffffffffffff81118282101715611fe357611fe3611f91565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561205357612053611f91565b604052919050565b600082601f83011261206c57600080fd5b813567ffffffffffffffff81111561208657612086611f91565b6120b760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161200c565b8181528460208386010111156120cc57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff82111561210357612103611f91565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146114c957600080fd5b8035611f8c8161210d565b600082601f83011261214b57600080fd5b8135602061216061215b836120e9565b61200c565b82815260069290921b8401810191818101908684111561217f57600080fd5b8286015b848110156121c7576040818903121561219c5760008081fd5b6121a4611fc0565b81356121af8161210d565b81528185013585820152835291830191604001612183565b509695505050505050565b600080604083850312156121e557600080fd5b6121ee83611f74565b9150602083013567ffffffffffffffff8082111561220b57600080fd5b9084019060a0828703121561221f57600080fd5b612227611fe9565b82358281111561223657600080fd5b6122428882860161205b565b82525060208301358281111561225757600080fd5b6122638882860161205b565b60208301525060408301358281111561227b57600080fd5b6122878882860161213a565b6040830152506122996060840161212f565b60608201526080830135828111156122b057600080fd5b6122bc8882860161205b565b6080830152508093505050509250929050565b600080600080608085870312156122e557600080fd5b843567ffffffffffffffff8111156122fc57600080fd5b850160a0818803121561230e57600080fd5b9350602085013561ffff8116811461232557600080fd5b925060408501359150606085013561233c8161210d565b939692955090935050565b8215158152604060208201526000611cf36040830184611f17565b60006020828403121561237457600080fd5b8135610ae48161210d565b60008060006060848603121561239457600080fd5b833561239f8161210d565b925060208401356123af8161210d565b929592945050506040919091013590565b600080604083850312156123d357600080fd5b6123dc83611f74565b915060208301356123ec8161210d565b809150509250929050565b602080825282518282018190526000919060409081850190868401855b82811015612459578151805167ffffffffffffffff16855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612414565b5091979650505050505050565b60006020828403121561247857600080fd5b610ae482611f74565b60008083601f84011261249357600080fd5b50813567ffffffffffffffff8111156124ab57600080fd5b6020830191508360208260061b85010111156124c657600080fd5b9250929050565b600080600080600080606087890312156124e657600080fd5b863567ffffffffffffffff808211156124fe57600080fd5b61250a8a838b01612481565b9098509650602089013591508082111561252357600080fd5b61252f8a838b01612481565b9096509450604089013591508082111561254857600080fd5b5061255589828a01612481565b979a9699509497509295939492505050565b6020808252825182820181905260009190848201906040850190845b818110156125b557835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612583565b50909695505050505050565b6000815160a084526125d660a0850182611f17565b9050602080840151858303828701526125ef8382611f17565b60408681015188830389830152805180845290850195509092506000918401905b8083101561264f578551805173ffffffffffffffffffffffffffffffffffffffff16835285015185830152948401946001929092019190830190612610565b5060608701519450612679606089018673ffffffffffffffffffffffffffffffffffffffff169052565b6080870151945087810360808901526126928186611f17565b98975050505050505050565b67ffffffffffffffff83168152604060208201526000611cf360408301846125c1565b6000602082840312156126d357600080fd5b5051919050565b6000602082840312156126ec57600080fd5b81518015158114610ae457600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261273157600080fd5b830160208101925035905067ffffffffffffffff81111561275157600080fd5b8036038213156124c657600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b858110156127fe5781356127cc8161210d565b73ffffffffffffffffffffffffffffffffffffffff1687528183013583880152604096870196909101906001016127b9565b509495945050505050565b6020815281356020820152600061282260208401611f74565b67ffffffffffffffff808216604085015261284060408601866126fc565b925060a0606086015261285760c086018483612760565b92505061286760608601866126fc565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08087860301608088015261289d858385612760565b9450608088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030183126128d657600080fd5b602092880192830192359150838211156128ef57600080fd5b8160061b360383131561290157600080fd5b8685030160a0870152611e098482846127a9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561295657600080fd5b8151610ae48161210d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129c1576129c1612961565b5060010190565b67ffffffffffffffff851681526080602082015260006129eb60808301866125c1565b905083604083015273ffffffffffffffffffffffffffffffffffffffff8316606083015295945050505050565b600060408284031215612a2a57600080fd5b612a32611fc0565b612a3b83611f74565b81526020830135612a4b8161210d565b60208201529392505050565b60006020808385031215612a6a57600080fd5b825167ffffffffffffffff811115612a8157600080fd5b8301601f81018513612a9257600080fd5b8051612aa061215b826120e9565b81815260059190911b82018301908381019087831115612abf57600080fd5b928401925b82841015611e09578351612ad78161210d565b82529284019290840190612ac4565b808201808211156105d2576105d2612961565b818103818111156105d2576105d2612961565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008251612b4d818460208701611ef3565b919091019291505056fea164736f6c6343000813000a", } var RouterABI = RouterMetaData.ABI @@ -378,27 +378,26 @@ func (_Router *RouterCallerSession) IsChainSupported(chainSelector uint64) (bool return _Router.Contract.IsChainSupported(&_Router.CallOpts, chainSelector) } -func (_Router *RouterCaller) IsOffRamp(opts *bind.CallOpts, offRamp common.Address) (bool, uint64, error) { +func (_Router *RouterCaller) IsOffRamp(opts *bind.CallOpts, sourceChainSelector uint64, offRamp common.Address) (bool, error) { var out []interface{} - err := _Router.contract.Call(opts, &out, "isOffRamp", offRamp) + err := _Router.contract.Call(opts, &out, "isOffRamp", sourceChainSelector, offRamp) if err != nil { - return *new(bool), *new(uint64), err + return *new(bool), err } out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - out1 := *abi.ConvertType(out[1], new(uint64)).(*uint64) - return out0, out1, err + return out0, err } -func (_Router *RouterSession) IsOffRamp(offRamp common.Address) (bool, uint64, error) { - return _Router.Contract.IsOffRamp(&_Router.CallOpts, offRamp) +func (_Router *RouterSession) IsOffRamp(sourceChainSelector uint64, offRamp common.Address) (bool, error) { + return _Router.Contract.IsOffRamp(&_Router.CallOpts, sourceChainSelector, offRamp) } -func (_Router *RouterCallerSession) IsOffRamp(offRamp common.Address) (bool, uint64, error) { - return _Router.Contract.IsOffRamp(&_Router.CallOpts, offRamp) +func (_Router *RouterCallerSession) IsOffRamp(sourceChainSelector uint64, offRamp common.Address) (bool, error) { + return _Router.Contract.IsOffRamp(&_Router.CallOpts, sourceChainSelector, offRamp) } func (_Router *RouterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -1370,7 +1369,7 @@ type RouterInterface interface { IsChainSupported(opts *bind.CallOpts, chainSelector uint64) (bool, error) - IsOffRamp(opts *bind.CallOpts, offRamp common.Address) (bool, uint64, error) + IsOffRamp(opts *bind.CallOpts, sourceChainSelector uint64, offRamp common.Address) (bool, error) Owner(opts *bind.CallOpts) (common.Address, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index de34862e8d..31c8dff207 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -7,12 +7,12 @@ commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../.. custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin e72f1d19a596153e17f1efd32dcf33492c35e1eed9fe7bac33c1668388073297 evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin c51bdb29e090fd5ff0c6c5c963df4e3e49dec727f55a79920a403d2189d8db38 -evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin e4a47f2783f3ed1c3a33210c9772a685ffab96639d36320485ca90d41ff45ac4 +evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 84ac2607dd76d553722b4ca8db9661ba762dcbb178eac13be1865b957d50ae44 lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 5a60f3e6d803cbd7581f6a9a1e34934ba6bce065454265d1039d92af5592a2e8 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 mock_arm_contract: ../../../contracts/solc/v0.8.19/MockARM.abi ../../../contracts/solc/v0.8.19/MockARM.bin efcf4cb260a2b6a6e189639f62bb50ab650a135715c1fcd42c92dfa9d04aa0e3 ping_pong_demo: ../../../contracts/solc/v0.8.19/PingPongDemo.abi ../../../contracts/solc/v0.8.19/PingPongDemo.bin f2972aa082cee8b461122f79773ce247d23b551ddc2ca9926ae90624134cfb23 price_registry: ../../../contracts/solc/v0.8.19/PriceRegistry.abi ../../../contracts/solc/v0.8.19/PriceRegistry.bin 36e8d2c44a16fefb5258557cb1eae25eca1cc12efcd3c3270f91a90a5f81e7ea -router: ../../../contracts/solc/v0.8.19/Router.abi ../../../contracts/solc/v0.8.19/Router.bin 0a45a322d993f6bb5726626b86deb80c861d3a9e5730e6f43b9c8a3869e1a774 +router: ../../../contracts/solc/v0.8.19/Router.abi ../../../contracts/solc/v0.8.19/Router.bin 78a5f557cb3925da28aa755c8c69742b936e2db3c524bdff34a9f5ce024b8b0e usdc_token_pool: ../../../contracts/solc/v0.8.19/USDCTokenPool.abi ../../../contracts/solc/v0.8.19/USDCTokenPool.bin dd7e1adb7e9bcfafe86721206ebf84dbfedf236adf0040b853d30575c207f3e4 weth9: ../../../contracts/solc/v0.8.19/WETH9.abi ../../../contracts/solc/v0.8.19/WETH9.bin 5a7d64fb19b62ec523c7667ce4c2983295c05f74935b5f994c06a6f70d440f8b diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go index aefc391630..ec5a67c1e4 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go @@ -402,25 +402,25 @@ func (_m *EVM2EVMOnRampInterface) FilterTokenTransferFeeConfigSet(opts *bind.Fil return r0, r1 } -// ForwardFromRouter provides a mock function with given fields: opts, message, feeTokenAmount, originalSender -func (_m *EVM2EVMOnRampInterface) ForwardFromRouter(opts *bind.TransactOpts, message evm_2_evm_onramp.ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { - ret := _m.Called(opts, message, feeTokenAmount, originalSender) +// ForwardFromRouter provides a mock function with given fields: opts, destChainSelector, message, feeTokenAmount, originalSender +func (_m *EVM2EVMOnRampInterface) ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message evm_2_evm_onramp.ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + ret := _m.Called(opts, destChainSelector, message, feeTokenAmount, originalSender) var r0 *types.Transaction var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) (*types.Transaction, error)); ok { - return rf(opts, message, feeTokenAmount, originalSender) + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) (*types.Transaction, error)); ok { + return rf(opts, destChainSelector, message, feeTokenAmount, originalSender) } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) *types.Transaction); ok { - r0 = rf(opts, message, feeTokenAmount, originalSender) + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) *types.Transaction); ok { + r0 = rf(opts, destChainSelector, message, feeTokenAmount, originalSender) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*types.Transaction) } } - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) error); ok { - r1 = rf(opts, message, feeTokenAmount, originalSender) + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage, *big.Int, common.Address) error); ok { + r1 = rf(opts, destChainSelector, message, feeTokenAmount, originalSender) } else { r1 = ret.Error(1) } @@ -476,25 +476,25 @@ func (_m *EVM2EVMOnRampInterface) GetExpectedNextSequenceNumber(opts *bind.CallO return r0, r1 } -// GetFee provides a mock function with given fields: opts, message -func (_m *EVM2EVMOnRampInterface) GetFee(opts *bind.CallOpts, message evm_2_evm_onramp.ClientEVM2AnyMessage) (*big.Int, error) { - ret := _m.Called(opts, message) +// GetFee provides a mock function with given fields: opts, destChainSelector, message +func (_m *EVM2EVMOnRampInterface) GetFee(opts *bind.CallOpts, destChainSelector uint64, message evm_2_evm_onramp.ClientEVM2AnyMessage) (*big.Int, error) { + ret := _m.Called(opts, destChainSelector, message) var r0 *big.Int var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, evm_2_evm_onramp.ClientEVM2AnyMessage) (*big.Int, error)); ok { - return rf(opts, message) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage) (*big.Int, error)); ok { + return rf(opts, destChainSelector, message) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, evm_2_evm_onramp.ClientEVM2AnyMessage) *big.Int); ok { - r0 = rf(opts, message) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage) *big.Int); ok { + r0 = rf(opts, destChainSelector, message) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*big.Int) } } - if rf, ok := ret.Get(1).(func(*bind.CallOpts, evm_2_evm_onramp.ClientEVM2AnyMessage) error); ok { - r1 = rf(opts, message) + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, evm_2_evm_onramp.ClientEVM2AnyMessage) error); ok { + r1 = rf(opts, destChainSelector, message) } else { r1 = ret.Error(1) } @@ -576,25 +576,25 @@ func (_m *EVM2EVMOnRampInterface) GetNops(opts *bind.CallOpts) (evm_2_evm_onramp return r0, r1 } -// GetPoolBySourceToken provides a mock function with given fields: opts, sourceToken -func (_m *EVM2EVMOnRampInterface) GetPoolBySourceToken(opts *bind.CallOpts, sourceToken common.Address) (common.Address, error) { - ret := _m.Called(opts, sourceToken) +// GetPoolBySourceToken provides a mock function with given fields: opts, arg0, sourceToken +func (_m *EVM2EVMOnRampInterface) GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) { + ret := _m.Called(opts, arg0, sourceToken) var r0 common.Address var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (common.Address, error)); ok { - return rf(opts, sourceToken) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address) (common.Address, error)); ok { + return rf(opts, arg0, sourceToken) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) common.Address); ok { - r0 = rf(opts, sourceToken) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address) common.Address); ok { + r0 = rf(opts, arg0, sourceToken) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(common.Address) } } - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { - r1 = rf(opts, sourceToken) + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, common.Address) error); ok { + r1 = rf(opts, arg0, sourceToken) } else { r1 = ret.Error(1) } @@ -650,25 +650,25 @@ func (_m *EVM2EVMOnRampInterface) GetStaticConfig(opts *bind.CallOpts) (evm_2_ev return r0, r1 } -// GetSupportedTokens provides a mock function with given fields: opts -func (_m *EVM2EVMOnRampInterface) GetSupportedTokens(opts *bind.CallOpts) ([]common.Address, error) { - ret := _m.Called(opts) +// GetSupportedTokens provides a mock function with given fields: opts, arg0 +func (_m *EVM2EVMOnRampInterface) GetSupportedTokens(opts *bind.CallOpts, arg0 uint64) ([]common.Address, error) { + ret := _m.Called(opts, arg0) var r0 []common.Address var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]common.Address, error)); ok { - return rf(opts) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) ([]common.Address, error)); ok { + return rf(opts, arg0) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) []common.Address); ok { - r0 = rf(opts) + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) []common.Address); ok { + r0 = rf(opts, arg0) } else { if ret.Get(0) != nil { r0 = ret.Get(0).([]common.Address) } } - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64) error); ok { + r1 = rf(opts, arg0) } else { r1 = ret.Error(1) }