diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 5716e70328..e6596d9f3c 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -560,18 +560,18 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61131) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39888) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32971) MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 411709) -MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1526954) +MultiRampsE2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1526826) NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37916) NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23709) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38799) NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71898) -NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 259965) -NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 264107) -NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 326950) -NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 299064) +NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 260404) +NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 264546) +NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 327828) +NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 299527) NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 244871) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 232986) -NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 152870) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 232964) +NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 153309) NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 168358) NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 220193) NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125157) @@ -608,145 +608,140 @@ OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51689) OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23499) OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39695) OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20572) -OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 5841071) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 468052) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99216) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12392) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 93196) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 109927) -OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13266) -OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 18000) -OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15349) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 176901) -OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 332739) -OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 276107) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 168045) -OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 187572) -OffRamp_batchExecute:test_SingleReport_Success() (gas: 155963) -OffRamp_batchExecute:test_Unhealthy_Success() (gas: 573311) -OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10440) -OffRamp_ccipReceive:test_Reverts() (gas: 15705) -OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67657) -OffRamp_commit:test_InvalidInterval_Revert() (gas: 59911) -OffRamp_commit:test_InvalidRootRevert() (gas: 58946) -OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6445240) -OffRamp_commit:test_NoConfig_Revert() (gas: 6029053) -OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 112542) -OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 120551) -OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 112563) -OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 353726) -OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 165014) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 140069) -OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 141975) -OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59233) -OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 236247) -OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 121476) -OffRamp_commit:test_Unhealthy_Revert() (gas: 57974) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 209485) -OffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6582277) -OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51298) -OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64445) -OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101442) -OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 162246) -OffRamp_constructor:test_Constructor_Success() (gas: 6030360) -OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 136908) -OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103636) -OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101513) -OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 139555) -OffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 101652) -OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101457) -OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17281) -OffRamp_execute:test_LargeBatch_Success() (gas: 3378308) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372457) -OffRamp_execute:test_MultipleReports_Success() (gas: 298416) -OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6852702) -OffRamp_execute:test_NoConfig_Revert() (gas: 6077500) -OffRamp_execute:test_NonArray_Revert() (gas: 27721) -OffRamp_execute:test_SingleReport_Success() (gas: 175215) -OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147455) -OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6855445) -OffRamp_execute:test_ZeroReports_Revert() (gas: 17162) -OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18212) -OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249178) -OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20494) -OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 210308) -OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48776) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48260) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 229570) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 86208) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 281045) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 92487) -OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28238) -OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 21860) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 502029) -OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 47635) -OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33895) -OffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154048) -OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28472) -OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 187688) -OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198173) -OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 40136) -OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 447500) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 247946) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 192339) -OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 211938) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 259763) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 140974) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 424565) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 59052) -OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 74143) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 596466) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 544340) -OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33678) -OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 569320) -OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 569334) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 474664) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135508) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 164757) -OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3635486) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118398) -OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87417) -OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 75569) -OffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26442) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 171318) -OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 211218) -OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26060) -OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152860) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 529914) -OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 310504) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2327501) -OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 224130) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 224711) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 768287) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 343255) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 40194) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 107223) -OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 88434) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 39933) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 97495) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 42919) -OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 89679) -OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 166024) -OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 24628) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 66391) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 41350) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 83403) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 178169) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 191356) -OffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11379) -OffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 214632) -OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11610) -OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14177) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 49192) -OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 27137) -OffRamp_trialExecute:test_RateLimitError_Success() (gas: 225885) -OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 234506) -OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 309185) -OffRamp_trialExecute:test_trialExecute_Success() (gas: 284141) -OffRamp_verify:test_Blessed_Success() (gas: 175973) -OffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178063) -OffRamp_verify:test_NotBlessed_Success() (gas: 140902) -OffRamp_verify:test_TooManyLeaves_Revert() (gas: 51510) +OffRamp_afterOC3ConfigSet:test_afterOCR3ConfigSet_SignatureVerificationDisabled_Revert() (gas: 6056933) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 468074) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 99238) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12414) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 93240) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 109971) +OffRamp_applySourceChainConfigUpdates:test_RouterAddress_Revert() (gas: 13288) +OffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 18022) +OffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 15371) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain_Success() (gas: 177419) +OffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 334109) +OffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 277477) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 168556) +OffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 188490) +OffRamp_batchExecute:test_SingleReport_Success() (gas: 156460) +OffRamp_batchExecute:test_Unhealthy_Success() (gas: 572587) +OffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10486) +OffRamp_ccipReceive:test_Reverts() (gas: 15770) +OffRamp_commit:test_FailedRMNVerification_Reverts() (gas: 64420) +OffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67632) +OffRamp_commit:test_InvalidInterval_Revert() (gas: 59886) +OffRamp_commit:test_InvalidRootRevert() (gas: 58921) +OffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6661100) +OffRamp_commit:test_NoConfig_Revert() (gas: 6244915) +OffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 112473) +OffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 120501) +OffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 112494) +OffRamp_commit:test_PriceSequenceNumberCleared_Success() (gas: 353540) +OffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 164945) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 139934) +OffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 141925) +OffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59208) +OffRamp_commit:test_StaleReportWithRoot_Success() (gas: 235331) +OffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 121451) +OffRamp_commit:test_Unhealthy_Revert() (gas: 57938) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 208966) +OffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 51273) +OffRamp_constructor:test_Constructor_Success() (gas: 6244332) +OffRamp_constructor:test_SourceChainSelector_Revert() (gas: 136075) +OffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103518) +OffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101418) +OffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 138723) +OffRamp_constructor:test_ZeroRMNRemote_Revert() (gas: 101338) +OffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101376) +OffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17505) +OffRamp_execute:test_LargeBatch_Success() (gas: 3391111) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 372353) +OffRamp_execute:test_MultipleReports_Success() (gas: 299779) +OffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 7069102) +OffRamp_execute:test_NoConfig_Revert() (gas: 6293902) +OffRamp_execute:test_NonArray_Revert() (gas: 27787) +OffRamp_execute:test_SingleReport_Success() (gas: 175730) +OffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 147970) +OffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7071845) +OffRamp_execute:test_ZeroReports_Revert() (gas: 17227) +OffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18682) +OffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 247849) +OffRamp_executeSingleMessage:test_NonContract_Success() (gas: 21002) +OffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 208927) +OffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49237) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48725) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 228696) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 85260) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 279681) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 91512) +OffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 28226) +OffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 21832) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 499180) +OffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 48620) +OffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 33892) +OffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154020) +OffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 28449) +OffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 188116) +OffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 198571) +OffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 41037) +OffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 447967) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 248847) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 193195) +OffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 212816) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 260215) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 141403) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 423165) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 59057) +OffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 74155) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 599623) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 543529) +OffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 33663) +OffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 568482) +OffRamp_executeSingleReport:test_Unhealthy_Success() (gas: 568496) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 473801) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 135923) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 165161) +OffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3737630) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 119064) +OffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 88148) +OffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79036) +OffRamp_manuallyExecute:test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() (gas: 78924) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 172960) +OffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 213287) +OffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26909) +OffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 159537) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() (gas: 27468) +OffRamp_manuallyExecute:test_manuallyExecute_InvalidTokenGasOverride_Revert() (gas: 58874) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 532013) +OffRamp_manuallyExecute:test_manuallyExecute_MultipleReportsWithSingleCursedLane_Revert() (gas: 317521) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2390649) +OffRamp_manuallyExecute:test_manuallyExecute_SourceChainSelectorMismatch_Revert() (gas: 164912) +OffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 226245) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 226785) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 778479) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 346205) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 40239) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 105265) +OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_transfer_Revert() (gas: 86476) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_InvalidDataLength_Revert() (gas: 37975) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_ReleaseOrMintBalanceMismatch_Revert() (gas: 95515) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_TokenHandlingError_BalanceOf_Revert() (gas: 40961) +OffRamp_releaseOrMintSingleToken:test_releaseOrMintToken_skip_ReleaseOrMintBalanceMismatch_if_pool_Revert() (gas: 87721) +OffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 164647) +OffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 25146) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 64911) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 41883) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 81999) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 176661) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride_Success() (gas: 178641) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 189850) +OffRamp_setDynamicConfig:test_FeeQuoterZeroAddress_Revert() (gas: 11189) +OffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 13793) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 46198) +OffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 24173) +OffRamp_trialExecute:test_RateLimitError_Success() (gas: 225140) +OffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 233762) +OffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 310735) +OffRamp_trialExecute:test_trialExecute_Success() (gas: 283386) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390910) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17746) OnRamp_applyAllowListUpdates:test_applyAllowListUpdates_Revert() (gas: 66535) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index 7c4ff56bd8..e1f95b2fcb 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -10,7 +10,7 @@ SOLC_VERSION="0.8.24" OPTIMIZE_RUNS=26000 OPTIMIZE_RUNS_OFFRAMP=18000 OPTIMIZE_RUNS_ONRAMP=4100 -OPTIMIZE_RUNS_MULTI_OFFRAMP=1925 +OPTIMIZE_RUNS_MULTI_OFFRAMP=800 SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol index 82e4a3de37..6399244605 100644 --- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol @@ -40,7 +40,11 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { error UnexpectedTokenData(); error ManualExecutionNotYetEnabled(uint64 sourceChainSelector); error ManualExecutionGasLimitMismatch(); - error InvalidManualExecutionGasLimit(uint64 sourceChainSelector, uint256 index, uint256 newLimit); + error InvalidManualExecutionGasLimit(uint64 sourceChainSelector, bytes32 messageId, uint256 newLimit); + error InvalidManualExecutionTokenGasOverride( + bytes32 messageId, uint256 tokenIndex, uint256 oldLimit, uint256 tokenGasOverride + ); + error ManualExecutionGasAmountCountMismatch(bytes32 messageId, uint64 sequenceNumber); error RootNotCommitted(uint64 sourceChainSelector); error RootAlreadyCommitted(uint64 sourceChainSelector, bytes32 merkleRoot); error InvalidRoot(); @@ -116,9 +120,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @dev Since DynamicConfig is part of DynamicConfigSet event, if changing it, we should update the ABI on Atlas struct DynamicConfig { address feeQuoter; // ──────────────────────────────╮ FeeQuoter address on the local chain - uint32 permissionLessExecutionThresholdSeconds; // │ Waiting time before manual execution is enabled - uint32 maxTokenTransferGas; // │ Maximum amount of gas passed on to token `transfer` call - uint32 maxPoolReleaseOrMintGas; // ─────────────────╯ Maximum amount of gas passed on to token pool when calling releaseOrMint + uint32 permissionLessExecutionThresholdSeconds; //──╯ Waiting time before manual execution is enabled address messageValidator; // Optional message validator to validate incoming messages (zero address = no validator) } @@ -130,6 +132,12 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { IRMNV2.Signature[] rmnSignatures; // RMN signatures on the merkle roots } + struct GasLimitOverride { + // A value of zero in both fields signifies no override and allows the corresponding field to be overridden as valid + uint256 receiverExecutionGasLimit; // Overrides EVM2EVMMessage.gasLimit. + uint32[] tokenGasOverrides; // Overrides EVM2EVMMessage.sourceTokenData.destGasAmount, length must be same as tokenAmounts. + } + // STATIC CONFIG string public constant override typeAndVersion = "OffRamp 1.6.0-dev"; /// @dev ChainSelector of this chain @@ -257,7 +265,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// The reports do not have to contain all the messages (they can be omitted). Multiple reports can be passed in simultaneously. function manuallyExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory gasLimitOverrides + GasLimitOverride[][] memory gasLimitOverrides ) external { // We do this here because the other _execute path is already covered by MultiOCR3Base. _whenChainNotForked(); @@ -269,15 +277,35 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { Internal.ExecutionReportSingleChain memory report = reports[reportIndex]; uint256 numMsgs = report.messages.length; - uint256[] memory msgGasLimitOverrides = gasLimitOverrides[reportIndex]; + GasLimitOverride[] memory msgGasLimitOverrides = gasLimitOverrides[reportIndex]; if (numMsgs != msgGasLimitOverrides.length) revert ManualExecutionGasLimitMismatch(); for (uint256 msgIndex = 0; msgIndex < numMsgs; ++msgIndex) { - uint256 newLimit = msgGasLimitOverrides[msgIndex]; + uint256 newLimit = msgGasLimitOverrides[msgIndex].receiverExecutionGasLimit; // Checks to ensure message cannot be executed with less gas than specified. + Internal.Any2EVMRampMessage memory message = report.messages[msgIndex]; if (newLimit != 0) { - if (newLimit < report.messages[msgIndex].gasLimit) { - revert InvalidManualExecutionGasLimit(report.sourceChainSelector, msgIndex, newLimit); + if (newLimit < message.gasLimit) { + revert InvalidManualExecutionGasLimit(report.sourceChainSelector, message.header.messageId, newLimit); + } + } + if (message.tokenAmounts.length != msgGasLimitOverrides[msgIndex].tokenGasOverrides.length) { + revert ManualExecutionGasAmountCountMismatch(message.header.messageId, message.header.sequenceNumber); + } + + // The gas limit can not be lowered as that could cause the message to fail. If manual execution is done + // from an UNTOUCHED state and we would allow lower gas limit, anyone could grief by executing the message with + // lower gas limit than the DON would have used. This results in the message being marked FAILURE and the DON + // would not attempt it with the correct gas limit. + for (uint256 tokenIndex = 0; tokenIndex < message.tokenAmounts.length; ++tokenIndex) { + uint256 tokenGasOverride = msgGasLimitOverrides[msgIndex].tokenGasOverrides[tokenIndex]; + if (tokenGasOverride != 0) { + uint32 destGasAmount = abi.decode(message.tokenAmounts[tokenIndex].destExecData, (uint32)); + if (tokenGasOverride < destGasAmount) { + revert InvalidManualExecutionTokenGasOverride( + message.header.messageId, tokenIndex, destGasAmount, tokenGasOverride + ); + } } } } @@ -290,7 +318,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// and expects the exec plugin type to be configured with no signatures. /// @param report serialized execution report function execute(bytes32[3] calldata reportContext, bytes calldata report) external { - _batchExecute(abi.decode(report, (Internal.ExecutionReportSingleChain[])), new uint256[][](0)); + _batchExecute(abi.decode(report, (Internal.ExecutionReportSingleChain[])), new GasLimitOverride[][](0)); bytes32[] memory emptySigs = new bytes32[](0); _transmit(uint8(Internal.OCRPluginType.Execution), reportContext, report, emptySigs, emptySigs, bytes32("")); @@ -305,30 +333,30 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @dev If called from manual execution, each inner array's length has to match the number of messages. function _batchExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory manualExecGasLimits + GasLimitOverride[][] memory manualExecGasOverrides ) internal { if (reports.length == 0) revert EmptyReport(); - bool areManualGasLimitsEmpty = manualExecGasLimits.length == 0; + bool areManualGasLimitsEmpty = manualExecGasOverrides.length == 0; // Cache array for gas savings in the loop's condition - uint256[] memory emptyGasLimits = new uint256[](0); + GasLimitOverride[] memory emptyGasLimits = new GasLimitOverride[](0); for (uint256 i = 0; i < reports.length; ++i) { - _executeSingleReport(reports[i], areManualGasLimitsEmpty ? emptyGasLimits : manualExecGasLimits[i]); + _executeSingleReport(reports[i], areManualGasLimitsEmpty ? emptyGasLimits : manualExecGasOverrides[i]); } } /// @notice Executes a report, executing each message in order. /// @param report The execution report containing the messages and proofs. - /// @param manualExecGasLimits An array of gas limits to use for manual execution. + /// @param manualExecGasExecOverrides An array of gas limits to use for manual execution. /// @dev If called from the DON, this array is always empty. /// @dev If called from manual execution, this array is always same length as messages. function _executeSingleReport( Internal.ExecutionReportSingleChain memory report, - uint256[] memory manualExecGasLimits + GasLimitOverride[] memory manualExecGasExecOverrides ) internal { uint64 sourceChainSelector = report.sourceChainSelector; - bool manualExecution = manualExecGasLimits.length != 0; + bool manualExecution = manualExecGasExecOverrides.length != 0; if (i_rmn.isCursed(bytes16(uint128(sourceChainSelector)))) { if (manualExecution) { // For manual execution we don't want to silently fail so we revert @@ -396,8 +424,9 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { emit SkippedAlreadyExecutedMessage(sourceChainSelector, message.header.sequenceNumber); continue; } - + uint32[] memory tokenGasOverrides; if (manualExecution) { + tokenGasOverrides = manualExecGasExecOverrides[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 @@ -407,8 +436,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } // Manual execution gas limit can override gas limit specified in the message. Value of 0 indicates no override. - if (manualExecGasLimits[i] != 0) { - message.gasLimit = manualExecGasLimits[i]; + if (manualExecGasExecOverrides[i].receiverExecutionGasLimit != 0) { + message.gasLimit = manualExecGasExecOverrides[i].receiverExecutionGasLimit; } } else { // DON can only execute a message once @@ -445,7 +474,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } _setExecutionState(sourceChainSelector, message.header.sequenceNumber, Internal.MessageExecutionState.IN_PROGRESS); - (Internal.MessageExecutionState newState, bytes memory returnData) = _trialExecute(message, offchainTokenData); + (Internal.MessageExecutionState newState, bytes memory returnData) = + _trialExecute(message, offchainTokenData, tokenGasOverrides); _setExecutionState(sourceChainSelector, message.header.sequenceNumber, newState); // Since it's hard to estimate whether manual execution will succeed, we @@ -490,9 +520,10 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @return errData Revert data in bytes if CCIP receiver reverted during execution. function _trialExecute( Internal.Any2EVMRampMessage memory message, - bytes[] memory offchainTokenData + bytes[] memory offchainTokenData, + uint32[] memory tokenGasOverrides ) internal returns (Internal.MessageExecutionState executionState, bytes memory) { - try this.executeSingleMessage(message, offchainTokenData) {} + 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 @@ -511,13 +542,19 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// (for example smart contract wallets) without an associated message. function executeSingleMessage( Internal.Any2EVMRampMessage memory message, - bytes[] calldata offchainTokenData + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides ) external { if (msg.sender != address(this)) revert CanOnlySelfCall(); Client.EVMTokenAmount[] memory destTokenAmounts = new Client.EVMTokenAmount[](0); if (message.tokenAmounts.length > 0) { destTokenAmounts = _releaseOrMintTokens( - message.tokenAmounts, message.sender, message.receiver, message.header.sourceChainSelector, offchainTokenData + message.tokenAmounts, + message.sender, + message.receiver, + message.header.sourceChainSelector, + offchainTokenData, + tokenGasOverrides ); } @@ -827,7 +864,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { // We retrieve the local token balance of the receiver before the pool call. (uint256 balancePre, uint256 gasLeft) = - _getBalanceOfReceiver(receiver, localToken, s_dynamicConfig.maxPoolReleaseOrMintGas); + _getBalanceOfReceiver(receiver, localToken, abi.decode(sourceTokenAmount.destExecData, (uint32))); // We determined that the pool address is a valid EVM address, but that does not mean the code at this // address is a (compatible) pool contract. _callWithExactGasSafeReturnData will check if the location @@ -923,10 +960,17 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { bytes memory originalSender, address receiver, uint64 sourceChainSelector, - bytes[] calldata offchainTokenData + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides ) internal returns (Client.EVMTokenAmount[] memory destTokenAmounts) { destTokenAmounts = new Client.EVMTokenAmount[](sourceTokenAmounts.length); + bool isTokenGasOverridesEmpty = tokenGasOverrides.length == 0; for (uint256 i = 0; i < sourceTokenAmounts.length; ++i) { + if (!isTokenGasOverridesEmpty) { + if (tokenGasOverrides[i] != 0) { + sourceTokenAmounts[i].destExecData = abi.encode(tokenGasOverrides[i]); + } + } destTokenAmounts[i] = _releaseOrMintSingleToken( sourceTokenAmounts[i], originalSender, receiver, sourceChainSelector, offchainTokenData[i] ); diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol index 8c61ba5d21..2bf7d8ea4d 100644 --- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol +++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol @@ -390,7 +390,9 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, @@ -421,7 +423,7 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain3), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain3), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_3, @@ -502,7 +504,7 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( @@ -524,7 +526,7 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, @@ -559,7 +561,7 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { assertEq(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, newSender), 0); vm.recordLogs(); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesMultiRamp), new OffRamp.GasLimitOverride[](0) ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, @@ -587,7 +589,9 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { // it waits for previous offramp to execute vm.expectEmit(); emit NonceManager.SkippedIncorrectNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].header.nonce, messages[0].sender); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertEq(startNonce, s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); Internal.EVM2EVMMessage[] memory messagesSingleLane = @@ -611,7 +615,9 @@ contract NonceManager_OffRampUpgrade is OffRampSetup { // new offramp is able to execute vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol index 446dcfc344..21643a5df6 100644 --- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol +++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol @@ -267,6 +267,10 @@ contract MultiRampsE2E is OnRampSetup, OffRampSetup { router.ccipSend(DEST_CHAIN_SELECTOR, message); vm.pauseGasMetering(); + uint256 gasLimit = s_feeQuoter.parseEVMExtraArgsFromBytes(msgEvent.extraArgs, DEST_CHAIN_SELECTOR).gasLimit; + for (uint256 i = 0; i < msgEvent.tokenAmounts.length; ++i) { + msgEvent.tokenAmounts[i].destExecData = abi.encode(MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS); + } return Internal.Any2EVMRampMessage({ header: Internal.RampMessageHeader({ messageId: msgEvent.header.messageId, diff --git a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol index e5cf6332d9..80672bf51e 100644 --- a/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/OffRampHelper.sol @@ -43,28 +43,32 @@ contract OffRampHelper is OffRamp, IgnoreContractSize { bytes calldata originalSender, address receiver, uint64 sourceChainSelector, - bytes[] calldata offchainTokenData + bytes[] calldata offchainTokenData, + uint32[] calldata tokenGasOverrides ) external returns (Client.EVMTokenAmount[] memory) { - return _releaseOrMintTokens(sourceTokenAmounts, originalSender, receiver, sourceChainSelector, offchainTokenData); + return _releaseOrMintTokens( + sourceTokenAmounts, originalSender, receiver, sourceChainSelector, offchainTokenData, tokenGasOverrides + ); } function trialExecute( Internal.Any2EVMRampMessage memory message, - bytes[] memory offchainTokenData + bytes[] memory offchainTokenData, + uint32[] memory tokenGasOverrides ) external returns (Internal.MessageExecutionState, bytes memory) { - return _trialExecute(message, offchainTokenData); + return _trialExecute(message, offchainTokenData, tokenGasOverrides); } function executeSingleReport( Internal.ExecutionReportSingleChain memory rep, - uint256[] memory manualExecGasLimits + GasLimitOverride[] memory manualExecGasExecOverrides ) external { - _executeSingleReport(rep, manualExecGasLimits); + _executeSingleReport(rep, manualExecGasExecOverrides); } function batchExecute( Internal.ExecutionReportSingleChain[] memory reports, - uint256[][] memory manualExecGasLimits + GasLimitOverride[][] memory manualExecGasLimits ) external { _batchExecute(reports, manualExecGasLimits); } diff --git a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol index 667fbc13e5..c8eee48808 100644 --- a/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol +++ b/contracts/src/v0.8/ccip/test/helpers/receivers/ReentrancyAbuserMultiRamp.sol @@ -24,10 +24,11 @@ contract ReentrancyAbuserMultiRamp is CCIPReceiver { function _ccipReceive(Client.Any2EVMMessage memory) internal override { // Use original message gas limits in manual execution uint256 numMsgs = s_payload.messages.length; - uint256[][] memory gasOverrides = new uint256[][](1); - gasOverrides[0] = new uint256[](numMsgs); + OffRamp.GasLimitOverride[][] memory gasOverrides = new OffRamp.GasLimitOverride[][](1); + gasOverrides[0] = new OffRamp.GasLimitOverride[](numMsgs); for (uint256 i = 0; i < numMsgs; ++i) { - gasOverrides[0][i] = 0; + gasOverrides[0][i].receiverExecutionGasLimit = 0; + gasOverrides[0][i].tokenGasOverrides = new uint32[](s_payload.messages[i].tokenAmounts.length); } Internal.ExecutionReportSingleChain[] memory batchPayload = new Internal.ExecutionReportSingleChain[](1); diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol index a2a7fff50a..8e41f88f91 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp.t.sol @@ -340,7 +340,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -356,7 +358,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -377,7 +381,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { // Nonce never increments on unordered messages. uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -399,7 +405,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { // Nonce never increments on unordered messages. nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -419,7 +427,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.Any2EVMRampMessage[] memory messagesChain1 = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesChain1), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messagesChain1), new OffRamp.GasLimitOverride[](0) ); uint64 nonceChain1 = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messagesChain1[0].sender); @@ -430,7 +438,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { assertEq(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_3, messagesChain2[0].sender), 0); s_offRamp.executeSingleReport( - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain2), new uint256[](0) + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messagesChain2), new OffRamp.GasLimitOverride[](0) ); assertGt(s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_3, messagesChain2[0].sender), 0); @@ -453,7 +461,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { // Nonce should increment on non-strict assertEq(uint64(0), s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, abi.encode(OWNER))); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -480,7 +490,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages[0].header.sourceChainSelector, messages[0].header.nonce, messages[0].sender ); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_SkippedIncorrectNonceStillExecutes_Success() public { @@ -494,7 +506,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { emit NonceManager.SkippedIncorrectNonce(SOURCE_CHAIN_SELECTOR_1, messages[1].header.nonce, messages[1].sender); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -510,7 +524,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, @@ -523,7 +539,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public { @@ -533,7 +551,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, @@ -546,7 +566,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } // Send a message to a contract that does not implement the CCIPReceiver interface @@ -559,7 +581,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -579,7 +603,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.resumeGasMetering(); vm.recordLogs(); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -602,10 +626,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.resumeGasMetering(); vm.recordLogs(); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); Vm.Log[] memory logs = vm.getRecordedLogs(); - assertExecutionStateChangedEventLogs( logs, SOURCE_CHAIN_SELECTOR_1, @@ -725,7 +748,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, @@ -745,7 +770,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); } @@ -758,7 +783,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, false); @@ -767,7 +792,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); @@ -786,7 +811,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectRevert( abi.encodeWithSelector(OffRamp.InvalidMessageDestChainSelector.selector, messages[0].header.destChainSelector) ); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0)); } function test_MismatchingOnRampRoot_Revert() public { @@ -804,7 +829,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.ExecutionReportSingleChain memory executionReport = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.expectRevert(abi.encodeWithSelector(OffRamp.RootNotCommitted.selector, SOURCE_CHAIN_SELECTOR_1)); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0)); } function test_UnhealthySingleChainCurse_Revert() public { @@ -815,7 +840,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); vm.recordLogs(); // Uncurse should succeed @@ -824,7 +849,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); } @@ -837,7 +862,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectRevert(OffRamp.UnexpectedTokenData.selector); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); } function test_EmptyReport_Revert() public { @@ -850,7 +875,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages: new Internal.Any2EVMRampMessage[](0), offchainTokenData: new bytes[][](0) }), - new uint256[](0) + new OffRamp.GasLimitOverride[](0) ); } @@ -884,7 +909,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(newSourceChainSelector, newOnRamp); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, newSourceChainSelector)); - s_offRamp.executeSingleReport(_generateReportFromMessages(newSourceChainSelector, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(newSourceChainSelector, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_DisabledSourceChain_Revert() public { @@ -892,7 +919,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, SOURCE_CHAIN_SELECTOR_2)); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_2, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_2, messages), new OffRamp.GasLimitOverride[](0) + ); } function test_TokenDataMismatch_Revert() public { @@ -907,7 +936,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { OffRamp.TokenDataMismatch.selector, SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber ) ); - s_offRamp.executeSingleReport(report, new uint256[](0)); + s_offRamp.executeSingleReport(report, new OffRamp.GasLimitOverride[](0)); } function test_RouterYULCall_Revert() public { @@ -923,7 +952,7 @@ contract OffRamp_executeSingleReport is OffRampSetup { _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.recordLogs(); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + s_offRamp.executeSingleReport(executionReport, new OffRamp.GasLimitOverride[](0)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -947,7 +976,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -964,7 +995,9 @@ contract OffRamp_executeSingleReport is OffRampSetup { vm.expectEmit(); emit OffRamp.AlreadyAttempted(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); - s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); + s_offRamp.executeSingleReport( + _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[](0) + ); } function _constructCommitReport(bytes32 merkleRoot) internal view returns (OffRamp.CommitReport memory) { @@ -995,7 +1028,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { function test_executeSingleMessage_NoTokens_Success() public { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithTokens_Success() public { @@ -1020,7 +1053,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { ) ); - s_offRamp.executeSingleMessage(message, offchainTokenData); + s_offRamp.executeSingleMessage(message, offchainTokenData, new uint32[](0)); } function test_executeSingleMessage_WithValidation_Success() public { @@ -1030,14 +1063,14 @@ contract OffRamp_executeSingleMessage is OffRampSetup { vm.startPrank(address(s_offRamp)); Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_NonContract_Success() public { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); message.receiver = STRANGER; - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_NonContractWithTokens_Success() public { @@ -1051,7 +1084,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); message.receiver = STRANGER; - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } // Reverts @@ -1069,7 +1102,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage)); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_ZeroGasDONExecution_Revert() public { @@ -1079,7 +1112,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.ReceiverError.selector, "")); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_MessageSender_Revert() public { @@ -1087,7 +1120,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { Internal.Any2EVMRampMessage memory message = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1); vm.expectRevert(OffRamp.CanOnlySelfCall.selector); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithFailingValidation_Revert() public { @@ -1104,7 +1137,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { abi.encodeWithSelector(IMessageInterceptor.MessageValidationError.selector, bytes("Invalid message")) ) ); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } function test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() public { @@ -1128,7 +1161,7 @@ contract OffRamp_executeSingleMessage is OffRampSetup { abi.encodeWithSelector(IMessageInterceptor.MessageValidationError.selector, bytes("Invalid message")) ) ); - s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.executeSingleMessage(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); } } @@ -1147,7 +1180,9 @@ contract OffRamp_batchExecute is OffRampSetup { uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -1174,10 +1209,9 @@ contract OffRamp_batchExecute is OffRampSetup { uint64 nonceBefore = s_inboundNonceManager.getInboundNonce(SOURCE_CHAIN_SELECTOR_1, messages1[0].sender); vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); - assertExecutionStateChangedEventLogs( logs, messages1[0].header.sourceChainSelector, @@ -1225,7 +1259,7 @@ contract OffRamp_batchExecute is OffRampSetup { vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1286,7 +1320,7 @@ contract OffRamp_batchExecute is OffRampSetup { vm.expectEmit(); emit OffRamp.SkippedReportExecution(SOURCE_CHAIN_SELECTOR_1); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1318,7 +1352,7 @@ contract OffRamp_batchExecute is OffRampSetup { emit OffRamp.SkippedAlreadyExecutedMessage(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber); vm.recordLogs(); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); assertExecutionStateChangedEventLogs( messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber, @@ -1337,7 +1371,7 @@ contract OffRamp_batchExecute is OffRampSetup { _generateBatchReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[][](1) + new OffRamp.GasLimitOverride[][](1) ); _setMockRMNChainCurse(SOURCE_CHAIN_SELECTOR_1, false); @@ -1347,7 +1381,7 @@ contract OffRamp_batchExecute is OffRampSetup { _generateBatchReportFromMessages( SOURCE_CHAIN_SELECTOR_1, _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) ), - new uint256[][](1) + new OffRamp.GasLimitOverride[][](1) ); _assertNoEmit(OffRamp.SkippedReportExecution.selector); @@ -1356,7 +1390,7 @@ contract OffRamp_batchExecute is OffRampSetup { // Reverts function test_ZeroReports_Revert() public { vm.expectRevert(OffRamp.EmptyReport.selector); - s_offRamp.batchExecute(new Internal.ExecutionReportSingleChain[](0), new uint256[][](1)); + s_offRamp.batchExecute(new Internal.ExecutionReportSingleChain[](0), new OffRamp.GasLimitOverride[][](1)); } function test_OutOfBoundsGasLimitsAccess_Revert() public { @@ -1372,7 +1406,7 @@ contract OffRamp_batchExecute is OffRampSetup { reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages2); vm.expectRevert(); - s_offRamp.batchExecute(reports, new uint256[][](1)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](1)); } } @@ -1390,12 +1424,14 @@ contract OffRamp_manuallyExecute is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](1); - gasLimitOverrides[0] = new uint256[](messages.length); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](messages.length); vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); @@ -1414,13 +1450,15 @@ contract OffRamp_manuallyExecute is OffRampSetup { _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0][0] += 1; + gasLimitOverrides[0][0].receiverExecutionGasLimit += 1; vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); assertExecutionStateChangedEventLogs( @@ -1445,7 +1483,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { s_reverting_receiver.setRevert(true); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); vm.recordLogs(); @@ -1486,20 +1524,20 @@ contract OffRamp_manuallyExecute is OffRampSetup { reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); - s_offRamp.batchExecute(reports, new uint256[][](2)); + s_offRamp.batchExecute(reports, new OffRamp.GasLimitOverride[][](2)); s_reverting_receiver.setRevert(false); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); for (uint256 i = 0; i < 3; ++i) { - gasLimitOverrides[0][i] += 1; + gasLimitOverrides[0][i].receiverExecutionGasLimit += 1; } for (uint256 i = 0; i < 2; ++i) { - gasLimitOverrides[1][i] += 1; + gasLimitOverrides[1][i].receiverExecutionGasLimit += 1; } vm.recordLogs(); @@ -1543,7 +1581,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { messages[1].header.messageId = Internal._hash(messages[1], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); Vm.Log[] memory logs = vm.getRecordedLogs(); @@ -1586,9 +1626,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { Internal.Any2EVMRampMessage[] memory newMessages = new Internal.Any2EVMRampMessage[](1); newMessages[0] = messages[1]; - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(newMessages); - gasLimitOverrides[0][0] += 1; + gasLimitOverrides[0][0].receiverExecutionGasLimit += 1; vm.recordLogs(); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, newMessages), gasLimitOverrides); @@ -1610,7 +1650,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); vm.recordLogs(); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); assertExecutionStateChangedEventLogs( SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber, @@ -1620,9 +1662,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { abi.encodeWithSelector(OffRamp.ReceiverError.selector, "") ); - uint256[][] memory gasLimitOverrides = new uint256[][](1); - gasLimitOverrides[0] = new uint256[](1); - gasLimitOverrides[0][0] = 100_000; + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](1); + gasLimitOverrides[0][0].receiverExecutionGasLimit = 100_000; vm.expectEmit(); emit ConformingReceiver.MessageReceived(); @@ -1652,7 +1694,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { vm.chainId(chain2); vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.ForkedChain.selector, chain1, chain2)); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); s_offRamp.manuallyExecute(reports, gasLimitOverrides); @@ -1668,22 +1710,22 @@ contract OffRamp_manuallyExecute is OffRampSetup { // No overrides for report vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](0)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](0)); // No messages - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1 message missing - gasLimitOverrides[0] = new uint256[](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1 message in excess - gasLimitOverrides[0] = new uint256[](3); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](3); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); @@ -1702,47 +1744,99 @@ contract OffRamp_manuallyExecute is OffRampSetup { reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](0)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](0)); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); - s_offRamp.manuallyExecute(reports, new uint256[][](1)); + s_offRamp.manuallyExecute(reports, new OffRamp.GasLimitOverride[][](1)); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 2nd report empty - gasLimitOverrides[0] = new uint256[](2); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](2); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1st report empty - gasLimitOverrides[0] = new uint256[](0); - gasLimitOverrides[1] = new uint256[](1); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](0); + gasLimitOverrides[1] = new OffRamp.GasLimitOverride[](1); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); // 1st report oversized - gasLimitOverrides[0] = new uint256[](3); + gasLimitOverrides[0] = new OffRamp.GasLimitOverride[](3); vm.expectRevert(OffRamp.ManualExecutionGasLimitMismatch.selector); s_offRamp.manuallyExecute(reports, gasLimitOverrides); } - function test_ManualExecInvalidGasLimit_Revert() public { + function test_manuallyExecute_InvalidReceiverExecutionGasLimit_Revert() public { Internal.Any2EVMRampMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + gasLimitOverrides[0][0].receiverExecutionGasLimit--; + + vm.expectRevert( + abi.encodeWithSelector( + OffRamp.InvalidManualExecutionGasLimit.selector, + SOURCE_CHAIN_SELECTOR_1, + messages[0].header.messageId, + gasLimitOverrides[0][0].receiverExecutionGasLimit + ) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + } + + function test_manuallyExecute_DestinationGasAmountCountMismatch_Revert() public { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1000; + amounts[1] = 1000; + Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](1); + messages[0] = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); + + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); - gasLimitOverrides[0][0]--; + // empty tokenGasOverride array provided + vm.expectRevert( + abi.encodeWithSelector(OffRamp.ManualExecutionGasAmountCountMismatch.selector, messages[0].header.messageId, 1) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + + //trying with excesss elements tokenGasOverride array provided + gasLimitOverrides[0][0].tokenGasOverrides = new uint32[](3); + vm.expectRevert( + abi.encodeWithSelector(OffRamp.ManualExecutionGasAmountCountMismatch.selector, messages[0].header.messageId, 1) + ); + s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); + } + + function test_manuallyExecute_InvalidTokenGasOverride_Revert() public { + uint256[] memory amounts = new uint256[](2); + amounts[0] = 1000; + amounts[1] = 1000; + Internal.Any2EVMRampMessage[] memory messages = new Internal.Any2EVMRampMessage[](1); + messages[0] = _generateAny2EVMMessageWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, 1, amounts); + + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); + gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + uint32[] memory tokenGasOverrides = new uint32[](2); + tokenGasOverrides[0] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD; + tokenGasOverrides[1] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD - 1; //invalid token gas override value + gasLimitOverrides[0][0].tokenGasOverrides = tokenGasOverrides; vm.expectRevert( abi.encodeWithSelector( - OffRamp.InvalidManualExecutionGasLimit.selector, SOURCE_CHAIN_SELECTOR_1, 0, gasLimitOverrides[0][0] + OffRamp.InvalidManualExecutionTokenGasOverride.selector, + messages[0].header.messageId, + 1, + DEFAULT_TOKEN_DEST_GAS_OVERHEAD, + tokenGasOverrides[1] ) ); s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides); @@ -1755,11 +1849,13 @@ contract OffRamp_manuallyExecute is OffRampSetup { messages[0].receiver = address(s_reverting_receiver); messages[0].header.messageId = Internal._hash(messages[0], ON_RAMP_ADDRESS_1); - s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); + s_offRamp.batchExecute( + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new OffRamp.GasLimitOverride[][](1) + ); s_reverting_receiver.setRevert(true); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); vm.expectRevert( @@ -1795,7 +1891,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { destTokenAddress: abi.encode(s_destTokenBySourceToken[s_sourceFeeToken]), extraData: "", amount: tokenAmount, - destExecData: abi.encode(DEFAULT_TOKEN_DEST_GAS_OVERHEAD) + destExecData: abi.encode(MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS) }); messages[0].receiver = address(receiver); @@ -1807,8 +1903,9 @@ contract OffRamp_manuallyExecute is OffRampSetup { // sets the report to be repeated on the ReentrancyAbuser to be able to replay receiver.setPayload(report); - uint256[][] memory gasLimitOverrides = new uint256[][](1); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](1); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages); + gasLimitOverrides[0][0].tokenGasOverrides = new uint32[](messages[0].tokenAmounts.length); // The first entry should be fine and triggers the second entry which is skipped. Due to the reentrancy // the second completes first, so we expect the skip event before the success event. @@ -1852,7 +1949,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); @@ -1873,7 +1970,7 @@ contract OffRamp_manuallyExecute is OffRampSetup { reports[0] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages1); reports[1] = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_3, messages2); - uint256[][] memory gasLimitOverrides = new uint256[][](2); + OffRamp.GasLimitOverride[][] memory gasLimitOverrides = new OffRamp.GasLimitOverride[][](2); gasLimitOverrides[0] = _getGasLimitsFromMessages(messages1); gasLimitOverrides[1] = _getGasLimitsFromMessages(messages2); @@ -2165,7 +2262,7 @@ contract OffRamp_execute is OffRampSetup { function test_IncorrectArrayType_Revert() public { bytes32[3] memory reportContext = [s_configDigestExec, s_configDigestExec, s_configDigestExec]; - uint256[] memory wrongData = new uint256[](1); + uint256[] memory wrongData = new uint256[](2); wrongData[0] = 1; vm.startPrank(s_validTransmitters[0]); @@ -2355,7 +2452,7 @@ contract OffRamp_trialExecute is OffRampSetup { uint256 startingBalance = dstToken0.balanceOf(message.receiver); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.SUCCESS), uint256(newState)); assertEq("", err); @@ -2378,7 +2475,7 @@ contract OffRamp_trialExecute is OffRampSetup { s_maybeRevertingPool.setShouldRevert(errorMessage); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage), err); @@ -2398,7 +2495,7 @@ contract OffRamp_trialExecute is OffRampSetup { s_maybeRevertingPool.setShouldRevert(errorMessage); (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.TokenHandlingError.selector, errorMessage), err); } @@ -2412,7 +2509,7 @@ contract OffRamp_trialExecute is OffRampSetup { // Happy path, pool is correct (Internal.MessageExecutionState newState, bytes memory err) = - s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.SUCCESS), uint256(newState)); assertEq("", err); @@ -2431,7 +2528,7 @@ contract OffRamp_trialExecute is OffRampSetup { message.header.messageId = Internal._hash(message, ON_RAMP_ADDRESS_1); // Unhappy path, no revert but marked as failed. - (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, abi.encode(address(0))), err); @@ -2448,7 +2545,7 @@ contract OffRamp_trialExecute is OffRampSetup { message.header.messageId = Internal._hash(message, ON_RAMP_ADDRESS_1); - (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length)); + (newState, err) = s_offRamp.trialExecute(message, new bytes[](message.tokenAmounts.length), new uint32[](0)); assertEq(uint256(Internal.MessageExecutionState.FAILURE), uint256(newState)); assertEq(abi.encodeWithSelector(OffRamp.NotACompatiblePool.selector, address(0)), err); @@ -2705,7 +2802,47 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { ); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) + ); + + assertEq(startingBalance + amount1, dstToken1.balanceOf(OWNER)); + } + + function test_releaseOrMintTokens_WithGasOverride_Success() public { + Client.EVMTokenAmount[] memory srcTokenAmounts = _getCastedSourceEVMTokenAmountsWithZeroAmounts(); + IERC20 dstToken1 = IERC20(s_destFeeToken); + uint256 startingBalance = dstToken1.balanceOf(OWNER); + uint256 amount1 = 100; + srcTokenAmounts[0].amount = amount1; + + bytes[] memory offchainTokenData = new bytes[](srcTokenAmounts.length); + offchainTokenData[0] = abi.encode(0x12345678); + + Internal.RampTokenAmount[] memory sourceTokenAmounts = _getDefaultSourceTokenData(srcTokenAmounts); + + vm.expectCall( + s_destPoolBySourceToken[srcTokenAmounts[0].token], + abi.encodeWithSelector( + LockReleaseTokenPool.releaseOrMint.selector, + Pool.ReleaseOrMintInV1({ + originalSender: abi.encode(OWNER), + receiver: OWNER, + amount: srcTokenAmounts[0].amount, + localToken: s_destTokenBySourceToken[srcTokenAmounts[0].token], + remoteChainSelector: SOURCE_CHAIN_SELECTOR_1, + sourcePoolAddress: sourceTokenAmounts[0].sourcePoolAddress, + sourcePoolData: sourceTokenAmounts[0].extraData, + offchainTokenData: offchainTokenData[0] + }) + ) + ); + + uint32[] memory gasOverrides = new uint32[](sourceTokenAmounts.length); + for (uint256 i = 0; i < gasOverrides.length; i++) { + gasOverrides[i] = DEFAULT_TOKEN_DEST_GAS_OVERHEAD + 1; + } + s_offRamp.releaseOrMintTokens( + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, gasOverrides ); assertEq(startingBalance + amount1, dstToken1.balanceOf(OWNER)); @@ -2727,7 +2864,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { MaybeRevertingBurnMintTokenPool(pool).setReleaseOrMintMultiplier(destinationDenominationMultiplier); Client.EVMTokenAmount[] memory destTokenAmounts = s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) ); assertEq(destTokenAmounts[1].amount, amount * destinationDenominationMultiplier); assertEq(destTokenAmounts[1].token, destToken); @@ -2748,7 +2885,8 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, - new bytes[](srcTokenAmounts.length) + new bytes[](srcTokenAmounts.length), + new uint32[](0) ); } @@ -2782,7 +2920,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(OffRamp.InvalidDataLength.selector, Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES, 64)); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) ); } @@ -2798,7 +2936,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { vm.expectRevert(abi.encodeWithSelector(Internal.InvalidEVMAddress.selector, wrongAddress)); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, offchainTokenData, new uint32[](0) ); } @@ -2816,7 +2954,9 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { }); vm.expectRevert(abi.encodeWithSelector(OffRamp.NotACompatiblePool.selector, address(0))); - s_offRamp.releaseOrMintTokens(sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1)); + s_offRamp.releaseOrMintTokens( + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1), new uint32[](0) + ); } function test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() public { @@ -2847,7 +2987,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { ); vm.expectRevert(); s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_3, offchainTokenData + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_3, offchainTokenData, new uint32[](0) ); } @@ -2869,7 +3009,7 @@ contract OffRamp_releaseOrMintTokens is OffRampSetup { }); try s_offRamp.releaseOrMintTokens( - sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1) + sourceTokenAmounts, abi.encode(OWNER), OWNER, SOURCE_CHAIN_SELECTOR_1, new bytes[](1), new uint32[](0) ) {} catch (bytes memory reason) { // Any revert should be a TokenHandlingError, InvalidEVMAddress, InvalidDataLength or NoContract as those are caught by the offramp assertTrue( diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol index bb890ef1b8..393d35bdc9 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRampSetup.t.sol @@ -227,9 +227,7 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { return OffRamp.DynamicConfig({ permissionLessExecutionThresholdSeconds: PERMISSION_LESS_EXECUTION_THRESHOLD_SECONDS, feeQuoter: feeQuoter, - messageValidator: address(0), - maxPoolReleaseOrMintGas: MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS, - maxTokenTransferGas: MAX_TOKEN_POOL_TRANSFER_GAS + messageValidator: address(0) }); } @@ -373,10 +371,10 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { function _getGasLimitsFromMessages( Internal.Any2EVMRampMessage[] memory messages - ) internal pure returns (uint256[] memory) { - uint256[] memory gasLimits = new uint256[](messages.length); + ) internal pure returns (OffRamp.GasLimitOverride[] memory) { + OffRamp.GasLimitOverride[] memory gasLimits = new OffRamp.GasLimitOverride[](messages.length); for (uint256 i = 0; i < messages.length; ++i) { - gasLimits[i] = messages[i].gasLimit; + gasLimits[i].receiverExecutionGasLimit = messages[i].gasLimit; } return gasLimits; @@ -384,8 +382,6 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { function _assertSameConfig(OffRamp.DynamicConfig memory a, OffRamp.DynamicConfig memory b) public pure { assertEq(a.permissionLessExecutionThresholdSeconds, b.permissionLessExecutionThresholdSeconds); - assertEq(a.maxPoolReleaseOrMintGas, b.maxPoolReleaseOrMintGas); - assertEq(a.maxTokenTransferGas, b.maxTokenTransferGas); assertEq(a.messageValidator, b.messageValidator); assertEq(a.feeQuoter, b.feeQuoter); } diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go index c89ca23917..0d91d63b0a 100644 --- a/core/gethwrappers/ccip/deployment_test/deployment_test.go +++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go @@ -48,8 +48,6 @@ func TestDeployAllV1_6(t *testing.T) { }, offramp.OffRampDynamicConfig{ FeeQuoter: common.HexToAddress("0x4"), PermissionLessExecutionThresholdSeconds: uint32((8 * time.Hour).Seconds()), - MaxTokenTransferGas: 50_000, - MaxPoolReleaseOrMintGas: 50_000, MessageValidator: common.HexToAddress("0x5"), }, nil) require.NoError(t, err) diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go index 1711c3d1e2..d2cfd96e75 100644 --- a/core/gethwrappers/ccip/generated/offramp/offramp.go +++ b/core/gethwrappers/ccip/generated/offramp/offramp.go @@ -124,11 +124,14 @@ type MultiOCR3BaseOCRConfigArgs struct { type OffRampDynamicConfig struct { FeeQuoter common.Address PermissionLessExecutionThresholdSeconds uint32 - MaxTokenTransferGas uint32 - MaxPoolReleaseOrMintGas uint32 MessageValidator common.Address } +type OffRampGasLimitOverride struct { + ReceiverExecutionGasLimit *big.Int + TokenGasOverrides []uint32 +} + type OffRampSourceChainConfig struct { Router common.Address IsEnabled bool @@ -151,8 +154,8 @@ type OffRampStaticConfig struct { } var OffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"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\":\"enumMultiOCR3Base.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\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"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\":[{\"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\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162006ca038038062006ca08339810160408190526200003591620008c7565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003c1565b50505062000c67565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b031916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b60005b815181101562000666576000828281518110620003e557620003e562000a1d565b60200260200101519050600081602001519050806001600160401b0316600003620004235760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b03166200044c576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291620004789062000a33565b80601f0160208091040260200160405190810160405280929190818152602001828054620004a69062000a33565b8015620004f75780601f10620004cb57610100808354040283529160200191620004f7565b820191906000526020600020905b815481529060010190602001808311620004d957829003601f168201915b5050505050905060008460600151905081516000036200059e57805160000362000534576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000544828262000ac4565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005d9565b8080519060200120828051906020012014620005d95760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906200064d90869062000b90565b60405180910390a25050505050806001019050620003c4565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715620006a557620006a56200066a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006d657620006d66200066a565b604052919050565b80516001600160401b0381168114620006f657600080fd5b919050565b6001600160a01b03811681146200071157600080fd5b50565b805163ffffffff81168114620006f657600080fd5b6000601f83601f8401126200073d57600080fd5b825160206001600160401b03808311156200075c576200075c6200066a565b8260051b6200076d838201620006ab565b93845286810183019383810190898611156200078857600080fd5b84890192505b85831015620008ba57825184811115620007a85760008081fd5b89016080601f19828d038101821315620007c25760008081fd5b620007cc62000680565b88840151620007db81620006fb565b81526040620007ec858201620006de565b8a8301526060808601518015158114620008065760008081fd5b838301529385015193898511156200081e5760008081fd5b84860195508f603f8701126200083657600094508485fd5b8a8601519450898511156200084f576200084f6200066a565b620008608b858f88011601620006ab565b93508484528f82868801011115620008785760008081fd5b60005b8581101562000898578681018301518582018d01528b016200087b565b5060009484018b0194909452509182015283525091840191908401906200078e565b9998505050505050505050565b6000806000838503610140811215620008df57600080fd5b6080811215620008ee57600080fd5b620008f862000680565b6200090386620006de565b815260208601516200091581620006fb565b602082015260408601516200092a81620006fb565b604082015260608601516200093f81620006fb565b6060820152935060a0607f19820112156200095957600080fd5b5060405160a081016001600160401b0380821183831017156200098057620009806200066a565b81604052608087015191506200099682620006fb565b818352620009a760a0880162000714565b6020840152620009ba60c0880162000714565b6040840152620009cd60e0880162000714565b60608401526101008701519150620009e582620006fb565b608083018290526101208701519294508083111562000a0357600080fd5b505062000a138682870162000729565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4857607f821691505b60208210810362000a6957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000abf576000816000526020600020601f850160051c8101602086101562000a9a5750805b601f850160051c820191505b8181101562000abb5782815560010162000aa6565b5050505b505050565b81516001600160401b0381111562000ae05762000ae06200066a565b62000af88162000af1845462000a33565b8462000a6f565b602080601f83116001811462000b30576000841562000b175750858301515b600019600386901b1c1916600185901b17855562000abb565b600085815260208120601f198616915b8281101562000b615788860151825594840194600190910190840162000b40565b508582101562000b805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000be58162000a33565b8060a089015260c0600183166000811462000c09576001811462000c265762000c58565b60ff19841660c08b015260c083151560051b8b0101945062000c58565b85600052602060002060005b8481101562000c4f5781548c820185015290880190890162000c32565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615fc362000cdd600039600081816102400152612a730152600081816102110152612f670152600081816101e20152818161077f0152818161098601526123f50152600081816101b201526126820152600081816117e3015261182f0152615fc36000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e1461052a578063f2fde38b1461054a578063f716f99f1461055d57600080fd5b8063c673e584146104c5578063ccd37ba3146104e557600080fd5b80638da5cb5b116100b25780638da5cb5b14610484578063991a50181461049f578063a80036b4146104b257600080fd5b806379ba50971461046e57806385572ffb1461047657600080fd5b80632d04ab76116101245780633f4b04aa116101095780633f4b04aa146103365780635e36480c146103525780637437ff9f1461037257600080fd5b80632d04ab7614610310578063311cd5131461032357600080fd5b806304666f9c1461015657806305d938b51461016b57806306285c691461017e578063181f5a77146102c7575b600080fd5b610169610164366004614133565b610570565b005b6101696101793660046147bd565b610584565b61027060408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102be9190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103036040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102be9190614938565b61016961031e3660046149e3565b610729565b610169610331366004614a96565b610cc7565b60095460405167ffffffffffffffff90911681526020016102be565b610365610360366004614aea565b610d30565b6040516102be9190614b47565b6104116040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a0810182526004546001600160a01b03808216835263ffffffff600160a01b83048116602085015278010000000000000000000000000000000000000000000000008304811694840194909452600160e01b9091049092166060820152600554909116608082015290565b6040516102be9190600060a0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401525092915050565b610169610d86565b610169610151366004614b55565b6000546040516001600160a01b0390911681526020016102be565b6101696104ad366004614ba4565b610e44565b6101696104c0366004614c18565b610e55565b6104d86104d3366004614c85565b6111c8565b6040516102be9190614ce5565b61051c6104f3366004614d5a565b67ffffffffffffffff919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102be565b61053d610538366004614d84565b611326565b6040516102be9190614d9f565b610169610558366004614ded565b611433565b61016961056b366004614e72565b611444565b610578611486565b610581816114e2565b50565b61058c6117e0565b8151815181146105c8576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156107195760008482815181106105e7576105e7614fb0565b6020026020010151905060008160200151519050600085848151811061060f5761060f614fb0565b6020026020010151905080518214610653576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8281101561070a57600082828151811061067257610672614fb0565b6020026020010151905080600014610701578460200151828151811061069a5761069a614fb0565b6020026020010151608001518110156107015784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064015b60405180910390fd5b50600101610656565b505050508060010190506105cb565b506107248383611861565b505050565b6000610737878901896151df565b602081015151909150156107e357602081015160408083015190517fccd5af000000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263ccd5af00926107b292600401615409565b60006040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050505b805151511515806107f957508051602001515115155b156108f95760095460208a01359067ffffffffffffffff808316911610156108b8576009805467ffffffffffffffff191667ffffffffffffffff83161790556004805483516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921692633937306f92610881929101615528565b600060405180830381600087803b15801561089b57600080fd5b505af11580156108af573d6000803e3d6000fd5b505050506108f7565b8160200151516000036108f7576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b816020015151811015610c085760008260200151828151811061092157610921614fb0565b602090810291909101015180516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa1580156109cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f1919061553b565b15610a34576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016106f8565b6000610a3f82611911565b6040840151815491925067ffffffffffffffff908116600160a81b90920416141580610a865750826060015167ffffffffffffffff16836040015167ffffffffffffffff16115b15610ae5578251604080850151606086015191517fd5e0f0d600000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93841660048201529083166024820152911660448201526064016106f8565b608083015180610b21576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff16600090815260086020908152604080832084845290915290205415610b945783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016106f8565b6060840151610ba490600161556e565b82547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b67ffffffffffffffff9283160217909255925116600090815260086020908152604080832094835293905291909120429055506001016108fc565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e492610c40929091615596565b60405180910390a1610cbc60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611978915050565b505050505050505050565b610d07610cd6828401846155bb565b6040805160008082526020820190925290610d01565b6060815260200190600190039081610cec5790505b50611861565b604080516000808252602082019092529050610d2a600185858585866000611978565b50505050565b6000610d3e600160046155f0565b6002610d4b608085615619565b67ffffffffffffffff16610d5f9190615640565b610d698585611cef565b901c166003811115610d7d57610d7d614b1d565b90505b92915050565b6001546001600160a01b03163314610de05760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106f8565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e4c611486565b61058181611d36565b333014610e8e576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610ecb565b6040805180820190915260008082526020820152815260200190600190039081610ea45790505b5060a08501515190915015610eff57610efc8460a00151856020015186606001518760000151602001518787611e9c565b90505b6040805160a0810182528551518152855160209081015167ffffffffffffffff1681830152808701518351600094840192610f3b929101614938565b60408051601f19818403018152918152908252878101516020830152018390526005549091506001600160a01b03168015611048576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a190610fb59085906004016156f9565b600060405180830381600087803b158015610fcf57600080fd5b505af1925050508015610fe0575060015b611048573d80801561100e576040519150601f19603f3d011682016040523d82523d6000602084013e611013565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b60408601515115801561105d57506080860151155b80611074575060608601516001600160a01b03163b155b806110b4575060608601516110b2906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611fbb565b155b156110c157505050505050565b855160209081015167ffffffffffffffff1660009081526006909152604080822054608089015160608a015192517f3cf9798300000000000000000000000000000000000000000000000000000000815284936001600160a01b0390931692633cf9798392611139928992611388929160040161570c565b6000604051808303816000875af1158015611158573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111809190810190615748565b5091509150816111be57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b5050505050505050565b61120b6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156112b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611296575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561131657602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116112f8575b5050505050815250509050919050565b604080516080808201835260008083526020808401829052838501829052606080850181905267ffffffffffffffff878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916113b3906157de565b80601f01602080910402602001604051908101604052809291908181526020018280546113df906157de565b80156113165780601f1061140157610100808354040283529160200191611316565b820191906000526020600020905b81548152906001019060200180831161140f57505050919092525091949350505050565b61143b611486565b61058181611fd7565b61144c611486565b60005b81518110156114825761147a82828151811061146d5761146d614fb0565b602002602001015161208d565b60010161144f565b5050565b6000546001600160a01b031633146114e05760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106f8565b565b60005b815181101561148257600082828151811061150257611502614fb0565b602002602001015190506000816020015190508067ffffffffffffffff16600003611559576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81516001600160a01b0316611581576040516342bcdf7f60e11b815260040160405180910390fd5b67ffffffffffffffff811660009081526006602052604081206001810180549192916115ac906157de565b80601f01602080910402602001604051908101604052809291908181526020018280546115d8906157de565b80156116255780601f106115fa57610100808354040283529160200191611625565b820191906000526020600020905b81548152906001019060200180831161160857829003601f168201915b5050505050905060008460600151905081516000036116dd578051600003611660576040516342bcdf7f60e11b815260040160405180910390fd5b6001830161166e8282615868565b5082547fffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b17835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611730565b8080519060200120828051906020012014611730576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106f8565b604080860151845487516001600160a01b031673ffffffffffffffffffffffffffffffffffffffff19921515600160a01b02929092167fffffffffffffffffffffff000000000000000000000000000000000000000000909116171784555167ffffffffffffffff8516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b906117c8908690615928565b60405180910390a250505050508060010190506114e5565b467f0000000000000000000000000000000000000000000000000000000000000000146114e0576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106f8565b815160000361189b576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b845181101561190a576119028582815181106118d0576118d0614fb0565b6020026020010151846118fc578583815181106118ef576118ef614fb0565b60200260200101516123a1565b836123a1565b6001016118b2565b5050505050565b67ffffffffffffffff811660009081526006602052604081208054600160a01b900460ff16610d80576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016106f8565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906119d78760a46159f6565b9050826060015115611a1f5784516119f0906020615640565b86516119fd906020615640565b611a089060a06159f6565b611a1291906159f6565b611a1c90826159f6565b90505b368114611a61576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106f8565b5081518114611aa95781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016106f8565b611ab16117e0565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611aff57611aff614b1d565b6002811115611b1057611b10614b1d565b9052509050600281602001516002811115611b2d57611b2d614b1d565b148015611b815750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611b6957611b69614fb0565b6000918252602090912001546001600160a01b031633145b611bb7576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611c99576020820151611bd2906001615a09565b60ff16855114611c0e576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611c49576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611c5b929190615a22565b604051908190038120611c72918b90602001615a32565b604051602081830303815290604052805190602001209050611c978a82888888612d21565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b67ffffffffffffffff8216600090815260076020526040812081611d14608085615a46565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b80516001600160a01b0316611d5e576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a17600160a01b63ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff1916918d169190911790558451988952955185169688019690965290518316918601919091525116938301939093529151909216908201527fa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d9060a00160405180910390a150565b6060865167ffffffffffffffff811115611eb857611eb8613f4a565b604051908082528060200260200182016040528015611efd57816020015b6040805180820190915260008082526020820152815260200190600190039081611ed65790505b50905060005b8751811015611faf57611f8a888281518110611f2157611f21614fb0565b6020026020010151888888888887818110611f3e57611f3e614fb0565b9050602002810190611f509190615a6d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612f0692505050565b828281518110611f9c57611f9c614fb0565b6020908102919091010152600101611f03565b505b9695505050505050565b6000611fc6836132ab565b8015610d7d5750610d7d838361330f565b336001600160a01b0382160361202f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106f8565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff166000036120b8576000604051631b3fab5160e11b81526004016106f89190615ab4565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361212557606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff90921691909117905561217a565b6060840151600182015460ff620100009091041615159015151461217a576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016106f8565b60a0840151805161010010156121a6576001604051631b3fab5160e11b81526004016106f89190615ab4565b61220c848460030180548060200260200160405190810160405280929190818152602001828054801561220257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116121e4575b50505050506133ca565b8460600151156123165761227a8484600201805480602002602001604051908101604052809291908181526020018280548015612202576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116121e45750505050506133ca565b6080850151805161010010156122a6576002604051631b3fab5160e11b81526004016106f89190615ab4565b60408601516122b6906003615ace565b60ff168151116122dc576003604051631b3fab5160e11b81526004016106f89190615ab4565b805160018401805461ff00191661010060ff8416021790556123079060028601906020840190613ec3565b5061231485826001613433565b505b61232284826002613433565b80516123379060038501906020840190613ec3565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936123909389939260028a01929190615aea565b60405180910390a161190a846135a7565b815181516040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608083901b77ffffffffffffffff00000000000000000000000000000000166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015612444573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612468919061553b565b156124f45780156124b1576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016106f8565b60405167ffffffffffffffff831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b60006124ff83611911565b600101805461250d906157de565b80601f0160208091040260200160405190810160405280929190818152602001828054612539906157de565b80156125865780601f1061255b57610100808354040283529160200191612586565b820191906000526020600020905b81548152906001019060200180831161256957829003601f168201915b505050602088015151929350505060008190036125ce576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b856040015151811461260c576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561262757612627613f4a565b604051908082528060200260200182016040528015612650578160200160208202803683370190505b50905060005b828110156127a95760008860200151828151811061267657612676614fb0565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461270957805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106f8565b8667ffffffffffffffff1681600001516020015167ffffffffffffffff1614612779578051602001516040517f6c95f1eb00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808a16600483015290911660248201526044016106f8565b6127838186613617565b83838151811061279557612795614fb0565b602090810291909101015250600101612656565b5060006127c086838a606001518b60800151613739565b905080600003612808576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff871660048201526024016106f8565b60005b83811015610cbc5760005a905060008a60200151838151811061283057612830614fb0565b60200260200101519050600061284e8a836000015160600151610d30565b9050600081600381111561286457612864614b1d565b14806128815750600381600381111561287f5761287f614b1d565b145b6128d9578151606001516040805167ffffffffffffffff808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a1505050612d19565b88156129a957600454600090600160a01b900463ffffffff166128fc87426155f0565b119050808061291c5750600382600381111561291a5761291a614b1d565b145b61295e576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8c1660048201526024016106f8565b8b858151811061297057612970614fb0565b60200260200101516000146129a3578b858151811061299157612991614fb0565b60200260200101518360800181815250505b50612a0a565b60008160038111156129bd576129bd614b1d565b14612a0a578151606001516040805167ffffffffffffffff808e16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe6512091016128c9565b81516080015167ffffffffffffffff1615612af9576000816003811115612a3357612a33614b1d565b03612af95781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612aaa928f929190600401615b96565b6020604051808303816000875af1158015612ac9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aed919061553b565b612af957505050612d19565b60008c604001518581518110612b1157612b11614fb0565b6020026020010151905080518360a001515114612b75578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808e16600483015290911660248201526044016106f8565b612b898b8460000151606001516001613777565b600080612b96858461381f565b91509150612bad8d86600001516060015184613777565b8b15612c1d576003826003811115612bc757612bc7614b1d565b03612c1d576000846003811115612be057612be0614b1d565b14612c1d578451516040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526106f891908390600401615bc3565b6002826003811115612c3157612c31614b1d565b14612c8b576003826003811115612c4a57612c4a614b1d565b14612c8b578451606001516040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526106f8918f918590600401615bdc565b84600001516000015185600001516060015167ffffffffffffffff168e67ffffffffffffffff167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8c8b81518110612ce557612ce5614fb0565b602002602001015186865a612cfa908e6155f0565b604051612d0a9493929190615c02565b60405180910390a45050505050505b60010161280b565b8251600090815b818110156111be576000600188868460208110612d4757612d47614fb0565b612d5491901a601b615a09565b898581518110612d6657612d66614fb0565b6020026020010151898681518110612d8057612d80614fb0565b602002602001015160405160008152602001604052604051612dbe949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612de0573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b03851683528152858220858701909652855480841686529397509095509293928401916101009004166002811115612e4157612e41614b1d565b6002811115612e5257612e52614b1d565b9052509050600181602001516002811115612e6f57612e6f614b1d565b14612ea6576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600160ff9091161b851615612ee9576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000015160ff166001901b851794505050806001019050612d28565b60408051808201909152600080825260208201526000612f2987602001516138e9565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd29190615c39565b90506001600160a01b038116158061301a57506130186001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611fbb565b155b1561305c576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106f8565b600454600090819061307e9089908690600160e01b900463ffffffff1661398f565b91509150600080600061314b6040518061010001604052808e81526020018c67ffffffffffffffff1681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b8152506040516024016130fc9190615c56565b60408051601f198184030181529190526020810180516001600160e01b03167f390775370000000000000000000000000000000000000000000000000000000017905287866113886084613abd565b9250925092508261318a57816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b81516020146131d25781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b6000828060200190518101906131e89190615d23565b9050866001600160a01b03168c6001600160a01b03161461327d5760006132198d8a613214868a6155f0565b61398f565b5090508681108061323357508161323088836155f0565b14155b1561327b576040517fa966e21f0000000000000000000000000000000000000000000000000000000081526004810183905260248101889052604481018290526064016106f8565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b60006132d7827f01ffc9a70000000000000000000000000000000000000000000000000000000061330f565b8015610d805750613308827fffffffff0000000000000000000000000000000000000000000000000000000061330f565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825192935060009283928392909183918a617530fa92503d915060005190508280156133b3575060208210155b80156133bf5750600081115b979650505050505050565b60005b81518110156107245760ff8316600090815260036020526040812083519091908490849081106133ff576133ff614fb0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191690556001016133cd565b60005b8251811015610d2a57600083828151811061345357613453614fb0565b602002602001015190506000600281111561347057613470614b1d565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156134af576134af614b1d565b146134d0576004604051631b3fab5160e11b81526004016106f89190615ab4565b6001600160a01b038116613510576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561353657613536614b1d565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561359357613593614b1d565b021790555090505050806001019050613436565b60ff81166105815760ff80821660009081526002602052604090206001015462010000900416613603576040517f7a3b4c9400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009805467ffffffffffffffff1916905550565b81516020808201516040928301519251600093849361365d937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615d3c565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976136a69794969395929491939101615d6f565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016136dd9190615e74565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b600080613747858585613be3565b67ffffffffffffffff8716600090815260086020908152604080832093835292905220549150505b949350505050565b60006002613786608085615619565b67ffffffffffffffff1661379a9190615640565b905060006137a88585611cef565b9050816137b7600160046155f0565b901b1916818360038111156137ce576137ce614b1d565b67ffffffffffffffff871660009081526007602052604081209190921b929092179182916137fd608088615a46565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fa80036b4000000000000000000000000000000000000000000000000000000008152600090606090309063a80036b4906138639087908790600401615ed4565b600060405180830381600087803b15801561387d57600080fd5b505af192505050801561388e575060015b6138cd573d8080156138bc576040519150601f19603f3d011682016040523d82523d6000602084013e6138c1565b606091505b506003925090506138e2565b50506040805160208101909152600081526002905b9250929050565b6000815160201461392857816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b60008280602001905181019061393e9190615d23565b90506001600160a01b03811180613956575061040081105b15610d8057826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b6000806000806000613a09886040516024016139ba91906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03167f70a082310000000000000000000000000000000000000000000000000000000017905288886113886084613abd565b92509250925082613a4857816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106f89190614938565b6020825114613a905781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106f8565b81806020019051810190613aa49190615d23565b613aae82886155f0565b94509450505050935093915050565b6000606060008361ffff1667ffffffffffffffff811115613ae057613ae0613f4a565b6040519080825280601f01601f191660200182016040528015613b0a576020820181803683370190505b509150863b613b3d577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613b70577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613ba9577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613bcc5750835b808352806000602085013e50955095509592505050565b8251825160009190818303613c24576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613c3857506101018111155b613c55576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613c7f576040516309bde33960e01b815260040160405180910390fd5b80600003613cac5786600081518110613c9a57613c9a614fb0565b60200260200101519350505050613e7b565b60008167ffffffffffffffff811115613cc757613cc7613f4a565b604051908082528060200260200182016040528015613cf0578160200160208202803683370190505b50905060008080805b85811015613e1a5760006001821b8b811603613d545788851015613d3d578c5160018601958e918110613d2e57613d2e614fb0565b60200260200101519050613d76565b8551600185019487918110613d2e57613d2e614fb0565b8b5160018401938d918110613d6b57613d6b614fb0565b602002602001015190505b600089861015613da6578d5160018701968f918110613d9757613d97614fb0565b60200260200101519050613dc8565b8651600186019588918110613dbd57613dbd614fb0565b602002602001015190505b82851115613de9576040516309bde33960e01b815260040160405180910390fd5b613df38282613e82565b878481518110613e0557613e05614fb0565b60209081029190910101525050600101613cf9565b506001850382148015613e2c57508683145b8015613e3757508581145b613e54576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613e6957613e69614fb0565b60200260200101519750505050505050505b9392505050565b6000818310613e9a57613e958284613ea0565b610d7d565b610d7d83835b60408051600160208201529081018390526060810182905260009060800161371b565b828054828255906000526020600020908101928215613f25579160200282015b82811115613f25578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613ee3565b50613f31929150613f35565b5090565b5b80821115613f315760008155600101613f36565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613f8357613f83613f4a565b60405290565b60405160a0810167ffffffffffffffff81118282101715613f8357613f83613f4a565b60405160c0810167ffffffffffffffff81118282101715613f8357613f83613f4a565b6040805190810167ffffffffffffffff81118282101715613f8357613f83613f4a565b6040516060810167ffffffffffffffff81118282101715613f8357613f83613f4a565b604051601f8201601f1916810167ffffffffffffffff8111828210171561403e5761403e613f4a565b604052919050565b600067ffffffffffffffff82111561406057614060613f4a565b5060051b60200190565b6001600160a01b038116811461058157600080fd5b803567ffffffffffffffff8116811461409757600080fd5b919050565b801515811461058157600080fd5b80356140978161409c565b600067ffffffffffffffff8211156140cf576140cf613f4a565b50601f01601f191660200190565b600082601f8301126140ee57600080fd5b81356141016140fc826140b5565b614015565b81815284602083860101111561411657600080fd5b816020850160208301376000918101602001919091529392505050565b6000602080838503121561414657600080fd5b823567ffffffffffffffff8082111561415e57600080fd5b818501915085601f83011261417257600080fd5b81356141806140fc82614046565b81815260059190911b8301840190848101908883111561419f57600080fd5b8585015b83811015614245578035858111156141bb5760008081fd5b86016080818c03601f19018113156141d35760008081fd5b6141db613f60565b898301356141e88161406a565b815260406141f784820161407f565b8b83015260608085013561420a8161409c565b8383015292840135928984111561422357600091508182fd5b6142318f8d868801016140dd565b9083015250855250509186019186016141a3565b5098975050505050505050565b600060a0828403121561426457600080fd5b61426c613f89565b90508135815261427e6020830161407f565b602082015261428f6040830161407f565b60408201526142a06060830161407f565b60608201526142b16080830161407f565b608082015292915050565b80356140978161406a565b600082601f8301126142d857600080fd5b813560206142e86140fc83614046565b82815260059290921b8401810191818101908684111561430757600080fd5b8286015b84811015611faf57803567ffffffffffffffff8082111561432c5760008081fd5b9088019060a0828b03601f19018113156143465760008081fd5b61434e613f89565b87840135838111156143605760008081fd5b61436e8d8a838801016140dd565b825250604080850135848111156143855760008081fd5b6143938e8b838901016140dd565b8a84015250606080860135858111156143ac5760008081fd5b6143ba8f8c838a01016140dd565b838501525060809150818601358184015250828501359250838311156143e05760008081fd5b6143ee8d8a858801016140dd565b90820152865250505091830191830161430b565b6000610140828403121561441557600080fd5b61441d613fac565b90506144298383614252565b815260a082013567ffffffffffffffff8082111561444657600080fd5b614452858386016140dd565b602084015260c084013591508082111561446b57600080fd5b614477858386016140dd565b604084015261448860e085016142bc565b606084015261010084013560808401526101208401359150808211156144ad57600080fd5b506144ba848285016142c7565b60a08301525092915050565b600082601f8301126144d757600080fd5b813560206144e76140fc83614046565b82815260059290921b8401810191818101908684111561450657600080fd5b8286015b84811015611faf57803567ffffffffffffffff81111561452a5760008081fd5b6145388986838b0101614402565b84525091830191830161450a565b600082601f83011261455757600080fd5b813560206145676140fc83614046565b82815260059290921b8401810191818101908684111561458657600080fd5b8286015b84811015611faf57803567ffffffffffffffff808211156145aa57600080fd5b818901915089603f8301126145be57600080fd5b858201356145ce6140fc82614046565b81815260059190911b830160400190878101908c8311156145ee57600080fd5b604085015b838110156146275780358581111561460a57600080fd5b6146198f6040838a01016140dd565b8452509189019189016145f3565b5087525050509284019250830161458a565b600082601f83011261464a57600080fd5b8135602061465a6140fc83614046565b8083825260208201915060208460051b87010193508684111561467c57600080fd5b602086015b84811015611faf5780358352918301918301614681565b600082601f8301126146a957600080fd5b813560206146b96140fc83614046565b82815260059290921b840181019181810190868411156146d857600080fd5b8286015b84811015611faf57803567ffffffffffffffff808211156146fd5760008081fd5b9088019060a0828b03601f19018113156147175760008081fd5b61471f613f89565b61472a88850161407f565b8152604080850135848111156147405760008081fd5b61474e8e8b838901016144c6565b8a84015250606080860135858111156147675760008081fd5b6147758f8c838a0101614546565b83850152506080915081860135858111156147905760008081fd5b61479e8f8c838a0101614639565b91840191909152509190930135908301525083529183019183016146dc565b60008060408084860312156147d157600080fd5b833567ffffffffffffffff808211156147e957600080fd5b6147f587838801614698565b945060209150818601358181111561480c57600080fd5b8601601f8101881361481d57600080fd5b803561482b6140fc82614046565b81815260059190911b8201840190848101908a83111561484a57600080fd5b8584015b838110156148d6578035868111156148665760008081fd5b8501603f81018d136148785760008081fd5b878101356148886140fc82614046565b81815260059190911b82018a0190898101908f8311156148a85760008081fd5b928b01925b828410156148c65783358252928a0192908a01906148ad565b865250505091860191860161484e565b50809750505050505050509250929050565b60005b838110156149035781810151838201526020016148eb565b50506000910152565b600081518084526149248160208601602086016148e8565b601f01601f19169290920160200192915050565b602081526000610d7d602083018461490c565b8060608101831015610d8057600080fd5b60008083601f84011261496e57600080fd5b50813567ffffffffffffffff81111561498657600080fd5b6020830191508360208285010111156138e257600080fd5b60008083601f8401126149b057600080fd5b50813567ffffffffffffffff8111156149c857600080fd5b6020830191508360208260051b85010111156138e257600080fd5b60008060008060008060008060e0898b0312156149ff57600080fd5b614a098a8a61494b565b9750606089013567ffffffffffffffff80821115614a2657600080fd5b614a328c838d0161495c565b909950975060808b0135915080821115614a4b57600080fd5b614a578c838d0161499e565b909750955060a08b0135915080821115614a7057600080fd5b50614a7d8b828c0161499e565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215614aab57600080fd5b614ab5858561494b565b9250606084013567ffffffffffffffff811115614ad157600080fd5b614add8682870161495c565b9497909650939450505050565b60008060408385031215614afd57600080fd5b614b068361407f565b9150614b146020840161407f565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614b4357614b43614b1d565b9052565b60208101610d808284614b33565b600060208284031215614b6757600080fd5b813567ffffffffffffffff811115614b7e57600080fd5b820160a08185031215613e7b57600080fd5b803563ffffffff8116811461409757600080fd5b600060a08284031215614bb657600080fd5b614bbe613f89565b8235614bc98161406a565b8152614bd760208401614b90565b6020820152614be860408401614b90565b6040820152614bf960608401614b90565b60608201526080830135614c0c8161406a565b60808201529392505050565b600080600060408486031215614c2d57600080fd5b833567ffffffffffffffff80821115614c4557600080fd5b614c5187838801614402565b94506020860135915080821115614c6757600080fd5b50614add8682870161499e565b803560ff8116811461409757600080fd5b600060208284031215614c9757600080fd5b610d7d82614c74565b60008151808452602080850194506020840160005b83811015614cda5781516001600160a01b031687529582019590820190600101614cb5565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614d3460e0840182614ca0565b90506040840151601f198483030160c0850152614d518282614ca0565b95945050505050565b60008060408385031215614d6d57600080fd5b614d768361407f565b946020939093013593505050565b600060208284031215614d9657600080fd5b610d7d8261407f565b602081526001600160a01b03825116602082015260208201511515604082015267ffffffffffffffff60408301511660608201526000606083015160808084015261376f60a084018261490c565b600060208284031215614dff57600080fd5b8135613e7b8161406a565b600082601f830112614e1b57600080fd5b81356020614e2b6140fc83614046565b8083825260208201915060208460051b870101935086841115614e4d57600080fd5b602086015b84811015611faf578035614e658161406a565b8352918301918301614e52565b60006020808385031215614e8557600080fd5b823567ffffffffffffffff80821115614e9d57600080fd5b818501915085601f830112614eb157600080fd5b8135614ebf6140fc82614046565b81815260059190911b83018401908481019088831115614ede57600080fd5b8585015b8381101561424557803585811115614ef957600080fd5b860160c0818c03601f19011215614f105760008081fd5b614f18613fac565b8882013581526040614f2b818401614c74565b8a8301526060614f3c818501614c74565b8284015260809150614f4f8285016140aa565b9083015260a08381013589811115614f675760008081fd5b614f758f8d83880101614e0a565b838501525060c0840135915088821115614f8f5760008081fd5b614f9d8e8c84870101614e0a565b9083015250845250918601918601614ee2565b634e487b7160e01b600052603260045260246000fd5b80356001600160e01b038116811461409757600080fd5b600082601f830112614fee57600080fd5b81356020614ffe6140fc83614046565b82815260069290921b8401810191818101908684111561501d57600080fd5b8286015b84811015611faf576040818903121561503a5760008081fd5b615042613fcf565b61504b8261407f565b8152615058858301614fc6565b81860152835291830191604001615021565b600082601f83011261507b57600080fd5b8135602061508b6140fc83614046565b82815260059290921b840181019181810190868411156150aa57600080fd5b8286015b84811015611faf57803567ffffffffffffffff808211156150cf5760008081fd5b9088019060a0828b03601f19018113156150e95760008081fd5b6150f1613f89565b6150fc88850161407f565b8152604080850135848111156151125760008081fd5b6151208e8b838901016140dd565b8a840152506060935061513484860161407f565b90820152608061514585820161407f565b938201939093529201359082015283529183019183016150ae565b600082601f83011261517157600080fd5b813560206151816140fc83614046565b82815260069290921b840181019181810190868411156151a057600080fd5b8286015b84811015611faf57604081890312156151bd5760008081fd5b6151c5613fcf565b8135815284820135858201528352918301916040016151a4565b600060208083850312156151f257600080fd5b823567ffffffffffffffff8082111561520a57600080fd5b908401906060828703121561521e57600080fd5b615226613ff2565b82358281111561523557600080fd5b8301604081890381131561524857600080fd5b615250613fcf565b82358581111561525f57600080fd5b8301601f81018b1361527057600080fd5b803561527e6140fc82614046565b81815260069190911b8201890190898101908d83111561529d57600080fd5b928a01925b828410156152ed5785848f0312156152ba5760008081fd5b6152c2613fcf565b84356152cd8161406a565b81526152da858d01614fc6565b818d0152825292850192908a01906152a2565b84525050508287013591508482111561530557600080fd5b6153118a838501614fdd565b8188015283525050828401358281111561532a57600080fd5b6153368882860161506a565b8583015250604083013593508184111561534f57600080fd5b61535b87858501615160565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b848110156153fc57601f19868403018952815160a067ffffffffffffffff8083511686528683015182888801526153c08388018261490c565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101615387565b5090979650505050505050565b6000604080835261541d604084018661536a565b83810360208581019190915285518083528682019282019060005b8181101561545d57845180518452840151848401529383019391850191600101615438565b509098975050505050505050565b805160408084528151848201819052600092602091908201906060870190855b818110156154c257835180516001600160a01b031684528501516001600160e01b031685840152928401929185019160010161548b565b50508583015187820388850152805180835290840192506000918401905b8083101561551c578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906154e0565b50979650505050505050565b602081526000610d7d602083018461546b565b60006020828403121561554d57600080fd5b8151613e7b8161409c565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561558f5761558f615558565b5092915050565b6040815260006155a9604083018561536a565b8281036020840152614d51818561546b565b6000602082840312156155cd57600080fd5b813567ffffffffffffffff8111156155e457600080fd5b61376f84828501614698565b81810381811115610d8057610d80615558565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061563457615634615603565b92169190910692915050565b8082028115828204841417610d8057610d80615558565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261568b60a087018261490c565b9050606085015186820360608801526156a4828261490c565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561551c57835180516001600160a01b03168352860151868301529285019260019290920191908401906156c7565b602081526000610d7d6020830184615657565b60808152600061571f6080830187615657565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561575d57600080fd5b83516157688161409c565b602085015190935067ffffffffffffffff81111561578557600080fd5b8401601f8101861361579657600080fd5b80516157a46140fc826140b5565b8181528760208385010111156157b957600080fd5b6157ca8260208301602086016148e8565b809450505050604084015190509250925092565b600181811c908216806157f257607f821691505b60208210810361581257634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610724576000816000526020600020601f850160051c810160208610156158415750805b601f850160051c820191505b818110156158605782815560010161584d565b505050505050565b815167ffffffffffffffff81111561588257615882613f4a565b6158968161589084546157de565b84615818565b602080601f8311600181146158cb57600084156158b35750858301515b600019600386901b1c1916600185901b178555615860565b600085815260208120601f198616915b828110156158fa578886015182559484019460019091019084016158db565b50858210156159185787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c161515604085015267ffffffffffffffff8160a81c1660608501525060018085016080808601526000815461597a816157de565b8060a089015260c0600183166000811461599b57600181146159b7576159e7565b60ff19841660c08b015260c083151560051b8b010194506159e7565b85600052602060002060005b848110156159de5781548c82018501529088019089016159c3565b8b0160c0019550505b50929998505050505050505050565b80820180821115610d8057610d80615558565b60ff8181168382160190811115610d8057610d80615558565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff80841680615a6157615a61615603565b92169190910492915050565b6000808335601e19843603018112615a8457600080fd5b83018035915067ffffffffffffffff821115615a9f57600080fd5b6020019150368190038213156138e257600080fd5b6020810160058310615ac857615ac8614b1d565b91905290565b60ff818116838216029081169081811461558f5761558f615558565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615b425784546001600160a01b031683526001948501949284019201615b1d565b50508481036060860152865180825290820192508187019060005b81811015615b825782516001600160a01b031685529383019391830191600101615b5d565b50505060ff85166080850152509050611fb1565b600067ffffffffffffffff808616835280851660208401525060606040830152614d51606083018461490c565b82815260406020820152600061376f604083018461490c565b67ffffffffffffffff8481168252831660208201526060810161376f6040830184614b33565b848152615c126020820185614b33565b608060408201526000615c28608083018561490c565b905082606083015295945050505050565b600060208284031215615c4b57600080fd5b8151613e7b8161406a565b6020815260008251610100806020850152615c7561012085018361490c565b91506020850151615c92604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615ccc60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615ce9848361490c565b935060c08701519150808685030160e0870152615d06848361490c565b935060e0870151915080868503018387015250611fb1838261490c565b600060208284031215615d3557600080fd5b5051919050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152611fb1608083018461490c565b86815260c060208201526000615d8860c083018861490c565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b848110156153fc57601f19868403018952815160a08151818652615e058287018261490c565b9150508582015185820387870152615e1d828261490c565b91505060408083015186830382880152615e37838261490c565b92505050606080830151818701525060808083015192508582038187015250615e60818361490c565b9a86019a9450505090830190600101615ddf565b602081526000610d7d6020830184615dc2565b60008282518085526020808601955060208260051b8401016020860160005b848110156153fc57601f19868403018952615ec283835161490c565b98840198925090830190600101615ea6565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615f3c61018085018361490c565b91506040860151603f198086850301610100870152615f5b848361490c565b935060608801519150615f7a6101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615fa18282615dc2565b9150508281036020840152614d518185615e8756fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"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\":\"enumMultiOCR3Base.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\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"tokenIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"oldLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenGasOverride\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionTokenGasOverride\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionGasAmountCountMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amountReleased\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePre\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"balancePost\",\"type\":\"uint256\"}],\"name\":\"ReleaseOrMintBalanceMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignatureVerificationDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRampAddress\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"maxSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SkippedReportExecution\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"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\":[{\"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\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"contractIRouter\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"contractIRMNV2\",\"name\":\"rmn\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"destExecData\",\"type\":\"bytes\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint32[]\",\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\"}],\"internalType\":\"structOffRamp.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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"feeQuoter\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"}],\"internalType\":\"structOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x6101206040523480156200001257600080fd5b50604051620068603803806200686083398101604081905262000035916200085e565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f1816200036d565b50505062000be5565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0316620002ce576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586166001600160c01b03199094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b60005b8151811015620006125760008282815181106200039157620003916200099b565b60200260200101519050600081602001519050806001600160401b0316600003620003cf5760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b0316620003f8576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b03811660009081526006602052604081206001810180549192916200042490620009b1565b80601f01602080910402602001604051908101604052809291908181526020018280546200045290620009b1565b8015620004a35780601f106200047757610100808354040283529160200191620004a3565b820191906000526020600020905b8154815290600101906020018083116200048557829003601f168201915b5050505050905060008460600151905081516000036200054a578051600003620004e0576040516342bcdf7f60e11b815260040160405180910390fd5b60018301620004f0828262000a42565b508254600160a81b600160e81b031916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a162000585565b8080519060200120828051906020012014620005855760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092166001600160a81b031990911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90620005f990869062000b0e565b60405180910390a2505050505080600101905062000370565b5050565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b038111828210171562000651576200065162000616565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000682576200068262000616565b604052919050565b80516001600160401b0381168114620006a257600080fd5b919050565b6001600160a01b0381168114620006bd57600080fd5b50565b6000601f83601f840112620006d457600080fd5b825160206001600160401b0380831115620006f357620006f362000616565b8260051b6200070483820162000657565b93845286810183019383810190898611156200071f57600080fd5b84890192505b8583101562000851578251848111156200073f5760008081fd5b89016080601f19828d038101821315620007595760008081fd5b620007636200062c565b888401516200077281620006a7565b81526040620007838582016200068a565b8a83015260608086015180151581146200079d5760008081fd5b83830152938501519389851115620007b55760008081fd5b84860195508f603f870112620007cd57600094508485fd5b8a860151945089851115620007e657620007e662000616565b620007f78b858f8801160162000657565b93508484528f828688010111156200080f5760008081fd5b60005b858110156200082f578681018301518582018d01528b0162000812565b5060009484018b01949094525091820152835250918401919084019062000725565b9998505050505050505050565b60008060008385036101008112156200087657600080fd5b60808112156200088557600080fd5b6200088f6200062c565b6200089a866200068a565b81526020860151620008ac81620006a7565b60208201526040860151620008c181620006a7565b60408201526060860151620008d681620006a7565b606082810191909152909450607f1982011215620008f357600080fd5b50604051606081016001600160401b0380821183831017156200091a576200091a62000616565b81604052608087015191506200093082620006a7565b90825260a08601519063ffffffff821682146200094c57600080fd5b81602084015260c087015191506200096482620006a7565b6040830182905260e0870151929450808311156200098157600080fd5b50506200099186828701620006c0565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680620009c657607f821691505b602082108103620009e757634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a3d576000816000526020600020601f850160051c8101602086101562000a185750805b601f850160051c820191505b8181101562000a395782815560010162000a24565b5050505b505050565b81516001600160401b0381111562000a5e5762000a5e62000616565b62000a768162000a6f8454620009b1565b84620009ed565b602080601f83116001811462000aae576000841562000a955750858301515b600019600386901b1c1916600185901b17855562000a39565b600085815260208120601f198616915b8281101562000adf5788860151825594840194600190910190840162000abe565b508582101562000afe5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b602080825282546001600160a01b0381168383015260a081901c60ff161515604084015260a81c6001600160401b0316606083015260808083015260018084018054600093929190849062000b6381620009b1565b8060a089015260c0600183166000811462000b87576001811462000ba45762000bd6565b60ff19841660c08b015260c083151560051b8b0101945062000bd6565b85600052602060002060005b8481101562000bcd5781548c820185015290880190890162000bb0565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615c0562000c5b6000396000818161022c015261292c0152600081816101fd0152612bfe0152600081816101ce01528181610552015281816106ff015261237001526000818161019f01526125af015260008181611d980152611dcb0152615c056000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c806379ba5097116100cd578063d434969111610081578063e9d68a8e11610066578063e9d68a8e146104bc578063f2fde38b146104dc578063f716f99f146104ef57600080fd5b8063d434969114610496578063e62653f5146104a957600080fd5b80638da5cb5b116100b25780638da5cb5b14610417578063c673e58414610432578063ccd37ba31461045257600080fd5b806379ba50971461040157806385572ffb1461040957600080fd5b8063311cd513116101245780635e36480c116101095780635e36480c1461033c5780636f9e320f1461035c5780637437ff9f1461036f57600080fd5b8063311cd5131461030e5780633f4b04aa1461032157600080fd5b806304666f9c1461015657806306285c691461016b578063181f5a77146102b25780632d04ab76146102fb575b600080fd5b610169610164366004613bc5565b610502565b005b61025c60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160401b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102a9919081516001600160401b031681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6102ee6040518060400160405280601181526020017f4f666652616d7020312e362e302d64657600000000000000000000000000000081525081565b6040516102a99190613d33565b610169610309366004613de3565b610516565b61016961031c366004613e95565b6109c5565b6009546040516001600160401b0390911681526020016102a9565b61034f61034a366004613ee8565b610a2e565b6040516102a99190613f45565b61016961036a366004613f70565b610a83565b6103cb604080516060810182526000808252602082018190529181019190915250604080516060810182526004546001600160a01b038082168352600160a01b90910463ffffffff166020830152600554169181019190915290565b6040805182516001600160a01b03908116825260208085015163ffffffff169083015292820151909216908201526060016102a9565b610169610a94565b610169610151366004613fc4565b6000546040516001600160a01b0390911681526020016102a9565b61044561044036600461400f565b610b45565b6040516102a9919061406f565b6104886104603660046140e4565b6001600160401b03919091166000908152600860209081526040808320938352929052205490565b6040519081526020016102a9565b6101696104a4366004614380565b610ca3565b6101696104b7366004614708565b610f83565b6104cf6104ca36600461494f565b61122a565b6040516102a9919061496a565b6101696104ea3660046149b7565b611336565b6101696104fd366004614a3c565b611347565b61050a611389565b610513816113e5565b50565b600061052487890189614d91565b602081015151909150156105b6576020810151604080830151905162ccd5af60e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263ccd5af009261058592600401614fb9565b60006040518083038186803b15801561059d57600080fd5b505afa1580156105b1573d6000803e3d6000fd5b505050505b805151511515806105cc57508051602001515115155b156106985760095460208a0135906001600160401b0380831691161015610670576009805467ffffffffffffffff19166001600160401b038316179055600480548351604051633937306f60e01b81526001600160a01b0390921692633937306f926106399291016150ed565b600060405180830381600087803b15801561065357600080fd5b505af1158015610667573d6000803e3d6000fd5b50505050610696565b81602001515160000361069657604051632261116760e01b815260040160405180910390fd5b505b60005b816020015151811015610906576000826020015182815181106106c0576106c061501b565b60209081029190910101518051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b166004820152919250906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610746573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061076a9190615100565b1561079857604051637edeb53960e11b81526001600160401b03821660048201526024015b60405180910390fd5b60006107a38261168b565b604084015181549192506001600160401b03908116600160a81b909204161415806107e7575082606001516001600160401b031683604001516001600160401b0316115b1561082c57825160408085015160608601519151636af0786b60e11b81526001600160401b03938416600482015290831660248201529116604482015260640161078f565b60808301518061084f5760405163504570e360e01b815260040160405180910390fd5b83516001600160401b03166000908152600860209081526040808320848452909152902054156108a75783516040516332cf0cbf60e01b81526001600160401b0390911660048201526024810182905260440161078f565b60608401516108b7906001615133565b825467ffffffffffffffff60a81b1916600160a81b6001600160401b0392831602179092559251166000908152600860209081526040808320948352939052919091204290555060010161069b565b50602081015181516040517f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e49261093e92909161515a565b60405180910390a16109ba60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506116d7915050565b505050505050505050565b610a056109d48284018461517f565b60408051600080825260208201909252906109ff565b60608152602001906001900390816109ea5790505b506119d0565b604080516000808252602082019092529050610a286001858585858660006116d7565b50505050565b6000610a3c600160046151b3565b6002610a496080856151dc565b6001600160401b0316610a5c9190615202565b610a668585611a92565b901c166003811115610a7a57610a7a613f1b565b90505b92915050565b610a8b611389565b61051381611ad7565b6001546001600160a01b03163314610aee5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161078f565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b886040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c082015294855291820180548451818402810184019095528085529293858301939092830182828015610c3157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c13575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610c9357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c75575b5050505050815250509050919050565b333014610cc3576040516306e34e6560e31b815260040160405180910390fd5b6040805160008082526020820190925281610d00565b6040805180820190915260008082526020820152815260200190600190039081610cd95790505b5060a08701515190915015610d3657610d338660a001518760200151886060015189600001516020015189898989611bb6565b90505b6040805160a081018252875151815287516020908101516001600160401b031681830152808901518351600094840192610d71929101613d33565b60408051601f19818403018152918152908252898101516020830152018390526005549091506001600160a01b03168015610e4c576040516308d450a160e01b81526001600160a01b038216906308d450a190610dd29085906004016152ba565b600060405180830381600087803b158015610dec57600080fd5b505af1925050508015610dfd575060015b610e4c573d808015610e2b576040519150601f19603f3d011682016040523d82523d6000602084013e610e30565b606091505b50806040516309c2532560e01b815260040161078f9190613d33565b604088015151158015610e6157506080880151155b80610e78575060608801516001600160a01b03163b155b80610e9f57506060880151610e9d906001600160a01b03166385572ffb60e01b611d79565b155b15610eac57505050610f7c565b87516020908101516001600160401b03166000908152600690915260408082205460808b015160608c01519251633cf9798360e01b815284936001600160a01b0390931692633cf9798392610f0a92899261138892916004016152cd565b6000604051808303816000875af1158015610f29573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f519190810190615309565b509150915081610f7657806040516302a35ba360e21b815260040161078f9190613d33565b50505050505b5050505050565b610f8b611d95565b815181518114610fae576040516320f8fd5960e21b815260040160405180910390fd5b60005b8181101561121a576000848281518110610fcd57610fcd61501b565b60200260200101519050600081602001515190506000858481518110610ff557610ff561501b565b6020026020010151905080518214611020576040516320f8fd5960e21b815260040160405180910390fd5b60005b8281101561120b57600082828151811061103f5761103f61501b565b60200260200101516000015190506000856020015183815181106110655761106561501b565b60200260200101519050816000146110b95780608001518210156110b9578551815151604051633a98d46360e11b81526001600160401b03909216600483015260248201526044810183905260640161078f565b8383815181106110cb576110cb61501b565b602002602001015160200151518160a00151511461111857805180516060909101516040516370a193fd60e01b815260048101929092526001600160401b0316602482015260440161078f565b60005b8160a00151518110156111fd57600085858151811061113c5761113c61501b565b60200260200101516020015182815181106111595761115961501b565b602002602001015163ffffffff169050806000146111f45760008360a0015183815181106111895761118961501b565b6020026020010151608001518060200190518101906111a8919061539e565b90508063ffffffff168210156111f2578351516040516348e617b360e01b815260048101919091526024810184905263ffffffff821660448201526064810183905260840161078f565b505b5060010161111b565b505050806001019050611023565b50505050806001019050610fb1565b5061122583836119d0565b505050565b60408051608080820183526000808352602080840182905283850182905260608085018190526001600160401b03878116845260068352928690208651948501875280546001600160a01b0381168652600160a01b810460ff16151593860193909352600160a81b9092049092169483019490945260018401805493949293918401916112b6906153bb565b80601f01602080910402602001604051908101604052809291908181526020018280546112e2906153bb565b8015610c935780601f1061130457610100808354040283529160200191610c93565b820191906000526020600020905b81548152906001019060200180831161131257505050919092525091949350505050565b61133e611389565b61051381611dfd565b61134f611389565b60005b81518110156113855761137d8282815181106113705761137061501b565b6020026020010151611ea6565b600101611352565b5050565b6000546001600160a01b031633146113e35760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161078f565b565b60005b81518110156113855760008282815181106114055761140561501b565b60200260200101519050600081602001519050806001600160401b03166000036114425760405163c656089560e01b815260040160405180910390fd5b81516001600160a01b031661146a576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b0381166000908152600660205260408120600181018054919291611494906153bb565b80601f01602080910402602001604051908101604052809291908181526020018280546114c0906153bb565b801561150d5780601f106114e25761010080835404028352916020019161150d565b820191906000526020600020905b8154815290600101906020018083116114f057829003601f168201915b5050505050905060008460600151905081516000036115b0578051600003611548576040516342bcdf7f60e11b815260040160405180910390fd5b600183016115568282615445565b50825467ffffffffffffffff60a81b1916600160a81b1783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16115e9565b80805190602001208280519060200120146115e95760405163c39a620560e01b81526001600160401b038516600482015260240161078f565b604080860151845487516001600160a01b03166001600160a01b0319921515600160a01b02929092167fffffffffffffffffffffff00000000000000000000000000000000000000000090911617178455516001600160401b038516907f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b90611673908690615504565b60405180910390a250505050508060010190506113e8565b6001600160401b03811660009081526006602052604081208054600160a01b900460ff16610a7d5760405163ed053c5960e01b81526001600160401b038416600482015260240161078f565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906117368760a46155d1565b905082606001511561177e57845161174f906020615202565b865161175c906020615202565b6117679060a06155d1565b61177191906155d1565b61177b90826155d1565b90505b3681146117a757604051638e1192e160e01b81526004810182905236602482015260440161078f565b50815181146117d65781516040516324f7d61360e21b815260048101919091526024810182905260440161078f565b6117de611d95565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561182c5761182c613f1b565b600281111561183d5761183d613f1b565b905250905060028160200151600281111561185a5761185a613f1b565b1480156118ae5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106118965761189661501b565b6000918252602090912001546001600160a01b031633145b6118cb57604051631b41e11d60e31b815260040160405180910390fd5b5081606001511561197b5760208201516118e69060016155e4565b60ff16855114611909576040516371253a2560e01b815260040160405180910390fd5b835185511461192b5760405163a75d88af60e01b815260040160405180910390fd5b6000878760405161193d9291906155fd565b604051908190038120611954918b9060200161560d565b6040516020818303038152906040528051906020012090506119798a82888888612185565b505b6040805182815260208a8101356001600160401b03169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b81516000036119f15760405162bf199760e01b815260040160405180910390fd5b80516040805160008082526020820190925291159181611a34565b604080518082019091526000815260606020820152815260200190600190039081611a0c5790505b50905060005b8451811015610f7c57611a8a858281518110611a5857611a5861501b565b602002602001015184611a8457858381518110611a7757611a7761501b565b6020026020010151612342565b83612342565b600101611a3a565b6001600160401b038216600090815260076020526040812081611ab6608085615621565b6001600160401b031681526020810191909152604001600020549392505050565b80516001600160a01b0316611aff576040516342bcdf7f60e11b815260040160405180910390fd5b805160048054602080850180516001600160a01b039586167fffffffffffffffff0000000000000000000000000000000000000000000000009094168417600160a01b63ffffffff928316021790945560408087018051600580546001600160a01b031916918916919091179055815194855291519094169183019190915251909216908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d9060600160405180910390a150565b606088516001600160401b03811115611bd157611bd16139e5565b604051908082528060200260200182016040528015611c1657816020015b6040805180820190915260008082526020820152815260200190600190039081611bef5790505b509050811560005b8a51811015611d6b5781611cc857848482818110611c3e57611c3e61501b565b9050602002016020810190611c539190615647565b63ffffffff1615611cc857848482818110611c7057611c7061501b565b9050602002016020810190611c859190615647565b6040805163ffffffff9092166020830152016040516020818303038152906040528b8281518110611cb857611cb861501b565b6020026020010151608001819052505b611d468b8281518110611cdd57611cdd61501b565b60200260200101518b8b8b8b8b87818110611cfa57611cfa61501b565b9050602002810190611d0c9190615664565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bb692505050565b838281518110611d5857611d5861501b565b6020908102919091010152600101611c1e565b505098975050505050505050565b6000611d8483612eb4565b8015610a7a5750610a7a8383612eff565b467f0000000000000000000000000000000000000000000000000000000000000000146113e357604051630f01ce8560e01b81527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161078f565b336001600160a01b03821603611e555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161078f565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff16600003611ed1576000604051631b3fab5160e11b815260040161078f91906156aa565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003611f22576060840151600182018054911515620100000262ff000019909216919091179055611f5e565b6060840151600182015460ff6201000090910416151590151514611f5e576040516321fd80df60e21b815260ff8416600482015260240161078f565b60a084015180516101001015611f8a576001604051631b3fab5160e11b815260040161078f91906156aa565b611ff08484600301805480602002602001604051908101604052809291908181526020018280548015611fe657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611fc8575b5050505050612fa1565b8460600151156120fa5761205e8484600201805480602002602001604051908101604052809291908181526020018280548015611fe6576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611fc8575050505050612fa1565b60808501518051610100101561208a576002604051631b3fab5160e11b815260040161078f91906156aa565b604086015161209a9060036156c4565b60ff168151116120c0576003604051631b3fab5160e11b815260040161078f91906156aa565b805160018401805461ff00191661010060ff8416021790556120eb906002860190602084019061396b565b506120f88582600161300a565b505b6121068482600261300a565b805161211b906003850190602084019061396b565b5060408581015160018401805460ff191660ff8316179055865180855560a088015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936121749389939260028a019291906156e0565b60405180910390a1610f7c84613165565b8251600090815b818110156123385760006001888684602081106121ab576121ab61501b565b6121b891901a601b6155e4565b8985815181106121ca576121ca61501b565b60200260200101518986815181106121e4576121e461501b565b602002602001015160405160008152602001604052604051612222949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612244573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156122a5576122a5613f1b565b60028111156122b6576122b6613f1b565b90525090506001816020015160028111156122d3576122d3613f1b565b146122f157604051636518c33d60e11b815260040160405180910390fd5b8051600160ff9091161b85161561231b57604051633d9ef1f160e21b815260040160405180910390fd5b806000015160ff166001901b85179450505080600101905061218c565b5050505050505050565b81518151604051632cbc26bb60e01b8152608083901b67ffffffffffffffff60801b166004820152901515907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156123bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123e39190615100565b1561245457801561241257604051637edeb53960e11b81526001600160401b038316600482015260240161078f565b6040516001600160401b03831681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d8949339060200160405180910390a150505050565b600061245f8361168b565b600101805461246d906153bb565b80601f0160208091040260200160405190810160405280929190818152602001828054612499906153bb565b80156124e65780601f106124bb576101008083540402835291602001916124e6565b820191906000526020600020905b8154815290600101906020018083116124c957829003601f168201915b505050602088015151929350505060008190036125155760405162bf199760e01b815260040160405180910390fd5b856040015151811461253a576040516357e0e08360e01b815260040160405180910390fd5b6000816001600160401b03811115612554576125546139e5565b60405190808252806020026020018201604052801561257d578160200160208202803683370190505b50905060005b8281101561269e576000886020015182815181106125a3576125a361501b565b602002602001015190507f00000000000000000000000000000000000000000000000000000000000000006001600160401b03168160000151604001516001600160401b03161461261a5780516040908101519051631c21951160e11b81526001600160401b03909116600482015260240161078f565b866001600160401b03168160000151602001516001600160401b03161461266e57805160200151604051636c95f1eb60e01b81526001600160401b03808a166004830152909116602482015260440161078f565b61267881866131bc565b83838151811061268a5761268a61501b565b602090810291909101015250600101612583565b5060006126b586838a606001518b608001516132de565b9050806000036126e357604051633ee8bd3f60e11b81526001600160401b038716600482015260240161078f565b60005b838110156109ba5760005a905060008a60200151838151811061270b5761270b61501b565b6020026020010151905060006127298a836000015160600151610a2e565b9050600081600381111561273f5761273f613f1b565b148061275c5750600381600381111561275a5761275a613f1b565b145b6127b257815160600151604080516001600160401b03808e16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505050612bae565b60608915612891578b85815181106127cc576127cc61501b565b6020908102919091018101510151600454909150600090600160a01b900463ffffffff166127fa88426151b3565b119050808061281a5750600383600381111561281857612818613f1b565b145b612842576040516354e7e43160e11b81526001600160401b038d16600482015260240161078f565b8c86815181106128545761285461501b565b60200260200101516000015160001461288b578c86815181106128795761287961501b565b60209081029190910101515160808501525b506128fd565b60008260038111156128a5576128a5613f1b565b146128fd57825160600151604080516001600160401b03808f16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120910160405180910390a150505050612bae565b8251608001516001600160401b0316156129d657600082600381111561292557612925613f1b565b036129d6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e0e03cae8c85600001516080015186602001516040518463ffffffff1660e01b815260040161298693929190615792565b6020604051808303816000875af11580156129a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c99190615100565b6129d65750505050612bae565b60008d6040015186815181106129ee576129ee61501b565b6020026020010151905080518460a001515114612a3857835160600151604051631cfe6d8b60e01b81526001600160401b03808f166004830152909116602482015260440161078f565b612a4c8c856000015160600151600161331b565b600080612a5a8684866133c0565b91509150612a718e8760000151606001518461331b565b8c15612ac8576003826003811115612a8b57612a8b613f1b565b03612ac8576000856003811115612aa457612aa4613f1b565b14612ac857855151604051632b11b8d960e01b815261078f919083906004016157be565b6002826003811115612adc57612adc613f1b565b14612b21576003826003811115612af557612af5613f1b565b14612b21578d866000015160600151836040516349362d1f60e11b815260040161078f939291906157d7565b8560000151600001518660000151606001516001600160401b03168f6001600160401b03167f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b8d8c81518110612b7957612b7961501b565b602002602001015186865a612b8e908f6151b3565b604051612b9e94939291906157fc565b60405180910390a4505050505050505b6001016126e6565b60408051808201909152600080825260208201526000612bd98760200151613474565b60405163bbe4f6db60e01b81526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c699190615833565b90506001600160a01b0381161580612c985750612c966001600160a01b03821663aff2afbf60e01b611d79565b155b15612cc15760405163ae9b4ce960e01b81526001600160a01b038216600482015260240161078f565b600080612cec88858c60800151806020019051810190612ce1919061539e565b63ffffffff166134e8565b915091506000806000612d9f6040518061010001604052808e81526020018c6001600160401b031681526020018d6001600160a01b031681526020018f606001518152602001896001600160a01b031681526020018f6000015181526020018f6040015181526020018b815250604051602401612d699190615850565b60408051601f198184030181529190526020810180516001600160e01b0316633907753760e01b179052878661138860846135cb565b92509250925082612dc5578160405163e1cd550960e01b815260040161078f9190613d33565b8151602014612df4578151604051631e3be00960e21b815260206004820152602481019190915260440161078f565b600082806020019051810190612e0a919061591c565b9050866001600160a01b03168c6001600160a01b031614612e86576000612e3b8d8a612e36868a6151b3565b6134e8565b50905086811080612e55575081612e5288836151b3565b14155b15612e845760405163a966e21f60e01b815260048101839052602481018890526044810182905260640161078f565b505b604080518082019091526001600160a01b039098168852602088015250949550505050505095945050505050565b6000612ec7826301ffc9a760e01b612eff565b8015610a7d5750612ef8827fffffffff00000000000000000000000000000000000000000000000000000000612eff565b1592915050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000082166024820152600090819060440160408051601f19818403018152919052602080820180516001600160e01b03166301ffc9a760e01b178152825192935060009283928392909183918a617530fa92503d91506000519050828015612f8a575060208210155b8015612f965750600081115b979650505050505050565b60005b81518110156112255760ff831660009081526003602052604081208351909190849084908110612fd657612fd661501b565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101612fa4565b60005b8251811015610a2857600083828151811061302a5761302a61501b565b602002602001015190506000600281111561304757613047613f1b565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561308657613086613f1b565b146130a7576004604051631b3fab5160e11b815260040161078f91906156aa565b6001600160a01b0381166130ce5760405163d6c62c9b60e01b815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156130f4576130f4613f1b565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561315157613151613f1b565b02179055509050505080600101905061300d565b60ff81166105135760ff808216600090815260026020526040902060010154620100009004166131a857604051631e8ed32560e21b815260040160405180910390fd5b6009805467ffffffffffffffff1916905550565b815160208082015160409283015192516000938493613202937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615935565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d0151950151959761324b9794969395929491939101615967565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016132829190615a6b565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b6000806132ec8585856136a5565b6001600160401b038716600090815260086020908152604080832093835292905220549150505b949350505050565b6000600261332a6080856151dc565b6001600160401b031661333d9190615202565b9050600061334b8585611a92565b90508161335a600160046151b3565b901b19168183600381111561337157613371613f1b565b6001600160401b03871660009081526007602052604081209190921b9290921791829161339f608088615621565b6001600160401b031681526020810191909152604001600020555050505050565b60405163d434969160e01b8152600090606090309063d4349691906133ed90889088908890600401615b02565b600060405180830381600087803b15801561340757600080fd5b505af1925050508015613418575060015b613457573d808015613446576040519150601f19603f3d011682016040523d82523d6000602084013e61344b565b606091505b5060039250905061346c565b50506040805160208101909152600081526002905b935093915050565b6000815160201461349a578160405163046b337b60e51b815260040161078f9190613d33565b6000828060200190518101906134b0919061591c565b90506001600160a01b038111806134c8575061040081105b15610a7d578260405163046b337b60e51b815260040161078f9190613d33565b60008060008060006135498860405160240161351391906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052888861138860846135cb565b9250925092508261356f578160405163e1cd550960e01b815260040161078f9190613d33565b602082511461359e578151604051631e3be00960e21b815260206004820152602481019190915260440161078f565b818060200190518101906135b2919061591c565b6135bc82886151b3565b94509450505050935093915050565b6000606060008361ffff166001600160401b038111156135ed576135ed6139e5565b6040519080825280601f01601f191660200182016040528015613617576020820181803683370190505b509150863b6136315763030ed58f60e21b60005260046000fd5b5a8581101561364b57632be8ca8b60e21b60005260046000fd5b859003604081048103871061366b576337c3be2960e01b60005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561368e5750835b808352806000602085013e50955095509592505050565b82518251600091908183036136cd57604051630469ac9960e21b815260040160405180910390fd5b61010182118015906136e157506101018111155b6136fe576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613728576040516309bde33960e01b815260040160405180910390fd5b8060000361375557866000815181106137435761374361501b565b60200260200101519350505050613923565b6000816001600160401b0381111561376f5761376f6139e5565b604051908082528060200260200182016040528015613798578160200160208202803683370190505b50905060008080805b858110156138c25760006001821b8b8116036137fc57888510156137e5578c5160018601958e9181106137d6576137d661501b565b6020026020010151905061381e565b85516001850194879181106137d6576137d661501b565b8b5160018401938d9181106138135761381361501b565b602002602001015190505b60008986101561384e578d5160018701968f91811061383f5761383f61501b565b60200260200101519050613870565b86516001860195889181106138655761386561501b565b602002602001015190505b82851115613891576040516309bde33960e01b815260040160405180910390fd5b61389b828261392a565b8784815181106138ad576138ad61501b565b602090810291909101015250506001016137a1565b5060018503821480156138d457508683145b80156138df57508581145b6138fc576040516309bde33960e01b815260040160405180910390fd5b8360018603815181106139115761391161501b565b60200260200101519750505050505050505b9392505050565b60008183106139425761393d8284613948565b610a7a565b610a7a83835b6040805160016020820152908101839052606081018290526000906080016132c0565b8280548282559060005260206000209081019282156139c0579160200282015b828111156139c057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061398b565b506139cc9291506139d0565b5090565b5b808211156139cc57600081556001016139d1565b634e487b7160e01b600052604160045260246000fd5b604051608081016001600160401b0381118282101715613a1d57613a1d6139e5565b60405290565b604051606081016001600160401b0381118282101715613a1d57613a1d6139e5565b60405160a081016001600160401b0381118282101715613a1d57613a1d6139e5565b60405160c081016001600160401b0381118282101715613a1d57613a1d6139e5565b604080519081016001600160401b0381118282101715613a1d57613a1d6139e5565b604051601f8201601f191681016001600160401b0381118282101715613ad357613ad36139e5565b604052919050565b60006001600160401b03821115613af457613af46139e5565b5060051b60200190565b6001600160a01b038116811461051357600080fd5b80356001600160401b0381168114613b2a57600080fd5b919050565b801515811461051357600080fd5b8035613b2a81613b2f565b60006001600160401b03821115613b6157613b616139e5565b50601f01601f191660200190565b600082601f830112613b8057600080fd5b8135613b93613b8e82613b48565b613aab565b818152846020838601011115613ba857600080fd5b816020850160208301376000918101602001919091529392505050565b60006020808385031215613bd857600080fd5b82356001600160401b0380821115613bef57600080fd5b818501915085601f830112613c0357600080fd5b8135613c11613b8e82613adb565b81815260059190911b83018401908481019088831115613c3057600080fd5b8585015b83811015613cd657803585811115613c4c5760008081fd5b86016080818c03601f1901811315613c645760008081fd5b613c6c6139fb565b89830135613c7981613afe565b81526040613c88848201613b13565b8b830152606080850135613c9b81613b2f565b83830152928401359289841115613cb457600091508182fd5b613cc28f8d86880101613b6f565b908301525085525050918601918601613c34565b5098975050505050505050565b60005b83811015613cfe578181015183820152602001613ce6565b50506000910152565b60008151808452613d1f816020860160208601613ce3565b601f01601f19169290920160200192915050565b602081526000610a7a6020830184613d07565b8060608101831015610a7d57600080fd5b60008083601f840112613d6957600080fd5b5081356001600160401b03811115613d8057600080fd5b602083019150836020828501011115613d9857600080fd5b9250929050565b60008083601f840112613db157600080fd5b5081356001600160401b03811115613dc857600080fd5b6020830191508360208260051b8501011115613d9857600080fd5b60008060008060008060008060e0898b031215613dff57600080fd5b613e098a8a613d46565b975060608901356001600160401b0380821115613e2557600080fd5b613e318c838d01613d57565b909950975060808b0135915080821115613e4a57600080fd5b613e568c838d01613d9f565b909750955060a08b0135915080821115613e6f57600080fd5b50613e7c8b828c01613d9f565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215613eaa57600080fd5b613eb48585613d46565b925060608401356001600160401b03811115613ecf57600080fd5b613edb86828701613d57565b9497909650939450505050565b60008060408385031215613efb57600080fd5b613f0483613b13565b9150613f1260208401613b13565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110613f4157613f41613f1b565b9052565b60208101610a7d8284613f31565b8035613b2a81613afe565b63ffffffff8116811461051357600080fd5b600060608284031215613f8257600080fd5b613f8a613a23565b8235613f9581613afe565b81526020830135613fa581613f5e565b60208201526040830135613fb881613afe565b60408201529392505050565b600060208284031215613fd657600080fd5b81356001600160401b03811115613fec57600080fd5b820160a0818503121561392357600080fd5b803560ff81168114613b2a57600080fd5b60006020828403121561402157600080fd5b610a7a82613ffe565b60008151808452602080850194506020840160005b838110156140645781516001600160a01b03168752958201959082019060010161403f565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a08401526140be60e084018261402a565b90506040840151601f198483030160c08501526140db828261402a565b95945050505050565b600080604083850312156140f757600080fd5b61410083613b13565b946020939093013593505050565b600060a0828403121561412057600080fd5b614128613a45565b90508135815261413a60208301613b13565b602082015261414b60408301613b13565b604082015261415c60608301613b13565b606082015261416d60808301613b13565b608082015292915050565b600082601f83011261418957600080fd5b81356020614199613b8e83613adb565b82815260059290921b840181019181810190868411156141b857600080fd5b8286015b848110156142b25780356001600160401b03808211156141dc5760008081fd5b9088019060a0828b03601f19018113156141f65760008081fd5b6141fe613a45565b87840135838111156142105760008081fd5b61421e8d8a83880101613b6f565b825250604080850135848111156142355760008081fd5b6142438e8b83890101613b6f565b8a840152506060808601358581111561425c5760008081fd5b61426a8f8c838a0101613b6f565b838501525060809150818601358184015250828501359250838311156142905760008081fd5b61429e8d8a85880101613b6f565b9082015286525050509183019183016141bc565b509695505050505050565b600061014082840312156142d057600080fd5b6142d8613a67565b90506142e4838361410e565b815260a08201356001600160401b038082111561430057600080fd5b61430c85838601613b6f565b602084015260c084013591508082111561432557600080fd5b61433185838601613b6f565b604084015261434260e08501613f53565b6060840152610100840135608084015261012084013591508082111561436757600080fd5b5061437484828501614178565b60a08301525092915050565b60008060008060006060868803121561439857600080fd5b85356001600160401b03808211156143af57600080fd5b6143bb89838a016142bd565b965060208801359150808211156143d157600080fd5b6143dd89838a01613d9f565b909650945060408801359150808211156143f657600080fd5b5061440388828901613d9f565b969995985093965092949392505050565b600082601f83011261442557600080fd5b81356020614435613b8e83613adb565b82815260059290921b8401810191818101908684111561445457600080fd5b8286015b848110156142b25780356001600160401b038111156144775760008081fd5b6144858986838b01016142bd565b845250918301918301614458565b600082601f8301126144a457600080fd5b813560206144b4613b8e83613adb565b82815260059290921b840181019181810190868411156144d357600080fd5b8286015b848110156142b25780356001600160401b03808211156144f657600080fd5b818901915089603f83011261450a57600080fd5b8582013561451a613b8e82613adb565b81815260059190911b830160400190878101908c83111561453a57600080fd5b604085015b838110156145735780358581111561455657600080fd5b6145658f6040838a0101613b6f565b84525091890191890161453f565b508752505050928401925083016144d7565b600082601f83011261459657600080fd5b813560206145a6613b8e83613adb565b8083825260208201915060208460051b8701019350868411156145c857600080fd5b602086015b848110156142b257803583529183019183016145cd565b600082601f8301126145f557600080fd5b81356020614605613b8e83613adb565b82815260059290921b8401810191818101908684111561462457600080fd5b8286015b848110156142b25780356001600160401b03808211156146485760008081fd5b9088019060a0828b03601f19018113156146625760008081fd5b61466a613a45565b614675888501613b13565b81526040808501358481111561468b5760008081fd5b6146998e8b83890101614414565b8a84015250606080860135858111156146b25760008081fd5b6146c08f8c838a0101614493565b83850152506080915081860135858111156146db5760008081fd5b6146e98f8c838a0101614585565b9184019190915250919093013590830152508352918301918301614628565b6000806040838503121561471b57600080fd5b6001600160401b038335111561473057600080fd5b61473d84843585016145e4565b91506001600160401b036020840135111561475757600080fd5b6020830135830184601f82011261476d57600080fd5b61477a613b8e8235613adb565b81358082526020808301929160051b84010187101561479857600080fd5b602083015b6020843560051b850101811015614941576001600160401b03813511156147c357600080fd5b87603f8235860101126147d557600080fd5b6147e8613b8e6020833587010135613adb565b81358501602081810135808452908301929160059190911b016040018a101561481057600080fd5b604083358701015b83358701602081013560051b01604001811015614931576001600160401b038135111561484457600080fd5b833587018135016040818d03603f1901121561485f57600080fd5b614867613a89565b604082013581526001600160401b036060830135111561488657600080fd5b8c605f60608401358401011261489b57600080fd5b60406060830135830101356148b2613b8e82613adb565b808282526020820191508f60608460051b60608801358801010111156148d757600080fd5b6060808601358601015b60608460051b606088013588010101811015614911576149018135613f5e565b80358352602092830192016148e1565b508060208501525050508085525050602083019250602081019050614818565b508452506020928301920161479d565b508093505050509250929050565b60006020828403121561496157600080fd5b610a7a82613b13565b602081526001600160a01b0382511660208201526020820151151560408201526001600160401b0360408301511660608201526000606083015160808084015261331360a0840182613d07565b6000602082840312156149c957600080fd5b813561392381613afe565b600082601f8301126149e557600080fd5b813560206149f5613b8e83613adb565b8083825260208201915060208460051b870101935086841115614a1757600080fd5b602086015b848110156142b2578035614a2f81613afe565b8352918301918301614a1c565b60006020808385031215614a4f57600080fd5b82356001600160401b0380821115614a6657600080fd5b818501915085601f830112614a7a57600080fd5b8135614a88613b8e82613adb565b81815260059190911b83018401908481019088831115614aa757600080fd5b8585015b83811015613cd657803585811115614ac257600080fd5b860160c0818c03601f19011215614ad95760008081fd5b614ae1613a67565b8882013581526040614af4818401613ffe565b8a8301526060614b05818501613ffe565b8284015260809150614b18828501613b3d565b9083015260a08381013589811115614b305760008081fd5b614b3e8f8d838801016149d4565b838501525060c0840135915088821115614b585760008081fd5b614b668e8c848701016149d4565b9083015250845250918601918601614aab565b80356001600160e01b0381168114613b2a57600080fd5b600082601f830112614ba157600080fd5b81356020614bb1613b8e83613adb565b82815260069290921b84018101918181019086841115614bd057600080fd5b8286015b848110156142b25760408189031215614bed5760008081fd5b614bf5613a89565b614bfe82613b13565b8152614c0b858301614b79565b81860152835291830191604001614bd4565b600082601f830112614c2e57600080fd5b81356020614c3e613b8e83613adb565b82815260059290921b84018101918181019086841115614c5d57600080fd5b8286015b848110156142b25780356001600160401b0380821115614c815760008081fd5b9088019060a0828b03601f1901811315614c9b5760008081fd5b614ca3613a45565b614cae888501613b13565b815260408085013584811115614cc45760008081fd5b614cd28e8b83890101613b6f565b8a8401525060609350614ce6848601613b13565b908201526080614cf7858201613b13565b93820193909352920135908201528352918301918301614c61565b600082601f830112614d2357600080fd5b81356020614d33613b8e83613adb565b82815260069290921b84018101918181019086841115614d5257600080fd5b8286015b848110156142b25760408189031215614d6f5760008081fd5b614d77613a89565b813581528482013585820152835291830191604001614d56565b60006020808385031215614da457600080fd5b82356001600160401b0380821115614dbb57600080fd5b9084019060608287031215614dcf57600080fd5b614dd7613a23565b823582811115614de657600080fd5b83016040818903811315614df957600080fd5b614e01613a89565b823585811115614e1057600080fd5b8301601f81018b13614e2157600080fd5b8035614e2f613b8e82613adb565b81815260069190911b8201890190898101908d831115614e4e57600080fd5b928a01925b82841015614e9e5785848f031215614e6b5760008081fd5b614e73613a89565b8435614e7e81613afe565b8152614e8b858d01614b79565b818d0152825292850192908a0190614e53565b845250505082870135915084821115614eb657600080fd5b614ec28a838501614b90565b81880152835250508284013582811115614edb57600080fd5b614ee788828601614c1d565b85830152506040830135935081841115614f0057600080fd5b614f0c87858501614d12565b60408201529695505050505050565b600082825180855260208086019550808260051b84010181860160005b84811015614fac57601f19868403018952815160a06001600160401b03808351168652868301518288880152614f7083880182613d07565b60408581015184169089015260608086015190931692880192909252506080928301519290950191909152509783019790830190600101614f38565b5090979650505050505050565b60006040808352614fcd6040840186614f1b565b83810360208581019190915285518083528682019282019060005b8181101561500d57845180518452840151848401529383019391850191600101614fe8565b509098975050505050505050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561508857835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615051565b50508583015187820388850152805180835290840192506000918401905b808310156150e157835180516001600160401b031683528501516001600160e01b0316858301529284019260019290920191908501906150a6565b50979650505050505050565b602081526000610a7a6020830184615031565b60006020828403121561511257600080fd5b815161392381613b2f565b634e487b7160e01b600052601160045260246000fd5b6001600160401b038181168382160190808211156151535761515361511d565b5092915050565b60408152600061516d6040830185614f1b565b82810360208401526140db8185615031565b60006020828403121561519157600080fd5b81356001600160401b038111156151a757600080fd5b613313848285016145e4565b81810381811115610a7d57610a7d61511d565b634e487b7160e01b600052601260045260246000fd5b60006001600160401b03808416806151f6576151f66151c6565b92169190910692915050565b8082028115828204841417610a7d57610a7d61511d565b80518252600060206001600160401b0381840151168185015260408084015160a0604087015261524c60a0870182613d07565b9050606085015186820360608801526152658282613d07565b608087810151898303918a01919091528051808352908601935060009250908501905b808310156150e157835180516001600160a01b0316835286015186830152928501926001929092019190840190615288565b602081526000610a7a6020830184615219565b6080815260006152e06080830187615219565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561531e57600080fd5b835161532981613b2f565b60208501519093506001600160401b0381111561534557600080fd5b8401601f8101861361535657600080fd5b8051615364613b8e82613b48565b81815287602083850101111561537957600080fd5b61538a826020830160208601613ce3565b809450505050604084015190509250925092565b6000602082840312156153b057600080fd5b815161392381613f5e565b600181811c908216806153cf57607f821691505b6020821081036153ef57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115611225576000816000526020600020601f850160051c8101602086101561541e5750805b601f850160051c820191505b8181101561543d5782815560010161542a565b505050505050565b81516001600160401b0381111561545e5761545e6139e5565b6154728161546c84546153bb565b846153f5565b602080601f8311600181146154a7576000841561548f5750858301515b600019600386901b1c1916600185901b17855561543d565b600085815260208120601f198616915b828110156154d6578886015182559484019460019091019084016154b7565b50858210156154f45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835283546001600160a01b038116602085015260ff8160a01c16151560408501526001600160401b038160a81c16606085015250600180850160808086015260008154615555816153bb565b8060a089015260c060018316600081146155765760018114615592576155c2565b60ff19841660c08b015260c083151560051b8b010194506155c2565b85600052602060002060005b848110156155b95781548c820185015290880190890161559e565b8b0160c0019550505b50929998505050505050505050565b80820180821115610a7d57610a7d61511d565b60ff8181168382160190811115610a7d57610a7d61511d565b8183823760009101908152919050565b828152606082602083013760800192915050565b60006001600160401b038084168061563b5761563b6151c6565b92169190910492915050565b60006020828403121561565957600080fd5b813561392381613f5e565b6000808335601e1984360301811261567b57600080fd5b8301803591506001600160401b0382111561569557600080fd5b602001915036819003821315613d9857600080fd5b60208101600583106156be576156be613f1b565b91905290565b60ff81811683821602908116908181146151535761515361511d565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b818110156157385784546001600160a01b031683526001948501949284019201615713565b50508481036060860152865180825290820192508187019060005b818110156157785782516001600160a01b031685529383019391830191600101615753565b50505060ff851660808501525090505b9695505050505050565b60006001600160401b038086168352808516602084015250606060408301526140db6060830184613d07565b8281526040602082015260006133136040830184613d07565b6001600160401b03848116825283166020820152606081016133136040830184613f31565b84815261580c6020820185613f31565b6080604082015260006158226080830185613d07565b905082606083015295945050505050565b60006020828403121561584557600080fd5b815161392381613afe565b602081526000825161010080602085015261586f610120850183613d07565b9150602085015161588b60408601826001600160401b03169052565b5060408501516001600160a01b0381166060860152506060850151608085015260808501516158c560a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526158e28483613d07565b935060c08701519150808685030160e08701526158ff8483613d07565b935060e08701519150808685030183870152506157888382613d07565b60006020828403121561592e57600080fd5b5051919050565b84815260006001600160401b038086166020840152808516604084015250608060608301526157886080830184613d07565b86815260c06020820152600061598060c0830188613d07565b6001600160a01b03969096166040830152506001600160401b039384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015614fac57601f19868403018952815160a081518186526159fc82870182613d07565b9150508582015185820387870152615a148282613d07565b91505060408083015186830382880152615a2e8382613d07565b92505050606080830151818701525060808083015192508582038187015250615a578183613d07565b9a86019a94505050908301906001016159d6565b602081526000610a7a60208301846159b9565b60008282518085526020808601955060208260051b8401016020860160005b84811015614fac57601f19868403018952615ab9838351613d07565b98840198925090830190600101615a9d565b60008151808452602080850194506020840160005b8381101561406457815163ffffffff1687529582019590820190600101615ae0565b60608152600084518051606084015260208101516001600160401b0380821660808601528060408401511660a08601528060608401511660c08601528060808401511660e0860152505050602085015161014080610100850152615b6a6101a0850183613d07565b91506040870151605f198086850301610120870152615b898483613d07565b935060608901519150615ba6838701836001600160a01b03169052565b608089015161016087015260a0890151925080868503016101808701525050615bcf82826159b9565b9150508281036020840152615be48186615a7e565b905082810360408401526157888185615acb56fea164736f6c6343000818000a", } var OffRampABI = OffRampMetaData.ABI @@ -557,27 +560,27 @@ func (_OffRamp *OffRampTransactorSession) Execute(reportContext [3][32]byte, rep return _OffRamp.Contract.Execute(&_OffRamp.TransactOpts, reportContext, report) } -func (_OffRamp *OffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData) +func (_OffRamp *OffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData) +func (_OffRamp *OffRampSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampTransactorSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) { - return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData) +func (_OffRamp *OffRampTransactorSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) } -func (_OffRamp *OffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.contract.Transact(opts, "manuallyExecute", reports, gasLimitOverrides) } -func (_OffRamp *OffRampSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) } -func (_OffRamp *OffRampTransactorSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) { +func (_OffRamp *OffRampTransactorSession) ManuallyExecute(reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) } @@ -2404,7 +2407,7 @@ func (OffRampConfigSet) Topic() common.Hash { } func (OffRampDynamicConfigSet) Topic() common.Hash { - return common.HexToHash("0xa55bd56595c45f517e5967a3067f3dca684445a3080e7c04a4e0d5a40cda627d") + return common.HexToHash("0xa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d") } func (OffRampExecutionStateChanged) Topic() common.Hash { @@ -2480,9 +2483,9 @@ type OffRampInterface interface { Execute(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte) (*types.Transaction, error) - ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte) (*types.Transaction, error) + ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) - ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) + ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OffRampDynamicConfig) (*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 fca7e971c4..9908bcfcd8 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 @@ -23,7 +23,7 @@ multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRate multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin 6b56e0114a4d50797d30a34aecc2641ef340451d0c3fcb9d729bba4df2435122 nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536 ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin 9254b35a86f00fde7b7193a033ca58f6521a66e87b9cf9da6ce5660082e79f5d -offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin ec0e067fe9cd81ff009b813be775638f53e6c4f17e38610a724304885c96cbf2 +offramp: ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.abi ../../../contracts/solc/v0.8.24/OffRamp/OffRamp.bin d7f33e895b1b282930c81ac4e19ec51f6a7900fe6dddda3a7ba1b2796eacff32 onramp: ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.abi ../../../contracts/solc/v0.8.24/OnRamp/OnRamp.bin 594439983f963f4158f9c5009dee7cba4ee56be61900bb1d5b9108eaeac3d6a6 ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin c1c2f8a65c7ffd971899cae7fe62f2da57d09e936151e2b92163c4bebe699d6b price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin e7781d600c1bb7aa4620106af7f6e146a109b97f4cb6a7d06c9e15773340ecb2