diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index a9343c56e2..29b9cc5f30 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -122,7 +122,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) DefensiveExampleTest:test_Recovery() (gas: 424253) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1112564) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1136264) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38185) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 109684) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 82608) diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index ec82b9d4d4..b5c91858b6 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -47,7 +47,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio error ManualExecutionGasLimitMismatch(); error DestinationGasAmountCountMismatch(bytes32 messageId, uint64 sequenceNumber); error InvalidManualExecutionGasLimit(uint256 index, uint256 newLimit); - error InvalidDestGasAmount(uint256 index, uint256 destGasAmount); + error InvalidTokenGasOverride(uint256 index, uint256 tokenGasOverride); error RootNotCommitted(); error CanOnlySelfCall(); error ReceiverError(bytes err); @@ -103,7 +103,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio struct GasLimitOverride { uint256 receiverExecutionGasLimit; - uint256[] destGasAmounts; + uint256[] tokenGasOverrides; } // STATIC CONFIG @@ -242,7 +242,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio } } - if (report.messages[i].tokenAmounts.length != gasLimitOverrides[i].destGasAmounts.length) { + if (report.messages[i].tokenAmounts.length != gasLimitOverrides[i].tokenGasOverrides.length) { revert DestinationGasAmountCountMismatch(report.messages[i].messageId, report.messages[i].sequenceNumber); } @@ -251,9 +251,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio for (uint256 j = 0; j < report.messages[i].tokenAmounts.length; ++j) { Internal.SourceTokenData memory sourceTokenData = abi.decode(encodedSourceTokenData[i], (Internal.SourceTokenData)); - uint256 destGasAmount = gasLimitOverrides[i].destGasAmounts[j]; - if (destGasAmount != 0 && destGasAmount < sourceTokenData.destGasAmount) { - revert InvalidDestGasAmount(j, destGasAmount); + uint256 tokenGasOverride = gasLimitOverrides[i].tokenGasOverrides[j]; + if (tokenGasOverride != 0 && tokenGasOverride < sourceTokenData.destGasAmount) { + revert InvalidTokenGasOverride(j, tokenGasOverride); } } } @@ -315,11 +315,11 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio emit SkippedAlreadyExecutedMessage(message.sequenceNumber); continue; } - uint256[] memory destGasAmounts; + uint256[] memory tokenGasOverrides; bool manualExecution = manualExecGasLimits.length != 0; if (manualExecution) { - destGasAmounts = manualExecGasLimits[i].destGasAmounts; + tokenGasOverrides = manualExecGasLimits[i].tokenGasOverrides; bool isOldCommitReport = (block.timestamp - timestampCommitted) > s_dynamicConfig.permissionLessExecutionThresholdSeconds; // Manually execution is fine if we previously failed or if the commit report is just too old @@ -388,7 +388,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio _setExecutionState(message.sequenceNumber, Internal.MessageExecutionState.IN_PROGRESS); (Internal.MessageExecutionState newState, bytes memory returnData) = - _trialExecute(message, offchainTokenData, destGasAmounts); + _trialExecute(message, offchainTokenData, tokenGasOverrides); _setExecutionState(message.sequenceNumber, newState); // Since it's hard to estimate whether manual execution will succeed, we @@ -460,9 +460,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio function _trialExecute( Internal.EVM2EVMMessage memory message, bytes[] memory offchainTokenData, - uint256[] memory destGasAmounts + uint256[] memory tokenGasOverrides ) internal returns (Internal.MessageExecutionState, bytes memory) { - try this.executeSingleMessage(message, offchainTokenData, destGasAmounts) {} + try this.executeSingleMessage(message, offchainTokenData, tokenGasOverrides) {} catch (bytes memory err) { // return the message execution state as FAILURE and the revert data // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES @@ -482,7 +482,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio function executeSingleMessage( Internal.EVM2EVMMessage memory message, bytes[] memory offchainTokenData, - uint256[] memory destGasAmounts + uint256[] memory tokenGasOverrides ) external { if (msg.sender != address(this)) revert CanOnlySelfCall(); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); @@ -493,7 +493,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio message.receiver, message.sourceTokenData, offchainTokenData, - destGasAmounts + tokenGasOverrides ); } // There are three cases in which we skip calling the receiver: @@ -714,7 +714,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio address receiver, bytes[] memory encodedSourceTokenData, bytes[] memory offchainTokenData, - uint256[] memory destGasAmounts + uint256[] memory tokenGasOverrides ) internal returns (Client.EVMTokenAmount[] memory destTokenAmounts) { // Creating a copy is more gas efficient than initializing a new array. destTokenAmounts = sourceTokenAmounts; @@ -722,9 +722,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio for (uint256 i = 0; i < sourceTokenAmounts.length; ++i) { Internal.SourceTokenData memory sourceTokenData = abi.decode(encodedSourceTokenData[i], (Internal.SourceTokenData)); - if (destGasAmounts.length != 0) { - if (destGasAmounts[i] != 0) { - sourceTokenData.destGasAmount = uint32(destGasAmounts[i]); + if (tokenGasOverrides.length != 0) { + if (tokenGasOverrides[i] != 0) { + sourceTokenData.destGasAmount = uint32(tokenGasOverrides[i]); } } destTokenAmounts[i] = _releaseOrMintToken( diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol index 2410af7c1c..8237af3702 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol @@ -34,19 +34,19 @@ contract EVM2EVMOffRampHelper is EVM2EVMOffRamp, IgnoreContractSize { address receiver, bytes[] calldata sourceTokenData, bytes[] calldata offchainTokenData, - uint256[] memory destGasAmounts + uint256[] memory tokenGasOverrides ) external returns (Client.EVMTokenAmount[] memory) { return _releaseOrMintTokens( - sourceTokenAmounts, originalSender, receiver, sourceTokenData, offchainTokenData, destGasAmounts + sourceTokenAmounts, originalSender, receiver, sourceTokenData, offchainTokenData, tokenGasOverrides ); } function trialExecute( Internal.EVM2EVMMessage memory message, bytes[] memory offchainTokenData, - uint256[] memory destGasAmounts + uint256[] memory tokenGasOverrides ) external returns (Internal.MessageExecutionState, bytes memory) { - return _trialExecute(message, offchainTokenData, destGasAmounts); + return _trialExecute(message, offchainTokenData, tokenGasOverrides); } function report(bytes calldata executableMessages) external { diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol index 42d4103a1d..4f9b530017 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuser.sol @@ -46,11 +46,11 @@ contract ReentrancyAbuser is CCIPReceiver { for (uint256 i = 0; i < messages.length; ++i) { gasLimitOverrides[i].receiverExecutionGasLimit = messages[i].gasLimit; //create an array for destinationGasAmounts - gasLimitOverrides[i].destGasAmounts = new uint256[](messages[i].tokenAmounts.length); + gasLimitOverrides[i].tokenGasOverrides = new uint256[](messages[i].tokenAmounts.length); - // initialize destGasAmounts + // initialize tokenGasOverrides for (uint256 j = 0; j < messages[i].tokenAmounts.length; ++j) { - gasLimitOverrides[i].destGasAmounts[j] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; + gasLimitOverrides[i].tokenGasOverrides[j] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; } } 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 966e22398d..f584f9d6ac 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -1148,7 +1148,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { s_offRamp.manuallyExecute(_generateReportFromMessages(messages), gasLimitOverrides); } - function test_ManualExecWithDestGasAmountOverride_Failure() public { + function test_ManualExecWithTokenGasOverride_Failure() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessageWithTokens(); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -1156,16 +1156,16 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { s_reverting_receiver.setRevert(false); EVM2EVMOffRamp.GasLimitOverride[] memory gasLimitOverrides = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0].destGasAmounts[0] = gasLimitOverrides[0].destGasAmounts[0] - 2; + gasLimitOverrides[0].tokenGasOverrides[0] = gasLimitOverrides[0].tokenGasOverrides[0] - 2; vm.expectRevert( - abi.encodeWithSelector(EVM2EVMOffRamp.InvalidDestGasAmount.selector, 0, gasLimitOverrides[0].destGasAmounts[0]) + abi.encodeWithSelector(EVM2EVMOffRamp.InvalidTokenGasOverride.selector, 0, gasLimitOverrides[0].tokenGasOverrides[0]) ); s_offRamp.manuallyExecute(_generateReportFromMessages(messages), gasLimitOverrides); } - function test_ManualExecWithDestGasAmountOverride_Mismatch_Failure() public { + function test_ManualExecWithTokenGasOverride_Mismatch_Failure() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessageWithTokens(); messages[0].receiver = address(s_reverting_receiver); messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash()); @@ -1173,7 +1173,7 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup { s_reverting_receiver.setRevert(false); EVM2EVMOffRamp.GasLimitOverride[] memory gasLimitOverrides = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0].destGasAmounts = new uint256[](0); + gasLimitOverrides[0].tokenGasOverrides = new uint256[](0); vm.expectRevert( abi.encodeWithSelector(EVM2EVMOffRamp.DestinationGasAmountCountMismatch.selector, messages[0].messageId, 1) diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol index 54eadfe4ea..dd32b109af 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol @@ -237,11 +237,11 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { for (uint256 i = 0; i < messages.length; ++i) { gasLimitOverrides[i].receiverExecutionGasLimit = messages[i].gasLimit; //create an array for destinationGasAmounts - gasLimitOverrides[i].destGasAmounts = new uint256[](messages[i].tokenAmounts.length); + gasLimitOverrides[i].tokenGasOverrides = new uint256[](messages[i].tokenAmounts.length); - // initialize destGasAmounts + // initialize tokenGasOverrides for (uint256 j = 0; j < messages[i].tokenAmounts.length; ++j) { - gasLimitOverrides[i].destGasAmounts[j] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; + gasLimitOverrides[i].tokenGasOverrides[j] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; } } @@ -254,7 +254,7 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { returns (EVM2EVMOffRamp.GasLimitOverride[] memory) { EVM2EVMOffRamp.GasLimitOverride[] memory gasLimitOverrides = - _prepareGasLimitsAndDestGasAmountOverridesForMessages(messages); + _prepareGasLimitsAndTokenGasOverridesForMessages(messages); for (uint256 i = 0; i < gasLimitOverrides.length; i++) { gasLimitOverrides[i].receiverExecutionGasLimit = gasLimitOverrides[i].receiverExecutionGasLimit - 10; @@ -263,7 +263,7 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { return gasLimitOverrides; } - function _prepareGasLimitsAndDestGasAmountOverridesForMessages(Internal.EVM2EVMMessage[] memory messages) + function _prepareGasLimitsAndTokenGasOverridesForMessages(Internal.EVM2EVMMessage[] memory messages) public pure returns (EVM2EVMOffRamp.GasLimitOverride[] memory) @@ -271,11 +271,11 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { EVM2EVMOffRamp.GasLimitOverride[] memory gasLimitOverrides = new EVM2EVMOffRamp.GasLimitOverride[](messages.length); for (uint256 i = 0; i < messages.length; ++i) { gasLimitOverrides[i].receiverExecutionGasLimit = messages[i].gasLimit; - gasLimitOverrides[i].destGasAmounts = new uint256[](messages[i].tokenAmounts.length); + gasLimitOverrides[i].tokenGasOverrides = new uint256[](messages[i].tokenAmounts.length); for (uint256 j = 0; j < messages[i].sourceTokenData.length; ++j) { Internal.SourceTokenData memory sourceTokenData = abi.decode(messages[i].sourceTokenData[j], (Internal.SourceTokenData)); - gasLimitOverrides[i].destGasAmounts[j] = sourceTokenData.destGasAmount; + gasLimitOverrides[i].tokenGasOverrides[j] = sourceTokenData.destGasAmount; } } 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 63cbcbde71..d70d8ab57a 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 @@ -53,7 +53,7 @@ type EVM2EVMOffRampDynamicConfig struct { type EVM2EVMOffRampGasLimitOverride struct { ReceiverExecutionGasLimit *big.Int - DestGasAmounts []*big.Int + TokenGasOverrides []*big.Int } type EVM2EVMOffRampRateLimitToken struct { @@ -109,7 +109,7 @@ 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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"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\"}],\"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\":\"AlreadyExecuted\",\"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\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"DestinationGasAmountCountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"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\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"destGasAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidDestGasAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"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\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"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\":\"err\",\"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\":\"err\",\"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\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"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\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"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\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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[]\"},{\"internalType\":\"uint256[]\",\"name\":\"destGasAmounts\",\"type\":\"uint256[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"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\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"destGasAmounts\",\"type\":\"uint256[]\"}],\"internalType\":\"structEVM2EVMOffRamp.GasLimitOverride[]\",\"name\":\"gasLimitOverrides\",\"type\":\"tuple[]\"}],\"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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + 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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"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\"}],\"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\":\"AlreadyExecuted\",\"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\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"DestinationGasAmountCountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"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\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"destGasAmount\",\"type\":\"uint256\"}],\"name\":\"InvalidDestGasAmount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"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\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"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\":\"err\",\"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\":\"err\",\"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\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"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\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"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\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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[]\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint256[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"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\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"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\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint256[]\"}],\"internalType\":\"structEVM2EVMOffRamp.GasLimitOverride[]\",\"name\":\"gasLimitOverrides\",\"type\":\"tuple[]\"}],\"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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", Bin: "0x6101a06040523480156200001257600080fd5b506040516200616e3803806200616e8339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615aa5620006c9600039600081816102ec01528181611c540152612e430152600081816102bd01528181611c2c015261210e01526000818161028e015281816110300152818161109501528181611c020152818161268b01526126f5015260006122ad01526000818161025f0152611bd80152600081816101ff0152611b7c01526000818161022f01528181611bb0015281816120cb01528181612f5401526135ff0152600081816101d001528181611b57015261238d01526000818161202501526120710152615aa56000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063c92b283211610066578063c92b2832146105f3578063f077b59214610606578063f2fde38b1461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063b1fc6515146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063546719cd1161013a578063704b6c0211610114578063704b6c02146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063546719cd146103c3578063599f643114610427578063666cab8d1461044c57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b57806330c2fd44146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190614150565b60405180910390f35b6103456103403660046141e6565b61062f565b6040516103299190614246565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b60405161032991906142a4565b6103ae6103a93660046144c2565b6106aa565b005b6103ae6103be366004614844565b610a9e565b6103cb610d41565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610454610df6565b6040516103299190614911565b6103ae61046f366004614924565b610e58565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b6040516103299190614941565b6103ae610f21565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614997565b61057061056b366004614924565b611004565b60405167ffffffffffffffff9091168152602001610329565b6103ae610597366004614a63565b611107565b6000546001600160a01b0316610434565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614b0c565b6112da565b6103ae6105ee366004614d7f565b6114e5565b6103ae610601366004614eb1565b6117d1565b61060e61183c565b604051610329929190614f1f565b6103ae61062a366004614924565b611962565b600061063d60016004614f73565b600261064a608085614fb5565b67ffffffffffffffff1661065e9190614fdc565b6010600061066d608087614ff3565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4614203565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee919061501a565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee919061501a565b61073c611973565b610745856119e9565b60095460005b818110156107bc57600860006009838154811061076a5761076a615034565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df615034565b60200260200101519050600060028111156107fc576107fc614203565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e614203565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee919061501a565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b614203565b0217905550905050508060010190506107c3565b5087516109739060099060208b01906140be565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16615063565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611cb3565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90615086565b60405180910390a150505050505050505050565b333014610ad7576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610b14565b6040805180820190915260008082526020820152815260200190600190039081610aed5790505b506101408501515190915015610b7557610b728461014001518560200151604051602001610b5191906001600160a01b0391909116815260200190565b60405160208183030381529060405286604001518761016001518787611d40565b90505b61012084015151158015610b8b57506080840151155b80610ba2575060408401516001600160a01b03163b155b80610be257506040840151610be0906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611eca565b155b15610bed5750505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808961018001518152602001896000015167ffffffffffffffff1681526020018960200151604051602001610c6591906001600160a01b0391909116815260200190565b604051602081830303815290604052815260200189610120015181526020018681525061138889608001518a604001516040518563ffffffff1660e01b8152600401610cb49493929190615161565b6000604051808303816000875af1158015610cd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfb919081019061526b565b509150915081610d3957806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610df190611ee6565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610e4e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e30575b5050505050905090565b6000546001600160a01b03163314801590610e7e57506002546001600160a01b03163314155b15610eb5576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b6001546001600160a01b03163314610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110091906152c5565b9392505050565b61110f611973565b60005b82518110156111e25761114c83828151811061113057611130615034565b602002602001015160200151600c611f9890919063ffffffff16565b156111da577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061118457611184615034565b6020026020010151600001518483815181106111a2576111a2615034565b6020026020010151602001516040516111d19291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611112565b5060005b81518110156112d55761123f82828151811061120457611204615034565b60200260200101516020015183838151811061122257611222615034565b602002602001015160000151600c611fad9092919063ffffffff16565b156112cd577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061127757611277615034565b60200260200101516000015183838151811061129557611295615034565b6020026020010151602001516040516112c49291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b6001016111e6565b505050565b6112e48787611fcb565b60055488359080821461132d576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b611335612022565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156113bd576113bd614203565b60028111156113ce576113ce614203565b90525090506002816020015160028111156113eb576113eb614203565b14801561142557506009816000015160ff168154811061140d5761140d615034565b6000918252602090912001546001600160a01b031633145b61145b576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611469856020614fdc565b611474886020614fdc565b6114808b6101446152e2565b61148a91906152e2565b61149491906152e2565b90503681146114d8576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6114ed612022565b8151518151811461152a576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156117c657600083828151811061154957611549615034565b6020026020010151600001519050806000146115c257845180518390811061157357611573615034565b6020026020010151608001518110156115c2576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b8382815181106115d4576115d4615034565b60200260200101516020015151856000015183815181106115f7576115f7615034565b60200260200101516101400151511461169457845180518390811061161e5761161e615034565b602002602001015161018001518560000151838151811061164157611641615034565b6020026020010151606001516040517f85d2e5bf0000000000000000000000000000000000000000000000000000000081526004016106ee92919091825267ffffffffffffffff16602082015260400190565b6000856000015183815181106116ac576116ac615034565b60200260200101516101600151905060005b86518051859081106116d2576116d2615034565b60200260200101516101400151518110156117b85760008285815181106116fb576116fb615034565b60200260200101518060200190518101906117169190615309565b9050600087868151811061172c5761172c615034565b602002602001015160200151838151811061174957611749615034565b602002602001015190508060001415801561176d5750816060015163ffffffff1681105b156117ae576040517ffd6dde0e00000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016106ee565b50506001016116be565b50505080600101905061152d565b506112d583836120a3565b6000546001600160a01b031633148015906117f757506002546001600160a01b03163314155b1561182e576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611839600382612af9565b50565b606080600061184b600c612cde565b90508067ffffffffffffffff811115611866576118666142b7565b60405190808252806020026020018201604052801561188f578160200160208202803683370190505b5092508067ffffffffffffffff8111156118ab576118ab6142b7565b6040519080825280602002602001820160405280156118d4578160200160208202803683370190505b50915060005b8181101561195c576000806118f0600c84612ce9565b915091508086848151811061190757611907615034565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061193a5761193a615034565b6001600160a01b039092166020928302919091019091015250506001016118da565b50509091565b61196a611973565b61183981612d07565b6000546001600160a01b031633146119e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b6000818060200190518101906119ff91906153cf565b60608101519091506001600160a01b0316611a46576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611ca791849061546a565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611cd79998979695949392919061552c565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b856000805b8851811015611eaf576000868281518110611d6257611d62615034565b6020026020010151806020019051810190611d7d9190615309565b90508451600014611dd257848281518110611d9a57611d9a615034565b6020026020010151600014611dd257848281518110611dbb57611dbb615034565b602090810291909101015163ffffffff1660608201525b611e158a8381518110611de757611de7615034565b6020026020010151602001518a8a848a8781518110611e0857611e08615034565b6020026020010151612de2565b848381518110611e2757611e27615034565b6020026020010181905250611e63848381518110611e4757611e47615034565b602002602001015160000151600c6131eb90919063ffffffff16565b15611ea657611e99848381518110611e7d57611e7d615034565b6020908102919091010151600b546001600160a01b0316613200565b611ea390846152e2565b92505b50600101611d45565b508015611ebf57611ebf81613321565b509695505050505050565b6000611ed58361332e565b801561110057506111008383613392565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611f7482606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611f589190614f73565b85608001516fffffffffffffffffffffffffffffffff16613461565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000611100836001600160a01b038416613480565b6000611fc3846001600160a01b0385168461348c565b949350505050565b61201e611fda828401846155b4565b6040805160008082526020820190925290612018565b604080518082019091526000815260606020820152815260200190600190039081611ff05790505b506120a3565b5050565b467f0000000000000000000000000000000000000000000000000000000000000000146119e7576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561215d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218191906155e9565b156121b8576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515160008190036121f5576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612233576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561224e5761224e6142b7565b604051908082528060200260200182016040528015612277578160200160208202803683370190505b50905060005b8281101561234f5760008560000151828151811061229d5761229d615034565b602002602001015190506122d1817f00000000000000000000000000000000000000000000000000000000000000006134a2565b8383815181106122e3576122e3615034565b60200260200101818152505080610180015183838151811061230757612307615034565b602002602001015114612346576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060010161227d565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926332048875926123c392879291600401615637565b602060405180830381865afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612404919061566d565b905080600003612440576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610d395760008660000151828151811061246357612463615034565b60200260200101519050600061247c826060015161062f565b9050600081600381111561249257612492614203565b14806124af575060038160038111156124ad576124ad614203565b145b6124f557816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a25050612af1565b8651606090158015906125e05788858151811061251457612514615034565b6020908102919091018101510151600a5490925060009063ffffffff1661253b8842614f73565b119050808061255b5750600384600381111561255957612559614203565b145b612591576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8986815181106125a3576125a3615034565b6020026020010151600001516000146125da578986815181106125c8576125c8615034565b60209081029190910101515160808601525b50612645565b60008360038111156125f4576125f4614203565b1461264557606084015160405167ffffffffffffffff90911681527f67d9ba0f63d427c482c2736300e6d5a34c6691dbcdea8ad35828a1f1ba47e8729060200160405180910390a150505050612af1565b60c084015167ffffffffffffffff16156128c8576020808501516001600160a01b03166000908152600f909152604081205467ffffffffffffffff1690819003612831577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156128315760208501516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa15801561273e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276291906152c5565b60c086015190915067ffffffffffffffff1661277f826001615686565b67ffffffffffffffff16146127e15784602001516001600160a01b03168560c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050505050612af1565b6020858101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600084600381111561284557612845614203565b036128c65760c085015167ffffffffffffffff16612864826001615686565b67ffffffffffffffff16146128c65784602001516001600160a01b03168560c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050505050612af1565b505b60008a6020015186815181106128e0576128e0615034565b6020026020010151905061290c85606001518660000151876101400151518861012001515185516135fd565b61291b8560600151600161377e565b600080612929878487613828565b9150915061293b87606001518361377e565b83156129a757600382600381111561295557612955614203565b036129a757600086600381111561296e5761296e614203565b146129a757806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b60028260038111156129bb576129bb614203565b14612a135760038260038111156129d4576129d4614203565b14612a13578660600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee9291906156a7565b60c087015167ffffffffffffffff1615612a9b576000866003811115612a3b57612a3b614203565b03612a9b576020808801516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff1691612a73836156c5565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612ae19291906156e2565b60405180910390a3505050505050505b600101612443565b8154600090612b2290700100000000000000000000000000000000900463ffffffff1642614f73565b90508015612bc45760018301548354612b6a916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613461565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612bea916fffffffffffffffffffffffffffffffff90811691166138f5565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612cd19084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a48261390b565b6000808080612cf88686613916565b909450925050505b9250929050565b336001600160a01b03821603612d79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60408051808201909152600080825260208201526000612e058460200151613925565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612e8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eae9190615702565b90506001600160a01b0381161580612ef65750612ef46001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611eca565b155b15612f38576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b600080600061303d6040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a60400151815260200189815250604051602401612fce919061571f565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905260608a0151869063ffffffff1661138860846139cb565b9250925092508261307c57816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b81516020146130c45781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b6000828060200190518101906130da919061566d565b6040516001600160a01b0380881660248301528c1660448201526064810182905290915061317f9060840160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905260608b0151889061317590869063ffffffff16614f73565b61138860846139cb565b509094509250836131be57826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b604080518082019091526001600160a01b0390961686526020860152509293505050505b95945050505050565b6000611100836001600160a01b038416613af1565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328a91906157f6565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036132f35783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b6020840151611fc3907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690613afd565b6118396003826000613b3a565b600061335a827f01ffc9a700000000000000000000000000000000000000000000000000000000613392565b80156106a4575061338b827fffffffff00000000000000000000000000000000000000000000000000000000613392565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561344a575060208210155b80156134565750600081115b979650505050505050565b60006131e2856134718486614fdc565b61347b90876152e2565b6138f5565b60006111008383613e89565b6000611fc384846001600160a01b038516613ea6565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016135389897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016135719190615856565b6040516020818303038152906040528051906020012087610160015160405160200161359d91906158c3565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613676576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff168311156136ce576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b808314613713576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561377757600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b5050505050565b6000600261378d608085614fb5565b67ffffffffffffffff166137a19190614fdc565b905060006010816137b3608087614ff3565b67ffffffffffffffff1681526020810191909152604001600020549050816137dd60016004614f73565b901b1916818360038111156137f4576137f4614203565b901b178060106000613807608088614ff3565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517f30c2fd4400000000000000000000000000000000000000000000000000000000815260009060609030906330c2fd449061386e908890889088906004016158d6565b600060405180830381600087803b15801561388857600080fd5b505af1925050508015613899575060015b6138d8573d8080156138c7576040519150601f19603f3d011682016040523d82523d6000602084013e6138cc565b606091505b506003925090506138ed565b50506040805160208101909152600081526002905b935093915050565b60008183106139045781611100565b5090919050565b60006106a482613ec3565b6000808080612cf88686613ece565b6000815160201461396457816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b60008280602001905181019061397a919061566d565b90506001600160a01b03811180613992575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee91906142a4565b6000606060008361ffff1667ffffffffffffffff8111156139ee576139ee6142b7565b6040519080825280601f01601f191660200182016040528015613a18576020820181803683370190505b509150863b613a4b577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613a7e577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613ab7577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613ada5750835b808352806000602085013e50955095509592505050565b60006111008383613ef9565b6000670de0b6b3a7640000613b30837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614fdc565b6111009190615a55565b825474010000000000000000000000000000000000000000900460ff161580613b61575081155b15613b6b57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613bb190700100000000000000000000000000000000900463ffffffff1642614f73565b90508015613c715781831115613bf3576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613c2d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613461565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613d0e576001600160a01b038416613cc3576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613e075760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613d529082614f73565b613d5c878a614f73565b613d6691906152e2565b613d709190615a55565b90506001600160a01b038616613dbc576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613e118584614f73565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260028301602052604081208190556111008383613f05565b60008281526002840160205260408120829055611fc38484613f11565b60006106a482613f1d565b60008080613edc8585613f27565b600081815260029690960160205260409095205494959350505050565b60006111008383613f33565b60006111008383613f4b565b60006111008383614045565b60006106a4825490565b60006111008383614094565b60008181526001830160205260408120541515611100565b60008181526001830160205260408120548015614034576000613f6f600183614f73565b8554909150600090613f8390600190614f73565b9050818114613fe8576000866000018281548110613fa357613fa3615034565b9060005260206000200154905080876000018481548110613fc657613fc6615034565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613ff957613ff9615a69565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b600081815260018301602052604081205461408c575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b60008260000182815481106140ab576140ab615034565b9060005260206000200154905092915050565b82805482825590600052602060002090810192821561412b579160200282015b8281111561412b57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161782556020909201916001909101906140de565b5061413792915061413b565b5090565b5b80821115614137576000815560010161413c565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461183957600080fd5b80356141e1816141c0565b919050565b6000602082840312156141f857600080fd5b8135611100816141c0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061424257614242614203565b9052565b602081016106a48284614232565b60005b8381101561426f578181015183820152602001614257565b50506000910152565b60008151808452614290816020860160208601614254565b601f01601f19169290920160200192915050565b6020815260006111006020830184614278565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614309576143096142b7565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614309576143096142b7565b6040516080810167ffffffffffffffff81118282101715614309576143096142b7565b604051601f8201601f1916810167ffffffffffffffff8111828210171561437f5761437f6142b7565b604052919050565b600067ffffffffffffffff8211156143a1576143a16142b7565b5060051b60200190565b6001600160a01b038116811461183957600080fd5b80356141e1816143ab565b600082601f8301126143dc57600080fd5b813560206143f16143ec83614387565b614356565b8083825260208201915060208460051b87010193508684111561441357600080fd5b602086015b84811015611ebf57803561442b816143ab565b8352918301918301614418565b803560ff811681146141e157600080fd5b600067ffffffffffffffff821115614463576144636142b7565b50601f01601f191660200190565b600082601f83011261448257600080fd5b81356144906143ec82614449565b8181528460208386010111156144a557600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156144db57600080fd5b863567ffffffffffffffff808211156144f357600080fd5b6144ff8a838b016143cb565b9750602089013591508082111561451557600080fd5b6145218a838b016143cb565b965061452f60408a01614438565b9550606089013591508082111561454557600080fd5b6145518a838b01614471565b945061455f60808a016141d6565b935060a089013591508082111561457557600080fd5b5061458289828a01614471565b9150509295509295509295565b801515811461183957600080fd5b80356141e18161458f565b600082601f8301126145b957600080fd5b813560206145c96143ec83614387565b82815260069290921b840181019181810190868411156145e857600080fd5b8286015b84811015611ebf57604081890312156146055760008081fd5b61460d6142e6565b8135614618816143ab565b815281850135858201528352918301916040016145ec565b600082601f83011261464157600080fd5b813560206146516143ec83614387565b82815260059290921b8401810191818101908684111561467057600080fd5b8286015b84811015611ebf57803567ffffffffffffffff8111156146945760008081fd5b6146a28986838b0101614471565b845250918301918301614674565b60006101a082840312156146c357600080fd5b6146cb61430f565b90506146d6826141d6565b81526146e4602083016143c0565b60208201526146f5604083016143c0565b6040820152614706606083016141d6565b60608201526080820135608082015261472160a0830161459d565b60a082015261473260c083016141d6565b60c082015261474360e083016143c0565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561477057600080fd5b61477c86838701614471565b8385015261014092508285013591508082111561479857600080fd5b6147a4868387016145a8565b838501526101609250828501359150808211156147c057600080fd5b506147cd85828601614630565b82840152505061018080830135818301525092915050565b600082601f8301126147f657600080fd5b813560206148066143ec83614387565b8083825260208201915060208460051b87010193508684111561482857600080fd5b602086015b84811015611ebf578035835291830191830161482d565b60008060006060848603121561485957600080fd5b833567ffffffffffffffff8082111561487157600080fd5b61487d878388016146b0565b9450602086013591508082111561489357600080fd5b61489f87838801614630565b935060408601359150808211156148b557600080fd5b506148c2868287016147e5565b9150509250925092565b60008151808452602080850194506020840160005b838110156149065781516001600160a01b0316875295820195908201906001016148e1565b509495945050505050565b60208152600061110060208301846148cc565b60006020828403121561493657600080fd5b8135611100816143ab565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156149a957600080fd5b813567ffffffffffffffff8111156149c057600080fd5b820160a0818503121561110057600080fd5b600082601f8301126149e357600080fd5b813560206149f36143ec83614387565b82815260069290921b84018101918181019086841115614a1257600080fd5b8286015b84811015611ebf5760408189031215614a2f5760008081fd5b614a376142e6565b8135614a42816143ab565b815281850135614a51816143ab565b81860152835291830191604001614a16565b60008060408385031215614a7657600080fd5b823567ffffffffffffffff80821115614a8e57600080fd5b614a9a868387016149d2565b93506020850135915080821115614ab057600080fd5b50614abd858286016149d2565b9150509250929050565b60008083601f840112614ad957600080fd5b50813567ffffffffffffffff811115614af157600080fd5b6020830191508360208260051b8501011115612d0057600080fd5b60008060008060008060008060e0898b031215614b2857600080fd5b606089018a811115614b3957600080fd5b8998503567ffffffffffffffff80821115614b5357600080fd5b818b0191508b601f830112614b6757600080fd5b813581811115614b7657600080fd5b8c6020828501011115614b8857600080fd5b6020830199508098505060808b0135915080821115614ba657600080fd5b614bb28c838d01614ac7565b909750955060a08b0135915080821115614bcb57600080fd5b50614bd88b828c01614ac7565b999c989b50969995989497949560c00135949350505050565b600082601f830112614c0257600080fd5b81356020614c126143ec83614387565b82815260059290921b84018101918181019086841115614c3157600080fd5b8286015b84811015611ebf57803567ffffffffffffffff811115614c555760008081fd5b614c638986838b0101614630565b845250918301918301614c35565b600060808284031215614c8357600080fd5b614c8b614333565b9050813567ffffffffffffffff80821115614ca557600080fd5b818401915084601f830112614cb957600080fd5b81356020614cc96143ec83614387565b82815260059290921b84018101918181019088841115614ce857600080fd5b8286015b84811015614d2057803586811115614d045760008081fd5b614d128b86838b01016146b0565b845250918301918301614cec565b5086525085810135935082841115614d3757600080fd5b614d4387858801614bf1565b90850152506040840135915080821115614d5c57600080fd5b50614d69848285016147e5565b6040830152506060820135606082015292915050565b6000806040808486031215614d9357600080fd5b833567ffffffffffffffff80821115614dab57600080fd5b614db787838801614c71565b9450602091508186013581811115614dce57600080fd5b8601601f81018813614ddf57600080fd5b8035614ded6143ec82614387565b81815260059190911b8201840190848101908a831115614e0c57600080fd5b8584015b83811015614e7f57803586811115614e285760008081fd5b8501808d03601f1901891315614e3e5760008081fd5b614e466142e6565b8882013581528982013588811115614e5e5760008081fd5b614e6c8f8b838601016147e5565b828b015250845250918601918601614e10565b50809750505050505050509250929050565b80356fffffffffffffffffffffffffffffffff811681146141e157600080fd5b600060608284031215614ec357600080fd5b6040516060810181811067ffffffffffffffff82111715614ee657614ee66142b7565b6040528235614ef48161458f565b8152614f0260208401614e91565b6020820152614f1360408401614e91565b60408201529392505050565b604081526000614f3260408301856148cc565b82810360208401526131e281856148cc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614f44565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614fd057614fd0614f86565b92169190910692915050565b80820281158282048414176106a4576106a4614f44565b600067ffffffffffffffff8084168061500e5761500e614f86565b92169190910492915050565b602081016003831061502e5761502e614203565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff80831681810361507c5761507c614f44565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526150b68184018a6148cc565b905082810360808401526150ca81896148cc565b905060ff871660a084015282810360c08401526150e78187614278565b905067ffffffffffffffff851660e084015282810361010084015261510c8185614278565b9c9b505050505050505050505050565b60008151808452602080850194506020840160005b8381101561490657815180516001600160a01b031688528301518388015260409096019590820190600101615131565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c084015261519c610120840182614278565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e08601526151d88383614278565b9250608089015191508085840301610100860152506151f7828261511c565b9250505061520b602083018661ffff169052565b8360408301526131e260608301846001600160a01b03169052565b600082601f83011261523757600080fd5b81516152456143ec82614449565b81815284602083860101111561525a57600080fd5b611fc3826020830160208701614254565b60008060006060848603121561528057600080fd5b835161528b8161458f565b602085015190935067ffffffffffffffff8111156152a857600080fd5b6152b486828701615226565b925050604084015190509250925092565b6000602082840312156152d757600080fd5b8151611100816141c0565b808201808211156106a4576106a4614f44565b805163ffffffff811681146141e157600080fd5b60006020828403121561531b57600080fd5b815167ffffffffffffffff8082111561533357600080fd5b908301906080828603121561534757600080fd5b61534f614333565b82518281111561535e57600080fd5b61536a87828601615226565b82525060208301518281111561537f57600080fd5b61538b87828601615226565b6020830152506040830151828111156153a357600080fd5b6153af87828601615226565b6040830152506153c1606084016152f5565b606082015295945050505050565b600060a082840312156153e157600080fd5b60405160a0810181811067ffffffffffffffff82111715615404576154046142b7565b604052615410836152f5565b815261541e602084016152f5565b6020820152604083015161ffff8116811461543857600080fd5b6040820152606083015161544b816143ab565b6060820152608083015161545e816143ab565b60808201529392505050565b61018081016154db82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152611100565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526155668285018b6148cc565b9150838203608085015261557a828a6148cc565b915060ff881660a085015283820360c08501526155978288614278565b90861660e0850152838103610100850152905061510c8185614278565b6000602082840312156155c657600080fd5b813567ffffffffffffffff8111156155dd57600080fd5b611fc384828501614c71565b6000602082840312156155fb57600080fd5b81516111008161458f565b60008151808452602080850194506020840160005b838110156149065781518752958201959082019060010161561b565b60608152600061564a6060830186615606565b828103602084015261565c8186615606565b915050826040830152949350505050565b60006020828403121561567f57600080fd5b5051919050565b67ffffffffffffffff81811683821601908082111561403e5761403e614f44565b67ffffffffffffffff83168152604081016111006020830184614232565b600067ffffffffffffffff80831681810361507c5761507c614f44565b6156ec8184614232565b604060208201526000611fc36040830184614278565b60006020828403121561571457600080fd5b8151611100816143ab565b602081526000825161010080602085015261573e610120850183614278565b9150602085015161575b604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161579560a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526157b28483614278565b935060c08701519150808685030160e08701526157cf8483614278565b935060e08701519150808685030183870152506157ec8382614278565b9695505050505050565b60006040828403121561580857600080fd5b6158106142e6565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461583c57600080fd5b815261584a602084016152f5565b60208201529392505050565b602081526000611100602083018461511c565b60008282518085526020808601955060208260051b8401016020860160005b848110156158b657601f198684030189526158a4838351614278565b98840198925090830190600101615888565b5090979650505050505050565b6020815260006111006020830184615869565b606081526158f160608201855167ffffffffffffffff169052565b6000602085015161590d60808401826001600160a01b03169052565b5060408501516001600160a01b03811660a084015250606085015167ffffffffffffffff811660c084015250608085015160e083015260a08501516101006159588185018315159052565b60c087015191506101206159778186018467ffffffffffffffff169052565b60e08801519250610140615995818701856001600160a01b03169052565b828901519350610160925083838701528189015193506101a0915061018082818801526159c6610200880186614278565b9450818a015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0808887030184890152615a02868461511c565b948b01518886039091016101c0890152939450615a1f8585615869565b9450808a01516101e0880152505050508281036020840152615a418186615869565b905082810360408401526157ec8185615606565b600082615a6457615a64614f86565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } @@ -571,16 +571,16 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) AcceptOwnership() (*type return _EVM2EVMOffRamp.Contract.AcceptOwnership(&_EVM2EVMOffRamp.TransactOpts) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte, destGasAmounts []*big.Int) (*types.Transaction, error) { - return _EVM2EVMOffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData, destGasAmounts) +func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte, tokenGasOverrides []*big.Int) (*types.Transaction, error) { + return _EVM2EVMOffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData, tokenGasOverrides) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) ExecuteSingleMessage(message InternalEVM2EVMMessage, offchainTokenData [][]byte, destGasAmounts []*big.Int) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.ExecuteSingleMessage(&_EVM2EVMOffRamp.TransactOpts, message, offchainTokenData, destGasAmounts) +func (_EVM2EVMOffRamp *EVM2EVMOffRampSession) ExecuteSingleMessage(message InternalEVM2EVMMessage, offchainTokenData [][]byte, tokenGasOverrides []*big.Int) (*types.Transaction, error) { + return _EVM2EVMOffRamp.Contract.ExecuteSingleMessage(&_EVM2EVMOffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } -func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) ExecuteSingleMessage(message InternalEVM2EVMMessage, offchainTokenData [][]byte, destGasAmounts []*big.Int) (*types.Transaction, error) { - return _EVM2EVMOffRamp.Contract.ExecuteSingleMessage(&_EVM2EVMOffRamp.TransactOpts, message, offchainTokenData, destGasAmounts) +func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactorSession) ExecuteSingleMessage(message InternalEVM2EVMMessage, offchainTokenData [][]byte, tokenGasOverrides []*big.Int) (*types.Transaction, error) { + return _EVM2EVMOffRamp.Contract.ExecuteSingleMessage(&_EVM2EVMOffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } func (_EVM2EVMOffRamp *EVM2EVMOffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, report InternalExecutionReport, gasLimitOverrides []EVM2EVMOffRampGasLimitOverride) (*types.Transaction, error) { @@ -2693,7 +2693,7 @@ type EVM2EVMOffRampInterface interface { AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) - ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte, destGasAmounts []*big.Int) (*types.Transaction, error) + ExecuteSingleMessage(opts *bind.TransactOpts, message InternalEVM2EVMMessage, offchainTokenData [][]byte, tokenGasOverrides []*big.Int) (*types.Transaction, error) ManuallyExecute(opts *bind.TransactOpts, report InternalExecutionReport, gasLimitOverrides []EVM2EVMOffRampGasLimitOverride) (*types.Transaction, 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 dedc69ca74..15e3b366c0 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 @@ -12,7 +12,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin cb1c4d1bd8460181f1545524bc2537a58f6839ee0acad6a068f5e24216a9cee9 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 15cd5695049ab4be1f396ec1d7b609738b2bcefa3740a7a48316e1f72506a34a -evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin d3fad9c29bcfee3af0d8561f1cb5a7ff195fbecb32a7c7a9d160adff85e200d3 +evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b187f7b62a9455151d3b49d9de7a66b1b2f14a794acfec4a5ef2c033648e0c61 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf1a3090a2f8d1632b82a6d45200cf6f3833a1e27303745405c1ed13ffc0cf83 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin ee60ad24918c9652ef4b251236dd3390cce651b685e94532bf3bde2a111fe6b9 lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin e23f4fd063eb3a289d651016ac45fcef72607ce2b571cba134e2bf35590c114d diff --git a/core/scripts/ccip/manual-execution/helpers/contractmodels.go b/core/scripts/ccip/manual-execution/helpers/contractmodels.go index 66105cf802..000b32dd39 100644 --- a/core/scripts/ccip/manual-execution/helpers/contractmodels.go +++ b/core/scripts/ccip/manual-execution/helpers/contractmodels.go @@ -81,5 +81,5 @@ type EVM2EVMOffRampExecutionStateChanged struct { type EVM2EVMOffRampGasLimitOverride struct { ReceiverExecutionGasLimit *big.Int - DestGasAmounts []*big.Int + TokenGasOverrides []*big.Int } diff --git a/core/scripts/ccip/manual-execution/main.go b/core/scripts/ccip/manual-execution/main.go index 0f01b72ab6..ad86457e6b 100644 --- a/core/scripts/ccip/manual-execution/main.go +++ b/core/scripts/ccip/manual-execution/main.go @@ -41,19 +41,19 @@ type Config struct { } type execArgs struct { - cfg Config - seqNum uint64 - msgID [32]byte - sourceChain *ethclient.Client - sourceChainId *big.Int - destChain *ethclient.Client - destUser *bind.TransactOpts - destChainId *big.Int - srcStartBlock *big.Int - destStartBlock uint64 - destLatestBlock uint64 - OnRamp common.Address - destGasAmounts []*big.Int + cfg Config + seqNum uint64 + msgID [32]byte + sourceChain *ethclient.Client + sourceChainId *big.Int + destChain *ethclient.Client + destUser *bind.TransactOpts + destChainId *big.Int + srcStartBlock *big.Int + destStartBlock uint64 + destLatestBlock uint64 + OnRamp common.Address + tokenGasOverrides []*big.Int } func main() { @@ -305,7 +305,7 @@ func (args *execArgs) execute() error { for range offRampProof.Messages { evm2evmOffRampGasLimitOverride := &helpers.EVM2EVMOffRampGasLimitOverride{ ReceiverExecutionGasLimit: big.NewInt(int64(args.cfg.GasLimitOverride)), - DestGasAmounts: args.destGasAmounts, + TokenGasOverrides: args.tokenGasOverrides, } gasLimitOverrides = append(gasLimitOverrides, evm2evmOffRampGasLimitOverride) } diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go index 74e072b12f..aaa0e1c2be 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go @@ -1269,14 +1269,14 @@ type ManualExecArgs struct { DestDeployedAt uint64 // destination block number for the initial destination contract deployment. // Can be any number before the tx was reverted in destination chain. Preferably this needs to be set up with // a value greater than zero to avoid performance issue in locating approximate destination block - SendReqLogIndex uint // log index of the CCIPSendRequested log in source chain - SendReqTxHash string // tx hash of the ccip-send transaction for which execution was reverted - CommitStore string - OnRamp string - OffRamp string - SeqNr uint64 - GasLimit *big.Int - destGasAmounts []*big.Int + SendReqLogIndex uint // log index of the CCIPSendRequested log in source chain + SendReqTxHash string // tx hash of the ccip-send transaction for which execution was reverted + CommitStore string + OnRamp string + OffRamp string + SeqNr uint64 + GasLimit *big.Int + tokenGasOverrides []*big.Int } // ApproxDestStartBlock attempts to locate a block in destination chain with timestamp closest to the timestamp of the block @@ -1487,23 +1487,23 @@ func (args *ManualExecArgs) execute(report *commit_store.CommitStoreCommitReport msg.GasLimit = args.GasLimit } - destGasAmounts := make([]*big.Int, len(msg.TokenAmounts)) + tokenGasOverrides := make([]*big.Int, len(msg.TokenAmounts)) - if args.destGasAmounts != nil && len(args.destGasAmounts) == len(msg.TokenAmounts) { - for i, destGasAmount := range args.destGasAmounts { - destGasAmounts[i].Set(destGasAmount) + if args.tokenGasOverrides != nil && len(args.tokenGasOverrides) == len(msg.TokenAmounts) { + for i, tokenGasOverride := range args.tokenGasOverrides { + tokenGasOverrides[i].Set(tokenGasOverride) } } else { // Initialize each element in the slice to a new big.Int value in one line using a loop - for i := range destGasAmounts { - destGasAmounts[i] = new(big.Int) + for i := range tokenGasOverrides { + tokenGasOverrides[i] = new(big.Int) } } // CCIP-2950 create a new object for evm_2_evm_offramp.EVM2EVMOffRampGasLimitOverride evm2evmOffRampGasLimitOverride := &evm_2_evm_offramp.EVM2EVMOffRampGasLimitOverride{ ReceiverExecutionGasLimit: msg.GasLimit, - DestGasAmounts: destGasAmounts, + TokenGasOverrides: tokenGasOverrides, } manualExecGasLimits = append(manualExecGasLimits, evm2evmOffRampGasLimitOverride)