diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 81afe8fdd0..1649878355 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -39,18 +39,20 @@ ARM_voteToCurse:testEvenIfAlreadyCursedSuccess() (gas: 275945) ARM_voteToCurse:testInvalidVoterReverts() (gas: 13660) ARM_voteToCurse:testOwnerCanCurseAndUncurse() (gas: 200805) ARM_voteToCurse:testVoteToCurseSuccess_gas() (gas: 70262) -AggregateTokenLimiter__rateLimitValue:testAggregateValueMaxCapacityExceededReverts() (gas: 16389) -AggregateTokenLimiter__rateLimitValue:testRateLimitValueSuccess_gas() (gas: 18361) -AggregateTokenLimiter_constructor:testConstructorSuccess() (gas: 26734) -AggregateTokenLimiter_getTokenBucket:testGetTokenBucketSuccess() (gas: 19686) -AggregateTokenLimiter_getTokenBucket:testRefillSuccess() (gas: 40876) -AggregateTokenLimiter_getTokenBucket:testTimeUnderflowReverts() (gas: 15285) -AggregateTokenLimiter_getTokenLimitAdmin:testGetTokenLimitAdminSuccess() (gas: 10443) -AggregateTokenLimiter_setAdmin:testOnlyOwnerOrAdminReverts() (gas: 12961) -AggregateTokenLimiter_setAdmin:testOwnerSuccess() (gas: 18877) +AggregateTokenLimiter__getTokenValue:testGetTokenValueSuccess() (gas: 17198) +AggregateTokenLimiter__getTokenValue:testNoTokenPriceReverts() (gas: 18817) +AggregateTokenLimiter__rateLimitValue:testAggregateValueMaxCapacityExceededReverts() (gas: 16411) +AggregateTokenLimiter__rateLimitValue:testRateLimitValueSuccess_gas() (gas: 18354) +AggregateTokenLimiter_constructor:testConstructorSuccess() (gas: 26823) +AggregateTokenLimiter_getTokenBucket:testGetTokenBucketSuccess() (gas: 19708) +AggregateTokenLimiter_getTokenBucket:testRefillSuccess() (gas: 40935) +AggregateTokenLimiter_getTokenBucket:testTimeUnderflowReverts() (gas: 15307) +AggregateTokenLimiter_getTokenLimitAdmin:testGetTokenLimitAdminSuccess() (gas: 10465) +AggregateTokenLimiter_setAdmin:testOnlyOwnerOrAdminReverts() (gas: 13012) +AggregateTokenLimiter_setAdmin:testOwnerSuccess() (gas: 18950) AggregateTokenLimiter_setRateLimiterConfig:testOnlyOnlyCallableByAdminOrOwnerReverts() (gas: 17434) -AggregateTokenLimiter_setRateLimiterConfig:testOwnerSuccess() (gas: 30020) -AggregateTokenLimiter_setRateLimiterConfig:testTokenLimitAdminSuccess() (gas: 32003) +AggregateTokenLimiter_setRateLimiterConfig:testOwnerSuccess() (gas: 30050) +AggregateTokenLimiter_setRateLimiterConfig:testTokenLimitAdminSuccess() (gas: 32032) BurnFromMintTokenPool_lockOrBurn:testChainNotAllowedReverts() (gas: 22860) BurnFromMintTokenPool_lockOrBurn:testPoolBurnRevertNotHealthyReverts() (gas: 63723) BurnFromMintTokenPool_lockOrBurn:testPoolBurnSuccess() (gas: 248751) @@ -97,44 +99,46 @@ CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 207184) DefensiveExampleTest:testRecovery() (gas: 431320) -E2E:testE2E_3MessagesSuccess_gas() (gas: 991841) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 625164) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 143685) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 27261) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 31714) -EVM2EVMOffRamp__releaseOrMintTokens:test_fuzz__releaseOrMintTokens_AnyRevertIsCaught_Success(uint256) (runs: 256, μ: 23177, ~: 23903) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 157516) -EVM2EVMOffRamp__report:testReportSuccess() (gas: 127460) +E2E:testE2E_3MessagesSuccess_gas() (gas: 991819) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 625054) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 143663) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 27239) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 31692) +EVM2EVMOffRamp__releaseOrMintTokens:test_fuzz__releaseOrMintTokens_AnyRevertIsCaught_Success(uint256) (runs: 256, μ: 23127, ~: 23881) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 157494) +EVM2EVMOffRamp__report:testReportSuccess() (gas: 127438) EVM2EVMOffRamp__trialExecute:testRateLimitErrorSuccess() (gas: 195843) EVM2EVMOffRamp__trialExecute:testTokenHandlingErrorIsCaughtSuccess() (gas: 204499) EVM2EVMOffRamp__trialExecute:test_trialExecuteSuccess() (gas: 259973) +EVM2EVMOffRamp__updateRateLimitTokens:testNonOwnerReverts() (gas: 12160) +EVM2EVMOffRamp__updateRateLimitTokens:test_updateRateLimitTokensSuccess() (gas: 156261) EVM2EVMOffRamp_ccipReceive:testReverts() (gas: 17043) EVM2EVMOffRamp_constructor:testCommitStoreAlreadyInUseReverts() (gas: 158125) -EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5178349) +EVM2EVMOffRamp_constructor:testConstructorSuccess() (gas: 5189210) EVM2EVMOffRamp_constructor:testZeroOnRampAddressReverts() (gas: 148872) -EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 137483) -EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 19038) -EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 34134) -EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49417) -EVM2EVMOffRamp_execute:testInvalidSourcePoolAddressSuccess() (gas: 409903) -EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 44164) -EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 150204) -EVM2EVMOffRamp_execute:testPausedReverts() (gas: 99235) -EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 164545) -EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 39062) -EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413890) -EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 174116) -EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 246354) -EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114745) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 354522) -EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51950) -EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 131724) -EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49773) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 480492) -EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 419323) -EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 33092) -EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 468475) -EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61498) +EVM2EVMOffRamp_execute:testAlreadyExecutedReverts() (gas: 137439) +EVM2EVMOffRamp_execute:testEmptyReportReverts() (gas: 19016) +EVM2EVMOffRamp_execute:testInvalidMessageIdReverts() (gas: 34112) +EVM2EVMOffRamp_execute:testInvalidSourceChainReverts() (gas: 49373) +EVM2EVMOffRamp_execute:testInvalidSourcePoolAddressSuccess() (gas: 409837) +EVM2EVMOffRamp_execute:testManualExecutionNotYetEnabledReverts() (gas: 44142) +EVM2EVMOffRamp_execute:testMessageTooLargeReverts() (gas: 150160) +EVM2EVMOffRamp_execute:testPausedReverts() (gas: 99213) +EVM2EVMOffRamp_execute:testReceiverErrorSuccess() (gas: 164501) +EVM2EVMOffRamp_execute:testRootNotCommittedReverts() (gas: 39040) +EVM2EVMOffRamp_execute:testRouterYULCallReverts() (gas: 413846) +EVM2EVMOffRamp_execute:testSingleMessageNoTokensSuccess() (gas: 174050) +EVM2EVMOffRamp_execute:testSingleMessageToNonCCIPReceiverSuccess() (gas: 246310) +EVM2EVMOffRamp_execute:testSingleMessagesNoTokensSuccess_gas() (gas: 114723) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceStillExecutesSuccess() (gas: 354478) +EVM2EVMOffRamp_execute:testSkippedIncorrectNonceSuccess() (gas: 51906) +EVM2EVMOffRamp_execute:testStrictUntouchedToSuccessSuccess() (gas: 131680) +EVM2EVMOffRamp_execute:testTokenDataMismatchReverts() (gas: 49751) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensAndGESuccess() (gas: 480448) +EVM2EVMOffRamp_execute:testTwoMessagesWithTokensSuccess_gas() (gas: 419301) +EVM2EVMOffRamp_execute:testUnexpectedTokenDataReverts() (gas: 33070) +EVM2EVMOffRamp_execute:testUnhealthyReverts() (gas: 468431) +EVM2EVMOffRamp_execute:testUnsupportedNumberOfTokensReverts() (gas: 61454) EVM2EVMOffRamp_executeSingleMessage:testMessageSenderReverts() (gas: 20583) EVM2EVMOffRamp_executeSingleMessage:testNonContractSuccess() (gas: 20121) EVM2EVMOffRamp_executeSingleMessage:testNonContractWithTokensSuccess() (gas: 227589) @@ -142,49 +146,50 @@ EVM2EVMOffRamp_executeSingleMessage:testTokenHandlingErrorReverts() (gas: 180163 EVM2EVMOffRamp_executeSingleMessage:testZeroGasDONExecutionReverts() (gas: 48637) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48110) EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 262006) -EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 233029) -EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 281429) -EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 262582) -EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 229263) -EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 131524) -EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3343429) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionStateSuccess() (gas: 82666) -EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 497153) -EVM2EVMOffRamp_manuallyExecute:testManualExecFailedTxReverts() (gas: 188051) -EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 25984) -EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43480) -EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 26003) -EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 189749) -EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 190420) -EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFails() (gas: 2042576) -EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 8960) -EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 40310) -EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38520) +EVM2EVMOffRamp_execute_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 232963) +EVM2EVMOffRamp_execute_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 281319) +EVM2EVMOffRamp_execute_upgrade:testV2OffRampNonceSkipsIfMsgInFlightSuccess() (gas: 262450) +EVM2EVMOffRamp_execute_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 229131) +EVM2EVMOffRamp_execute_upgrade:testV2Success() (gas: 131502) +EVM2EVMOffRamp_getExecutionState:testFillExecutionStateSuccess() (gas: 3360325) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionStateSuccess() (gas: 82776) +EVM2EVMOffRamp_manuallyExecute:testLowGasLimitManualExecSuccess() (gas: 497174) +EVM2EVMOffRamp_manuallyExecute:testManualExecFailedTxReverts() (gas: 188072) +EVM2EVMOffRamp_manuallyExecute:testManualExecForkedChainReverts() (gas: 26049) +EVM2EVMOffRamp_manuallyExecute:testManualExecGasLimitMismatchReverts() (gas: 43675) +EVM2EVMOffRamp_manuallyExecute:testManualExecInvalidGasLimitReverts() (gas: 26068) +EVM2EVMOffRamp_manuallyExecute:testManualExecSuccess() (gas: 189770) +EVM2EVMOffRamp_manuallyExecute:testManualExecWithGasOverrideSuccess() (gas: 190441) +EVM2EVMOffRamp_manuallyExecute:testReentrancyManualExecuteFails() (gas: 2042684) +EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 8938) +EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 40332) +EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38542) EVM2EVMOffRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 144167) EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5516252) EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31723) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126926) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 127250) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137765) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126983) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 127285) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137822) +EVM2EVMOnRamp_forwardFromRouter:testHighCapacityARLOffSuccess() (gas: 213319) EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressEncodePackedReverts() (gas: 24143) -EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24442) +EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24464) EVM2EVMOnRamp_forwardFromRouter:testInvalidChainSelectorReverts() (gas: 23186) EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23473) -EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 79450) +EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 79485) EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32398) -EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 27161) +EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 27117) EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105650) EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20332) -EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 50983) -EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 23183) -EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 52685) +EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 50989) +EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 23189) +EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 52697) EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 170340) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 107733) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 127011) -EVM2EVMOnRamp_forwardFromRouter:testSourceTokenDataTooLargeReverts() (gas: 3572353) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 107768) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 127116) +EVM2EVMOnRamp_forwardFromRouter:testSourceTokenDataTooLargeReverts() (gas: 3572365) EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28283) EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 43114) -EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 106457) +EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 106426) EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 173989) EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 142371) EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 186548) @@ -240,7 +245,7 @@ EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190427) EVM2EVMOnRamp_setNops:testZeroAddressCannotBeNopReverts() (gas: 53616) EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 13536) EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 16445) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetTokenTransferFeeSuccess() (gas: 80076) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetTokenTransferFeeSuccess() (gas: 80913) EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 78604) EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 15306) EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 275745) diff --git a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol index f3b5ee6eac..195d3a2a2d 100644 --- a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol +++ b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol @@ -1,14 +1,21 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.19; +import {IPriceRegistry} from "./interfaces/IPriceRegistry.sol"; + import {OwnerIsCreator} from "./../shared/access/OwnerIsCreator.sol"; +import {Client} from "./libraries/Client.sol"; import {RateLimiter} from "./libraries/RateLimiter.sol"; +import {USDPriceWith18Decimals} from "./libraries/USDPriceWith18Decimals.sol"; /// @notice The aggregate rate limiter is a wrapper of the token bucket rate limiter /// which permits rate limiting based on the aggregate value of a group of /// token transfers, using a price registry to convert to a numeraire asset (e.g. USD). contract AggregateRateLimiter is OwnerIsCreator { using RateLimiter for RateLimiter.TokenBucket; + using USDPriceWith18Decimals for uint224; + + error PriceNotFoundForToken(address token); event AdminSet(address newAdmin); @@ -35,6 +42,17 @@ contract AggregateRateLimiter is OwnerIsCreator { s_rateLimiter._consume(value, address(0)); } + function _getTokenValue( + Client.EVMTokenAmount memory tokenAmount, + IPriceRegistry priceRegistry + ) internal view returns (uint256) { + // not fetching validated price, as price staleness is not important for value-based rate limiting + // we only need to verify the price is not 0 + uint224 pricePerToken = priceRegistry.getTokenPrice(tokenAmount.token).value; + if (pricePerToken == 0) revert PriceNotFoundForToken(tokenAmount.token); + return pricePerToken._calcUSDValueFromTokenAmount(tokenAmount.amount); + } + /// @notice Gets the token bucket with its values for the block it was requested at. /// @return The token bucket. function currentRateLimiterState() external view returns (RateLimiter.TokenBucket memory) { diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index a8fe14394d..a8d3bbbf6a 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -11,15 +11,14 @@ import {IRouter} from "../interfaces/IRouter.sol"; import {IPool} from "../interfaces/pools/IPool.sol"; import {CallWithExactGas} from "../../shared/call/CallWithExactGas.sol"; -import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; import {AggregateRateLimiter} from "../AggregateRateLimiter.sol"; import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; import {RateLimiter} from "../libraries/RateLimiter.sol"; -import {USDPriceWith18Decimals} from "../libraries/USDPriceWith18Decimals.sol"; import {OCR2BaseNoChecks} from "../ocr/OCR2BaseNoChecks.sol"; import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; +import {EnumerableSet} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"; /// @notice EVM2EVMOffRamp enables OCR networks to execute multiple messages /// in an OffRamp in a single transaction. @@ -31,7 +30,6 @@ import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersion, OCR2BaseNoChecks { using ERC165Checker for address; using EnumerableSet for EnumerableSet.AddressSet; - using USDPriceWith18Decimals for uint224; error AlreadyAttempted(uint64 sequenceNumber); error AlreadyExecuted(uint64 sequenceNumber); @@ -55,7 +53,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio error InvalidMessageId(); error InvalidAddress(bytes encodedAddress); error InvalidNewState(uint64 sequenceNumber, Internal.MessageExecutionState newState); - error PriceNotFoundForToken(address token); /// @dev Atlas depends on this event, if changing, please notify Atlas. event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); @@ -146,7 +143,10 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio i_metadataHash = _metadataHash(Internal.EVM_2_EVM_MESSAGE_HASH); - _addRateLimitedTokens(rateLimitedTokens); + for (uint256 i = 0; i < rateLimitedTokens.length; ++i) { + bool success = s_rateLimitedTokens.add(rateLimitedTokens[i]); + if (success) emit TokenAggregateRateLimitAdded(rateLimitedTokens[i]); + } } // ================================================================ @@ -489,29 +489,21 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio /// @notice Get all tokens which are included in Aggregate Rate Limiting. /// @return rateLimitedTokens Array of Aggregate Rate Limited tokens. - function getAllRateLimitedTokens() external view returns (address[] memory) { + function getAllRateLimitTokens() external view returns (address[] memory) { return s_rateLimitedTokens.values(); } - /// @notice Adds tokens from being used in Aggregate Rate Limiting. - /// @param adds A list of one or more tokens to be added. - function addRateLimitedTokens(address[] memory adds) external onlyOwner { - _addRateLimitedTokens(adds); - } - - function _addRateLimitedTokens(address[] memory adds) internal { + /// @notice Adds or removes tokens from being used in Aggregate Rate Limiting. + /// @param adds - A list of one or more tokens to be added. + /// @param removes - A list of one or more tokens to be removed. + function updateRateLimitTokens(address[] memory removes, address[] memory adds) external onlyOwner { for (uint256 i = 0; i < adds.length; ++i) { - s_rateLimitedTokens.add(adds[i]); - emit TokenAggregateRateLimitAdded(adds[i]); + bool success = s_rateLimitedTokens.add(adds[i]); + if (success) emit TokenAggregateRateLimitAdded(adds[i]); } - } - - /// @notice Removes tokens from being used in Aggregate Rate Limiting. - /// @param removes A list of one or more tokens to be removed. - function removeRateLimitedTokens(address[] memory removes) external onlyOwner { for (uint256 i = 0; i < removes.length; ++i) { - s_rateLimitedTokens.remove(removes[i]); - emit TokenAggregateRateLimitRemoved(removes[i]); + bool success = s_rateLimitedTokens.remove(removes[i]); + if (success) emit TokenAggregateRateLimitRemoved(removes[i]); } } @@ -591,17 +583,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio return address(uint160(decodedAddress)); } - function _getTokenValue( - Client.EVMTokenAmount memory tokenAmount, - IPriceRegistry priceRegistry - ) internal view returns (uint256) { - // not fetching validated price, as price staleness is not important for value-based rate limiting - // we only need to verify the price is not 0 - uint224 pricePerToken = priceRegistry.getTokenPrice(tokenAmount.token).value; - if (pricePerToken == 0) revert PriceNotFoundForToken(tokenAmount.token); - return pricePerToken._calcUSDValueFromTokenAmount(tokenAmount.amount); - } - // ================================================================ // │ Access and ARM │ // ================================================================ diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index da573350aa..8e598d686c 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -58,7 +58,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, error CannotSendZeroTokens(); error SourceTokenDataTooLarge(address token); error InvalidChainSelector(uint64 chainSelector); - error PriceNotFoundForToken(address token); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); event NopPaid(address indexed nop, uint256 amount); @@ -459,17 +458,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, return ITokenAdminRegistry(s_dynamicConfig.tokenAdminRegistry).getAllConfiguredTokens(); } - function _getTokenValue( - Client.EVMTokenAmount memory tokenAmount, - IPriceRegistry priceRegistry - ) internal view returns (uint256) { - // not fetching validated price, as price staleness is not important for value-based rate limiting - // we only need to verify the price is not 0 - uint224 pricePerToken = priceRegistry.getTokenPrice(tokenAmount.token).value; - if (pricePerToken == 0) revert PriceNotFoundForToken(tokenAmount.token); - return pricePerToken._calcUSDValueFromTokenAmount(tokenAmount.amount); - } - // ================================================================ // │ Fees │ // ================================================================ diff --git a/contracts/src/v0.8/ccip/test/helpers/AggregateRateLimiterHelper.sol b/contracts/src/v0.8/ccip/test/helpers/AggregateRateLimiterHelper.sol index 9bd490f215..71510cafe9 100644 --- a/contracts/src/v0.8/ccip/test/helpers/AggregateRateLimiterHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/AggregateRateLimiterHelper.sol @@ -9,4 +9,11 @@ contract AggregateRateLimiterHelper is AggregateRateLimiter { function rateLimitValue(uint256 value) public { _rateLimitValue(value); } + + function getTokenValue( + Client.EVMTokenAmount memory tokenAmount, + IPriceRegistry priceRegistry + ) public view returns (uint256) { + return _getTokenValue(tokenAmount, priceRegistry); + } } diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol index 5aedf59c93..3fb926140d 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -28,7 +28,7 @@ import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/tok contract EVM2EVMOffRamp_constructor is EVM2EVMOffRampSetup { event ConfigSet(EVM2EVMOffRamp.StaticConfig staticConfig, EVM2EVMOffRamp.DynamicConfig dynamicConfig); - event PoolAdded(address token, address pool); + event TokenAggregateRateLimitAdded(address token); function testConstructorSuccess() public { EVM2EVMOffRamp.StaticConfig memory staticConfig = EVM2EVMOffRamp.StaticConfig({ @@ -42,6 +42,11 @@ contract EVM2EVMOffRamp_constructor is EVM2EVMOffRampSetup { EVM2EVMOffRamp.DynamicConfig memory dynamicConfig = generateDynamicOffRampConfig(address(s_destRouter), address(s_priceRegistry)); + for (uint256 i = 0; i < s_destTokens.length; ++i) { + vm.expectEmit(); + emit TokenAggregateRateLimitAdded(s_destTokens[i]); + } + s_offRamp = new EVM2EVMOffRampHelper(staticConfig, getInboundRateLimiterConfig(), s_destTokens); s_offRamp.setOCR2Config( @@ -67,6 +72,7 @@ contract EVM2EVMOffRamp_constructor is EVM2EVMOffRampSetup { // OffRamp initial values assertEq("EVM2EVMOffRamp 1.5.0-dev", s_offRamp.typeAndVersion()); assertEq(OWNER, s_offRamp.owner()); + assertEq(s_destTokens, s_offRamp.getAllRateLimitTokens()); } // Revert @@ -1233,3 +1239,49 @@ contract EVM2EVMOffRamp__releaseOrMintTokens is EVM2EVMOffRampSetup { } } } + +contract EVM2EVMOffRamp__updateRateLimitTokens is EVM2EVMOffRampSetup { + event TokenAggregateRateLimitAdded(address token); + event TokenAggregateRateLimitRemoved(address token); + + function test_updateRateLimitTokensSuccess() public { + assertEq(s_destTokens, s_offRamp.getAllRateLimitTokens()); + + address token1 = makeAddr("Some token 1"); + address token2 = makeAddr("Some token 2"); + address token3 = makeAddr("Some token 3"); + + address[] memory addsAndRemoves = new address[](4); + addsAndRemoves[0] = token1; + addsAndRemoves[1] = token2; + addsAndRemoves[2] = token3; + // Add/removes token twice, expect no event on second add/remove + addsAndRemoves[3] = token3; + + for (uint256 i = 0; i < addsAndRemoves.length - 1; ++i) { + vm.expectEmit(); + emit TokenAggregateRateLimitAdded(addsAndRemoves[i]); + } + for (uint256 i = 0; i < addsAndRemoves.length - 1; ++i) { + vm.expectEmit(); + emit TokenAggregateRateLimitRemoved(addsAndRemoves[i]); + } + + s_offRamp.updateRateLimitTokens(addsAndRemoves, addsAndRemoves); + + assertEq(s_destTokens, s_offRamp.getAllRateLimitTokens()); + } + + // Reverts + + function testNonOwnerReverts() public { + address[] memory adds; + address[] memory removes; + + vm.startPrank(STRANGER); + + vm.expectRevert("Only callable by owner"); + + s_offRamp.updateRateLimitTokens(adds, removes); + } +} 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 c896bbdadb..3f5b5f2d3b 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol @@ -375,6 +375,53 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { assertEq(feeTokenAmount, s_onRamp.getNopFeesJuels()); } + function testHighCapacityARLOffSuccess() public { + Client.EVM2AnyMessage memory message = _generateEmptyMessage(); + message.tokenAmounts = new Client.EVMTokenAmount[](1); + message.tokenAmounts[0].amount = 10; + message.tokenAmounts[0].token = s_sourceTokens[0]; + + IERC20(s_sourceTokens[0]).approve(address(s_onRamp), 10); + + vm.startPrank(OWNER); + // Set a high price to trip the ARL + uint224 tokenPrice = 3 ** 128; + Internal.PriceUpdates memory priceUpdates = getSingleTokenPriceUpdateStruct(s_sourceTokens[0], tokenPrice); + s_priceRegistry.updatePrices(priceUpdates); + vm.startPrank(address(s_sourceRouter)); + + vm.expectRevert( + abi.encodeWithSelector( + RateLimiter.AggregateValueMaxCapacityExceeded.selector, + getOutboundRateLimiterConfig().capacity, + (message.tokenAmounts[0].amount * tokenPrice) / 1e18 + ) + ); + // Expect to fail from ARL + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER); + + // Configure ARL off for token + EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig = + s_onRamp.getTokenTransferFeeConfig(s_sourceTokens[0]); + EVM2EVMOnRamp.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = + new EVM2EVMOnRamp.TokenTransferFeeConfigArgs[](1); + tokenTransferFeeConfigArgs[0] = EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ + token: s_sourceTokens[0], + minFeeUSDCents: tokenTransferFeeConfig.minFeeUSDCents, + maxFeeUSDCents: tokenTransferFeeConfig.maxFeeUSDCents, + deciBps: tokenTransferFeeConfig.deciBps, + destGasOverhead: tokenTransferFeeConfig.destGasOverhead, + destBytesOverhead: tokenTransferFeeConfig.destBytesOverhead, + aggregateRateLimitEnabled: false + }); + vm.startPrank(OWNER); + s_onRamp.setTokenTransferFeeConfig(tokenTransferFeeConfigArgs); + + vm.startPrank(address(s_sourceRouter)); + // Expect the call now succeeds + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER); + } + // Reverts function testPausedReverts() public { @@ -494,7 +541,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { message.tokenAmounts[0].token = CUSTOM_TOKEN; message.tokenAmounts[0].amount = 1; - vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.PriceNotFoundForToken.selector, CUSTOM_TOKEN)); + vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, CUSTOM_TOKEN)); s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER); } @@ -1570,7 +1617,7 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { deciBps: 1, destGasOverhead: 1, destBytesOverhead: 1, - aggregateRateLimitEnabled: true + aggregateRateLimitEnabled: false }); vm.expectEmit(); @@ -1584,6 +1631,7 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { assertEq(0, tokenTransferFeeConfig0.deciBps); assertEq(0, tokenTransferFeeConfig0.destGasOverhead); assertEq(0, tokenTransferFeeConfig0.destBytesOverhead); + assertEq(true, tokenTransferFeeConfig0.aggregateRateLimitEnabled); EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig1 = s_onRamp.getTokenTransferFeeConfig(address(1)); assertEq(1, tokenTransferFeeConfig1.minFeeUSDCents); @@ -1591,6 +1639,7 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { assertEq(1, tokenTransferFeeConfig1.deciBps); assertEq(1, tokenTransferFeeConfig1.destGasOverhead); assertEq(1, tokenTransferFeeConfig1.destBytesOverhead); + assertEq(false, tokenTransferFeeConfig1.aggregateRateLimitEnabled); } function testSetFeeTokenConfigByAdminSuccess() public { diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol index b3c334d2c5..16d8e38207 100644 --- a/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol +++ b/contracts/src/v0.8/ccip/test/rateLimiter/AggregateRateLimiter.t.sol @@ -226,3 +226,22 @@ contract AggregateTokenLimiter__rateLimitValue is AggregateTokenLimiterSetup { s_rateLimiter.rateLimitValue(value); } } + +/// @notice #_getTokenValue +contract AggregateTokenLimiter__getTokenValue is AggregateTokenLimiterSetup { + function testGetTokenValueSuccess() public { + uint256 numberOfTokens = 10; + Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: TOKEN, amount: 10}); + uint256 value = s_rateLimiter.getTokenValue(tokenAmount, s_priceRegistry); + assertEq(value, (numberOfTokens * TOKEN_PRICE) / 1e18); + } + + // Reverts + function testNoTokenPriceReverts() public { + address tokenWithNoPrice = makeAddr("Token with no price"); + Client.EVMTokenAmount memory tokenAmount = Client.EVMTokenAmount({token: tokenWithNoPrice, amount: 10}); + + vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, tokenWithNoPrice)); + s_rateLimiter.getTokenValue(tokenAmount, s_priceRegistry); + } +} diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index 7cf8b5c72b..b95751eacd 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -99,8 +99,8 @@ type RateLimiterTokenBucket struct { } var EVM2EVMOffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"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\"},{\"internalType\":\"address[]\",\"name\":\"rateLimitedTokens\",\"type\":\"address[]\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"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\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"addRateLimitedTokens\",\"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\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"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\":\"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\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"}],\"name\":\"removeRateLimitedTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"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\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162005cee38038062005cee8339810160408190526200003591620006a9565b8133806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002b0565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508301516001600160a01b031615806200016f575082516001600160a01b0316155b156200018e576040516342bcdf7f60e11b815260040160405180910390fd5b82600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f791906200078e565b6001600160401b03166001146200022157604051636fc2a20760e11b815260040160405180910390fd5b82516001600160a01b0390811660a090815260408501516001600160401b0390811660c05260208601511660e052606085015182166101005260808501518216610140528401511661016052620002987f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36200035b565b61012052620002a781620003c2565b505050620007ea565b336001600160a01b038216036200030a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003a594939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60005b8151811015620004785762000401828281518110620003e857620003e8620007ac565b6020026020010151600c6200047c60201b90919060201c565b507fd9fda0bdb11c1ae5e51144a17c6080d6b44cf243cc24807a6b9ba875fb7e3f75828281518110620004385762000438620007ac565b60200260200101516040516200045d91906001600160a01b0391909116815260200190565b60405180910390a16200047081620007c2565b9050620003c5565b5050565b600062000493836001600160a01b0384166200049c565b90505b92915050565b6000818152600183016020526040812054620004e55750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000496565b50600062000496565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715620005295762000529620004ee565b60405290565b80516001600160a01b03811681146200054757600080fd5b919050565b80516001600160401b03811681146200054757600080fd5b80516001600160801b03811681146200054757600080fd5b6000606082840312156200058f57600080fd5b604051606081016001600160401b0381118282101715620005b457620005b4620004ee565b806040525080915082518015158114620005cd57600080fd5b8152620005dd6020840162000564565b6020820152620005f06040840162000564565b60408201525092915050565b600082601f8301126200060e57600080fd5b815160206001600160401b03808311156200062d576200062d620004ee565b8260051b604051601f19603f83011681018181108482111715620006555762000655620004ee565b6040529384528581018301938381019250878511156200067457600080fd5b83870191505b848210156200069e576200068e826200052f565b835291830191908301906200067a565b979650505050505050565b6000806000838503610140811215620006c157600080fd5b60c0811215620006d057600080fd5b50620006db62000504565b620006e6856200052f565b8152620006f6602086016200054c565b602082015262000709604086016200054c565b60408201526200071c606086016200052f565b60608201526200072f608086016200052f565b60808201526200074260a086016200052f565b60a08201529250620007588560c086016200057c565b6101208501519092506001600160401b038111156200077657600080fd5b6200078486828701620005fc565b9150509250925092565b600060208284031215620007a157600080fd5b62000493826200054c565b634e487b7160e01b600052603260045260246000fd5b600060018201620007e357634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615427620008c7600039600081816102c10152818161197e0152611be101526000818161029201528181611092015281816110fa0152818161195701528181612130015261219d01526000611d8d015260008181610263015261192d01526000818161020301526118db01526000818161023301528181611905015281816129b60152612e850152600081816101d4015281816118ad0152611e75015260008181610e0201528181610e4e015281816111ce015261121a01526154276000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637437ff9f116100e35780638da5cb5b1161008c578063c92b283211610066578063c92b283214610617578063f2fde38b1461062a578063f52121a51461063d57600080fd5b80638da5cb5b146105d3578063afcb95d7146105e4578063b1dc65a41461060457600080fd5b806385572ffb116100bd57806385572ffb14610591578063856c82471461059f5780638bfd7cbb146105cb57600080fd5b80637437ff9f1461046f57806379ba50971461055957806381ff70481461056157600080fd5b806353c150ba11610145578063666cab8d1161011f578063666cab8d14610434578063704b6c0214610449578063740f41501461045c57600080fd5b806353c150ba14610398578063546719cd146103ab578063599f64311461040f57600080fd5b8063181f5a7711610176578063181f5a77146103275780631ef381741461037057806325fdafcb1461038557600080fd5b806306285c6914610192578063142a98fc14610307575b600080fd5b6102f16040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102fe9190613c04565b60405180910390f35b61031a610315366004613c8e565b610650565b6040516102fe9190613d15565b6103636040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b6040516102fe9190613d73565b61038361037e366004613fbb565b6106cb565b005b610383610393366004614088565b610b56565b6103836103a6366004614088565b610b6a565b6103b3610c1f565b6040516102fe919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b0390911681526020016102fe565b61043c610cd4565b6040516102fe9190614101565b610383610457366004614114565b610d36565b61038361046a366004614570565b610dff565b61054c6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff80821683526001600160a01b0364010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b6040516102fe919061462b565b610383610f81565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016102fe565b61038361018d36600461468d565b6105b26105ad366004614114565b611064565b60405167ffffffffffffffff90911681526020016102fe565b61043c61116c565b6000546001600160a01b031661041c565b6040805160018152600060208201819052918101919091526060016102fe565b61038361061236600461470d565b611178565b610383610625366004614812565b6113fc565b610383610638366004614114565b611464565b61038361064b366004614862565b611475565b600061065e600160046148f5565b600261066b608085614937565b67ffffffffffffffff1661067f919061495e565b600f600061068e608087614975565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106c5576106c5613cab565b92915050565b84518460ff16601f821115610741576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036107ab576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610738565b6107b3611685565b6107bc856116fb565b60095460005b8181101561083b5760086000600983815481106107e1576107e161499c565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055610834816149cb565b90506107c2565b50875160005b81811015610a105760008a828151811061085d5761085d61499c565b602002602001015190506000600281111561087a5761087a613cab565b6001600160a01b038216600090815260086020526040902054610100900460ff1660028111156108ac576108ac613cab565b14610913576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610738565b6001600160a01b038116610953576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016176101008360028111156109f6576109f6613cab565b02179055509050505080610a09906149cb565b9050610841565b508851610a249060099060208c0190613b72565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610aaa914691309190600090610a7c9063ffffffff16614a03565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d6119e2565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610b4199989796959493929190614a26565b60405180910390a15050505050505050505050565b610b5e611685565b610b6781611a6f565b50565b610b72611685565b60005b8151811015610c1b57610bab828281518110610b9357610b9361499c565b6020026020010151600c611b1890919063ffffffff16565b507ffc16088b4213ca373fd6511475fedb3850038eff902c19a9611fc783674c2e84828281518110610bdf57610bdf61499c565b6020026020010151604051610c0391906001600160a01b0391909116815260200190565b60405180910390a1610c14816149cb565b9050610b75565b5050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610ccf90611b2d565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610d2c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d0e575b5050505050905090565b6000546001600160a01b03163314801590610d5c57506002546001600160a01b03163314155b15610d93576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f000000000000000000000000000000000000000000000000000000000000000014610e8a576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff46166024820152604401610738565b81515181518114610ec7576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f71576000838281518110610ee657610ee661499c565b6020026020010151905080600014158015610f1f57508451805183908110610f1057610f1061499c565b60200260200101516080015181105b15610f60576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610738565b50610f6a816149cb565b9050610eca565b50610f7c8383611bdf565b505050565b6001546001600160a01b03163314610ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610738565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600e602052604081205467ffffffffffffffff16801580156110bd57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156106c5576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611141573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111659190614abc565b9392505050565b6060610ccf600c612588565b6111828787612595565b6005548835908082146111cb576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610738565b467f00000000000000000000000000000000000000000000000000000000000000001461124c576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610738565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156112d4576112d4613cab565b60028111156112e5576112e5613cab565b905250905060028160200151600281111561130257611302613cab565b14801561133c57506009816000015160ff16815481106113245761132461499c565b6000918252602090912001546001600160a01b031633145b611372576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600061138085602061495e565b61138b88602061495e565b6113978b610144614ad9565b6113a19190614ad9565b6113ab9190614ad9565b90503681146113ef576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610738565b5050505050505050505050565b6000546001600160a01b0316331480159061142257506002546001600160a01b03163314155b15611459576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b676003826125b8565b61146c611685565b610b678161279d565b3330146114ae576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600080825260208201909252816114eb565b60408051808201909152600080825260208201528152602001906001900390816114c45790505b50610140840151519091501561154b57611548836101400151846020015160405160200161152891906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612878565b90505b60408301516001600160a01b03163b158061159b57506040830151611599906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612b3b565b155b156115a557505050565b600a54600090819064010000000090046001600160a01b0316633cf979836115cd8786612b57565b611388886080015189604001516040518563ffffffff1660e01b81526004016115f99493929190614b30565b6000604051808303816000875af1158015611618573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116409190810190614c3a565b50915091508161167e57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b5050505050565b6000546001600160a01b031633146116f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610738565b565b6000818060200190518101906117119190614ca8565b60208101519091506001600160a01b0316611758576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516001600160a01b03908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a916119d6918490614d54565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611a0699989796959493929190614e16565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b60005b8151811015610c1b57611aa8828281518110611a9057611a9061499c565b6020026020010151600c612bfa90919063ffffffff16565b507fd9fda0bdb11c1ae5e51144a17c6080d6b44cf243cc24807a6b9ba875fb7e3f75828281518110611adc57611adc61499c565b6020026020010151604051611b0091906001600160a01b0391909116815260200190565b60405180910390a1611b11816149cb565b9050611a72565b6000611165836001600160a01b038416612c0f565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611bbb82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611b9f91906148f5565b85608001516fffffffffffffffffffffffffffffffff16612d09565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c619190614e9e565b15611c98576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611cd5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611d13576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611d2e57611d2e613d86565b604051908082528060200260200182016040528015611d57578160200160208202803683370190505b50905060005b82811015611e3757600085600001518281518110611d7d57611d7d61499c565b60200260200101519050611db1817f0000000000000000000000000000000000000000000000000000000000000000612d28565b838381518110611dc357611dc361499c565b602002602001018181525050806101800151838381518110611de757611de761499c565b602002602001015114611e26576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611e30816149cb565b9050611d5d565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611eab92879291600401614eeb565b602060405180830381865afa158015611ec8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eec9190614f21565b905080600003611f28576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561257f57600087600001518281518110611f4f57611f4f61499c565b602002602001015190506000611f688260600151610650565b90506000816003811115611f7e57611f7e613cab565b1480611f9b57506003816003811115611f9957611f99613cab565b145b611fe35760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610738565b83156120a057600a5460009063ffffffff16611fff87426148f5565b119050808061201f5750600382600381111561201d5761201d613cab565b145b612055576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8884815181106120675761206761499c565b602002602001015160001461209a578884815181106120885761208861499c565b60200260200101518360800181815250505b506120fd565b60008160038111156120b4576120b4613cab565b146120fd5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610738565b6020808301516001600160a01b03166000908152600e909152604090205467ffffffffffffffff168015801561215b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156122d75760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156121e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061220a9190614abc565b60c084015190915067ffffffffffffffff16612227826001614f3a565b67ffffffffffffffff16146122875782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a350505061256f565b6020838101516001600160a01b03166000908152600e9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156122eb576122eb613cab565b0361236a5760c083015167ffffffffffffffff1661230a826001614f3a565b67ffffffffffffffff161461236a5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a350505061256f565b60008a6020015185815181106123825761238261499c565b602002602001015190506123ae8460600151856000015186610140015151876101200151518551612e83565b6123bd8460600151600161302d565b6000806123ca86846130d7565b915091506123dc86606001518361302d565b8780156123fa575060038260038111156123f8576123f8613cab565b145b1561243357806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b600382600381111561244757612447613cab565b141580156124675750600282600381111561246457612464613cab565b14155b156124a6578560600151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610738929190614f5b565b60008560038111156124ba576124ba613cab565b0361251a576020808701516001600160a01b03166000908152600e90915260408120805467ffffffffffffffff16916124f283614f79565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612560929190614f96565b60405180910390a35050505050505b612578816149cb565b9050611f2f565b50505050505050565b60606000611165836132cf565b610c1b6125a482840184614fb6565b604080516000815260208101909152611bdf565b81546000906125e190700100000000000000000000000000000000900463ffffffff16426148f5565b905080156126835760018301548354612629916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612d09565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546126a9916fffffffffffffffffffffffffffffffff908116911661332b565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906127909084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b336001600160a01b0382160361280f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610738565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612b2057600085828151811061289a5761289a61499c565b60200260200101518060200190518101906128b59190614feb565b905060006128c68260200151613341565b9050806001600160a01b03163b6000036129125781602001516040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b6129438584815181106129275761292761499c565b602002602001015160000151600c6133e690919063ffffffff16565b156129865761297985848151811061295d5761295d61499c565b6020908102919091010151600b546001600160a01b0316613408565b6129839085614ad9565b93505b600080612a98636a3d7ce860e01b8c8c8f89815181106129a8576129a861499c565b6020026020010151602001517f0000000000000000000000000000000000000000000000000000000000000000898e8c815181106129e8576129e861499c565b6020026020010151604051602401612a05969594939291906150a0565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54859063ffffffff7a010000000000000000000000000000000000000000000000000000909104166113886084613531565b509150915081612ad657806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b612adf81613341565b878681518110612af157612af161499c565b60209081029190910101516001600160a01b03909116905250612b1992508391506149cb9050565b905061287d565b508015612b3057612b3081613657565b505b95945050505050565b6000612b4683613664565b8015611165575061116583836136c8565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001612bcf91906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b6000611165836001600160a01b038416613797565b60008181526001830160205260408120548015612cf8576000612c336001836148f5565b8554909150600090612c47906001906148f5565b9050818114612cac576000866000018281548110612c6757612c6761499c565b9060005260206000200154905080876000018481548110612c8a57612c8a61499c565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cbd57612cbd615149565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106c5565b60009150506106c5565b5092915050565b6000612b3285612d19848661495e565b612d239087614ad9565b61332b565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612dbe9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612df79190615178565b60405160208183030381529060405280519060200120876101600151604051602001612e2391906151e0565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612efc576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610738565b600b5474010000000000000000000000000000000000000000900461ffff16831115612f60576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610738565b808314612fa5576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610738565b600b54760100000000000000000000000000000000000000000000900463ffffffff1682111561167e57600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff16600482015260248101839052604401610738565b6000600261303c608085614937565b67ffffffffffffffff16613050919061495e565b90506000600f81613062608087614975565b67ffffffffffffffff16815260208101919091526040016000205490508161308c600160046148f5565b901b1916818360038111156130a3576130a3613cab565b901b1780600f60006130b6608088614975565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061311b90879087906004016151f3565b600060405180830381600087803b15801561313557600080fd5b505af1925050508015613146575060015b6132b3573d808015613174576040519150601f19603f3d011682016040523d82523d6000602084013e613179565b606091505b5061318381615356565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061321b57506131d681615356565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b8061326f575061322a81615356565b7fffffffff00000000000000000000000000000000000000000000000000000000167f370d875f00000000000000000000000000000000000000000000000000000000145b1561327f576003925090506132c8565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b50506040805160208101909152600081526002905b9250929050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561331f57602002820191906000526020600020905b81548152602001906001019080831161330b575b50505050509050919050565b600081831061333a5781611165565b5090919050565b6000815160201461338057816040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b6000828060200190518101906133969190614f21565b90506001600160a01b038111806133ad5750600a81105b156106c557826040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016107389190613d73565b6001600160a01b03811660009081526001830160205260408120541515611165565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa15801561346e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349291906153a6565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036134fb5783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610738565b6020840151613529907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906137e6565b949350505050565b6000606060008361ffff1667ffffffffffffffff81111561355457613554613d86565b6040519080825280601f01601f19166020018201604052801561357e576020820181803683370190505b509150863b6135b1577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156135e4577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b859003604081048103871061361d577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156136405750835b808352806000602085013e50955095509592505050565b610b676003826000613823565b6000613690827f01ffc9a7000000000000000000000000000000000000000000000000000000006136c8565b80156106c557506136c1827fffffffff000000000000000000000000000000000000000000000000000000006136c8565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613780575060208210155b801561378c5750600081115b979650505050505050565b60008181526001830160205260408120546137de575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106c5565b5060006106c5565b6000670de0b6b3a7640000613819837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661495e565b6111659190615406565b825474010000000000000000000000000000000000000000900460ff16158061384a575081155b1561385457505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061389a90700100000000000000000000000000000000900463ffffffff16426148f5565b9050801561395a57818311156138dc576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546139169083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612d09565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156139f7576001600160a01b0384166139ac576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610738565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610738565b84831015613af05760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613a3b90826148f5565b613a45878a6148f5565b613a4f9190614ad9565b613a599190615406565b90506001600160a01b038616613aa5576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610738565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610738565b613afa85846148f5565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b828054828255906000526020600020908101928215613bdf579160200282015b82811115613bdf57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613b92565b50613beb929150613bef565b5090565b5b80821115613beb5760008155600101613bf0565b60c081016106c582846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b67ffffffffffffffff81168114610b6757600080fd5b8035613c8981613c68565b919050565b600060208284031215613ca057600080fd5b813561116581613c68565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613d11577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b602081016106c58284613cda565b60005b83811015613d3e578181015183820152602001613d26565b50506000910152565b60008151808452613d5f816020860160208601613d23565b601f01601f19169290920160200192915050565b6020815260006111656020830184613d47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613dd857613dd8613d86565b60405290565b6040516101a0810167ffffffffffffffff81118282101715613dd857613dd8613d86565b6040516080810167ffffffffffffffff81118282101715613dd857613dd8613d86565b6040516060810167ffffffffffffffff81118282101715613dd857613dd8613d86565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e7157613e71613d86565b604052919050565b600067ffffffffffffffff821115613e9357613e93613d86565b5060051b60200190565b6001600160a01b0381168114610b6757600080fd5b8035613c8981613e9d565b600082601f830112613ece57600080fd5b81356020613ee3613ede83613e79565b613e48565b82815260059290921b84018101918181019086841115613f0257600080fd5b8286015b84811015613f26578035613f1981613e9d565b8352918301918301613f06565b509695505050505050565b803560ff81168114613c8957600080fd5b600067ffffffffffffffff821115613f5c57613f5c613d86565b50601f01601f191660200190565b600082601f830112613f7b57600080fd5b8135613f89613ede82613f42565b818152846020838601011115613f9e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c08789031215613fd457600080fd5b863567ffffffffffffffff80821115613fec57600080fd5b613ff88a838b01613ebd565b9750602089013591508082111561400e57600080fd5b61401a8a838b01613ebd565b965061402860408a01613f31565b9550606089013591508082111561403e57600080fd5b61404a8a838b01613f6a565b945061405860808a01613c7e565b935060a089013591508082111561406e57600080fd5b5061407b89828a01613f6a565b9150509295509295509295565b60006020828403121561409a57600080fd5b813567ffffffffffffffff8111156140b157600080fd5b61352984828501613ebd565b600081518084526020808501945080840160005b838110156140f65781516001600160a01b0316875295820195908201906001016140d1565b509495945050505050565b60208152600061116560208301846140bd565b60006020828403121561412657600080fd5b813561116581613e9d565b8015158114610b6757600080fd5b8035613c8981614131565b600082601f83011261415b57600080fd5b8135602061416b613ede83613e79565b82815260069290921b8401810191818101908684111561418a57600080fd5b8286015b84811015613f2657604081890312156141a75760008081fd5b6141af613db5565b81356141ba81613e9d565b8152818501358582015283529183019160400161418e565b600082601f8301126141e357600080fd5b813560206141f3613ede83613e79565b82815260059290921b8401810191818101908684111561421257600080fd5b8286015b84811015613f2657803567ffffffffffffffff8111156142365760008081fd5b6142448986838b0101613f6a565b845250918301918301614216565b60006101a0828403121561426557600080fd5b61426d613dde565b905061427882613c7e565b815261428660208301613eb2565b602082015261429760408301613eb2565b60408201526142a860608301613c7e565b6060820152608082013560808201526142c360a0830161413f565b60a08201526142d460c08301613c7e565b60c08201526142e560e08301613eb2565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561431257600080fd5b61431e86838701613f6a565b8385015261014092508285013591508082111561433a57600080fd5b6143468683870161414a565b8385015261016092508285013591508082111561436257600080fd5b5061436f858286016141d2565b82840152505061018080830135818301525092915050565b600082601f83011261439857600080fd5b813560206143a8613ede83613e79565b82815260059290921b840181019181810190868411156143c757600080fd5b8286015b84811015613f2657803567ffffffffffffffff8111156143eb5760008081fd5b6143f98986838b01016141d2565b8452509183019183016143cb565b600082601f83011261441857600080fd5b81356020614428613ede83613e79565b82815260059290921b8401810191818101908684111561444757600080fd5b8286015b84811015613f26578035835291830191830161444b565b60006080828403121561447457600080fd5b61447c613e02565b9050813567ffffffffffffffff8082111561449657600080fd5b818401915084601f8301126144aa57600080fd5b813560206144ba613ede83613e79565b82815260059290921b840181019181810190888411156144d957600080fd5b8286015b84811015614511578035868111156144f55760008081fd5b6145038b86838b0101614252565b8452509183019183016144dd565b508652508581013593508284111561452857600080fd5b61453487858801614387565b9085015250604084013591508082111561454d57600080fd5b5061455a84828501614407565b6040830152506060820135606082015292915050565b6000806040838503121561458357600080fd5b823567ffffffffffffffff8082111561459b57600080fd5b6145a786838701614462565b93506020915081850135818111156145be57600080fd5b85019050601f810186136145d157600080fd5b80356145df613ede82613e79565b81815260059190911b820183019083810190888311156145fe57600080fd5b928401925b8284101561461c57833582529284019290840190614603565b80955050505050509250929050565b60c081016106c5828463ffffffff80825116835260208201516001600160a01b038082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b60006020828403121561469f57600080fd5b813567ffffffffffffffff8111156146b657600080fd5b820160a0818503121561116557600080fd5b60008083601f8401126146da57600080fd5b50813567ffffffffffffffff8111156146f257600080fd5b6020830191508360208260051b85010111156132c857600080fd5b60008060008060008060008060e0898b03121561472957600080fd5b606089018a81111561473a57600080fd5b8998503567ffffffffffffffff8082111561475457600080fd5b818b0191508b601f83011261476857600080fd5b81358181111561477757600080fd5b8c602082850101111561478957600080fd5b6020830199508098505060808b01359150808211156147a757600080fd5b6147b38c838d016146c8565b909750955060a08b01359150808211156147cc57600080fd5b506147d98b828c016146c8565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff81168114613c8957600080fd5b60006060828403121561482457600080fd5b61482c613e25565b823561483781614131565b8152614845602084016147f2565b6020820152614856604084016147f2565b60408201529392505050565b6000806040838503121561487557600080fd5b823567ffffffffffffffff8082111561488d57600080fd5b61489986838701614252565b935060208501359150808211156148af57600080fd5b506148bc858286016141d2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106c5576106c56148c6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061495257614952614908565b92169190910692915050565b80820281158282048414176106c5576106c56148c6565b600067ffffffffffffffff8084168061499057614990614908565b92169190910492915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149fc576149fc6148c6565b5060010190565b600063ffffffff808316818103614a1c57614a1c6148c6565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614a568184018a6140bd565b90508281036080840152614a6a81896140bd565b905060ff871660a084015282810360c0840152614a878187613d47565b905067ffffffffffffffff851660e0840152828103610100840152614aac8185613d47565b9c9b505050505050505050505050565b600060208284031215614ace57600080fd5b815161116581613c68565b808201808211156106c5576106c56148c6565b600081518084526020808501945080840160005b838110156140f657815180516001600160a01b031688528301518388015260409096019590820190600101614b00565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614b6b610120840182613d47565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614ba78383613d47565b925060808901519150808584030161010086015250614bc68282614aec565b92505050614bda602083018661ffff169052565b836040830152612b3260608301846001600160a01b03169052565b600082601f830112614c0657600080fd5b8151614c14613ede82613f42565b818152846020838601011115614c2957600080fd5b613529826020830160208701613d23565b600080600060608486031215614c4f57600080fd5b8351614c5a81614131565b602085015190935067ffffffffffffffff811115614c7757600080fd5b614c8386828701614bf5565b925050604084015190509250925092565b805163ffffffff81168114613c8957600080fd5b600060c08284031215614cba57600080fd5b60405160c0810181811067ffffffffffffffff82111715614cdd57614cdd613d86565b604052614ce983614c94565b81526020830151614cf981613e9d565b60208201526040830151614d0c81613e9d565b6040820152606083015161ffff81168114614d2657600080fd5b6060820152614d3760808401614c94565b6080820152614d4860a08401614c94565b60a08201529392505050565b6101808101614db982856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c084015260208401516001600160a01b0390811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a084015116610160830152611165565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b166040850152816060850152614e508285018b6140bd565b91508382036080850152614e64828a6140bd565b915060ff881660a085015283820360c0850152614e818288613d47565b90861660e08501528381036101008501529050614aac8185613d47565b600060208284031215614eb057600080fd5b815161116581614131565b600081518084526020808501945080840160005b838110156140f657815187529582019590820190600101614ecf565b606081526000614efe6060830186614ebb565b8281036020840152614f108186614ebb565b915050826040830152949350505050565b600060208284031215614f3357600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612d0257612d026148c6565b67ffffffffffffffff83168152604081016111656020830184613cda565b600067ffffffffffffffff808316818103614a1c57614a1c6148c6565b614fa08184613cda565b6040602082015260006135296040830184613d47565b600060208284031215614fc857600080fd5b813567ffffffffffffffff811115614fdf57600080fd5b61352984828501614462565b600060208284031215614ffd57600080fd5b815167ffffffffffffffff8082111561501557600080fd5b908301906060828603121561502957600080fd5b615031613e25565b82518281111561504057600080fd5b61504c87828601614bf5565b82525060208301518281111561506157600080fd5b61506d87828601614bf5565b60208301525060408301518281111561508557600080fd5b61509187828601614bf5565b60408301525095945050505050565b60c0815260006150b360c0830189613d47565b6001600160a01b038816602084015286604084015267ffffffffffffffff8616606084015282810360808401528451606082526150f36060830182613d47565b90506020860151828203602084015261510c8282613d47565b915050604086015182820360408401526151268282613d47565b9250505082810360a084015261513c8185613d47565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6020815260006111656020830184614aec565b600081518084526020808501808196508360051b8101915082860160005b858110156151d35782840389526151c1848351613d47565b988501989350908401906001016151a9565b5091979650505050505050565b602081526000611165602083018461518b565b6040815261520e60408201845167ffffffffffffffff169052565b6000602084015161522a60608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061528b8185018367ffffffffffffffff169052565b60e086015191506101206152a9818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526152d96101e0870185613d47565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526153188686614aec565b9550828a01519450818887030184890152615333868661518b565b9550808a01516101c089015250505050508281036020840152612b32818561518b565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561539e5780818460040360031b1b83161693505b505050919050565b6000604082840312156153b857600080fd5b6153c0613db5565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146153ec57600080fd5b81526153fa60208401614c94565b60208201529392505050565b60008261541557615415614908565b50049056fea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"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\"},{\"internalType\":\"address[]\",\"name\":\"rateLimitedTokens\",\"type\":\"address[]\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"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\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"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\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"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\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"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\":\"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\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"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\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101806040523480156200001257600080fd5b5060405162005cf938038062005cf98339810160408190526200003591620006a7565b8133806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000368565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508301516001600160a01b031615806200016f575082516001600160a01b0316155b156200018e576040516342bcdf7f60e11b815260040160405180910390fd5b82600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f791906200078c565b6001600160401b03166001146200022157604051636fc2a20760e11b815260040160405180910390fd5b82516001600160a01b0390811660a090815260408501516001600160401b0390811660c05260208601511660e052606085015182166101005260808501518216610140528401511661016052620002987f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000413565b6101205260005b81518110156200035e576000620002dd838381518110620002c457620002c4620007aa565b6020026020010151600c6200047a60201b90919060201c565b905080156200034a577fd9fda0bdb11c1ae5e51144a17c6080d6b44cf243cc24807a6b9ba875fb7e3f758383815181106200031c576200031c620007aa565b60200260200101516040516200034191906001600160a01b0391909116815260200190565b60405180910390a15b506200035681620007c0565b90506200029f565b50505050620007e8565b336001600160a01b03821603620003c25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e051610100516040516020016200045d94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b600062000491836001600160a01b0384166200049a565b90505b92915050565b6000818152600183016020526040812054620004e35750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000494565b50600062000494565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715620005275762000527620004ec565b60405290565b80516001600160a01b03811681146200054557600080fd5b919050565b80516001600160401b03811681146200054557600080fd5b80516001600160801b03811681146200054557600080fd5b6000606082840312156200058d57600080fd5b604051606081016001600160401b0381118282101715620005b257620005b2620004ec565b806040525080915082518015158114620005cb57600080fd5b8152620005db6020840162000562565b6020820152620005ee6040840162000562565b60408201525092915050565b600082601f8301126200060c57600080fd5b815160206001600160401b03808311156200062b576200062b620004ec565b8260051b604051601f19603f83011681018181108482111715620006535762000653620004ec565b6040529384528581018301938381019250878511156200067257600080fd5b83870191505b848210156200069c576200068c826200052d565b8352918301919083019062000678565b979650505050505050565b6000806000838503610140811215620006bf57600080fd5b60c0811215620006ce57600080fd5b50620006d962000502565b620006e4856200052d565b8152620006f4602086016200054a565b602082015262000707604086016200054a565b60408201526200071a606086016200052d565b60608201526200072d608086016200052d565b60808201526200074060a086016200052d565b60a08201529250620007568560c086016200057a565b6101208501519092506001600160401b038111156200077457600080fd5b6200078286828701620005fa565b9150509250925092565b6000602082840312156200079f57600080fd5b62000491826200054a565b634e487b7160e01b600052603260045260246000fd5b600060018201620007e157634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161016051615434620008c5600039600081816102b601528181611a350152611bda0152600081816102870152818161111c0152818161118401528181611a0e01528181612129015261219601526000611d8601526000818161025801526119e40152600081816101f80152611992015260008181610228015281816119bc015281816129b30152612ebc0152600081816101c9015281816119640152611e6e015260008181610e9101528181610edd0152818161124c015261129801526154346000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806379ba5097116100d8578063afcb95d71161008c578063f077b59211610066578063f077b59214610604578063f2fde38b1461060c578063f52121a51461061f57600080fd5b8063afcb95d7146105be578063b1dc65a4146105de578063c92b2832146105f157600080fd5b806385572ffb116100bd57806385572ffb14610573578063856c8247146105815780638da5cb5b146105ad57600080fd5b806379ba50971461053b57806381ff70481461054357600080fd5b8063546719cd1161013a578063704b6c0211610114578063704b6c021461042b578063740f41501461043e5780637437ff9f1461045157600080fd5b8063546719cd1461038d578063599f6431146103f1578063666cab8d1461041657600080fd5b8063142a98fc1161016b578063142a98fc14610311578063181f5a77146103315780631ef381741461037a57600080fd5b806306285c691461018757806310707b96146102fc575b600080fd5b6102e66040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091526040518060c001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102f39190613bec565b60405180910390f35b61030f61030a366004613e00565b610632565b005b61032461031f366004613e85565b6107a8565b6040516102f39190613f0c565b61036d6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b6040516102f39190613f6a565b61030f610388366004614007565b610823565b610395610cae565b6040516102f3919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b0390911681526020016102f3565b61041e610d63565b6040516102f39190614118565b61030f61043936600461412b565b610dc5565b61030f61044c366004614587565b610e8e565b61052e6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c081018252600a5463ffffffff80821683526001600160a01b0364010000000090920482166020840152600b549182169383019390935261ffff7401000000000000000000000000000000000000000082041660608301527601000000000000000000000000000000000000000000008104831660808301527a010000000000000000000000000000000000000000000000000000900490911660a082015290565b6040516102f39190614642565b61030f61100b565b6007546005546040805163ffffffff808516825264010000000090940490931660208401528201526060016102f3565b61030f6101823660046146a4565b61059461058f36600461412b565b6110ee565b60405167ffffffffffffffff90911681526020016102f3565b6000546001600160a01b03166103fe565b6040805160018152600060208201819052918101919091526060016102f3565b61030f6105ec366004614724565b6111f6565b61030f6105ff366004614829565b61147a565b61041e6114e5565b61030f61061a36600461412b565b6114f1565b61030f61062d366004614879565b611502565b61063a611712565b60005b81518110156106ee57600061067583838151811061065d5761065d6148d3565b6020026020010151600c61178890919063ffffffff16565b905080156106dd577fd9fda0bdb11c1ae5e51144a17c6080d6b44cf243cc24807a6b9ba875fb7e3f758383815181106106b0576106b06148d3565b60200260200101516040516106d491906001600160a01b0391909116815260200190565b60405180910390a15b506106e781614931565b905061063d565b5060005b82518110156107a357600061072a848381518110610712576107126148d3565b6020026020010151600c61179d90919063ffffffff16565b90508015610792577ffc16088b4213ca373fd6511475fedb3850038eff902c19a9611fc783674c2e84848381518110610765576107656148d3565b602002602001015160405161078991906001600160a01b0391909116815260200190565b60405180910390a15b5061079c81614931565b90506106f2565b505050565b60006107b660016004614969565b60026107c36080856149ab565b67ffffffffffffffff166107d791906149d2565b600f60006107e66080876149e9565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c16600381111561081d5761081d613ea2565b92915050565b84518460ff16601f821115610899576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b80600003610903576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610890565b61090b611712565b610914856117b2565b60095460005b81811015610993576008600060098381548110610939576109396148d3565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905561098c81614931565b905061091a565b50875160005b81811015610b685760008a82815181106109b5576109b56148d3565b60200260200101519050600060028111156109d2576109d2613ea2565b6001600160a01b038216600090815260086020526040902054610100900460ff166002811115610a0457610a04613ea2565b14610a6b576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610890565b6001600160a01b038116610aab576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001617610100836002811115610b4e57610b4e613ea2565b02179055509050505080610b6190614931565b9050610999565b508851610b7c9060099060208c0190613b5a565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b161717905560078054610c02914691309190600090610bd49063ffffffff16614a10565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d611a99565b6005600001819055506000600760049054906101000a900463ffffffff16905043600760046101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600560000154600760009054906101000a900463ffffffff168e8e8e8e8e8e604051610c9999989796959493929190614a33565b60405180910390a15050505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610d5e90611b26565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610dbb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d9d575b5050505050905090565b6000546001600160a01b03163314801590610deb57506002546001600160a01b03163314155b15610e22576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b467f000000000000000000000000000000000000000000000000000000000000000014610f19576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff46166024820152604401610890565b81515181518114610f56576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611000576000838281518110610f7557610f756148d3565b6020026020010151905080600014158015610fae57508451805183908110610f9f57610f9f6148d3565b60200260200101516080015181105b15610fef576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610890565b50610ff981614931565b9050610f59565b506107a38383611bd8565b6001546001600160a01b0316331461107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610890565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600e602052604081205467ffffffffffffffff168015801561114757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561081d576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156111cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ef9190614ac9565b9392505050565b6112008787612581565b600554883590808214611249576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610890565b467f0000000000000000000000000000000000000000000000000000000000000000146112ca576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610890565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561135257611352613ea2565b600281111561136357611363613ea2565b905250905060028160200151600281111561138057611380613ea2565b1480156113ba57506009816000015160ff16815481106113a2576113a26148d3565b6000918252602090912001546001600160a01b031633145b6113f0576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006113fe8560206149d2565b6114098860206149d2565b6114158b610144614ae6565b61141f9190614ae6565b6114299190614ae6565b905036811461146d576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610890565b5050505050505050505050565b6000546001600160a01b031633148015906114a057506002546001600160a01b03163314155b156114d7576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e26003826125a8565b50565b6060610d5e600c61278d565b6114f9611712565b6114e28161279a565b33301461153b576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611578565b60408051808201909152600080825260208201528152602001906001900390816115515790505b5061014084015151909150156115d8576115d583610140015184602001516040516020016115b591906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612875565b90505b60408301516001600160a01b03163b158061162857506040830151611626906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612b38565b155b1561163257505050565b600a54600090819064010000000090046001600160a01b0316633cf9798361165a8786612b54565b611388886080015189604001516040518563ffffffff1660e01b81526004016116869493929190614b3d565b6000604051808303816000875af11580156116a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116cd9190810190614c47565b50915091508161170b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b5050505050565b6000546001600160a01b03163314611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610890565b565b60006111ef836001600160a01b038416612bf7565b60006111ef836001600160a01b038416612c46565b6000818060200190518101906117c89190614cb5565b60208101519091506001600160a01b031661180f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516001600160a01b03908116640100000000027fffffffffffffffff00000000000000000000000000000000000000000000000090931663ffffffff9586161792909217909255604080850151600b80546060808901516080808b015160a0808d01518c167a010000000000000000000000000000000000000000000000000000027fffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffff92909c1676010000000000000000000000000000000000000000000002919091167fffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff61ffff90941674010000000000000000000000000000000000000000027fffffffffffffffffffff00000000000000000000000000000000000000000000909616978a169790971794909417919091169490941797909717909155825160c0810184527f00000000000000000000000000000000000000000000000000000000000000008516815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116968201969096527f0000000000000000000000000000000000000000000000000000000000000000909516858401527f00000000000000000000000000000000000000000000000000000000000000008416958501959095527f00000000000000000000000000000000000000000000000000000000000000008316908401527f00000000000000000000000000000000000000000000000000000000000000009091169282019290925290517fe668e1a4644c1a030b909bbfd837f5cfa914994ed5e0bb2e9c34a5c37753128a91611a8d918490614d61565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611abd99989796959493929190614e23565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611bb482606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611b989190614969565b85608001516fffffffffffffffffffffffffffffffff16612d40565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5a9190614eab565b15611c91576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611cce576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611d0c576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611d2757611d27613c50565b604051908082528060200260200182016040528015611d50578160200160208202803683370190505b50905060005b82811015611e3057600085600001518281518110611d7657611d766148d3565b60200260200101519050611daa817f0000000000000000000000000000000000000000000000000000000000000000612d5f565b838381518110611dbc57611dbc6148d3565b602002602001018181525050806101800151838381518110611de057611de06148d3565b602002602001015114611e1f576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50611e2981614931565b9050611d56565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611ea492879291600401614ef8565b602060405180830381865afa158015611ec1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee59190614f2e565b905080600003611f21576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b8481101561257857600087600001518281518110611f4857611f486148d3565b602002602001015190506000611f6182606001516107a8565b90506000816003811115611f7757611f77613ea2565b1480611f9457506003816003811115611f9257611f92613ea2565b145b611fdc5760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610890565b831561209957600a5460009063ffffffff16611ff88742614969565b11905080806120185750600382600381111561201657612016613ea2565b145b61204e576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b888481518110612060576120606148d3565b602002602001015160001461209357888481518110612081576120816148d3565b60200260200101518360800181815250505b506120f6565b60008160038111156120ad576120ad613ea2565b146120f65760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610890565b6020808301516001600160a01b03166000908152600e909152604090205467ffffffffffffffff168015801561215457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b156122d05760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156121df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122039190614ac9565b60c084015190915067ffffffffffffffff16612220826001614f47565b67ffffffffffffffff16146122805782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050612568565b6020838101516001600160a01b03166000908152600e9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156122e4576122e4613ea2565b036123635760c083015167ffffffffffffffff16612303826001614f47565b67ffffffffffffffff16146123635782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050612568565b60008a60200151858151811061237b5761237b6148d3565b602002602001015190506123a78460600151856000015186610140015151876101200151518551612eba565b6123b684606001516001613064565b6000806123c3868461310e565b915091506123d5866060015183613064565b8780156123f3575060038260038111156123f1576123f1613ea2565b145b1561242c57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b600382600381111561244057612440613ea2565b141580156124605750600282600381111561245d5761245d613ea2565b14155b1561249f578560600151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610890929190614f68565b60008560038111156124b3576124b3613ea2565b03612513576020808701516001600160a01b03166000908152600e90915260408120805467ffffffffffffffff16916124eb83614f86565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612559929190614fa3565b60405180910390a35050505050505b61257181614931565b9050611f28565b50505050505050565b6125a461259082840184614fc3565b604080516000815260208101909152611bd8565b5050565b81546000906125d190700100000000000000000000000000000000900463ffffffff1642614969565b905080156126735760018301548354612619916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612d40565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612699916fffffffffffffffffffffffffffffffff9081169116613306565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906127809084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b606060006111ef8361331c565b336001600160a01b0382160361280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610890565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612b1d576000858281518110612897576128976148d3565b60200260200101518060200190518101906128b29190614ff8565b905060006128c38260200151613378565b9050806001600160a01b03163b60000361290f5781602001516040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b612940858481518110612924576129246148d3565b602002602001015160000151600c61341d90919063ffffffff16565b156129835761297685848151811061295a5761295a6148d3565b6020908102919091010151600b546001600160a01b031661343f565b6129809085614ae6565b93505b600080612a95636a3d7ce860e01b8c8c8f89815181106129a5576129a56148d3565b6020026020010151602001517f0000000000000000000000000000000000000000000000000000000000000000898e8c815181106129e5576129e56148d3565b6020026020010151604051602401612a02969594939291906150ad565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600b54859063ffffffff7a010000000000000000000000000000000000000000000000000000909104166113886084613568565b509150915081612ad357806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b612adc81613378565b878681518110612aee57612aee6148d3565b60209081029190910101516001600160a01b03909116905250612b1692508391506149319050565b905061287a565b508015612b2d57612b2d8161368e565b505b95945050505050565b6000612b438361369b565b80156111ef57506111ef83836136ff565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff1681526020018460200151604051602001612bcc91906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b6000818152600183016020526040812054612c3e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561081d565b50600061081d565b60008181526001830160205260408120548015612d2f576000612c6a600183614969565b8554909150600090612c7e90600190614969565b9050818114612ce3576000866000018281548110612c9e57612c9e6148d3565b9060005260206000200154905080876000018481548110612cc157612cc16148d3565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612cf457612cf4615156565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061081d565b600091505061081d565b5092915050565b6000612b2f85612d5084866149d2565b612d5a9087614ae6565b613306565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612df59897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612e2e9190615185565b60405160208183030381529060405280519060200120876101600151604051602001612e5a91906151ed565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612f33576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610890565b600b5474010000000000000000000000000000000000000000900461ffff16831115612f97576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610890565b808314612fdc576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610890565b600b54760100000000000000000000000000000000000000000000900463ffffffff1682111561170b57600b546040517f8693378900000000000000000000000000000000000000000000000000000000815276010000000000000000000000000000000000000000000090910463ffffffff16600482015260248101839052604401610890565b600060026130736080856149ab565b67ffffffffffffffff1661308791906149d2565b90506000600f816130996080876149e9565b67ffffffffffffffff1681526020810191909152604001600020549050816130c360016004614969565b901b1916818360038111156130da576130da613ea2565b901b1780600f60006130ed6080886149e9565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906131529087908790600401615200565b600060405180830381600087803b15801561316c57600080fd5b505af192505050801561317d575060015b6132ea573d8080156131ab576040519150601f19603f3d011682016040523d82523d6000602084013e6131b0565b606091505b506131ba81615363565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c000000000000000000000000000000000000000000000000000000001480613252575061320d81615363565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b806132a6575061326181615363565b7fffffffff00000000000000000000000000000000000000000000000000000000167f370d875f00000000000000000000000000000000000000000000000000000000145b156132b6576003925090506132ff565b806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b50506040805160208101909152600081526002905b9250929050565b600081831061331557816111ef565b5090919050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561336c57602002820191906000526020600020905b815481526020019060010190808311613358575b50505050509050919050565b600081516020146133b757816040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b6000828060200190518101906133cd9190614f2e565b90506001600160a01b038111806133e45750600a81105b1561081d57826040517f370d875f0000000000000000000000000000000000000000000000000000000081526004016108909190613f6a565b6001600160a01b038116600090815260018301602052604081205415156111ef565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa1580156134a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c991906153b3565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036135325783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610890565b6020840151613560907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906137ce565b949350505050565b6000606060008361ffff1667ffffffffffffffff81111561358b5761358b613c50565b6040519080825280601f01601f1916602001820160405280156135b5576020820181803683370190505b509150863b6135e8577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a8581101561361b577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613654577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156136775750835b808352806000602085013e50955095509592505050565b6114e2600382600061380b565b60006136c7827f01ffc9a7000000000000000000000000000000000000000000000000000000006136ff565b801561081d57506136f8827fffffffff000000000000000000000000000000000000000000000000000000006136ff565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156137b7575060208210155b80156137c35750600081115b979650505050505050565b6000670de0b6b3a7640000613801837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166149d2565b6111ef9190615413565b825474010000000000000000000000000000000000000000900460ff161580613832575081155b1561383c57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061388290700100000000000000000000000000000000900463ffffffff1642614969565b9050801561394257818311156138c4576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546138fe9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612d40565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156139df576001600160a01b038416613994576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610890565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610890565b84831015613ad85760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613a239082614969565b613a2d878a614969565b613a379190614ae6565b613a419190615413565b90506001600160a01b038616613a8d576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610890565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610890565b613ae28584614969565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b828054828255906000526020600020908101928215613bc7579160200282015b82811115613bc757825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613b7a565b50613bd3929150613bd7565b5090565b5b80821115613bd35760008155600101613bd8565b60c0810161081d82846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613ca257613ca2613c50565b60405290565b6040516101a0810167ffffffffffffffff81118282101715613ca257613ca2613c50565b6040516080810167ffffffffffffffff81118282101715613ca257613ca2613c50565b6040516060810167ffffffffffffffff81118282101715613ca257613ca2613c50565b604051601f8201601f1916810167ffffffffffffffff81118282101715613d3b57613d3b613c50565b604052919050565b600067ffffffffffffffff821115613d5d57613d5d613c50565b5060051b60200190565b6001600160a01b03811681146114e257600080fd5b8035613d8781613d67565b919050565b600082601f830112613d9d57600080fd5b81356020613db2613dad83613d43565b613d12565b82815260059290921b84018101918181019086841115613dd157600080fd5b8286015b84811015613df5578035613de881613d67565b8352918301918301613dd5565b509695505050505050565b60008060408385031215613e1357600080fd5b823567ffffffffffffffff80821115613e2b57600080fd5b613e3786838701613d8c565b93506020850135915080821115613e4d57600080fd5b50613e5a85828601613d8c565b9150509250929050565b67ffffffffffffffff811681146114e257600080fd5b8035613d8781613e64565b600060208284031215613e9757600080fd5b81356111ef81613e64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613f08577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161081d8284613ed1565b60005b83811015613f35578181015183820152602001613f1d565b50506000910152565b60008151808452613f56816020860160208601613f1a565b601f01601f19169290920160200192915050565b6020815260006111ef6020830184613f3e565b803560ff81168114613d8757600080fd5b600067ffffffffffffffff821115613fa857613fa8613c50565b50601f01601f191660200190565b600082601f830112613fc757600080fd5b8135613fd5613dad82613f8e565b818152846020838601011115613fea57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561402057600080fd5b863567ffffffffffffffff8082111561403857600080fd5b6140448a838b01613d8c565b9750602089013591508082111561405a57600080fd5b6140668a838b01613d8c565b965061407460408a01613f7d565b9550606089013591508082111561408a57600080fd5b6140968a838b01613fb6565b94506140a460808a01613e7a565b935060a08901359150808211156140ba57600080fd5b506140c789828a01613fb6565b9150509295509295509295565b600081518084526020808501945080840160005b8381101561410d5781516001600160a01b0316875295820195908201906001016140e8565b509495945050505050565b6020815260006111ef60208301846140d4565b60006020828403121561413d57600080fd5b81356111ef81613d67565b80151581146114e257600080fd5b8035613d8781614148565b600082601f83011261417257600080fd5b81356020614182613dad83613d43565b82815260069290921b840181019181810190868411156141a157600080fd5b8286015b84811015613df557604081890312156141be5760008081fd5b6141c6613c7f565b81356141d181613d67565b815281850135858201528352918301916040016141a5565b600082601f8301126141fa57600080fd5b8135602061420a613dad83613d43565b82815260059290921b8401810191818101908684111561422957600080fd5b8286015b84811015613df557803567ffffffffffffffff81111561424d5760008081fd5b61425b8986838b0101613fb6565b84525091830191830161422d565b60006101a0828403121561427c57600080fd5b614284613ca8565b905061428f82613e7a565b815261429d60208301613d7c565b60208201526142ae60408301613d7c565b60408201526142bf60608301613e7a565b6060820152608082013560808201526142da60a08301614156565b60a08201526142eb60c08301613e7a565b60c08201526142fc60e08301613d7c565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561432957600080fd5b61433586838701613fb6565b8385015261014092508285013591508082111561435157600080fd5b61435d86838701614161565b8385015261016092508285013591508082111561437957600080fd5b50614386858286016141e9565b82840152505061018080830135818301525092915050565b600082601f8301126143af57600080fd5b813560206143bf613dad83613d43565b82815260059290921b840181019181810190868411156143de57600080fd5b8286015b84811015613df557803567ffffffffffffffff8111156144025760008081fd5b6144108986838b01016141e9565b8452509183019183016143e2565b600082601f83011261442f57600080fd5b8135602061443f613dad83613d43565b82815260059290921b8401810191818101908684111561445e57600080fd5b8286015b84811015613df55780358352918301918301614462565b60006080828403121561448b57600080fd5b614493613ccc565b9050813567ffffffffffffffff808211156144ad57600080fd5b818401915084601f8301126144c157600080fd5b813560206144d1613dad83613d43565b82815260059290921b840181019181810190888411156144f057600080fd5b8286015b848110156145285780358681111561450c5760008081fd5b61451a8b86838b0101614269565b8452509183019183016144f4565b508652508581013593508284111561453f57600080fd5b61454b8785880161439e565b9085015250604084013591508082111561456457600080fd5b506145718482850161441e565b6040830152506060820135606082015292915050565b6000806040838503121561459a57600080fd5b823567ffffffffffffffff808211156145b257600080fd5b6145be86838701614479565b93506020915081850135818111156145d557600080fd5b85019050601f810186136145e857600080fd5b80356145f6613dad82613d43565b81815260059190911b8201830190838101908883111561461557600080fd5b928401925b828410156146335783358252928401929084019061461a565b80955050505050509250929050565b60c0810161081d828463ffffffff80825116835260208201516001600160a01b038082166020860152806040850151166040860152505061ffff60608301511660608401528060808301511660808401528060a08301511660a0840152505050565b6000602082840312156146b657600080fd5b813567ffffffffffffffff8111156146cd57600080fd5b820160a081850312156111ef57600080fd5b60008083601f8401126146f157600080fd5b50813567ffffffffffffffff81111561470957600080fd5b6020830191508360208260051b85010111156132ff57600080fd5b60008060008060008060008060e0898b03121561474057600080fd5b606089018a81111561475157600080fd5b8998503567ffffffffffffffff8082111561476b57600080fd5b818b0191508b601f83011261477f57600080fd5b81358181111561478e57600080fd5b8c60208285010111156147a057600080fd5b6020830199508098505060808b01359150808211156147be57600080fd5b6147ca8c838d016146df565b909750955060a08b01359150808211156147e357600080fd5b506147f08b828c016146df565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff81168114613d8757600080fd5b60006060828403121561483b57600080fd5b614843613cef565b823561484e81614148565b815261485c60208401614809565b602082015261486d60408401614809565b60408201529392505050565b6000806040838503121561488c57600080fd5b823567ffffffffffffffff808211156148a457600080fd5b6148b086838701614269565b935060208501359150808211156148c657600080fd5b50613e5a858286016141e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361496257614962614902565b5060010190565b8181038181111561081d5761081d614902565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff808416806149c6576149c661497c565b92169190910692915050565b808202811582820484141761081d5761081d614902565b600067ffffffffffffffff80841680614a0457614a0461497c565b92169190910492915050565b600063ffffffff808316818103614a2957614a29614902565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614a638184018a6140d4565b90508281036080840152614a7781896140d4565b905060ff871660a084015282810360c0840152614a948187613f3e565b905067ffffffffffffffff851660e0840152828103610100840152614ab98185613f3e565b9c9b505050505050505050505050565b600060208284031215614adb57600080fd5b81516111ef81613e64565b8082018082111561081d5761081d614902565b600081518084526020808501945080840160005b8381101561410d57815180516001600160a01b031688528301518388015260409096019590820190600101614b0d565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614b78610120840182613f3e565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614bb48383613f3e565b925060808901519150808584030161010086015250614bd38282614af9565b92505050614be7602083018661ffff169052565b836040830152612b2f60608301846001600160a01b03169052565b600082601f830112614c1357600080fd5b8151614c21613dad82613f8e565b818152846020838601011115614c3657600080fd5b613560826020830160208701613f1a565b600080600060608486031215614c5c57600080fd5b8351614c6781614148565b602085015190935067ffffffffffffffff811115614c8457600080fd5b614c9086828701614c02565b925050604084015190509250925092565b805163ffffffff81168114613d8757600080fd5b600060c08284031215614cc757600080fd5b60405160c0810181811067ffffffffffffffff82111715614cea57614cea613c50565b604052614cf683614ca1565b81526020830151614d0681613d67565b60208201526040830151614d1981613d67565b6040820152606083015161ffff81168114614d3357600080fd5b6060820152614d4460808401614ca1565b6080820152614d5560a08401614ca1565b60a08201529392505050565b6101808101614dc682856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a0840152505050565b825163ffffffff90811660c084015260208401516001600160a01b0390811660e0850152604085015116610100840152606084015161ffff166101208401526080840151811661014084015260a0840151166101608301526111ef565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b166040850152816060850152614e5d8285018b6140d4565b91508382036080850152614e71828a6140d4565b915060ff881660a085015283820360c0850152614e8e8288613f3e565b90861660e08501528381036101008501529050614ab98185613f3e565b600060208284031215614ebd57600080fd5b81516111ef81614148565b600081518084526020808501945080840160005b8381101561410d57815187529582019590820190600101614edc565b606081526000614f0b6060830186614ec8565b8281036020840152614f1d8186614ec8565b915050826040830152949350505050565b600060208284031215614f4057600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115612d3957612d39614902565b67ffffffffffffffff83168152604081016111ef6020830184613ed1565b600067ffffffffffffffff808316818103614a2957614a29614902565b614fad8184613ed1565b6040602082015260006135606040830184613f3e565b600060208284031215614fd557600080fd5b813567ffffffffffffffff811115614fec57600080fd5b61356084828501614479565b60006020828403121561500a57600080fd5b815167ffffffffffffffff8082111561502257600080fd5b908301906060828603121561503657600080fd5b61503e613cef565b82518281111561504d57600080fd5b61505987828601614c02565b82525060208301518281111561506e57600080fd5b61507a87828601614c02565b60208301525060408301518281111561509257600080fd5b61509e87828601614c02565b60408301525095945050505050565b60c0815260006150c060c0830189613f3e565b6001600160a01b038816602084015286604084015267ffffffffffffffff8616606084015282810360808401528451606082526151006060830182613f3e565b9050602086015182820360208401526151198282613f3e565b915050604086015182820360408401526151338282613f3e565b9250505082810360a08401526151498185613f3e565b9998505050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6020815260006111ef6020830184614af9565b600081518084526020808501808196508360051b8101915082860160005b858110156151e05782840389526151ce848351613f3e565b988501989350908401906001016151b6565b5091979650505050505050565b6020815260006111ef6020830184615198565b6040815261521b60408201845167ffffffffffffffff169052565b6000602084015161523760608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006152988185018367ffffffffffffffff169052565b60e086015191506101206152b6818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526152e66101e0870185613f3e565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526153258686614af9565b9550828a015194508188870301848901526153408686615198565b9550808a01516101c089015250505050508281036020840152612b2f8185615198565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156153ab5780818460040360031b1b83161693505b505050919050565b6000604082840312156153c557600080fd5b6153cd613c7f565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146153f957600080fd5b815261540760208401614ca1565b60208201529392505050565b6000826154225761542261497c565b50049056fea164736f6c6343000813000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI @@ -281,9 +281,9 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampCallerSession) CurrentRateLimiterState() (R return _EVM2EVMOffRamp.Contract.CurrentRateLimiterState(&_EVM2EVMOffRamp.CallOpts) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampCaller) GetAllRateLimitedTokens(opts *bind.CallOpts) ([]common.Address, error) { +func (_EVM2EVMOffRamp *EVM2EVMOffRampCaller) GetAllRateLimitTokens(opts *bind.CallOpts) ([]common.Address, error) { var out []interface{} - err := _EVM2EVMOffRamp.contract.Call(opts, &out, "getAllRateLimitedTokens") + err := _EVM2EVMOffRamp.contract.Call(opts, &out, "getAllRateLimitTokens") if err != nil { return *new([]common.Address), err @@ -295,12 +295,12 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampCaller) GetAllRateLimitedTokens(opts *bind. } -func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) GetAllRateLimitedTokens() ([]common.Address, error) { - return _EVM2EVMOffRamp.Contract.GetAllRateLimitedTokens(&_EVM2EVMOffRamp.CallOpts) +func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) GetAllRateLimitTokens() ([]common.Address, error) { + return _EVM2EVMOffRamp.Contract.GetAllRateLimitTokens(&_EVM2EVMOffRamp.CallOpts) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampCallerSession) GetAllRateLimitedTokens() ([]common.Address, error) { - return _EVM2EVMOffRamp.Contract.GetAllRateLimitedTokens(&_EVM2EVMOffRamp.CallOpts) +func (_EVM2EVMOffRamp *EVM2EVMOffRampCallerSession) GetAllRateLimitTokens() ([]common.Address, error) { + return _EVM2EVMOffRamp.Contract.GetAllRateLimitTokens(&_EVM2EVMOffRamp.CallOpts) } func (_EVM2EVMOffRamp *EVM2EVMOffRampCaller) GetDynamicConfig(opts *bind.CallOpts) (EVM2EVMOffRampDynamicConfig, error) { @@ -553,18 +553,6 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) AcceptOwnership() (*type return _EVM2EVMOffRamp.Contract.AcceptOwnership(&_EVM2EVMOffRamp.TransactOpts) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) AddRateLimitedTokens(opts *bind.TransactOpts, adds []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.contract.Transact(opts, "addRateLimitedTokens", adds) -} - -func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) AddRateLimitedTokens(adds []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.AddRateLimitedTokens(&_EVM2EVMOffRamp.TransactOpts, adds) -} - -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) AddRateLimitedTokens(adds []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.AddRateLimitedTokens(&_EVM2EVMOffRamp.TransactOpts, adds) -} - func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte) (*types.Transaction, error) { return _EVM2EVMOffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData) } @@ -589,18 +577,6 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) ManuallyExecute(report I return _EVM2EVMOffRamp.Contract.ManuallyExecute(&_EVM2EVMOffRamp.TransactOpts, report, gasLimitOverrides) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) RemoveRateLimitedTokens(opts *bind.TransactOpts, removes []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.contract.Transact(opts, "removeRateLimitedTokens", removes) -} - -func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) RemoveRateLimitedTokens(removes []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.RemoveRateLimitedTokens(&_EVM2EVMOffRamp.TransactOpts, removes) -} - -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) RemoveRateLimitedTokens(removes []common.Address) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.RemoveRateLimitedTokens(&_EVM2EVMOffRamp.TransactOpts, removes) -} - func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { return _EVM2EVMOffRamp.contract.Transact(opts, "setAdmin", newAdmin) } @@ -661,6 +637,18 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) Transmit(reportContext [ return _EVM2EVMOffRamp.Contract.Transmit(&_EVM2EVMOffRamp.TransactOpts, reportContext, report, rs, ss, arg4) } +func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) UpdateRateLimitTokens(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _EVM2EVMOffRamp.contract.Transact(opts, "updateRateLimitTokens", removes, adds) +} + +func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) UpdateRateLimitTokens(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _EVM2EVMOffRamp.Contract.UpdateRateLimitTokens(&_EVM2EVMOffRamp.TransactOpts, removes, adds) +} + +func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) UpdateRateLimitTokens(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _EVM2EVMOffRamp.Contract.UpdateRateLimitTokens(&_EVM2EVMOffRamp.TransactOpts, removes, adds) +} + type EVM2EVMOffRampAdminSetIterator struct { Event *EVM2EVMOffRampAdminSet @@ -2149,7 +2137,7 @@ type EVM2EVMOffRampInterface interface { CurrentRateLimiterState(opts *bind.CallOpts) (RateLimiterTokenBucket, error) - GetAllRateLimitedTokens(opts *bind.CallOpts) ([]common.Address, error) + GetAllRateLimitTokens(opts *bind.CallOpts) ([]common.Address, error) GetDynamicConfig(opts *bind.CallOpts) (EVM2EVMOffRampDynamicConfig, error) @@ -2177,14 +2165,10 @@ type EVM2EVMOffRampInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - AddRateLimitedTokens(opts *bind.TransactOpts, adds []common.Address) (*types.Transaction, error) - ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte) (*types.Transaction, error) ManuallyExecute(opts *bind.TransactOpts, report InternalExecutionReport, gasLimitOverrides []*big.Int) (*types.Transaction, error) - RemoveRateLimitedTokens(opts *bind.TransactOpts, removes []common.Address) (*types.Transaction, error) - SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) SetOCR2Config(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) @@ -2195,6 +2179,8 @@ type EVM2EVMOffRampInterface interface { Transmit(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, arg4 [32]byte) (*types.Transaction, error) + UpdateRateLimitTokens(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + FilterAdminSet(opts *bind.FilterOpts) (*EVM2EVMOffRampAdminSetIterator, error) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *EVM2EVMOffRampAdminSet) (event.Subscription, 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 10c967a311..01de01ca77 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 @@ -8,7 +8,7 @@ commit_store: ../../../contracts/solc/v0.8.19/CommitStore/CommitStore.abi ../../ commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.19/CommitStoreHelper/CommitStoreHelper.bin dd078eef6a55928e0cad79f40828a36cfa5c2789a664f37b56a7c215fb7c8932 custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool/CustomTokenPool.bin 8eb1dfec66f36ef014091d1b4f4714647056ea05a1edd79c80df841d8b9fb6b1 ether_sender_receiver: ../../../contracts/solc/v0.8.19/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.19/EtherSenderReceiver/EtherSenderReceiver.bin 0769a3b492889ac03fe5fe5bb8be0f28fc379f853c1b869ac9bd57397a2d229b -evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp/EVM2EVMOffRamp.bin 3dee70deebe8b0f96e2061e73914255e1e3fc0140052bf9bd6f6e17182993fb2 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp/EVM2EVMOffRamp.bin a9966049004356afcc341a0df77fbcd012af8c2012dc2c1ad5db1668ae6fe9b9 evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 0a37756b97f75d2b15a5ac67f5db5867f779fd3b49c99e059f1064b1bdd08bf5 lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool/LockReleaseTokenPool.bin 27d484a373a2b2c5b6f5623a1d07517502bae466952bd65a2a04ac57c3748341 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go index 28b3087923..7af18debd7 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go @@ -54,36 +54,6 @@ func (_m *EVM2EVMOffRampInterface) AcceptOwnership(opts *bind.TransactOpts) (*ty return r0, r1 } -// AddRateLimitedTokens provides a mock function with given fields: opts, adds -func (_m *EVM2EVMOffRampInterface) AddRateLimitedTokens(opts *bind.TransactOpts, adds []common.Address) (*types.Transaction, error) { - ret := _m.Called(opts, adds) - - if len(ret) == 0 { - panic("no return value specified for AddRateLimitedTokens") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address) (*types.Transaction, error)); ok { - return rf(opts, adds) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address) *types.Transaction); ok { - r0 = rf(opts, adds) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []common.Address) error); ok { - r1 = rf(opts, adds) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // Address provides a mock function with given fields: func (_m *EVM2EVMOffRampInterface) Address() common.Address { ret := _m.Called() @@ -510,12 +480,12 @@ func (_m *EVM2EVMOffRampInterface) FilterTransmitted(opts *bind.FilterOpts) (*ev return r0, r1 } -// GetAllRateLimitedTokens provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) GetAllRateLimitedTokens(opts *bind.CallOpts) ([]common.Address, error) { +// GetAllRateLimitTokens provides a mock function with given fields: opts +func (_m *EVM2EVMOffRampInterface) GetAllRateLimitTokens(opts *bind.CallOpts) ([]common.Address, error) { ret := _m.Called(opts) if len(ret) == 0 { - panic("no return value specified for GetAllRateLimitedTokens") + panic("no return value specified for GetAllRateLimitTokens") } var r0 []common.Address @@ -1188,36 +1158,6 @@ func (_m *EVM2EVMOffRampInterface) ParseTransmitted(log types.Log) (*evm_2_evm_o return r0, r1 } -// RemoveRateLimitedTokens provides a mock function with given fields: opts, removes -func (_m *EVM2EVMOffRampInterface) RemoveRateLimitedTokens(opts *bind.TransactOpts, removes []common.Address) (*types.Transaction, error) { - ret := _m.Called(opts, removes) - - if len(ret) == 0 { - panic("no return value specified for RemoveRateLimitedTokens") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address) (*types.Transaction, error)); ok { - return rf(opts, removes) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address) *types.Transaction); ok { - r0 = rf(opts, removes) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []common.Address) error); ok { - r1 = rf(opts, removes) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // SetAdmin provides a mock function with given fields: opts, newAdmin func (_m *EVM2EVMOffRampInterface) SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { ret := _m.Called(opts, newAdmin) @@ -1396,6 +1336,36 @@ func (_m *EVM2EVMOffRampInterface) TypeAndVersion(opts *bind.CallOpts) (string, return r0, r1 } +// UpdateRateLimitTokens provides a mock function with given fields: opts, removes, adds +func (_m *EVM2EVMOffRampInterface) UpdateRateLimitTokens(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + ret := _m.Called(opts, removes, adds) + + if len(ret) == 0 { + panic("no return value specified for UpdateRateLimitTokens") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, []common.Address) (*types.Transaction, error)); ok { + return rf(opts, removes, adds) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, []common.Address) *types.Transaction); ok { + r0 = rf(opts, removes, adds) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []common.Address, []common.Address) error); ok { + r1 = rf(opts, removes, adds) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // WatchAdminSet provides a mock function with given fields: opts, sink func (_m *EVM2EVMOffRampInterface) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) (event.Subscription, error) { ret := _m.Called(opts, sink) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go index c64f612fe0..062a55245a 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go @@ -356,7 +356,6 @@ func setupOnRampV1_5_0(t *testing.T, user *bind.TransactOpts, bc *client.Simulat NetworkFeeUSDCents: 0, GasMultiplierWeiPerEth: 0, PremiumMultiplierWeiPerEth: 0, - AggregateRateLimitEnabled: true, Enabled: false, }, } diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go index 7b4c797f03..a1f31011e3 100644 --- a/integration-tests/ccip-tests/actions/ccip_helpers.go +++ b/integration-tests/ccip-tests/actions/ccip_helpers.go @@ -1177,7 +1177,7 @@ func (sourceCCIP *SourceCCIPModule) SetTokenTransferFeeConfig() error { DeciBps: 5_0, // 5 bps DestGasOverhead: destGasOverhead, DestBytesOverhead: destByteOverhead, - AggregateRateLimitEnabled: true, + AggregateRateLimitEnabled: rand.Intn(2) == 1, // Randomly turn on ARL for ~50% of tokens }) } err := sourceCCIP.OnRamp.SetTokenTransferFeeConfig(tokenTransferFeeConfig) @@ -1253,7 +1253,6 @@ func (sourceCCIP *SourceCCIPModule) DeployContracts(lane *laneconfig.LaneConfig) NetworkFeeUSDCents: 1_00, GasMultiplierWeiPerEth: GasFeeMultiplier, PremiumMultiplierWeiPerEth: 1e18, - AggregateRateLimitEnabled: true, Enabled: true, }, { @@ -1261,7 +1260,6 @@ func (sourceCCIP *SourceCCIPModule) DeployContracts(lane *laneconfig.LaneConfig) NetworkFeeUSDCents: 1_00, GasMultiplierWeiPerEth: GasFeeMultiplier, PremiumMultiplierWeiPerEth: 1e18, - AggregateRateLimitEnabled: true, Enabled: true, }, }, tokenTransferFeeConfig, sourceCCIP.Common.FeeToken.EthAddress) @@ -1671,6 +1669,16 @@ func (destCCIP *DestCCIPModule) LoadContracts(conf *laneconfig.LaneConfig) { } } +func (destCCIP *DestCCIPModule) UpdateRateLimitTokens(srcTokens []*contracts.ERC20Token) error { + var sourceTokens []common.Address + + for _, token := range srcTokens { + sourceTokens = append(sourceTokens, common.HexToAddress(token.Address())) + } + + return destCCIP.OffRamp.UpdateRateLimitTokens(sourceTokens) +} + // DeployContracts deploys all CCIP contracts specific to the destination chain func (destCCIP *DestCCIPModule) DeployContracts( sourceCCIP SourceCCIPModule, @@ -1749,6 +1757,7 @@ func (destCCIP *DestCCIPModule) DeployContracts( destChainSelector, destCCIP.CommitStore.EthAddress, sourceCCIP.OnRamp.EthAddress, + []common.Address{}, destCCIP.Common.RateLimiterConfig, *destCCIP.Common.ARMContract) if err != nil { return fmt.Errorf("deploying offramp shouldn't fail %w", err) @@ -1764,6 +1773,15 @@ func (destCCIP *DestCCIPModule) DeployContracts( return fmt.Errorf("setting offramp as fee updater shouldn't fail %w", err) } + err = destCCIP.UpdateRateLimitTokens(sourceCCIP.Common.BridgeTokens) + if err != nil { + return fmt.Errorf("setting rate limited tokens shouldn't fail %w", err) + } + err = destCCIP.Common.ChainClient.WaitForEvents() + if err != nil { + return fmt.Errorf("waiting for events on destination contract shouldn't fail %w", err) + } + err = destCCIP.Common.ChainClient.WaitForEvents() if err != nil { return fmt.Errorf("waiting for events on destination contract shouldn't fail %w", err) diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go index 1e0be34ec5..1f864d0f47 100644 --- a/integration-tests/ccip-tests/contracts/contract_deployer.go +++ b/integration-tests/ccip-tests/contracts/contract_deployer.go @@ -677,7 +677,7 @@ func (e *CCIPContractsDeployer) NewOffRamp(addr common.Address) ( }, err } -func (e *CCIPContractsDeployer) DeployOffRamp(sourceChainSelector, destChainSelector uint64, commitStore, onRamp common.Address, opts RateLimiterConfig, armProxy common.Address) (*OffRamp, error) { +func (e *CCIPContractsDeployer) DeployOffRamp(sourceChainSelector, destChainSelector uint64, commitStore, onRamp common.Address, rateLimitTokens []common.Address, opts RateLimiterConfig, armProxy common.Address) (*OffRamp, error) { address, _, instance, err := e.evmClient.DeployContract("OffRamp Contract", func( auth *bind.TransactOpts, backend bind.ContractBackend, @@ -698,6 +698,7 @@ func (e *CCIPContractsDeployer) DeployOffRamp(sourceChainSelector, destChainSele Capacity: opts.Capacity, Rate: opts.Rate, }, + rateLimitTokens, ) }) if err != nil { diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go index f1d0c72987..2b78ed0af4 100644 --- a/integration-tests/ccip-tests/contracts/contract_models.go +++ b/integration-tests/ccip-tests/contracts/contract_models.go @@ -934,6 +934,23 @@ func (offRamp *OffRamp) SetOCR2Config( return offRamp.client.ProcessTransaction(tx) } +func (offRamp *OffRamp) UpdateRateLimitTokens(tokens []common.Address) error { + opts, err := offRamp.client.TransactionOpts(offRamp.client.GetDefaultWallet()) + if err != nil { + return fmt.Errorf("failed to get transaction opts: %w", err) + } + tx, err := offRamp.Instance.UpdateRateLimitTokens(opts, tokens, []common.Address{}) + if err != nil { + return fmt.Errorf("failed to apply rate limit tokens updates: %w", err) + } + log.Info(). + Interface("rateLimitToken adds", tokens). + Str("offRamp", offRamp.Address()). + Str(Network, offRamp.client.GetNetworkConfig().Name). + Msg("rateLimitTokens set in OffRamp") + return offRamp.client.ProcessTransaction(tx) +} + type MockAggregator struct { client blockchain.EVMClient Instance *mock_v3_aggregator_contract.MockV3Aggregator