From 9900b28b1ae9ed66421b25c6c692d90ca8541b1a Mon Sep 17 00:00:00 2001 From: Evaldas Latoskinas Date: Tue, 11 Jun 2024 20:33:35 +0200 Subject: [PATCH 1/4] feat: make offramp metadataHash configurable with uniqueness check --- contracts/.changeset/popular-poets-reflect.md | 5 + contracts/gas-snapshots/ccip.gas-snapshot | 272 ++++++++-------- .../v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol | 48 +-- .../v0.8/ccip/test/e2e/MultiRampsEnd2End.sol | 9 +- .../helpers/EVM2EVMMultiOffRampHelper.sol | 4 - .../test/offRamp/EVM2EVMMultiOffRamp.t.sol | 304 +++++++----------- .../offRamp/EVM2EVMMultiOffRampSetup.t.sol | 31 +- .../evm_2_evm_multi_offramp.go | 9 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 9 files changed, 309 insertions(+), 375 deletions(-) create mode 100644 contracts/.changeset/popular-poets-reflect.md diff --git a/contracts/.changeset/popular-poets-reflect.md b/contracts/.changeset/popular-poets-reflect.md new file mode 100644 index 0000000000..c6eb4e9726 --- /dev/null +++ b/contracts/.changeset/popular-poets-reflect.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts-ccip': minor +--- + +#changed Configurable metadataHash for MultiOffRamp diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 4af4b21269..45d471aa45 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -69,144 +69,142 @@ E2E:test_E2E_3MessagesSuccess_gas() (gas: 1106837) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38297) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108537) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116989) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 262944) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 93628) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12398) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 87827) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 87538) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 87686) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 102183) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 12487) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 12462) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 278563) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 223913) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 149702) -EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 178741) -EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 136083) -EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 520278) -EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10487) -EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17112) -EVM2EVMMultiOffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 66098) -EVM2EVMMultiOffRamp_commit:test_InvalidInterval_Revert() (gas: 59748) -EVM2EVMMultiOffRamp_commit:test_InvalidRootRevert() (gas: 58828) -EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6589672) -EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 6172841) -EVM2EVMMultiOffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 108294) -EVM2EVMMultiOffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 118230) -EVM2EVMMultiOffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 108270) -EVM2EVMMultiOffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 160084) -EVM2EVMMultiOffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 135123) -EVM2EVMMultiOffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 136820) -EVM2EVMMultiOffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59096) -EVM2EVMMultiOffRamp_commit:test_StaleReportWithRoot_Success() (gas: 225356) -EVM2EVMMultiOffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 119693) -EVM2EVMMultiOffRamp_commit:test_Unhealthy_Revert() (gas: 77594) -EVM2EVMMultiOffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 207937) -EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6584042) -EVM2EVMMultiOffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47717) -EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 6242606) -EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 101021) -EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 97965) -EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 101074) -EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 95722) -EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 95789) -EVM2EVMMultiOffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17299) -EVM2EVMMultiOffRamp_execute:test_LargeBatch_Success() (gas: 1490148) -EVM2EVMMultiOffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 330182) -EVM2EVMMultiOffRamp_execute:test_MultipleReports_Success() (gas: 247239) -EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6640018) -EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6222985) -EVM2EVMMultiOffRamp_execute:test_NonArray_Revert() (gas: 30044) -EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 156627) -EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 140575) -EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 7002111) -EVM2EVMMultiOffRamp_execute:test_ZeroReports_Revert() (gas: 17174) -EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20709) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 255851) -EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 22860) -EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 208240) -EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 50948) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 50458) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 235451) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 91273) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 288058) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 95383) -EVM2EVMMultiOffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 37472) -EVM2EVMMultiOffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 24087) -EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidMessageId_Revert() (gas: 41948) -EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 448634) -EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 53653) -EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingOnRampAddress_Revert() (gas: 44740) -EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingSourceChainSelector_Revert() (gas: 41840) -EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37658) -EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 170378) -EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 182190) -EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47177) -EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 405951) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 233102) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 180689) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 251836) -EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 119083) -EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 383789) -EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 56096) -EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 51403) -EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 528700) -EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 466304) -EVM2EVMMultiOffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 38177) -EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 518752) -EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 516084) -EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 483321) -EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 147823) -EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 239478) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 239370) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 289847) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 270573) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247753) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 235728) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 7174963) -EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 136472) -EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3652910) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 254592) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 91131) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12354) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_DuplicateMetadataHashOnSameUpdate_Revert() (gas: 87916) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_DuplicateMetadataHash_Revert() (gas: 89002) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainMetadataHash_Revert() (gas: 86965) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 87072) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 98775) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroMetadataHash_Revert() (gas: 14549) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 12612) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 278605) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 223955) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 149658) +EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 178697) +EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 136125) +EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 520190) +EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10443) +EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17155) +EVM2EVMMultiOffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 63870) +EVM2EVMMultiOffRamp_commit:test_InvalidInterval_Revert() (gas: 59815) +EVM2EVMMultiOffRamp_commit:test_InvalidRootRevert() (gas: 58895) +EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6529284) +EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 6112474) +EVM2EVMMultiOffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 108339) +EVM2EVMMultiOffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 118364) +EVM2EVMMultiOffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 108315) +EVM2EVMMultiOffRamp_commit:test_ReportAndPriceUpdate_Success() (gas: 157841) +EVM2EVMMultiOffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 132869) +EVM2EVMMultiOffRamp_commit:test_RootAlreadyCommitted_Revert() (gas: 136954) +EVM2EVMMultiOffRamp_commit:test_SourceChainNotEnabled_Revert() (gas: 59163) +EVM2EVMMultiOffRamp_commit:test_StaleReportWithRoot_Success() (gas: 222901) +EVM2EVMMultiOffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 119760) +EVM2EVMMultiOffRamp_commit:test_Unhealthy_Revert() (gas: 77661) +EVM2EVMMultiOffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 205758) +EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6523654) +EVM2EVMMultiOffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47784) +EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 6185332) +EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 101140) +EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 97849) +EVM2EVMMultiOffRamp_constructor:test_ZeroMetadataHash_Revert() (gas: 103071) +EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 95606) +EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 95695) +EVM2EVMMultiOffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17277) +EVM2EVMMultiOffRamp_execute:test_LargeBatch_Success() (gas: 1490126) +EVM2EVMMultiOffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 330246) +EVM2EVMMultiOffRamp_execute:test_MultipleReports_Success() (gas: 247217) +EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6579541) +EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6162529) +EVM2EVMMultiOffRamp_execute:test_NonArray_Revert() (gas: 30022) +EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 156605) +EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 140553) +EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6941613) +EVM2EVMMultiOffRamp_execute:test_ZeroReports_Revert() (gas: 17152) +EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20721) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 255863) +EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 22872) +EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 208252) +EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 50960) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 50470) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 234451) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 91371) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 288082) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 95481) +EVM2EVMMultiOffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 37462) +EVM2EVMMultiOffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 24043) +EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidMessageId_Revert() (gas: 41938) +EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 446495) +EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 53686) +EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingMetadataHash_Revert() (gas: 43654) +EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingSourceChainSelector_Revert() (gas: 41808) +EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 37648) +EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 169356) +EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 181060) +EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 47167) +EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 404842) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 233277) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 179645) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 250727) +EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 119061) +EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 382676) +EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 54965) +EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 51393) +EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 527673) +EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 470780) +EVM2EVMMultiOffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 38145) +EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 518756) +EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 516088) +EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 483323) +EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 147769) +EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 239609) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 238360) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 287816) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 267653) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 244909) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 233226) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 7117958) +EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 136462) +EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3636080) EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118102) -EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87240) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 80029) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28684) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 152312) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 199879) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28213) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160718) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 497791) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2371474) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 201989) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 202563) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 651271) -EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 287191) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 10983) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11029) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 9135) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 165404) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 26964) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 63569) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44686) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 80707) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 185601) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 284048) -EVM2EVMMultiOffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11420) -EVM2EVMMultiOffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 211875) -EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14223) -EVM2EVMMultiOffRamp_setDynamicConfig:test_PriceRegistryZeroAddress_Revert() (gas: 11729) -EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 13885) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 55566) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 33576) -EVM2EVMMultiOffRamp_setLatestPriceSequenceNumber:test_OnlyOwner_Revert() (gas: 11033) -EVM2EVMMultiOffRamp_setLatestPriceSequenceNumber:test_PriceEpochCleared_Success() (gas: 242133) +EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87207) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79965) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28674) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 151290) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 198728) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 28203) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 160622) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 496639) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2370345) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 200837) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 201411) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 645818) +EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 286066) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 165426) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 26986) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 63591) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44708) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 80729) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 185623) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 284065) +EVM2EVMMultiOffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11398) +EVM2EVMMultiOffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 211887) +EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14289) +EVM2EVMMultiOffRamp_setDynamicConfig:test_PriceRegistryZeroAddress_Revert() (gas: 11795) +EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 13951) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 55652) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 33662) +EVM2EVMMultiOffRamp_setLatestPriceSequenceNumber:test_OnlyOwner_Revert() (gas: 11077) +EVM2EVMMultiOffRamp_setLatestPriceSequenceNumber:test_PriceEpochCleared_Success() (gas: 242048) EVM2EVMMultiOffRamp_setLatestPriceSequenceNumber:test_setLatestPriceSequenceNumber_Success() (gas: 20534) -EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 243929) -EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 252586) -EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 306761) -EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 286008) -EVM2EVMMultiOffRamp_verify:test_Blessed_Success() (gas: 176393) -EVM2EVMMultiOffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178464) -EVM2EVMMultiOffRamp_verify:test_NotBlessed_Success() (gas: 138858) +EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 243907) +EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 252564) +EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 306695) +EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 285986) +EVM2EVMMultiOffRamp_verify:test_Blessed_Success() (gas: 176471) +EVM2EVMMultiOffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178542) +EVM2EVMMultiOffRamp_verify:test_NotBlessed_Success() (gas: 138936) EVM2EVMMultiOffRamp_verify:test_TooManyLeaves_Revert() (gas: 51501) EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 33520) EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16645) @@ -600,7 +598,7 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24191) MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61409) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39890) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32973) -MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1395580) +MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1395604) OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12171) OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42233) OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84124) diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol index 1b6ed6eb21..cabf33b598 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol @@ -25,8 +25,8 @@ import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts /// @notice EVM2EVMOffRamp enables OCR networks to execute multiple messages /// in an OffRamp in a single transaction. -/// @dev The EVM2EVMOnRamp, CommitStore and EVM2EVMOffRamp form an xchain upgradeable unit. Any change to one of them -/// results an onchain upgrade of all 3. +/// @dev The EVM2EVMMultiOnRamp and EVM2EVMMultiOffRamp form an xchain upgradeable unit. Any change to one of them +/// results an onchain upgrade of both contracts. /// @dev MultiOCR3Base is used to store multiple OCR configs for both the OffRamp and the CommitStore. /// The execution plugin type has to be configured without signature verification, and the commit /// plugin type with verification. @@ -60,6 +60,8 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 error StaleCommitReport(); error InvalidInterval(uint64 sourceChainSelector, Interval interval); error ZeroAddressNotAllowed(); + error DuplicateMetadataHash(bytes32 metadataHash); + error ZeroMetadataHashNotAllowed(); /// @dev Atlas depends on this event, if changing, please notify Atlas. event StaticConfigSet(StaticConfig staticConfig); @@ -94,12 +96,10 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 struct SourceChainConfig { bool isEnabled; // ─────────╮ Flag whether the source chain is enabled or not uint64 minSeqNr; // | The min sequence number expected for future messages - address prevOffRamp; // ────╯ Address of previous-version per-lane OffRamp. Used to be able to provide sequencing continuity during a zero downtime upgrade. - address onRamp; // OnRamp address on the source chain + address prevOffRamp; // ────╯ Address of previous-version per-lane OffRamp. Used to be able to provide seequencing continuity during a zero downtime upgrade. /// @dev Ensures that 2 identical messages sent to 2 different lanes will have a distinct hash. - /// Must match the metadataHash used in computing leaf hashes offchain for the root committed in - /// the commitStore and i_metadataHash in the onRamp. - bytes32 metadataHash; // Source-chain specific message hash preimage to ensure global uniqueness + /// Must match the meatdataHash on the onRamp. + bytes32 metadataHash; // Source-chain specific message hash preimage to ensure global uniqueness } /// @notice SourceChainConfig update args scoped to one source chain @@ -107,7 +107,7 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 uint64 sourceChainSelector; // ───╮ Source chain selector of the config to update bool isEnabled; // │ Flag whether the source chain is enabled or not address prevOffRamp; // ───────────╯ Address of previous-version per-lane OffRamp. Used to be able to provide sequencing continuity during a zero downtime upgrade. - address onRamp; // OnRamp address on the source chain + bytes32 metadataHash; // Source-chain specific message hash preimage to ensure global uniqueness } /// @notice Dynamic offRamp config @@ -163,6 +163,8 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 /// @notice SourceConfig per chain /// (forms lane configurations from sourceChainSelector => StaticConfig.chainSelector) mapping(uint64 sourceChainSelector => SourceChainConfig sourceChainConfig) internal s_sourceChainConfigs; + /// @notice Set of used metadata hashes - used to prevent configuring the same metadataHash more than once + mapping(bytes32 metadataHash => bool isActive) internal s_usedMetadataHashSet; // STATE /// @dev The expected nonce for a given sender per source chain. @@ -591,11 +593,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 if (!success) revert ReceiverError(returnData); } - /// @notice creates a unique hash to be used in message hashing. - function _metadataHash(uint64 sourceChainSelector, address onRamp, bytes32 prefix) internal view returns (bytes32) { - return keccak256(abi.encode(prefix, sourceChainSelector, i_chainSelector, onRamp)); - } - // ================================================================ // │ Commit │ // ================================================================ @@ -790,23 +787,28 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 revert ZeroChainSelectorNotAllowed(); } - if (sourceConfigUpdate.onRamp == address(0)) { - revert ZeroAddressNotAllowed(); - } - SourceChainConfig storage currentConfig = s_sourceChainConfigs[sourceChainSelector]; // OnRamp can never be zero - if it is, then the source chain has been added for the first time - if (currentConfig.onRamp == address(0)) { - currentConfig.metadataHash = - _metadataHash(sourceChainSelector, sourceConfigUpdate.onRamp, Internal.EVM_2_EVM_MESSAGE_HASH); - currentConfig.onRamp = sourceConfigUpdate.onRamp; + if (currentConfig.metadataHash == bytes32("")) { + bytes32 newMetadataHash = sourceConfigUpdate.metadataHash; + + if (newMetadataHash == bytes32("")) { + revert ZeroMetadataHashNotAllowed(); + } + + if (s_usedMetadataHashSet[newMetadataHash]) { + revert DuplicateMetadataHash(newMetadataHash); + } + s_usedMetadataHashSet[newMetadataHash] = true; + + currentConfig.metadataHash = newMetadataHash; currentConfig.prevOffRamp = sourceConfigUpdate.prevOffRamp; currentConfig.minSeqNr = 1; - emit SourceChainSelectorAdded(sourceChainSelector); } else if ( - currentConfig.onRamp != sourceConfigUpdate.onRamp || currentConfig.prevOffRamp != sourceConfigUpdate.prevOffRamp + currentConfig.metadataHash != sourceConfigUpdate.metadataHash + || currentConfig.prevOffRamp != sourceConfigUpdate.prevOffRamp ) { revert InvalidStaticConfig(sourceChainSelector); } diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol index 3ab36ab469..e8fc591b33 100644 --- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol +++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol @@ -75,13 +75,18 @@ contract MultiRampsE2E is EVM2EVMMultiOnRampSetup, EVM2EVMMultiOffRampSetup { sourceChainSelector: SOURCE_CHAIN_SELECTOR, isEnabled: true, prevOffRamp: address(0), - onRamp: address(s_onRamp) + // Must match OnRamp's metadataHash + metadataHash: keccak256( + abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR, DEST_CHAIN_SELECTOR, address(s_onRamp)) + ) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR + 1, isEnabled: true, prevOffRamp: address(0), - onRamp: address(s_onRamp2) + metadataHash: keccak256( + abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR + 1, DEST_CHAIN_SELECTOR, address(s_onRamp2)) + ) }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol index 83b9569425..cd4c467da4 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol @@ -26,10 +26,6 @@ contract EVM2EVMMultiOffRampHelper is EVM2EVMMultiOffRamp, IgnoreContractSize { return s_executionStates[sourceChainSelector][bitmapIndex]; } - function metadataHash(uint64 sourceChainSelector, address onRamp) external view returns (bytes32) { - return _metadataHash(sourceChainSelector, onRamp, Internal.EVM_2_EVM_MESSAGE_HASH); - } - function releaseOrMintSingleToken( uint256 sourceTokenAmount, bytes calldata originalSender, diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol index 39dc2b61df..6b4e7e1bd0 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol @@ -49,31 +49,29 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, + metadataHash: METADATA_HASH_2, isEnabled: true, - prevOffRamp: address(0), - onRamp: address(uint160(ON_RAMP_ADDRESS_1) + 1) + prevOffRamp: address(0) }); EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig1 = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - onRamp: sourceChainConfigs[0].onRamp, - metadataHash: s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, sourceChainConfigs[0].onRamp) + metadataHash: METADATA_HASH_1 }); EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig2 = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - onRamp: sourceChainConfigs[1].onRamp, - metadataHash: s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1 + 1, sourceChainConfigs[1].onRamp) + metadataHash: METADATA_HASH_2 }); vm.expectEmit(); @@ -144,7 +142,7 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { } // Revert - function test_ZeroOnRampAddress_Revert() public { + function test_ZeroMetadataHash_Revert() public { uint64[] memory sourceChainSelectors = new uint64[](1); sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1; @@ -152,12 +150,12 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: bytes32(""), isEnabled: true, - prevOffRamp: address(0), - onRamp: address(0) + prevOffRamp: address(0) }); - vm.expectRevert(EVM2EVMMultiOffRamp.ZeroAddressNotAllowed.selector); + vm.expectRevert(EVM2EVMMultiOffRamp.ZeroMetadataHashNotAllowed.selector); s_offRamp = new EVM2EVMMultiOffRampHelper( EVM2EVMMultiOffRamp.StaticConfig({ @@ -177,9 +175,9 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: 0, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: address(0) + prevOffRamp: address(0) }); vm.expectRevert(EVM2EVMMultiOffRamp.ZeroChainSelectorNotAllowed.selector); @@ -310,74 +308,6 @@ contract EVM2EVMMultiOffRamp_setDynamicConfig is EVM2EVMMultiOffRampSetup { } } -contract EVM2EVMMultiOffRamp_metadataHash is EVM2EVMMultiOffRampSetup { - function test_MetadataHash_Success() public view { - bytes32 h = s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - assertEq( - h, - keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_1, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_1) - ) - ); - } - - function test_MetadataHashChangesOnSourceChain_Success() public view { - bytes32 h = s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1 + 1, ON_RAMP_ADDRESS_1); - assertEq( - h, - keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_1 + 1, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_1) - ) - ); - assertTrue(h != s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); - } - - function test_MetadataHashChangesOnOnRampAddress_Success() public view { - address mockOnRampAddress = address(uint160(ON_RAMP_ADDRESS_1) + 1); - bytes32 h = s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, mockOnRampAddress); - assertEq( - h, - keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_1, DEST_CHAIN_SELECTOR, mockOnRampAddress) - ) - ); - assertTrue(h != s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); - } - - // NOTE: to get a reliable result, set fuzz runs to at least 1mil - /// forge-config: default.fuzz.runs = 32 - /// forge-config: ccip.fuzz.runs = 10000 - function test_Fuzz__MetadataHash_NoCollisions( - uint64 destChainSelector, - uint64 sourceChainSelector1, - uint64 sourceChainSelector2, - address onRamp1, - address onRamp2 - ) public { - // Edge case: metadata hash should be the same when values match - if (sourceChainSelector1 == sourceChainSelector2 && onRamp1 == onRamp2) { - return; - } - - // Disallow 0 source chain selectors - vm.assume(sourceChainSelector1 != 0); - vm.assume(sourceChainSelector2 != 0); - vm.assume(destChainSelector != 0); - - EVM2EVMMultiOffRamp.StaticConfig memory staticConfig = s_offRamp.getStaticConfig(); - EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = - new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](0); - - staticConfig.chainSelector = destChainSelector; - s_offRamp = new EVM2EVMMultiOffRampHelper(staticConfig, sourceChainConfigs); - - bytes32 h1 = s_offRamp.metadataHash(sourceChainSelector1, onRamp1); - bytes32 h2 = s_offRamp.metadataHash(sourceChainSelector2, onRamp2); - - assertTrue(h1 != h2); - } -} - contract EVM2EVMMultiOffRamp_ccipReceive is EVM2EVMMultiOffRampSetup { // Reverts @@ -412,8 +342,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -461,8 +390,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -485,8 +413,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce++; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.SkippedIncorrectNonce( @@ -500,8 +427,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[1].nonce++; - messages[1].messageId = - Internal._hash(messages[1], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -544,8 +470,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); messages[0].receiver = address(newReceiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -583,8 +508,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].messageId = - Internal._hash(messages[1], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -614,8 +538,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].messageId = - Internal._hash(messages[1], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -654,10 +577,8 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { }) ); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); - messages[1].messageId = - Internal._hash(messages[1], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -708,10 +629,9 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_offRamp.executeSingleReport(executionReport, new uint256[](0)); } - function test_MismatchingOnRampAddress_Revert() public { + function test_MismatchingMetadataHash_Revert() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_3)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_2); // MessageID no longer matches hash. Internal.ExecutionReportSingleChain memory executionReport = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -847,8 +767,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { // gas limit too high, Router's external call should revert messages[0].gasLimit = 1e36; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); Internal.ExecutionReportSingleChain memory executionReport = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -872,8 +791,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -921,21 +839,21 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(s_prevOffRamp), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(s_prevOffRamp) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, + metadataHash: METADATA_HASH_2, isEnabled: true, - prevOffRamp: address(s_nestedPrevOffRamps[1]), - onRamp: ON_RAMP_ADDRESS_2 + prevOffRamp: address(s_nestedPrevOffRamps[1]) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, + metadataHash: METADATA_HASH_3, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_3 + prevOffRamp: address(0) }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); @@ -993,7 +911,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { // messages contains a single message - update for the next execution messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); assertEq(startNonce + i, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); } @@ -1011,7 +929,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { // messages contains a single message - update for the next execution messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], s_nestedPrevOffRamps[0].metadataHash()); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_2); // Read through prev sender nonce through prevOffRamp -> prevPrevOffRamp assertEq(startNonce + i, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_2, messages[0].sender)); @@ -1027,8 +945,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { assertEq(startNonce + 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce++; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1044,8 +961,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1067,8 +983,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { address newSender = address(1234567); messages[0].sender = newSender; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1091,8 +1006,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { address newSender = address(1234567); messages[0].sender = newSender; messages[0].nonce = 2; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); @@ -1106,15 +1020,14 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { assertEq(startNonce, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce = 1; - messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); // previous offramp executes msg and increases nonce s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); assertEq(startNonce + 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce = 2; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); // new offramp is able to execute vm.expectEmit(); @@ -1149,9 +1062,9 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(prevOffRamp), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(prevOffRamp) }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); @@ -1299,7 +1212,7 @@ contract EVM2EVMMultiOffRamp_executeSingleMessage is EVM2EVMMultiOffRampSetup { // Setup the receiver to a non-CCIP Receiver, which will skip the Router call (but should still perform the validation) MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); message.receiver = address(newReceiver); - message.messageId = Internal._hash(message, s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + message.messageId = Internal._hash(message, METADATA_HASH_1); s_messageValidator.setMessageIdValidationState(message.messageId, true); vm.expectRevert( @@ -1510,8 +1423,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); s_reverting_receiver.setRevert(false); @@ -1533,8 +1445,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_WithGasOverride_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); s_reverting_receiver.setRevert(false); @@ -1558,8 +1469,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_DoesNotRevertIfUntouched_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); assertEq(messages[0].nonce - 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); @@ -1592,15 +1502,13 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { for (uint64 i = 0; i < 3; ++i) { messages1[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); messages1[i].receiver = address(s_reverting_receiver); - messages1[i].messageId = - Internal._hash(messages1[i], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages1[i].messageId = Internal._hash(messages1[i], METADATA_HASH_1); } for (uint64 i = 0; i < 2; ++i) { messages2[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3, i + 1); messages2[i].receiver = address(s_reverting_receiver); - messages2[i].messageId = - Internal._hash(messages2[i], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3)); + messages2[i].messageId = Internal._hash(messages2[i], METADATA_HASH_3); } Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); @@ -1651,8 +1559,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { messages[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); } messages[1].receiver = address(s_reverting_receiver); - messages[1].messageId = - Internal._hash(messages[1], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1712,8 +1619,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].gasLimit = 1; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1854,8 +1760,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); @@ -1902,8 +1807,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { }) ); - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2881,17 +2785,16 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1, - metadataHash: s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1) + metadataHash: METADATA_HASH_1 }); vm.expectEmit(); @@ -2910,9 +2813,9 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); @@ -2922,8 +2825,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam isEnabled: false, minSeqNr: 1, prevOffRamp: address(0), - onRamp: sourceChainConfigs[0].onRamp, - metadataHash: s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, sourceChainConfigs[0].onRamp) + metadataHash: METADATA_HASH_1 }); vm.expectEmit(); @@ -2948,21 +2850,21 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, + metadataHash: bytes32(uint256(METADATA_HASH_1) + 1), isEnabled: false, - prevOffRamp: address(999), - onRamp: address(uint160(ON_RAMP_ADDRESS_1) + 7) + prevOffRamp: address(999) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 2, + metadataHash: bytes32(uint256(METADATA_HASH_1) + 2), isEnabled: true, - prevOffRamp: address(1000), - onRamp: address(uint160(ON_RAMP_ADDRESS_1) + 42) + prevOffRamp: address(1000) }); EVM2EVMMultiOffRamp.SourceChainConfig[] memory expectedSourceChainConfigs = @@ -2972,8 +2874,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam isEnabled: sourceChainConfigs[i].isEnabled, minSeqNr: 1, prevOffRamp: sourceChainConfigs[i].prevOffRamp, - onRamp: sourceChainConfigs[i].onRamp, - metadataHash: s_offRamp.metadataHash(sourceChainConfigs[i].sourceChainSelector, sourceChainConfigs[i].onRamp) + metadataHash: bytes32(uint256(METADATA_HASH_1) + i) }); vm.expectEmit(); @@ -3004,32 +2905,32 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam ) public { // Skip invalid inputs vm.assume(sourceChainConfigArgs.sourceChainSelector != 0); - vm.assume(sourceChainConfigArgs.onRamp != address(0)); + vm.assume(sourceChainConfigArgs.metadataHash != bytes32("")); EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(42), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(42) }); sourceChainConfigs[1] = sourceChainConfigArgs; // Handle cases when an update occurs - bool isNewChain = true; - if (sourceChainConfigs[1].sourceChainSelector == SOURCE_CHAIN_SELECTOR_1) { + bool isNewChain = sourceChainConfigs[1].sourceChainSelector != SOURCE_CHAIN_SELECTOR_1; + if (isNewChain) { + vm.assume(sourceChainConfigs[1].metadataHash != METADATA_HASH_1); + } else { sourceChainConfigs[1].prevOffRamp = sourceChainConfigs[0].prevOffRamp; - sourceChainConfigs[1].onRamp = sourceChainConfigs[0].onRamp; - isNewChain = false; + sourceChainConfigs[1].metadataHash = sourceChainConfigs[0].metadataHash; } EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: sourceChainConfigArgs.isEnabled, minSeqNr: 1, prevOffRamp: sourceChainConfigArgs.prevOffRamp, - onRamp: sourceChainConfigArgs.onRamp, - metadataHash: s_offRamp.metadataHash(sourceChainConfigArgs.sourceChainSelector, sourceChainConfigArgs.onRamp) + metadataHash: sourceChainConfigArgs.metadataHash }); if (isNewChain) { @@ -3049,17 +2950,17 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam // Reverts - function test_ZeroOnRampAddress_Revert() public { + function test_ZeroMetadataHash_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: bytes32(""), isEnabled: true, - prevOffRamp: address(0), - onRamp: address(0) + prevOffRamp: address(0) }); - vm.expectRevert(EVM2EVMMultiOffRamp.ZeroAddressNotAllowed.selector); + vm.expectRevert(EVM2EVMMultiOffRamp.ZeroMetadataHashNotAllowed.selector); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } @@ -3068,67 +2969,86 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: 0, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); vm.expectRevert(EVM2EVMMultiOffRamp.ZeroChainSelectorNotAllowed.selector); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - function test_ReplaceExistingChainOnRamp_Revert() public { + function test_ReplaceExistingChainPrevOffRamp_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - sourceChainConfigs[0].onRamp = address(uint160(sourceChainConfigs[0].onRamp) + 1); + sourceChainConfigs[0].prevOffRamp = address(uint160(sourceChainConfigs[0].prevOffRamp) + 1); vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidStaticConfig.selector, SOURCE_CHAIN_SELECTOR_1)); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - function test_ReplaceExistingChainPrevOffRamp_Revert() public { + function test_ReplaceExistingChainMetadataHash_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - sourceChainConfigs[0].prevOffRamp = address(uint160(sourceChainConfigs[0].prevOffRamp) + 1); + sourceChainConfigs[0].metadataHash = bytes32(uint256(METADATA_HASH_1) + 1); vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidStaticConfig.selector, SOURCE_CHAIN_SELECTOR_1)); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - function test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() public { + function test_DuplicateMetadataHash_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - sourceChainConfigs[0].onRamp = address(uint160(sourceChainConfigs[0].onRamp) + 1); - sourceChainConfigs[0].prevOffRamp = address(uint160(sourceChainConfigs[0].prevOffRamp) + 1); + sourceChainConfigs[0].sourceChainSelector = SOURCE_CHAIN_SELECTOR_2; - vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidStaticConfig.selector, SOURCE_CHAIN_SELECTOR_1)); + vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.DuplicateMetadataHash.selector, METADATA_HASH_1)); + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); + } + + function test_DuplicateMetadataHashOnSameUpdate_Revert() public { + EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = + new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); + sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ + sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, + isEnabled: true, + prevOffRamp: address(0) + }); + sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ + sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, + metadataHash: METADATA_HASH_1, + isEnabled: true, + prevOffRamp: address(0) + }); + + vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.DuplicateMetadataHash.selector, METADATA_HASH_1)); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } } diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol index 003671c6b1..b575524913 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol @@ -39,6 +39,18 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba address internal constant ON_RAMP_ADDRESS_2 = 0xaA3f843Cf8E33B1F02dd28303b6bD87B1aBF8AE4; address internal constant ON_RAMP_ADDRESS_3 = 0x71830C37Cb193e820de488Da111cfbFcC680a1b9; + bytes32 internal constant METADATA_HASH_1 = keccak256( + abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_1, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_1) + ); + + bytes32 internal constant METADATA_HASH_2 = keccak256( + abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_2, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_2) + ); + + bytes32 internal constant METADATA_HASH_3 = keccak256( + abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_3, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_3) + ); + address internal constant BLESS_VOTE_ADDR = address(8888); IAny2EVMMessageReceiver internal s_receiver; @@ -164,21 +176,21 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + metadataHash: METADATA_HASH_1, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_1 + prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, + metadataHash: METADATA_HASH_2, isEnabled: false, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_2 + prevOffRamp: address(0) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, + metadataHash: METADATA_HASH_3, isEnabled: true, - prevOffRamp: address(0), - onRamp: ON_RAMP_ADDRESS_3 + prevOffRamp: address(0) }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); } @@ -188,14 +200,12 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba { s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](sourceChainConfigs.length); - Router.OffRamp[] memory offRampUpdates = new Router.OffRamp[](2 * onRampUpdates.length); + Router.OnRamp[] memory onRampUpdates = new Router.OnRamp[](0); + Router.OffRamp[] memory offRampUpdates = new Router.OffRamp[](2 * sourceChainConfigs.length); for (uint256 i = 0; i < sourceChainConfigs.length; ++i) { uint64 sourceChainSelector = sourceChainConfigs[i].sourceChainSelector; - onRampUpdates[i] = Router.OnRamp({destChainSelector: DEST_CHAIN_SELECTOR, onRamp: sourceChainConfigs[i].onRamp}); - offRampUpdates[2 * i] = Router.OffRamp({sourceChainSelector: sourceChainSelector, offRamp: address(s_offRamp)}); offRampUpdates[2 * i + 1] = Router.OffRamp({sourceChainSelector: sourceChainSelector, offRamp: address(sourceChainConfigs[i].prevOffRamp)}); @@ -420,7 +430,6 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba assertEq(config1.isEnabled, config2.isEnabled); assertEq(config1.minSeqNr, config2.minSeqNr); assertEq(config1.prevOffRamp, config2.prevOffRamp); - assertEq(config1.onRamp, config2.onRamp); assertEq(config1.metadataHash, config2.metadataHash); } diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go index 7dc439b6ce..17c4ee813d 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go @@ -72,7 +72,6 @@ type EVM2EVMMultiOffRampSourceChainConfig struct { IsEnabled bool MinSeqNr uint64 PrevOffRamp common.Address - OnRamp common.Address MetadataHash [32]byte } @@ -80,7 +79,7 @@ type EVM2EVMMultiOffRampSourceChainConfigArgs struct { SourceChainSelector uint64 IsEnabled bool PrevOffRamp common.Address - OnRamp common.Address + MetadataHash [32]byte } type EVM2EVMMultiOffRampStaticConfig struct { @@ -156,8 +155,8 @@ type MultiOCR3BaseOCRConfigArgs struct { } var EVM2EVMMultiOffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"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\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"InvalidMessageId\",\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"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\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"error\",\"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\":[{\"components\":[{\"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[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldSequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newSequenceNumber\",\"type\":\"uint64\"}],\"name\":\"LatestPriceSequenceNumberSet\",\"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\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"latestPriceSequenceNumber\",\"type\":\"uint64\"}],\"name\":\"setLatestPriceSequenceNumber\",\"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: "0x6101006040523480156200001257600080fd5b50604051620067e1380380620067e1833981016040819052620000359162000648565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c1565b5050466080525060208201516001600160a01b03161580620000ec575060408201516001600160a01b0316155b156200010b576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001375760405163c656089560e01b815260040160405180910390fd5b81516001600160401b0390811660a052602080840180516001600160a01b0390811660c05260408087018051831660e052815188519096168652925182169385019390935290511682820152517f2f56698ec552a5d53d27d6f4b3dd8b6989f6426b6151a36aff61160c1d07efdf9181900360600190a1620001b9816200026c565b5050620007d0565b336001600160a01b038216036200021b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b81518110156200051c576000828281518110620002905762000290620007ba565b60200260200101519050600081600001519050806001600160401b0316600003620002ce5760405163c656089560e01b815260040160405180910390fd5b60608201516001600160a01b0316620002fa576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260076020526040902060018101546001600160a01b031662000400576200035c8284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36200052060201b60201c565b600282015560608301516001820180546001600160a01b039283166001600160a01b03199091161790556040808501518354610100600160481b03199190931669010000000000000000000216610100600160e81b031990921691909117610100178255516001600160401b03831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16200046f565b606083015160018201546001600160a01b03908116911614158062000444575060408301518154690100000000000000000090046001600160a01b03908116911614155b156200046f5760405163c39a620560e01b81526001600160401b038316600482015260240162000083565b6020830151815490151560ff199091161781556040516001600160401b038316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d309062000505908490815460ff811615158252600881901c6001600160401b0316602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a25050508060010190506200026f565b5050565b60a0805160408051602081018590526001600160401b0380881692820192909252911660608201526001600160a01b0384166080820152600091016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005b557620005b56200057a565b60405290565b604051608081016001600160401b0381118282101715620005b557620005b56200057a565b604051601f8201601f191681016001600160401b03811182821017156200060b576200060b6200057a565b604052919050565b80516001600160401b03811681146200062b57600080fd5b919050565b80516001600160a01b03811681146200062b57600080fd5b6000808284036080808212156200065e57600080fd5b6060808312156200066e57600080fd5b6200067862000590565b9250620006858662000613565b835260206200069681880162000630565b818501526040620006aa6040890162000630565b604086015260608801519496506001600160401b0380861115620006cd57600080fd5b858901955089601f870112620006e257600080fd5b855181811115620006f757620006f76200057a565b62000707848260051b01620005e0565b818152848101925060079190911b87018401908b8211156200072857600080fd5b968401965b81881015620007a85786888d031215620007475760008081fd5b62000751620005bb565b6200075c8962000613565b8152858901518015158114620007725760008081fd5b818701526200078389860162000630565b8582015262000794878a0162000630565b81880152835296860196918401916200072d565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051615fb46200082d6000396000818161021e01526131fe0152600081816101ef015281816115fc01526116b30152600081816101bf0152613120015260008181611c4f0152611c9b0152615fb46000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80637f63b711116100e3578063d2a15d351161008c578063f52121a511610066578063f52121a514610686578063f716f99f14610699578063ff888fb1146106ac57600080fd5b8063d2a15d3514610552578063e9d68a8e14610565578063f2fde38b1461067357600080fd5b80638da5cb5b116100bd5780638da5cb5b146104d2578063c673e584146104ed578063ccd37ba31461050d57600080fd5b80637f63b7111461049e57806385572ffb146104b15780638b364334146104bf57600080fd5b8063403b2d631161014557806369600bca1161011f57806369600bca1461036e5780637437ff9f1461038157806379ba50971461049657600080fd5b8063403b2d6314610328578063542625af1461033b5780635e36480c1461034e57600080fd5b80632d04ab76116101765780632d04ab76146102d9578063311cd513146102ee5780633f4b04aa1461030157600080fd5b806306285c6914610192578063181f5a7714610290575b600080fd5b61024e604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60408051825167ffffffffffffffff1681526020808401516001600160a01b039081169183019190915292820151909216908201526060015b60405180910390f35b6102cc6040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b604051610287919061423a565b6102ec6102e73660046142e5565b6106cf565b005b6102ec6102fc366004614398565b610a95565b600b5467ffffffffffffffff165b60405167ffffffffffffffff9091168152602001610287565b6102ec610336366004614545565b610afe565b6102ec610349366004614b69565b610cbb565b61036161035c366004614c94565b610e60565b6040516102879190614cf7565b6102ec61037c366004614d05565b610eb6565b61042d6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152600160c01b8304811694840194909452600160e01b90910490921660608201526005548216608082015260065490911660a082015290565b6040516102879190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b6102ec610f21565b6102ec6104ac366004614d22565b610fdf565b6102ec61018d366004614e06565b61030f6104cd366004614e41565b610ff3565b6000546040516001600160a01b039091168152602001610287565b6105006104fb366004614e80565b611009565b6040516102879190614ee0565b61054461051b366004614f55565b67ffffffffffffffff919091166000908152600a60209081526040808320938352929052205490565b604051908152602001610287565b6102ec610560366004614f81565b611167565b610616610573366004614d05565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525067ffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff8116151582526101008104909516928101929092526001600160a01b0369010000000000000000009094048416928201929092526001820154909216606083015260020154608082015290565b6040516102879190600060a08201905082511515825267ffffffffffffffff602084015116602083015260408301516001600160a01b03808216604085015280606086015116606085015250506080830151608083015292915050565b6102ec610681366004614ff6565b611221565b6102ec610694366004615013565b611232565b6102ec6106a73660046150df565b611564565b6106bf6106ba36600461522a565b6115a6565b6040519015158152602001610287565b60006106dd878901896153bb565b805151519091501515806106f657508051602001515115155b156107f657600b5460208a01359067ffffffffffffffff808316911610156107b557600b805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f9161077e916004016155f9565b600060405180830381600087803b15801561079857600080fd5b505af11580156107ac573d6000803e3d6000fd5b505050506107f4565b8160200151516000036107f4576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b8160200151518110156109de5760008260200151828151811061081e5761081e615526565b6020026020010151905060008160000151905061083a81611667565b600061084582611769565b602084015151815491925067ffffffffffffffff90811661010090920416141580610887575060208084015190810151905167ffffffffffffffff9182169116115b156108d057825160208401516040517feefb0cac0000000000000000000000000000000000000000000000000000000081526108c792919060040161560c565b60405180910390fd5b60408301518061090c576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600a602090815260408083208484529091529020541561097f5783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016108c7565b6020808501510151610992906001615657565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600a6020908152604080832094835293905291909120429055506001016107f9565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051610a0e919061567f565b60405180910390a1610a8a60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506117c9915050565b505050505050505050565b610ad5610aa48284018461571c565b6040805160008082526020820190925290610acf565b6060815260200190600190039081610aba5790505b50611b40565b604080516000808252602082019092529050610af86001858585858660006117c9565b50505050565b610b06611bf0565b60a08101516001600160a01b03161580610b28575080516001600160a01b0316155b15610b5f576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b610cc3611c4c565b815181518114610cff576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610e50576000848281518110610d1e57610d1e615526565b60200260200101519050600081602001515190506000858481518110610d4657610d46615526565b6020026020010151905080518214610d8a576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610e41576000828281518110610da957610da9615526565b6020026020010151905080600014158015610de4575084602001518281518110610dd557610dd5615526565b60200260200101516080015181105b15610e385784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064016108c7565b50600101610d8d565b50505050806001019050610d02565b50610e5b8383611b40565b505050565b6000610e6e60016004615751565b6002610e7b60808561577a565b67ffffffffffffffff16610e8f91906157a1565b610e998585611ccd565b901c166003811115610ead57610ead614ccd565b90505b92915050565b610ebe611bf0565b600b805467ffffffffffffffff83811667ffffffffffffffff1983168117909355604080519190921680825260208201939093527f88ad9c61d6caf19a2af116a871802a03a31e680115a2dd20e8c08801d7c82f83910160405180910390a15050565b6001546001600160a01b03163314610f7b5760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108c7565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610fe7611bf0565b610ff081611d14565b50565b6000806110008484612025565b50949350505050565b61104c6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156110f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110d7575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561115757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611139575b5050505050815250509050919050565b61116f611bf0565b60005b81811015610e5b57600083838381811061118e5761118e615526565b9050604002018036038101906111a491906157b8565b90506111b381602001516115a6565b61121857805167ffffffffffffffff166000908152600a602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b50600101611172565b611229611bf0565b610ff081612136565b33301461126b576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600080825260208201909252816112a8565b60408051808201909152600080825260208201528152602001906001900390816112815790505b5061014084015151909150156113095761130683610140015184602001516040516020016112e591906001600160a01b0391909116815260200190565b60408051601f198184030181529181528601518651610160880151876121ec565b90505b60006113158483612299565b6005549091506001600160a01b03168015611402576040517fa219f6e50000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063a219f6e59061136f9085906004016158a0565b600060405180830381600087803b15801561138957600080fd5b505af192505050801561139a575060015b611402573d8080156113c8576040519150601f19603f3d011682016040523d82523d6000602084013e6113cd565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016108c7919061423a565b6101208501515115801561141857506080850151155b8061142f575060408501516001600160a01b03163b155b8061146f5750604085015161146d906001600160a01b03167f85572ffb0000000000000000000000000000000000000000000000000000000061233c565b155b1561147b575050505050565b60048054608087015160408089015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf97983936114d6938a93611388939291016158b3565b6000604051808303816000875af11580156114f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261151d9190810190615934565b50915091508161155b57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016108c7919061423a565b50505050505050565b61156c611bf0565b60005b81518110156115a25761159a82828151811061158d5761158d615526565b6020026020010151612358565b60010161156f565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa158015611643573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb0919061598e565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611702573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611726919061598e565b15610ff0576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108c7565b67ffffffffffffffff81166000908152600760205260408120805460ff16610eb0576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108c7565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906118288760a46159ab565b90508260600151156118705784516118419060206157a1565b865161184e9060206157a1565b6118599060a06159ab565b61186391906159ab565b61186d90826159ab565b90505b3681146118b2576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016108c7565b50815181146118fa5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016108c7565b611902611c4c565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561195057611950614ccd565b600281111561196157611961614ccd565b905250905060028160200151600281111561197e5761197e614ccd565b1480156119d25750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106119ba576119ba615526565b6000918252602090912001546001600160a01b031633145b611a08576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611aea576020820151611a239060016159be565b60ff16855114611a5f576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611a9a576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611aac9291906159d7565b604051908190038120611ac3918b906020016159e7565b604051602081830303815290604052805190602001209050611ae88a82888888612663565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611b7a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611be957611be1858281518110611baf57611baf615526565b602002602001015184611bdb57858381518110611bce57611bce615526565b602002602001015161287a565b8361287a565b600101611b91565b5050505050565b6000546001600160a01b03163314611c4a5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108c7565b565b467f000000000000000000000000000000000000000000000000000000000000000014611c4a576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016108c7565b67ffffffffffffffff8216600090815260096020526040812081611cf26080856159fb565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b60005b81518110156115a2576000828281518110611d3457611d34615526565b602002602001015190506000816000015190508067ffffffffffffffff16600003611d8b576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608201516001600160a01b0316611dcf576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8116600090815260076020526040902060018101546001600160a01b0316611ef257611e298284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b361311a565b600282015560608301516001820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19909116179055604080850151835468ffffffffffffffff001991909316690100000000000000000002167fffffff00000000000000000000000000000000000000000000000000000000ff909216919091176101001782555167ffffffffffffffff831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611f78565b606083015160018201546001600160a01b039081169116141580611f35575060408301518154690100000000000000000090046001600160a01b03908116911614155b15611f78576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108c7565b6020830151815490151560ff1990911617815560405167ffffffffffffffff8316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d309061200f908490815460ff811615158252600881901c67ffffffffffffffff16602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a2505050806001019050611d17565b67ffffffffffffffff80831660009081526008602090815260408083206001600160a01b038616845290915281205490918291168082036121285767ffffffffffffffff8516600090815260076020526040902054690100000000000000000090046001600160a01b03168015612126576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015282169063856c824790602401602060405180830381865afa1580156120f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121199190615a22565b600193509350505061212f565b505b9150600090505b9250929050565b336001600160a01b0382160361218e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108c7565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8560005b875181101561228e5761226988828151811061220e5761220e615526565b60200260200101516020015188888888868151811061222f5761222f615526565b602002602001015180602001905181019061224a9190615a3f565b88878151811061225c5761225c615526565b602002602001015161319d565b82828151811061227b5761227b615526565b60209081029190910101526001016121f0565b509695505050505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff168152602001846020015160405160200161231191906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b600061234783613516565b8015610ead5750610ead8383613562565b806040015160ff16600003612383576000604051631b3fab5160e11b81526004016108c79190615af4565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036123d4576060840151600182018054911515620100000262ff000019909216919091179055612429565b6060840151600182015460ff6201000090910416151590151514612429576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016108c7565b60a08401518051601f60ff82161115612458576001604051631b3fab5160e11b81526004016108c79190615af4565b6124be85856003018054806020026020016040519081016040528092919081815260200182805480156124b457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612496575b5050505050613604565b8560600151156125d05761252c85856002018054806020026020016040519081016040528092919081815260200182805480156124b4576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612496575050505050613604565b608086015180516125469060028701906020840190614148565b50805160018501805461ff00191661010060ff841690810291909117909155601f1015612589576002604051631b3fab5160e11b81526004016108c79190615af4565b6040880151612599906003615b0e565b60ff168160ff16116125c1576003604051631b3fab5160e11b81526004016108c79190615af4565b6125cd8783600161366d565b50505b6125dc8583600261366d565b81516125f19060038601906020850190614148565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361264a938a939260028b01929190615b2a565b60405180910390a161265b856137ed565b505050505050565b61266b6141b6565b835160005b8181101561287057600060018886846020811061268f5761268f615526565b61269c91901a601b6159be565b8985815181106126ae576126ae615526565b60200260200101518986815181106126c8576126c8615526565b602002602001015160405160008152602001604052604051612706949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612728573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b0385168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561278957612789614ccd565b600281111561279a5761279a614ccd565b90525090506001816020015160028111156127b7576127b7614ccd565b146127ee576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061280557612805615526565b602002015115612841576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f811061285c5761285c615526565b911515602090920201525050600101612670565b5050505050505050565b815161288581611667565b600061289082611769565b60208501515190915060008190036128d3576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151518114612911576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561292c5761292c6143ec565b604051908082528060200260200182016040528015612955578160200160208202803683370190505b50905060005b82811015612a1a5760008760200151828151811061297b5761297b615526565b60200260200101519050612993818660020154613809565b8383815181106129a5576129a5615526565b6020026020010181815250508061018001518383815181106129c9576129c9615526565b602002602001015114612a11578061018001516040517f345039be0000000000000000000000000000000000000000000000000000000081526004016108c791815260200190565b5060010161295b565b506000612a31858389606001518a60800151613965565b905080600003612a79576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016108c7565b8551151560005b84811015610a8a57600089602001518281518110612aa057612aa0615526565b602002602001015190506000612aba898360600151610e60565b90506002816003811115612ad057612ad0614ccd565b03612b265760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a15050613112565b6000816003811115612b3a57612b3a614ccd565b1480612b5757506003816003811115612b5557612b55614ccd565b145b612ba75760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c16600483015290911660248201526044016108c7565b8315612c885760045460009074010000000000000000000000000000000000000000900463ffffffff16612bdb8742615751565b1190508080612bfb57506003826003811115612bf957612bf9614ccd565b145b612c3d576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b1660048201526024016108c7565b8a8481518110612c4f57612c4f615526565b6020026020010151600014612c82578a8481518110612c7057612c70615526565b60200260200101518360800181815250505b50612ced565b6000816003811115612c9c57612c9c614ccd565b14612ced5760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c16600483015290911660248201526044016108c7565b600080612cfe8b8560200151612025565b915091508015612ded5760c084015167ffffffffffffffff16612d22836001615657565b67ffffffffffffffff1614612da55760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612d94928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60405180910390a150505050613112565b67ffffffffffffffff8b81166000908152600860209081526040808320888301516001600160a01b031684529091529020805467ffffffffffffffff19169184169190911790555b6000836003811115612e0157612e01614ccd565b03612e925760c084015167ffffffffffffffff16612e20836001615657565b67ffffffffffffffff1614612e925760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612d94928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60008d604001518681518110612eaa57612eaa615526565b6020026020010151905080518561014001515114612f0e5760608501516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808f16600483015290911660248201526044016108c7565b612f1e8c866060015160016139bb565b600080612f2b8784613a63565b91509150612f3e8e8860600151846139bb565b888015612f5c57506003826003811115612f5a57612f5a614ccd565b145b8015612f7a57506000866003811115612f7757612f77614ccd565b14155b15612fba57866101800151816040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016108c7929190615bb0565b6003826003811115612fce57612fce614ccd565b14158015612fee57506002826003811115612feb57612feb614ccd565b14155b1561302f578d8760600151836040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526004016108c793929190615bc9565b600086600381111561304357613043614ccd565b036130b15767ffffffffffffffff808f1660009081526008602090815260408083208b8301516001600160a01b0316845290915281208054909216919061308983615bef565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df28585604051613102929190615c16565b60405180910390a4505050505050505b600101612a80565b600081847f00000000000000000000000000000000000000000000000000000000000000008560405160200161317d949392919093845267ffffffffffffffff9283166020850152911660408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b604080518082019091526000808252602082015260006131c08460200151613cad565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015613245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132699190615c36565b90506001600160a01b03811615806132b157506132af6001600160a01b0382167faff2afbf0000000000000000000000000000000000000000000000000000000061233c565b155b156132f3576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108c7565b6000806133be633907753760e01b6040518061010001604052808d81526020018b67ffffffffffffffff1681526020018c6001600160a01b031681526020018e8152602001876001600160a01b031681526020018a6000015181526020018a6040015181526020018981525060405160240161336f9190615c53565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152600454859063ffffffff600160e01b909104166113886084613cef565b5091509150816133e3578060405163e1cd550960e01b81526004016108c7919061423a565b805160201461342b5780516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016108c7565b6000818060200190518101906134419190615d2a565b604080516001600160a01b038d16602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb000000000000000000000000000000000000000000000000000000001790526004549192506134c4918790600160c01b900463ffffffff166113886084613cef565b509093509150826134ea578160405163e1cd550960e01b81526004016108c7919061423a565b604080518082019091526001600160a01b03909516855260208501525091925050509695505050505050565b6000613542827f01ffc9a700000000000000000000000000000000000000000000000000000000613562565b8015610eb0575061355b826001600160e01b0319613562565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156135ed575060208210155b80156135f95750600081115b979650505050505050565b60005b8151811015610e5b5760ff83166000908152600360205260408120835190919084908490811061363957613639615526565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613607565b60005b82518160ff161015610af8576000838260ff168151811061369357613693615526565b60200260200101519050600060028111156136b0576136b0614ccd565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156136ef576136ef614ccd565b14613710576004604051631b3fab5160e11b81526004016108c79190615af4565b6001600160a01b038116613750576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561377657613776614ccd565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156137d3576137d3614ccd565b021790555090505050806137e690615d43565b9050613670565b60ff8116610ff057600b805467ffffffffffffffff1916905550565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b610100015160405160200161389f9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016138d89190615d62565b604051602081830303815290604052805190602001208761016001516040516020016139049190615e17565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b600080613973858585613e15565b905061397e816115a6565b61398c5760009150506139b3565b67ffffffffffffffff86166000908152600a60209081526040808320938352929052205490505b949350505050565b600060026139ca60808561577a565b67ffffffffffffffff166139de91906157a1565b905060006139ec8585611ccd565b9050816139fb60016004615751565b901b191681836003811115613a1257613a12614ccd565b67ffffffffffffffff871660009081526009602052604081209190921b92909217918291613a416080886159fb565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613aa79087908790600401615e2a565b600060405180830381600087803b158015613ac157600080fd5b505af1925050508015613ad2575060015b613c92573d808015613b00576040519150601f19603f3d011682016040523d82523d6000602084013e613b05565b606091505b506000613b1182615f6f565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000006001600160e01b031982161480613b5b575063e1cd550960e01b6001600160e01b03198216145b80613b76575063046b337b60e51b6001600160e01b03198216145b80613baa57507f78ef8024000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613bde57507f0c3b563c000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613c1257507fae9b4ce9000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613c4657507f09c25325000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b15613c57575060039250905061212f565b856101800151826040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016108c7929190615bb0565b50506040805160208101909152600081526002909250929050565b60008151602014613cd3578160405163046b337b60e51b81526004016108c7919061423a565b610eb082806020019051810190613cea9190615d2a565b6140b3565b6000606060008361ffff1667ffffffffffffffff811115613d1257613d126143ec565b6040519080825280601f01601f191660200182016040528015613d3c576020820181803683370190505b509150863b613d6f577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613da2577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613ddb577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613dfe5750835b808352806000602085013e50955095509592505050565b8251825160009190818303613e56576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613e6a57506101018111155b613e87576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613eb1576040516309bde33960e01b815260040160405180910390fd5b80600003613ede5786600081518110613ecc57613ecc615526565b60200260200101519350505050613196565b60008167ffffffffffffffff811115613ef957613ef96143ec565b604051908082528060200260200182016040528015613f22578160200160208202803683370190505b50905060008080805b8581101561404c5760006001821b8b811603613f865788851015613f6f578c5160018601958e918110613f6057613f60615526565b60200260200101519050613fa8565b8551600185019487918110613f6057613f60615526565b8b5160018401938d918110613f9d57613f9d615526565b602002602001015190505b600089861015613fd8578d5160018701968f918110613fc957613fc9615526565b60200260200101519050613ffa565b8651600186019588918110613fef57613fef615526565b602002602001015190505b8285111561401b576040516309bde33960e01b815260040160405180910390fd5b6140258282614107565b87848151811061403757614037615526565b60209081029190910101525050600101613f2b565b50600185038214801561405e57508683145b801561406957508581145b614086576040516309bde33960e01b815260040160405180910390fd5b83600186038151811061409b5761409b615526565b60200260200101519750505050505050509392505050565b60006001600160a01b038211806140cb575061040082105b156141035760408051602081018490520160408051601f198184030181529082905263046b337b60e51b82526108c79160040161423a565b5090565b600081831061411f5761411a8284614125565b610ead565b610ead83835b604080516001602082015290810183905260608101829052600090608001613947565b8280548282559060005260206000209081019282156141aa579160200282015b828111156141aa578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190614168565b506141039291506141d5565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561410357600081556001016141d6565b60005b838110156142055781810151838201526020016141ed565b50506000910152565b600081518084526142268160208601602086016141ea565b601f01601f19169290920160200192915050565b602081526000610ead602083018461420e565b8060608101831015610eb057600080fd5b60008083601f84011261427057600080fd5b50813567ffffffffffffffff81111561428857600080fd5b60208301915083602082850101111561212f57600080fd5b60008083601f8401126142b257600080fd5b50813567ffffffffffffffff8111156142ca57600080fd5b6020830191508360208260051b850101111561212f57600080fd5b60008060008060008060008060e0898b03121561430157600080fd5b61430b8a8a61424d565b9750606089013567ffffffffffffffff8082111561432857600080fd5b6143348c838d0161425e565b909950975060808b013591508082111561434d57600080fd5b6143598c838d016142a0565b909750955060a08b013591508082111561437257600080fd5b5061437f8b828c016142a0565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156143ad57600080fd5b6143b7858561424d565b9250606084013567ffffffffffffffff8111156143d357600080fd5b6143df8682870161425e565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715614425576144256143ec565b60405290565b6040805190810167ffffffffffffffff81118282101715614425576144256143ec565b6040516101a0810167ffffffffffffffff81118282101715614425576144256143ec565b60405160a0810167ffffffffffffffff81118282101715614425576144256143ec565b6040516080810167ffffffffffffffff81118282101715614425576144256143ec565b6040516060810167ffffffffffffffff81118282101715614425576144256143ec565b604051601f8201601f1916810167ffffffffffffffff81118282101715614504576145046143ec565b604052919050565b6001600160a01b0381168114610ff057600080fd5b803561452c8161450c565b919050565b803563ffffffff8116811461452c57600080fd5b600060c0828403121561455757600080fd5b61455f614402565b823561456a8161450c565b815261457860208401614531565b602082015261458960408401614531565b604082015261459a60608401614531565b606082015260808301356145ad8161450c565b608082015260a08301356145c08161450c565b60a08201529392505050565b600067ffffffffffffffff8211156145e6576145e66143ec565b5060051b60200190565b67ffffffffffffffff81168114610ff057600080fd5b803561452c816145f0565b8015158114610ff057600080fd5b803561452c81614611565b600067ffffffffffffffff821115614644576146446143ec565b50601f01601f191660200190565b600082601f83011261466357600080fd5b81356146766146718261462a565b6144db565b81815284602083860101111561468b57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126146b957600080fd5b813560206146c9614671836145cc565b82815260069290921b840181019181810190868411156146e857600080fd5b8286015b8481101561228e57604081890312156147055760008081fd5b61470d61442b565b81356147188161450c565b815281850135858201528352918301916040016146ec565b600082601f83011261474157600080fd5b81356020614751614671836145cc565b82815260059290921b8401810191818101908684111561477057600080fd5b8286015b8481101561228e57803567ffffffffffffffff8111156147945760008081fd5b6147a28986838b0101614652565b845250918301918301614774565b60006101a082840312156147c357600080fd5b6147cb61444e565b90506147d682614606565b81526147e460208301614521565b60208201526147f560408301614521565b604082015261480660608301614606565b60608201526080820135608082015261482160a0830161461f565b60a082015261483260c08301614606565b60c082015261484360e08301614521565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561487057600080fd5b61487c86838701614652565b8385015261014092508285013591508082111561489857600080fd5b6148a4868387016146a8565b838501526101609250828501359150808211156148c057600080fd5b506148cd85828601614730565b82840152505061018080830135818301525092915050565b600082601f8301126148f657600080fd5b81356020614906614671836145cc565b82815260059290921b8401810191818101908684111561492557600080fd5b8286015b8481101561228e57803567ffffffffffffffff8111156149495760008081fd5b6149578986838b01016147b0565b845250918301918301614929565b600082601f83011261497657600080fd5b81356020614986614671836145cc565b82815260059290921b840181019181810190868411156149a557600080fd5b8286015b8481101561228e57803567ffffffffffffffff8111156149c95760008081fd5b6149d78986838b0101614730565b8452509183019183016149a9565b600082601f8301126149f657600080fd5b81356020614a06614671836145cc565b8083825260208201915060208460051b870101935086841115614a2857600080fd5b602086015b8481101561228e5780358352918301918301614a2d565b600082601f830112614a5557600080fd5b81356020614a65614671836145cc565b82815260059290921b84018101918181019086841115614a8457600080fd5b8286015b8481101561228e57803567ffffffffffffffff80821115614aa95760008081fd5b9088019060a0828b03601f1901811315614ac35760008081fd5b614acb614472565b614ad6888501614606565b815260408085013584811115614aec5760008081fd5b614afa8e8b838901016148e5565b8a8401525060608086013585811115614b135760008081fd5b614b218f8c838a0101614965565b8385015250608091508186013585811115614b3c5760008081fd5b614b4a8f8c838a01016149e5565b9184019190915250919093013590830152508352918301918301614a88565b6000806040808486031215614b7d57600080fd5b833567ffffffffffffffff80821115614b9557600080fd5b614ba187838801614a44565b9450602091508186013581811115614bb857600080fd5b8601601f81018813614bc957600080fd5b8035614bd7614671826145cc565b81815260059190911b8201840190848101908a831115614bf657600080fd5b8584015b83811015614c8257803586811115614c125760008081fd5b8501603f81018d13614c245760008081fd5b87810135614c34614671826145cc565b81815260059190911b82018a0190898101908f831115614c545760008081fd5b928b01925b82841015614c725783358252928a0192908a0190614c59565b8652505050918601918601614bfa565b50809750505050505050509250929050565b60008060408385031215614ca757600080fd5b8235614cb2816145f0565b91506020830135614cc2816145f0565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614cf357614cf3614ccd565b9052565b60208101610eb08284614ce3565b600060208284031215614d1757600080fd5b8135613196816145f0565b60006020808385031215614d3557600080fd5b823567ffffffffffffffff811115614d4c57600080fd5b8301601f81018513614d5d57600080fd5b8035614d6b614671826145cc565b81815260079190911b82018301908381019087831115614d8a57600080fd5b928401925b828410156135f95760808489031215614da85760008081fd5b614db0614495565b8435614dbb816145f0565b815284860135614dca81614611565b81870152604085810135614ddd8161450c565b90820152606085810135614df08161450c565b9082015282526080939093019290840190614d8f565b600060208284031215614e1857600080fd5b813567ffffffffffffffff811115614e2f57600080fd5b820160a0818503121561319657600080fd5b60008060408385031215614e5457600080fd5b8235614e5f816145f0565b91506020830135614cc28161450c565b803560ff8116811461452c57600080fd5b600060208284031215614e9257600080fd5b610ead82614e6f565b60008151808452602080850194506020840160005b83811015614ed55781516001600160a01b031687529582019590820190600101614eb0565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614f2f60e0840182614e9b565b90506040840151601f198483030160c0850152614f4c8282614e9b565b95945050505050565b60008060408385031215614f6857600080fd5b8235614f73816145f0565b946020939093013593505050565b60008060208385031215614f9457600080fd5b823567ffffffffffffffff80821115614fac57600080fd5b818501915085601f830112614fc057600080fd5b813581811115614fcf57600080fd5b8660208260061b8501011115614fe457600080fd5b60209290920196919550909350505050565b60006020828403121561500857600080fd5b81356131968161450c565b6000806040838503121561502657600080fd5b823567ffffffffffffffff8082111561503e57600080fd5b61504a868387016147b0565b9350602085013591508082111561506057600080fd5b5061506d85828601614730565b9150509250929050565b600082601f83011261508857600080fd5b81356020615098614671836145cc565b8083825260208201915060208460051b8701019350868411156150ba57600080fd5b602086015b8481101561228e5780356150d28161450c565b83529183019183016150bf565b600060208083850312156150f257600080fd5b823567ffffffffffffffff8082111561510a57600080fd5b818501915085601f83011261511e57600080fd5b813561512c614671826145cc565b81815260059190911b8301840190848101908883111561514b57600080fd5b8585015b8381101561521d5780358581111561516657600080fd5b860160c0818c03601f1901121561517d5760008081fd5b615185614402565b8882013581526040615198818401614e6f565b8a83015260606151a9818501614e6f565b82840152608091506151bc82850161461f565b9083015260a083810135898111156151d45760008081fd5b6151e28f8d83880101615077565b838501525060c08401359150888211156151fc5760008081fd5b61520a8e8c84870101615077565b908301525084525091860191860161514f565b5098975050505050505050565b60006020828403121561523c57600080fd5b5035919050565b80356001600160e01b038116811461452c57600080fd5b600082601f83011261526b57600080fd5b8135602061527b614671836145cc565b82815260069290921b8401810191818101908684111561529a57600080fd5b8286015b8481101561228e57604081890312156152b75760008081fd5b6152bf61442b565b81356152ca816145f0565b81526152d7828601615243565b8186015283529183019160400161529e565b600082601f8301126152fa57600080fd5b8135602061530a614671836145cc565b82815260079290921b8401810191818101908684111561532957600080fd5b8286015b8481101561228e5780880360808112156153475760008081fd5b61534f6144b8565b823561535a816145f0565b81526040601f1983018113156153705760008081fd5b61537861442b565b925086840135615387816145f0565b835283810135615396816145f0565b838801528187019290925260608301359181019190915283529183019160800161532d565b600060208083850312156153ce57600080fd5b823567ffffffffffffffff808211156153e657600080fd5b818501915060408083880312156153fc57600080fd5b61540461442b565b83358381111561541357600080fd5b84016040818a03121561542557600080fd5b61542d61442b565b81358581111561543c57600080fd5b8201601f81018b1361544d57600080fd5b803561545b614671826145cc565b81815260069190911b8201890190898101908d83111561547a57600080fd5b928a01925b828410156154ca5787848f0312156154975760008081fd5b61549f61442b565b84356154aa8161450c565b81526154b7858d01615243565b818d0152825292870192908a019061547f565b8452505050818701359350848411156154e257600080fd5b6154ee8a85840161525a565b818801528252508385013591508282111561550857600080fd5b615514888386016152e9565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561559357835180516001600160a01b031684528501516001600160e01b031685840152928401929185019160010161555c565b50508583015187820388850152805180835290840192506000918401905b808310156155ed578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906155b1565b50979650505050505050565b602081526000610ead602083018461553c565b67ffffffffffffffff83168152606081016131966020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561567857615678615641565b5092915050565b60006020808352606084516040808487015261569e606087018361553c565b87850151878203601f19016040890152805180835290860193506000918601905b8083101561521d57845167ffffffffffffffff8151168352878101516156fe89850182805167ffffffffffffffff908116835260209182015116910152565b508401518287015293860193600192909201916080909101906156bf565b60006020828403121561572e57600080fd5b813567ffffffffffffffff81111561574557600080fd5b6139b384828501614a44565b81810381811115610eb057610eb0615641565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061579557615795615764565b92169190910692915050565b8082028115828204841417610eb057610eb0615641565b6000604082840312156157ca57600080fd5b6157d261442b565b82356157dd816145f0565b81526020928301359281019290925250919050565b60008151808452602080850194506020840160005b83811015614ed557815180516001600160a01b031688526020908101519088015260408701965090820190600101615807565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261586d60a085018261420e565b905060608301518482036060860152615886828261420e565b91505060808301518482036080860152614f4c82826157f2565b602081526000610ead602083018461583a565b6080815260006158c6608083018761583a565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b600082601f83011261590057600080fd5b815161590e6146718261462a565b81815284602083860101111561592357600080fd5b6139b38260208301602087016141ea565b60008060006060848603121561594957600080fd5b835161595481614611565b602085015190935067ffffffffffffffff81111561597157600080fd5b61597d868287016158ef565b925050604084015190509250925092565b6000602082840312156159a057600080fd5b815161319681614611565b80820180821115610eb057610eb0615641565b60ff8181168382160190811115610eb057610eb0615641565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff80841680615a1657615a16615764565b92169190910492915050565b600060208284031215615a3457600080fd5b8151613196816145f0565b600060208284031215615a5157600080fd5b815167ffffffffffffffff80821115615a6957600080fd5b9083019060608286031215615a7d57600080fd5b615a856144b8565b825182811115615a9457600080fd5b615aa0878286016158ef565b825250602083015182811115615ab557600080fd5b615ac1878286016158ef565b602083015250604083015182811115615ad957600080fd5b615ae5878286016158ef565b60408301525095945050505050565b6020810160058310615b0857615b08614ccd565b91905290565b60ff818116838216029081169081811461567857615678615641565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015615b845784546001600160a01b031683526001948501949284019201615b5f565b50508481036060860152615b988188614e9b565b935050505060ff831660808301529695505050505050565b8281526040602082015260006139b3604083018461420e565b67ffffffffffffffff848116825283166020820152606081016139b36040830184614ce3565b600067ffffffffffffffff808316818103615c0c57615c0c615641565b6001019392505050565b615c208184614ce3565b6040602082015260006139b3604083018461420e565b600060208284031215615c4857600080fd5b81516131968161450c565b6020815260008251610100806020850152615c7261012085018361420e565b91506020850151615c8f604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615cc960a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615ce6848361420e565b935060c08701519150808685030160e0870152615d03848361420e565b935060e0870151915080868503018387015250615d20838261420e565b9695505050505050565b600060208284031215615d3c57600080fd5b5051919050565b600060ff821660ff8103615d5957615d59615641565b60010192915050565b6020808252825182820181905260009190848201906040850190845b81811015615db157835180516001600160a01b031684526020908101519084015260408301938501939250600101615d7e565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015615e0a57601f19868403018952615df883835161420e565b98840198925090830190600101615ddc565b5090979650505050505050565b602081526000610ead6020830184615dbd565b60408152615e4560408201845167ffffffffffffffff169052565b60006020840151615e6160608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615ec28185018367ffffffffffffffff169052565b60e08601519150610120615ee0818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a06101608181870152615f106101e087018561420e565b9350828801519250603f19610180818887030181890152615f3186866157f2565b9550828a01519450818887030184890152615f4c8686615dbd565b9550808a01516101c089015250505050508281036020840152614f4c8185615dbd565b6000815160208301516001600160e01b031980821693506004831015615f9f5780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"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\":[{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"name\":\"DuplicateMetadataHash\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"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\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"InvalidMessageId\",\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"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\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"error\",\"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\"},{\"inputs\":[],\"name\":\"ZeroMetadataHashNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"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[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldSequenceNumber\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newSequenceNumber\",\"type\":\"uint64\"}],\"name\":\"LatestPriceSequenceNumberSet\",\"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\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"latestPriceSequenceNumber\",\"type\":\"uint64\"}],\"name\":\"setLatestPriceSequenceNumber\",\"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: "0x6101006040523480156200001257600080fd5b5060405162006690380380620066908339810160408190526200003591620005cc565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c1565b5050466080525060208201516001600160a01b03161580620000ec575060408201516001600160a01b0316155b156200010b576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001375760405163c656089560e01b815260040160405180910390fd5b81516001600160401b0390811660a052602080840180516001600160a01b0390811660c05260408087018051831660e052815188519096168652925182169385019390935290511682820152517f2f56698ec552a5d53d27d6f4b3dd8b6989f6426b6151a36aff61160c1d07efdf9181900360600190a1620001b9816200026c565b50506200074b565b336001600160a01b038216036200021b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015620004fa57600082828151811062000290576200029062000735565b60200260200101519050600081600001519050806001600160401b0316600003620002ce5760405163c656089560e01b815260040160405180910390fd5b6001600160401b03811660009081526007602052604090206001810154620003f85760608301518062000314576040516330a68d4d60e01b815260040160405180910390fd5b60008181526008602052604090205460ff16156200034957604051630f940f8760e31b81526004810182905260240162000083565b60008181526008602052604090819020805460ff191660019081179091558301829055848101518354610100600160481b03196001600160a01b0390921669010000000000000000000291909116610100600160e81b031990911617610100178355517ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990620003e99085906001600160401b0391909116815260200190565b60405180910390a1506200045a565b826060015181600101541415806200042f575060408301518154690100000000000000000090046001600160a01b03908116911614155b156200045a5760405163c39a620560e01b81526001600160401b038316600482015260240162000083565b6020830151815490151560ff199091161781556040516001600160401b038316907fb8f0c74385134334c728fcac437ec6c6397c9f2c1440532b0c44175a090b140190620004e3908490815460ff811615158252600881901c6001600160401b0316602083015260481c6001600160a01b03166040820152600190910154606082015260800190565b60405180910390a25050508060010190506200026f565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005395762000539620004fe565b60405290565b604051608081016001600160401b0381118282101715620005395762000539620004fe565b604051601f8201601f191681016001600160401b03811182821017156200058f576200058f620004fe565b604052919050565b80516001600160401b0381168114620005af57600080fd5b919050565b80516001600160a01b0381168114620005af57600080fd5b600080828403608080821215620005e257600080fd5b606080831215620005f257600080fd5b620005fc62000514565b9250620006098662000597565b835260206200061a818801620005b4565b8185015260406200062e60408901620005b4565b604086015260608801519496506001600160401b03808611156200065157600080fd5b858901955089601f8701126200066657600080fd5b8551818111156200067b576200067b620004fe565b6200068b848260051b0162000564565b818152848101925060079190911b87018401908b821115620006ac57600080fd5b968401965b81881015620007235786888d031215620006cb5760008081fd5b620006d56200053f565b620006e08962000597565b8152858901518015158114620006f65760008081fd5b8187015262000707898601620005b4565b81860152888701518782015283529686019691840191620006b1565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051615eef620007a16000396000818161021e01526131420152600081816101ef015281816115d4015261168b015260006101bf015260008181611c270152611c730152615eef6000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c806385572ffb116100e3578063d383e6d91161008c578063f52121a511610066578063f52121a51461065e578063f716f99f14610671578063ff888fb11461068457600080fd5b8063d383e6d914610552578063e9d68a8e14610565578063f2fde38b1461064b57600080fd5b8063c673e584116100bd578063c673e584146104da578063ccd37ba3146104fa578063d2a15d351461053f57600080fd5b806385572ffb1461049e5780638b364334146104ac5780638da5cb5b146104bf57600080fd5b8063403b2d631161014557806369600bca1161011f57806369600bca1461036e5780637437ff9f1461038157806379ba50971461049657600080fd5b8063403b2d6314610328578063542625af1461033b5780635e36480c1461034e57600080fd5b80632d04ab76116101765780632d04ab76146102d9578063311cd513146102ee5780633f4b04aa1461030157600080fd5b806306285c6914610192578063181f5a7714610290575b600080fd5b61024e604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60408051825167ffffffffffffffff1681526020808401516001600160a01b039081169183019190915292820151909216908201526060015b60405180910390f35b6102cc6040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b604051610287919061417f565b6102ec6102e736600461422a565b6106a7565b005b6102ec6102fc3660046142dd565b610a6d565b600c5467ffffffffffffffff165b60405167ffffffffffffffff9091168152602001610287565b6102ec61033636600461448a565b610ad6565b6102ec610349366004614aae565b610c93565b61036161035c366004614bd9565b610e38565b6040516102879190614c3c565b6102ec61037c366004614c4a565b610e8e565b61042d6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152600160c01b8304811694840194909452600160e01b90910490921660608201526005548216608082015260065490911660a082015290565b6040516102879190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b6102ec610ef9565b6102ec61018d366004614c67565b61030f6104ba366004614ca2565b610fb7565b6000546040516001600160a01b039091168152602001610287565b6104ed6104e8366004614ce1565b610fcd565b6040516102879190614d41565b610531610508366004614db6565b67ffffffffffffffff919091166000908152600b60209081526040808320938352929052205490565b604051908152602001610287565b6102ec61054d366004614de2565b61112b565b6102ec610560366004614e57565b6111e5565b610603610573366004614c4a565b6040805160808101825260008082526020820181905291810182905260608101919091525067ffffffffffffffff9081166000908152600760209081526040918290208251608081018452815460ff81161515825261010081049095169281019290925269010000000000000000009093046001600160a01b031691810191909152600190910154606082015290565b604051610287919081511515815260208083015167ffffffffffffffff16908201526040808301516001600160a01b0316908201526060918201519181019190915260800190565b6102ec610659366004614f31565b6111f9565b6102ec61066c366004614f4e565b61120a565b6102ec61067f36600461501a565b61153c565b610697610692366004615165565b61157e565b6040519015158152602001610287565b60006106b5878901896152f6565b805151519091501515806106ce57508051602001515115155b156107ce57600c5460208a01359067ffffffffffffffff8083169116101561078d57600c805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f9161075691600401615534565b600060405180830381600087803b15801561077057600080fd5b505af1158015610784573d6000803e3d6000fd5b505050506107cc565b8160200151516000036107cc576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b8160200151518110156109b6576000826020015182815181106107f6576107f6615461565b602002602001015190506000816000015190506108128161163f565b600061081d82611741565b602084015151815491925067ffffffffffffffff9081166101009092041614158061085f575060208084015190810151905167ffffffffffffffff9182169116115b156108a857825160208401516040517feefb0cac00000000000000000000000000000000000000000000000000000000815261089f929190600401615547565b60405180910390fd5b6040830151806108e4576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600b60209081526040808320848452909152902054156109575783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810182905260440161089f565b602080850151015161096a906001615592565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600b6020908152604080832094835293905291909120429055506001016107d1565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d816040516109e691906155ba565b60405180910390a1610a6260008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506117a1915050565b505050505050505050565b610aad610a7c82840184615657565b6040805160008082526020820190925290610aa7565b6060815260200190600190039081610a925790505b50611b18565b604080516000808252602082019092529050610ad06001858585858660006117a1565b50505050565b610ade611bc8565b60a08101516001600160a01b03161580610b00575080516001600160a01b0316155b15610b37576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b610c9b611c24565b815181518114610cd7576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610e28576000848281518110610cf657610cf6615461565b60200260200101519050600081602001515190506000858481518110610d1e57610d1e615461565b6020026020010151905080518214610d62576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610e19576000828281518110610d8157610d81615461565b6020026020010151905080600014158015610dbc575084602001518281518110610dad57610dad615461565b60200260200101516080015181105b15610e105784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018390526044810182905260640161089f565b50600101610d65565b50505050806001019050610cda565b50610e338383611b18565b505050565b6000610e466001600461568c565b6002610e536080856156b5565b67ffffffffffffffff16610e6791906156dc565b610e718585611ca5565b901c166003811115610e8557610e85614c12565b90505b92915050565b610e96611bc8565b600c805467ffffffffffffffff83811667ffffffffffffffff1983168117909355604080519190921680825260208201939093527f88ad9c61d6caf19a2af116a871802a03a31e680115a2dd20e8c08801d7c82f83910160405180910390a15050565b6001546001600160a01b03163314610f535760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161089f565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600080610fc48484611cec565b50949350505050565b6110106040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c0820152948552918201805484518184028101840190955280855292938583019390928301828280156110b957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161109b575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561111b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110fd575b5050505050815250509050919050565b611133611bc8565b60005b81811015610e3357600083838381811061115257611152615461565b90506040020180360381019061116891906156f3565b9050611177816020015161157e565b6111dc57805167ffffffffffffffff166000908152600b602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b50600101611136565b6111ed611bc8565b6111f681611dfd565b50565b611201611bc8565b6111f6816120fd565b333014611243576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611280565b60408051808201909152600080825260208201528152602001906001900390816112595790505b5061014084015151909150156112e1576112de83610140015184602001516040516020016112bd91906001600160a01b0391909116815260200190565b60408051601f198184030181529181528601518651610160880151876121b3565b90505b60006112ed8483612260565b6005549091506001600160a01b031680156113da576040517fa219f6e50000000000000000000000000000000000000000000000000000000081526001600160a01b0382169063a219f6e5906113479085906004016157db565b600060405180830381600087803b15801561136157600080fd5b505af1925050508015611372575060015b6113da573d8080156113a0576040519150601f19603f3d011682016040523d82523d6000602084013e6113a5565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161089f919061417f565b610120850151511580156113f057506080850151155b80611407575060408501516001600160a01b03163b155b8061144757506040850151611445906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612303565b155b15611453575050505050565b60048054608087015160408089015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf97983936114ae938a93611388939291016157ee565b6000604051808303816000875af11580156114cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114f5919081019061586f565b50915091508161153357806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161089f919061417f565b50505050505050565b611544611bc8565b60005b815181101561157a5761157282828151811061156557611565615461565b602002602001015161231f565b600101611547565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa15801561161b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906158c9565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156116da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fe91906158c9565b156111f6576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161089f565b67ffffffffffffffff81166000908152600760205260408120805460ff16610e88576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161089f565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906118008760a46158e6565b90508260600151156118485784516118199060206156dc565b86516118269060206156dc565b6118319060a06158e6565b61183b91906158e6565b61184590826158e6565b90505b36811461188a576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161089f565b50815181146118d25781516040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161089f565b6118da611c24565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561192857611928614c12565b600281111561193957611939614c12565b905250905060028160200151600281111561195657611956614c12565b1480156119aa5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061199257611992615461565b6000918252602090912001546001600160a01b031633145b6119e0576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611ac25760208201516119fb9060016158f9565b60ff16855114611a37576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611a72576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611a84929190615912565b604051908190038120611a9b918b90602001615922565b604051602081830303815290604052805190602001209050611ac08a8288888861262a565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611b52576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611bc157611bb9858281518110611b8757611b87615461565b602002602001015184611bb357858381518110611ba657611ba6615461565b6020026020010151612841565b83612841565b600101611b69565b5050505050565b6000546001600160a01b03163314611c225760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161089f565b565b467f000000000000000000000000000000000000000000000000000000000000000014611c22576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161089f565b67ffffffffffffffff82166000908152600a6020526040812081611cca608085615936565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b67ffffffffffffffff80831660009081526009602090815260408083206001600160a01b03861684529091528120549091829116808203611def5767ffffffffffffffff8516600090815260076020526040902054690100000000000000000090046001600160a01b03168015611ded576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015282169063856c824790602401602060405180830381865afa158015611dbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de0919061595d565b6001935093505050611df6565b505b9150600090505b9250929050565b60005b815181101561157a576000828281518110611e1d57611e1d615461565b602002602001015190506000816000015190508067ffffffffffffffff16600003611e74576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660009081526007602052604090206001810154611fe457606083015180611ed2576040517f30a68d4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526008602052604090205460ff1615611f1e576040517f7ca07c380000000000000000000000000000000000000000000000000000000081526004810182905260240161089f565b60008181526008602052604090819020805460ff19166001908117909155830182905584810151835468ffffffffffffffff00196001600160a01b03909216690100000000000000000002919091167fffffff00000000000000000000000000000000000000000000000000000000ff90911617610100178355517ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990611fd690859067ffffffffffffffff91909116815260200190565b60405180910390a15061205d565b8260600151816001015414158061201a575060408301518154690100000000000000000090046001600160a01b03908116911614155b1561205d576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8316600482015260240161089f565b6020830151815490151560ff1990911617815560405167ffffffffffffffff8316907fb8f0c74385134334c728fcac437ec6c6397c9f2c1440532b0c44175a090b1401906120e7908490815460ff811615158252600881901c67ffffffffffffffff16602083015260481c6001600160a01b03166040820152600190910154606082015260800190565b60405180910390a2505050806001019050611e00565b336001600160a01b038216036121555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161089f565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8560005b8751811015612255576122308882815181106121d5576121d5615461565b6020026020010151602001518888888886815181106121f6576121f6615461565b6020026020010151806020019051810190612211919061597a565b88878151811061222357612223615461565b60200260200101516130e1565b82828151811061224257612242615461565b60209081029190910101526001016121b7565b509695505050505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016122d891906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b600061230e8361345a565b8015610e855750610e8583836134a6565b806040015160ff1660000361234a576000604051631b3fab5160e11b815260040161089f9190615a2f565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361239b576060840151600182018054911515620100000262ff0000199092169190911790556123f0565b6060840151600182015460ff62010000909104161515901515146123f0576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff8416600482015260240161089f565b60a08401518051601f60ff8216111561241f576001604051631b3fab5160e11b815260040161089f9190615a2f565b612485858560030180548060200260200160405190810160405280929190818152602001828054801561247b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161245d575b5050505050613548565b856060015115612597576124f3858560020180548060200260200160405190810160405280929190818152602001828054801561247b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161245d575050505050613548565b6080860151805161250d906002870190602084019061408d565b50805160018501805461ff00191661010060ff841690810291909117909155601f1015612550576002604051631b3fab5160e11b815260040161089f9190615a2f565b6040880151612560906003615a49565b60ff168160ff1611612588576003604051631b3fab5160e11b815260040161089f9190615a2f565b612594878360016135b1565b50505b6125a3858360026135b1565b81516125b8906003860190602085019061408d565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f54793612611938a939260028b01929190615a65565b60405180910390a161262285613731565b505050505050565b6126326140fb565b835160005b8181101561283757600060018886846020811061265657612656615461565b61266391901a601b6158f9565b89858151811061267557612675615461565b602002602001015189868151811061268f5761268f615461565b6020026020010151604051600081526020016040526040516126cd949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156126ef573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b0385168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561275057612750614c12565b600281111561276157612761614c12565b905250905060018160200151600281111561277e5761277e614c12565b146127b5576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f81106127cc576127cc615461565b602002015115612808576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f811061282357612823615461565b911515602090920201525050600101612637565b5050505050505050565b815161284c8161163f565b600061285782611741565b602085015151909150600081900361289a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84604001515181146128d8576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156128f3576128f3614331565b60405190808252806020026020018201604052801561291c578160200160208202803683370190505b50905060005b828110156129e15760008760200151828151811061294257612942615461565b6020026020010151905061295a81866001015461374d565b83838151811061296c5761296c615461565b60200260200101818152505080610180015183838151811061299057612990615461565b6020026020010151146129d8578061018001516040517f345039be00000000000000000000000000000000000000000000000000000000815260040161089f91815260200190565b50600101612922565b5060006129f8858389606001518a608001516138a9565b905080600003612a40576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161089f565b8551151560005b84811015610a6257600089602001518281518110612a6757612a67615461565b602002602001015190506000612a81898360600151610e38565b90506002816003811115612a9757612a97614c12565b03612aed5760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a150506130d9565b6000816003811115612b0157612b01614c12565b1480612b1e57506003816003811115612b1c57612b1c614c12565b145b612b6e5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c166004830152909116602482015260440161089f565b8315612c4f5760045460009074010000000000000000000000000000000000000000900463ffffffff16612ba2874261568c565b1190508080612bc257506003826003811115612bc057612bc0614c12565b145b612c04576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b16600482015260240161089f565b8a8481518110612c1657612c16615461565b6020026020010151600014612c49578a8481518110612c3757612c37615461565b60200260200101518360800181815250505b50612cb4565b6000816003811115612c6357612c63614c12565b14612cb45760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c166004830152909116602482015260440161089f565b600080612cc58b8560200151611cec565b915091508015612db45760c084015167ffffffffffffffff16612ce9836001615592565b67ffffffffffffffff1614612d6c5760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612d5b928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60405180910390a1505050506130d9565b67ffffffffffffffff8b81166000908152600960209081526040808320888301516001600160a01b031684529091529020805467ffffffffffffffff19169184169190911790555b6000836003811115612dc857612dc8614c12565b03612e595760c084015167ffffffffffffffff16612de7836001615592565b67ffffffffffffffff1614612e595760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612d5b928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60008d604001518681518110612e7157612e71615461565b6020026020010151905080518561014001515114612ed55760608501516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808f166004830152909116602482015260440161089f565b612ee58c866060015160016138ff565b600080612ef287846139a7565b91509150612f058e8860600151846138ff565b888015612f2357506003826003811115612f2157612f21614c12565b145b8015612f4157506000866003811115612f3e57612f3e614c12565b14155b15612f8157866101800151816040517f2b11b8d900000000000000000000000000000000000000000000000000000000815260040161089f929190615aeb565b6003826003811115612f9557612f95614c12565b14158015612fb557506002826003811115612fb257612fb2614c12565b14155b15612ff6578d8760600151836040517f926c5a3e00000000000000000000000000000000000000000000000000000000815260040161089f93929190615b04565b600086600381111561300a5761300a614c12565b036130785767ffffffffffffffff808f1660009081526009602090815260408083208b8301516001600160a01b0316845290915281208054909216919061305083615b2a565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516130c9929190615b51565b60405180910390a4505050505050505b600101612a47565b604080518082019091526000808252602082015260006131048460200151613bf1565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015613189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ad9190615b71565b90506001600160a01b03811615806131f557506131f36001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612303565b155b15613237576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161089f565b600080613302633907753760e01b6040518061010001604052808d81526020018b67ffffffffffffffff1681526020018c6001600160a01b031681526020018e8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016132b39190615b8e565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152600454859063ffffffff600160e01b909104166113886084613c33565b509150915081613327578060405163e1cd550960e01b815260040161089f919061417f565b805160201461336f5780516040517f78ef802400000000000000000000000000000000000000000000000000000000815260206004820152602481019190915260440161089f565b6000818060200190518101906133859190615c65565b604080516001600160a01b038d16602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600454919250613408918790600160c01b900463ffffffff166113886084613c33565b5090935091508261342e578160405163e1cd550960e01b815260040161089f919061417f565b604080518082019091526001600160a01b03909516855260208501525091925050509695505050505050565b6000613486827f01ffc9a7000000000000000000000000000000000000000000000000000000006134a6565b8015610e88575061349f826001600160e01b03196134a6565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613531575060208210155b801561353d5750600081115b979650505050505050565b60005b8151811015610e335760ff83166000908152600360205260408120835190919084908490811061357d5761357d615461565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff1916905560010161354b565b60005b82518160ff161015610ad0576000838260ff16815181106135d7576135d7615461565b60200260200101519050600060028111156135f4576135f4614c12565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561363357613633614c12565b14613654576004604051631b3fab5160e11b815260040161089f9190615a2f565b6001600160a01b038116613694576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156136ba576136ba614c12565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561371757613717614c12565b0217905550905050508061372a90615c7e565b90506135b4565b60ff81166111f657600c805467ffffffffffffffff1916905550565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016137e39897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161381c9190615c9d565b604051602081830303815290604052805190602001208761016001516040516020016138489190615d52565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b6000806138b7858585613d59565b90506138c28161157e565b6138d05760009150506138f7565b67ffffffffffffffff86166000908152600b60209081526040808320938352929052205490505b949350505050565b6000600261390e6080856156b5565b67ffffffffffffffff1661392291906156dc565b905060006139308585611ca5565b90508161393f6001600461568c565b901b19168183600381111561395657613956614c12565b67ffffffffffffffff87166000908152600a602052604081209190921b92909217918291613985608088615936565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906139eb9087908790600401615d65565b600060405180830381600087803b158015613a0557600080fd5b505af1925050508015613a16575060015b613bd6573d808015613a44576040519150601f19603f3d011682016040523d82523d6000602084013e613a49565b606091505b506000613a5582615eaa565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000006001600160e01b031982161480613a9f575063e1cd550960e01b6001600160e01b03198216145b80613aba575063046b337b60e51b6001600160e01b03198216145b80613aee57507f78ef8024000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b2257507f0c3b563c000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b5657507fae9b4ce9000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b8a57507f09c25325000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b15613b9b5750600392509050611df6565b856101800151826040517f2b11b8d900000000000000000000000000000000000000000000000000000000815260040161089f929190615aeb565b50506040805160208101909152600081526002909250929050565b60008151602014613c17578160405163046b337b60e51b815260040161089f919061417f565b610e8882806020019051810190613c2e9190615c65565b613ff8565b6000606060008361ffff1667ffffffffffffffff811115613c5657613c56614331565b6040519080825280601f01601f191660200182016040528015613c80576020820181803683370190505b509150863b613cb3577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613ce6577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613d1f577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613d425750835b808352806000602085013e50955095509592505050565b8251825160009190818303613d9a576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613dae57506101018111155b613dcb576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613df5576040516309bde33960e01b815260040160405180910390fd5b80600003613e225786600081518110613e1057613e10615461565b60200260200101519350505050613ff1565b60008167ffffffffffffffff811115613e3d57613e3d614331565b604051908082528060200260200182016040528015613e66578160200160208202803683370190505b50905060008080805b85811015613f905760006001821b8b811603613eca5788851015613eb3578c5160018601958e918110613ea457613ea4615461565b60200260200101519050613eec565b8551600185019487918110613ea457613ea4615461565b8b5160018401938d918110613ee157613ee1615461565b602002602001015190505b600089861015613f1c578d5160018701968f918110613f0d57613f0d615461565b60200260200101519050613f3e565b8651600186019588918110613f3357613f33615461565b602002602001015190505b82851115613f5f576040516309bde33960e01b815260040160405180910390fd5b613f69828261404c565b878481518110613f7b57613f7b615461565b60209081029190910101525050600101613e6f565b506001850382148015613fa257508683145b8015613fad57508581145b613fca576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613fdf57613fdf615461565b60200260200101519750505050505050505b9392505050565b60006001600160a01b03821180614010575061040082105b156140485760408051602081018490520160408051601f198184030181529082905263046b337b60e51b825261089f9160040161417f565b5090565b60008183106140645761405f828461406a565b610e85565b610e8583835b60408051600160208201529081018390526060810182905260009060800161388b565b8280548282559060005260206000209081019282156140ef579160200282015b828111156140ef578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161782556020909201916001909101906140ad565b5061404892915061411a565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115614048576000815560010161411b565b60005b8381101561414a578181015183820152602001614132565b50506000910152565b6000815180845261416b81602086016020860161412f565b601f01601f19169290920160200192915050565b602081526000610e856020830184614153565b8060608101831015610e8857600080fd5b60008083601f8401126141b557600080fd5b50813567ffffffffffffffff8111156141cd57600080fd5b602083019150836020828501011115611df657600080fd5b60008083601f8401126141f757600080fd5b50813567ffffffffffffffff81111561420f57600080fd5b6020830191508360208260051b8501011115611df657600080fd5b60008060008060008060008060e0898b03121561424657600080fd5b6142508a8a614192565b9750606089013567ffffffffffffffff8082111561426d57600080fd5b6142798c838d016141a3565b909950975060808b013591508082111561429257600080fd5b61429e8c838d016141e5565b909750955060a08b01359150808211156142b757600080fd5b506142c48b828c016141e5565b999c989b50969995989497949560c00135949350505050565b6000806000608084860312156142f257600080fd5b6142fc8585614192565b9250606084013567ffffffffffffffff81111561431857600080fd5b614324868287016141a3565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561436a5761436a614331565b60405290565b6040805190810167ffffffffffffffff8111828210171561436a5761436a614331565b6040516101a0810167ffffffffffffffff8111828210171561436a5761436a614331565b60405160a0810167ffffffffffffffff8111828210171561436a5761436a614331565b6040516080810167ffffffffffffffff8111828210171561436a5761436a614331565b6040516060810167ffffffffffffffff8111828210171561436a5761436a614331565b604051601f8201601f1916810167ffffffffffffffff8111828210171561444957614449614331565b604052919050565b6001600160a01b03811681146111f657600080fd5b803561447181614451565b919050565b803563ffffffff8116811461447157600080fd5b600060c0828403121561449c57600080fd5b6144a4614347565b82356144af81614451565b81526144bd60208401614476565b60208201526144ce60408401614476565b60408201526144df60608401614476565b606082015260808301356144f281614451565b608082015260a083013561450581614451565b60a08201529392505050565b600067ffffffffffffffff82111561452b5761452b614331565b5060051b60200190565b67ffffffffffffffff811681146111f657600080fd5b803561447181614535565b80151581146111f657600080fd5b803561447181614556565b600067ffffffffffffffff82111561458957614589614331565b50601f01601f191660200190565b600082601f8301126145a857600080fd5b81356145bb6145b68261456f565b614420565b8181528460208386010111156145d057600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126145fe57600080fd5b8135602061460e6145b683614511565b82815260069290921b8401810191818101908684111561462d57600080fd5b8286015b84811015612255576040818903121561464a5760008081fd5b614652614370565b813561465d81614451565b81528185013585820152835291830191604001614631565b600082601f83011261468657600080fd5b813560206146966145b683614511565b82815260059290921b840181019181810190868411156146b557600080fd5b8286015b8481101561225557803567ffffffffffffffff8111156146d95760008081fd5b6146e78986838b0101614597565b8452509183019183016146b9565b60006101a0828403121561470857600080fd5b614710614393565b905061471b8261454b565b815261472960208301614466565b602082015261473a60408301614466565b604082015261474b6060830161454b565b60608201526080820135608082015261476660a08301614564565b60a082015261477760c0830161454b565b60c082015261478860e08301614466565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156147b557600080fd5b6147c186838701614597565b838501526101409250828501359150808211156147dd57600080fd5b6147e9868387016145ed565b8385015261016092508285013591508082111561480557600080fd5b5061481285828601614675565b82840152505061018080830135818301525092915050565b600082601f83011261483b57600080fd5b8135602061484b6145b683614511565b82815260059290921b8401810191818101908684111561486a57600080fd5b8286015b8481101561225557803567ffffffffffffffff81111561488e5760008081fd5b61489c8986838b01016146f5565b84525091830191830161486e565b600082601f8301126148bb57600080fd5b813560206148cb6145b683614511565b82815260059290921b840181019181810190868411156148ea57600080fd5b8286015b8481101561225557803567ffffffffffffffff81111561490e5760008081fd5b61491c8986838b0101614675565b8452509183019183016148ee565b600082601f83011261493b57600080fd5b8135602061494b6145b683614511565b8083825260208201915060208460051b87010193508684111561496d57600080fd5b602086015b848110156122555780358352918301918301614972565b600082601f83011261499a57600080fd5b813560206149aa6145b683614511565b82815260059290921b840181019181810190868411156149c957600080fd5b8286015b8481101561225557803567ffffffffffffffff808211156149ee5760008081fd5b9088019060a0828b03601f1901811315614a085760008081fd5b614a106143b7565b614a1b88850161454b565b815260408085013584811115614a315760008081fd5b614a3f8e8b8389010161482a565b8a8401525060608086013585811115614a585760008081fd5b614a668f8c838a01016148aa565b8385015250608091508186013585811115614a815760008081fd5b614a8f8f8c838a010161492a565b91840191909152509190930135908301525083529183019183016149cd565b6000806040808486031215614ac257600080fd5b833567ffffffffffffffff80821115614ada57600080fd5b614ae687838801614989565b9450602091508186013581811115614afd57600080fd5b8601601f81018813614b0e57600080fd5b8035614b1c6145b682614511565b81815260059190911b8201840190848101908a831115614b3b57600080fd5b8584015b83811015614bc757803586811115614b575760008081fd5b8501603f81018d13614b695760008081fd5b87810135614b796145b682614511565b81815260059190911b82018a0190898101908f831115614b995760008081fd5b928b01925b82841015614bb75783358252928a0192908a0190614b9e565b8652505050918601918601614b3f565b50809750505050505050509250929050565b60008060408385031215614bec57600080fd5b8235614bf781614535565b91506020830135614c0781614535565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614c3857614c38614c12565b9052565b60208101610e888284614c28565b600060208284031215614c5c57600080fd5b8135613ff181614535565b600060208284031215614c7957600080fd5b813567ffffffffffffffff811115614c9057600080fd5b820160a08185031215613ff157600080fd5b60008060408385031215614cb557600080fd5b8235614cc081614535565b91506020830135614c0781614451565b803560ff8116811461447157600080fd5b600060208284031215614cf357600080fd5b610e8582614cd0565b60008151808452602080850194506020840160005b83811015614d365781516001600160a01b031687529582019590820190600101614d11565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614d9060e0840182614cfc565b90506040840151601f198483030160c0850152614dad8282614cfc565b95945050505050565b60008060408385031215614dc957600080fd5b8235614dd481614535565b946020939093013593505050565b60008060208385031215614df557600080fd5b823567ffffffffffffffff80821115614e0d57600080fd5b818501915085601f830112614e2157600080fd5b813581811115614e3057600080fd5b8660208260061b8501011115614e4557600080fd5b60209290920196919550909350505050565b60006020808385031215614e6a57600080fd5b823567ffffffffffffffff811115614e8157600080fd5b8301601f81018513614e9257600080fd5b8035614ea06145b682614511565b81815260079190911b82018301908381019087831115614ebf57600080fd5b928401925b8284101561353d5760808489031215614edd5760008081fd5b614ee56143da565b8435614ef081614535565b815284860135614eff81614556565b81870152604085810135614f1281614451565b9082015260608581013590820152825260809093019290840190614ec4565b600060208284031215614f4357600080fd5b8135613ff181614451565b60008060408385031215614f6157600080fd5b823567ffffffffffffffff80821115614f7957600080fd5b614f85868387016146f5565b93506020850135915080821115614f9b57600080fd5b50614fa885828601614675565b9150509250929050565b600082601f830112614fc357600080fd5b81356020614fd36145b683614511565b8083825260208201915060208460051b870101935086841115614ff557600080fd5b602086015b8481101561225557803561500d81614451565b8352918301918301614ffa565b6000602080838503121561502d57600080fd5b823567ffffffffffffffff8082111561504557600080fd5b818501915085601f83011261505957600080fd5b81356150676145b682614511565b81815260059190911b8301840190848101908883111561508657600080fd5b8585015b83811015615158578035858111156150a157600080fd5b860160c0818c03601f190112156150b85760008081fd5b6150c0614347565b88820135815260406150d3818401614cd0565b8a83015260606150e4818501614cd0565b82840152608091506150f7828501614564565b9083015260a0838101358981111561510f5760008081fd5b61511d8f8d83880101614fb2565b838501525060c08401359150888211156151375760008081fd5b6151458e8c84870101614fb2565b908301525084525091860191860161508a565b5098975050505050505050565b60006020828403121561517757600080fd5b5035919050565b80356001600160e01b038116811461447157600080fd5b600082601f8301126151a657600080fd5b813560206151b66145b683614511565b82815260069290921b840181019181810190868411156151d557600080fd5b8286015b8481101561225557604081890312156151f25760008081fd5b6151fa614370565b813561520581614535565b815261521282860161517e565b818601528352918301916040016151d9565b600082601f83011261523557600080fd5b813560206152456145b683614511565b82815260079290921b8401810191818101908684111561526457600080fd5b8286015b848110156122555780880360808112156152825760008081fd5b61528a6143fd565b823561529581614535565b81526040601f1983018113156152ab5760008081fd5b6152b3614370565b9250868401356152c281614535565b8352838101356152d181614535565b8388015281870192909252606083013591810191909152835291830191608001615268565b6000602080838503121561530957600080fd5b823567ffffffffffffffff8082111561532157600080fd5b8185019150604080838803121561533757600080fd5b61533f614370565b83358381111561534e57600080fd5b84016040818a03121561536057600080fd5b615368614370565b81358581111561537757600080fd5b8201601f81018b1361538857600080fd5b80356153966145b682614511565b81815260069190911b8201890190898101908d8311156153b557600080fd5b928a01925b828410156154055787848f0312156153d25760008081fd5b6153da614370565b84356153e581614451565b81526153f2858d0161517e565b818d0152825292870192908a01906153ba565b84525050508187013593508484111561541d57600080fd5b6154298a858401615195565b818801528252508385013591508282111561544357600080fd5b61544f88838601615224565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b818110156154ce57835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615497565b50508583015187820388850152805180835290840192506000918401905b80831015615528578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906154ec565b50979650505050505050565b602081526000610e856020830184615477565b67ffffffffffffffff8316815260608101613ff16020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156155b3576155b361557c565b5092915050565b6000602080835260608451604080848701526155d96060870183615477565b87850151878203601f19016040890152805180835290860193506000918601905b8083101561515857845167ffffffffffffffff81511683528781015161563989850182805167ffffffffffffffff908116835260209182015116910152565b508401518287015293860193600192909201916080909101906155fa565b60006020828403121561566957600080fd5b813567ffffffffffffffff81111561568057600080fd5b6138f784828501614989565b81810381811115610e8857610e8861557c565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806156d0576156d061569f565b92169190910692915050565b8082028115828204841417610e8857610e8861557c565b60006040828403121561570557600080fd5b61570d614370565b823561571881614535565b81526020928301359281019290925250919050565b60008151808452602080850194506020840160005b83811015614d3657815180516001600160a01b031688526020908101519088015260408701965090820190600101615742565b8051825267ffffffffffffffff60208201511660208301526000604082015160a060408501526157a860a0850182614153565b9050606083015184820360608601526157c18282614153565b91505060808301518482036080860152614dad828261572d565b602081526000610e856020830184615775565b6080815260006158016080830187615775565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b600082601f83011261583b57600080fd5b81516158496145b68261456f565b81815284602083860101111561585e57600080fd5b6138f782602083016020870161412f565b60008060006060848603121561588457600080fd5b835161588f81614556565b602085015190935067ffffffffffffffff8111156158ac57600080fd5b6158b88682870161582a565b925050604084015190509250925092565b6000602082840312156158db57600080fd5b8151613ff181614556565b80820180821115610e8857610e8861557c565b60ff8181168382160190811115610e8857610e8861557c565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff808416806159515761595161569f565b92169190910492915050565b60006020828403121561596f57600080fd5b8151613ff181614535565b60006020828403121561598c57600080fd5b815167ffffffffffffffff808211156159a457600080fd5b90830190606082860312156159b857600080fd5b6159c06143fd565b8251828111156159cf57600080fd5b6159db8782860161582a565b8252506020830151828111156159f057600080fd5b6159fc8782860161582a565b602083015250604083015182811115615a1457600080fd5b615a208782860161582a565b60408301525095945050505050565b6020810160058310615a4357615a43614c12565b91905290565b60ff81811683821602908116908181146155b3576155b361557c565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015615abf5784546001600160a01b031683526001948501949284019201615a9a565b50508481036060860152615ad38188614cfc565b935050505060ff831660808301529695505050505050565b8281526040602082015260006138f76040830184614153565b67ffffffffffffffff848116825283166020820152606081016138f76040830184614c28565b600067ffffffffffffffff808316818103615b4757615b4761557c565b6001019392505050565b615b5b8184614c28565b6040602082015260006138f76040830184614153565b600060208284031215615b8357600080fd5b8151613ff181614451565b6020815260008251610100806020850152615bad610120850183614153565b91506020850151615bca604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615c0460a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615c218483614153565b935060c08701519150808685030160e0870152615c3e8483614153565b935060e0870151915080868503018387015250615c5b8382614153565b9695505050505050565b600060208284031215615c7757600080fd5b5051919050565b600060ff821660ff8103615c9457615c9461557c565b60010192915050565b6020808252825182820181905260009190848201906040850190845b81811015615cec57835180516001600160a01b031684526020908101519084015260408301938501939250600101615cb9565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015615d4557601f19868403018952615d33838351614153565b98840198925090830190600101615d17565b5090979650505050505050565b602081526000610e856020830184615cf8565b60408152615d8060408201845167ffffffffffffffff169052565b60006020840151615d9c60608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615dfd8185018367ffffffffffffffff169052565b60e08601519150610120615e1b818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a06101608181870152615e4b6101e0870185614153565b9350828801519250603f19610180818887030181890152615e6c868661572d565b9550828a01519450818887030184890152615e878686615cf8565b9550808a01516101c089015250505050508281036020840152614dad8185615cf8565b6000815160208301516001600160e01b031980821693506004831015615eda5780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", } var EVM2EVMMultiOffRampABI = EVM2EVMMultiOffRampMetaData.ABI @@ -2629,7 +2628,7 @@ func (EVM2EVMMultiOffRampSkippedSenderWithPreviousRampMessageInflight) Topic() c } func (EVM2EVMMultiOffRampSourceChainConfigSet) Topic() common.Hash { - return common.HexToHash("0xa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d30") + return common.HexToHash("0xb8f0c74385134334c728fcac437ec6c6397c9f2c1440532b0c44175a090b1401") } func (EVM2EVMMultiOffRampSourceChainSelectorAdded) Topic() common.Hash { 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 de649f27e2..322d56d005 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 @@ -9,7 +9,7 @@ commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 custom_token_pool: ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.abi ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.bin 488bd34d63be7b731f4fbdf0cd353f7e4fbee990cfa4db26be91973297d3f803 ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de -evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 4c7bdddea3decee12887c5bd89648ed3b423bd31eefe586d5cb5c1bc8b883ffe +evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 263ae943bc6b378a3cf01b268e2eb154c760dae708b940c8f1e59099a9100f84 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin da3b401b00dae39a2851740d00f2ed81d498ad9287b7ab9276f8b10021743d20 evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b6132cb22370d62b1b20174bbe832ec87df61f6ab65f7fe2515733bdd10a30f5 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 383e9930fbc1b7fbb6554cc8857229d207fd6742e87c7fb1a37002347e8de8e2 From 14e7676eaa11765768f1af5950e5b311531f0922 Mon Sep 17 00:00:00 2001 From: Evaldas Latoskinas Date: Wed, 26 Jun 2024 12:37:31 +0200 Subject: [PATCH 2/4] fix: metadataHash-based tests --- contracts/.changeset/popular-poets-reflect.md | 5 ----- .../v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol | 12 ++++-------- 2 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 contracts/.changeset/popular-poets-reflect.md diff --git a/contracts/.changeset/popular-poets-reflect.md b/contracts/.changeset/popular-poets-reflect.md deleted file mode 100644 index c6eb4e9726..0000000000 --- a/contracts/.changeset/popular-poets-reflect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts-ccip': minor ---- - -#changed Configurable metadataHash for MultiOffRamp diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol index 6b686b2796..5f373d071b 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol @@ -360,8 +360,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test_SingleMessageNoTokensUnordered_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce = 0; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -382,8 +381,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { ); messages[0].sequenceNumber++; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -513,8 +511,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce = 0; - messages[0].messageId = - Internal._hash(messages[0], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -649,8 +646,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { if (orderings[i]) { messages[i].nonce = ++expectedNonce; } - messages[i].messageId = - Internal._hash(messages[i], s_offRamp.metadataHash(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1)); + messages[i].messageId = Internal._hash(messages[i], METADATA_HASH_1); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( From 358ceb7db0d0762a538f209a3d9a5dda86739b25 Mon Sep 17 00:00:00 2001 From: Evaldas Latoskinas Date: Wed, 26 Jun 2024 15:41:24 +0200 Subject: [PATCH 3/4] feat: use onRamp instead of metadataHash in offramp --- .../src/v0.8/ccip/libraries/Internal.sol | 30 +++ .../v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol | 38 ++-- .../v0.8/ccip/test/e2e/MultiRampsEnd2End.sol | 16 +- .../test/offRamp/EVM2EVMMultiOffRamp.t.sol | 209 ++++++++---------- .../offRamp/EVM2EVMMultiOffRampSetup.t.sol | 41 ++-- 5 files changed, 155 insertions(+), 179 deletions(-) diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol index e39fcf4c0f..cc71dedfb4 100644 --- a/contracts/src/v0.8/ccip/libraries/Internal.sol +++ b/contracts/src/v0.8/ccip/libraries/Internal.sol @@ -158,6 +158,36 @@ library Internal { ); } + // TODO: this function is incomplete and should not yet be used - it is intended for Any2EVM / EVM2Any messages + function _hash(EVM2EVMMessage memory original) internal pure returns (bytes32) { + // Fixed-size message fields are included in nested hash to reduce stack pressure. + // This hashing scheme is also used by RMN. If changing it, please notify the RMN maintainers. + return keccak256( + abi.encode( + MerkleMultiProof.LEAF_DOMAIN_SEPARATOR, + // TODO: include prefix message hash + // TODO: include OnRamp address + // TODO: include destChainSelector + keccak256( + abi.encode( + original.sourceChainSelector, + original.sender, + original.receiver, + original.sequenceNumber, + original.gasLimit, + original.strict, + original.nonce, + original.feeToken, + original.feeTokenAmount + ) + ), + keccak256(original.data), + keccak256(abi.encode(original.tokenAmounts)), + keccak256(abi.encode(original.sourceTokenData)) + ) + ); + } + /// @notice This methods provides validation for parsing abi encoded addresses by ensuring the /// address is within the EVM address space. If it isn't it will revert with an InvalidEVMAddress error, which /// we can catch and handle more gracefully than a revert from abi.decode. diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol index 9ad4c0216f..62b19bb7ca 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol @@ -60,8 +60,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 error StaleCommitReport(); error InvalidInterval(uint64 sourceChainSelector, Interval interval); error ZeroAddressNotAllowed(); - error DuplicateMetadataHash(bytes32 metadataHash); - error ZeroMetadataHashNotAllowed(); /// @dev Atlas depends on this event, if changing, please notify Atlas. event StaticConfigSet(StaticConfig staticConfig); @@ -96,9 +94,7 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 bool isEnabled; // ─────────╮ Flag whether the source chain is enabled or not uint64 minSeqNr; // | The min sequence number expected for future messages address prevOffRamp; // ────╯ Address of previous-version per-lane OffRamp. Used to be able to provide seequencing continuity during a zero downtime upgrade. - /// @dev Ensures that 2 identical messages sent to 2 different lanes will have a distinct hash. - /// Must match the meatdataHash on the onRamp. - bytes32 metadataHash; // Source-chain specific message hash preimage to ensure global uniqueness + bytes onRamp; // OnRamp address on the source chain } /// @notice SourceChainConfig update args scoped to one source chain @@ -106,7 +102,7 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 uint64 sourceChainSelector; // ───╮ Source chain selector of the config to update bool isEnabled; // │ Flag whether the source chain is enabled or not address prevOffRamp; // ───────────╯ Address of previous-version per-lane OffRamp. Used to be able to provide sequencing continuity during a zero downtime upgrade. - bytes32 metadataHash; // Source-chain specific message hash preimage to ensure global uniqueness + bytes onRamp; // OnRamp address on the source chain } /// @notice Dynamic offRamp config @@ -162,8 +158,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 /// @notice SourceConfig per chain /// (forms lane configurations from sourceChainSelector => StaticConfig.chainSelector) mapping(uint64 sourceChainSelector => SourceChainConfig sourceChainConfig) internal s_sourceChainConfigs; - /// @notice Set of used metadata hashes - used to prevent configuring the same metadataHash more than once - mapping(bytes32 metadataHash => bool isActive) internal s_usedMetadataHashSet; // STATE /// @dev The expected nonce for a given sender per source chain. @@ -370,7 +364,9 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 uint64 sourceChainSelector = report.sourceChainSelector; _whenNotCursed(sourceChainSelector); - SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector); + // TODO: currently unused - but should not be removed - it will be used once the message signature changes + // SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector); + _getEnabledSourceChainConfig(sourceChainSelector); uint256 numMsgs = report.messages.length; if (numMsgs == 0) revert EmptyReport(); @@ -382,7 +378,9 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 Internal.EVM2EVMMessage memory message = report.messages[i]; // We do this hash here instead of in _verifyMessages to avoid two separate loops // over the same data, which increases gas cost - hashedLeaves[i] = Internal._hash(message, sourceChainConfig.metadataHash); + // TODO: verify message.onRamp == config.onRamp + // TODO: verify message.destChainSelector == config.destChainSelector + hashedLeaves[i] = Internal._hash(message); // For EVM2EVM offramps, the messageID is the leaf hash. // Asserting that this is true ensures we don't accidentally commit and then execute // a message with an unexpected hash. @@ -780,27 +778,21 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3 } SourceChainConfig storage currentConfig = s_sourceChainConfigs[sourceChainSelector]; + bytes memory currentOnRamp = currentConfig.onRamp; + bytes memory newOnRamp = sourceConfigUpdate.onRamp; // OnRamp can never be zero - if it is, then the source chain has been added for the first time - if (currentConfig.metadataHash == bytes32("")) { - bytes32 newMetadataHash = sourceConfigUpdate.metadataHash; - - if (newMetadataHash == bytes32("")) { - revert ZeroMetadataHashNotAllowed(); - } - - if (s_usedMetadataHashSet[newMetadataHash]) { - revert DuplicateMetadataHash(newMetadataHash); + if (currentOnRamp.length == 0) { + if (newOnRamp.length == 0) { + revert ZeroAddressNotAllowed(); } - s_usedMetadataHashSet[newMetadataHash] = true; - currentConfig.metadataHash = newMetadataHash; + currentConfig.onRamp = newOnRamp; currentConfig.prevOffRamp = sourceConfigUpdate.prevOffRamp; currentConfig.minSeqNr = 1; emit SourceChainSelectorAdded(sourceChainSelector); } else if ( - currentConfig.metadataHash != sourceConfigUpdate.metadataHash - || currentConfig.prevOffRamp != sourceConfigUpdate.prevOffRamp + keccak256(currentOnRamp) != keccak256(newOnRamp) || currentConfig.prevOffRamp != sourceConfigUpdate.prevOffRamp ) { revert InvalidStaticConfig(sourceChainSelector); } diff --git a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol index ce0e4ea121..e1a142e58f 100644 --- a/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol +++ b/contracts/src/v0.8/ccip/test/e2e/MultiRampsEnd2End.sol @@ -90,18 +90,14 @@ contract MultiRampsE2E is EVM2EVMMultiOnRampSetup, EVM2EVMMultiOffRampSetup { sourceChainSelector: SOURCE_CHAIN_SELECTOR, isEnabled: true, prevOffRamp: address(0), - // Must match OnRamp's metadataHash - metadataHash: keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR, DEST_CHAIN_SELECTOR, address(s_onRamp)) - ) + // Must match OnRamp address + onRamp: abi.encode(address(s_onRamp)) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR + 1, isEnabled: true, prevOffRamp: address(0), - metadataHash: keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR + 1, DEST_CHAIN_SELECTOR, address(s_onRamp2)) - ) + onRamp: abi.encode(address(s_onRamp2)) }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); @@ -131,12 +127,12 @@ contract MultiRampsE2E is EVM2EVMMultiOnRampSetup, EVM2EVMMultiOffRampSetup { // Commit bytes32[] memory hashedMessages1 = new bytes32[](2); - hashedMessages1[0] = messages1[0]._hash(s_metadataHash); + hashedMessages1[0] = messages1[0]._hash(); messages1[0].messageId = hashedMessages1[0]; - hashedMessages1[1] = messages1[1]._hash(s_metadataHash); + hashedMessages1[1] = messages1[1]._hash(); messages1[1].messageId = hashedMessages1[1]; bytes32[] memory hashedMessages2 = new bytes32[](1); - hashedMessages2[0] = messages2[0]._hash(s_metadataHash2); + hashedMessages2[0] = messages2[0]._hash(); messages2[0].messageId = hashedMessages2[0]; bytes32[] memory merkleRoots = new bytes32[](2); diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol index 5f373d071b..ea27bdd648 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol @@ -48,13 +48,13 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, - metadataHash: METADATA_HASH_2, + onRamp: ON_RAMP_ADDRESS_2, isEnabled: true, prevOffRamp: address(0) }); @@ -63,14 +63,14 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - metadataHash: METADATA_HASH_1 + onRamp: ON_RAMP_ADDRESS_1 }); EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig2 = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - metadataHash: METADATA_HASH_2 + onRamp: ON_RAMP_ADDRESS_2 }); vm.expectEmit(); @@ -141,7 +141,7 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { } // Revert - function test_ZeroMetadataHash_Revert() public { + function test_ZeroOnRampAddress_Revert() public { uint64[] memory sourceChainSelectors = new uint64[](1); sourceChainSelectors[0] = SOURCE_CHAIN_SELECTOR_1; @@ -149,12 +149,12 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: bytes32(""), + onRamp: new bytes(0), isEnabled: true, prevOffRamp: address(0) }); - vm.expectRevert(EVM2EVMMultiOffRamp.ZeroMetadataHashNotAllowed.selector); + vm.expectRevert(EVM2EVMMultiOffRamp.ZeroAddressNotAllowed.selector); s_offRamp = new EVM2EVMMultiOffRampHelper( EVM2EVMMultiOffRamp.StaticConfig({ @@ -174,7 +174,7 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: 0, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); @@ -341,7 +341,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -360,7 +360,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test_SingleMessageNoTokensUnordered_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce = 0; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -381,7 +381,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { ); messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -434,7 +434,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -457,7 +457,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.SkippedIncorrectNonce( @@ -471,7 +471,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[1].nonce++; - messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); + messages[1].messageId = Internal._hash(messages[1]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -511,7 +511,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test__execute_SkippedAlreadyExecutedMessageUnordered_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].nonce = 0; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -536,7 +536,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); messages[0].receiver = address(newReceiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -574,7 +574,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); + messages[1].messageId = Internal._hash(messages[1]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -604,7 +604,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateMessagesWithTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); // Set message 1 to use another receiver to simulate more fair gas costs messages[1].receiver = address(s_secondary_receiver); - messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); + messages[1].messageId = Internal._hash(messages[1]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -646,7 +646,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { if (orderings[i]) { messages[i].nonce = ++expectedNonce; } - messages[i].messageId = Internal._hash(messages[i], METADATA_HASH_1); + messages[i].messageId = Internal._hash(messages[i]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -685,8 +685,8 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { }) ); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); - messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); + messages[1].messageId = Internal._hash(messages[1]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -737,15 +737,16 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_offRamp.executeSingleReport(executionReport, new uint256[](0)); } - function test_MismatchingMetadataHash_Revert() public { - Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_2); - // MessageID no longer matches hash. - Internal.ExecutionReportSingleChain memory executionReport = - _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); - vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidMessageId.selector, messages[0].messageId)); - s_offRamp.executeSingleReport(executionReport, new uint256[](0)); - } + // TODO: re-implement for mismatching OnRamp + // function test_MismatchingMetadataHash_Revert() public { + // Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + // messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_2); + // // MessageID no longer matches hash. + // Internal.ExecutionReportSingleChain memory executionReport = + // _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); + // vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidMessageId.selector, messages[0].messageId)); + // s_offRamp.executeSingleReport(executionReport, new uint256[](0)); + // } function test_Unhealthy_Revert() public { s_mockRMN.voteToCurse(bytes16(type(uint128).max)); @@ -840,7 +841,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { function test_NonExistingSourceChain_Revert() public { uint64 newSourceChainSelector = SOURCE_CHAIN_SELECTOR_1 + 1; - address newOnRamp = address(uint160(ON_RAMP_ADDRESS_1) + 1); + bytes memory newOnRamp = abi.encode(ON_RAMP_ADDRESS, 1); Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(newSourceChainSelector, newOnRamp); @@ -875,7 +876,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { // gas limit too high, Router's external call should revert messages[0].gasLimit = 1e36; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); Internal.ExecutionReportSingleChain memory executionReport = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -899,7 +900,7 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup { s_reverting_receiver.setErr(realError1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -932,34 +933,38 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { ICommitStore mockPrevCommitStore = new MockCommitStore(); s_prevOffRamp = _deploySingleLaneOffRamp( - mockPrevCommitStore, s_destRouter, address(0), SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1 + mockPrevCommitStore, s_destRouter, address(0), SOURCE_CHAIN_SELECTOR_1, address(bytes20(ON_RAMP_ADDRESS_1)) ); s_nestedPrevOffRamps = new EVM2EVMOffRampHelper[](2); s_nestedPrevOffRamps[0] = _deploySingleLaneOffRamp( - mockPrevCommitStore, s_destRouter, address(0), SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2 + mockPrevCommitStore, s_destRouter, address(0), SOURCE_CHAIN_SELECTOR_2, address(bytes20(ON_RAMP_ADDRESS_2)) ); s_nestedPrevOffRamps[1] = _deploySingleLaneOffRamp( - mockPrevCommitStore, s_destRouter, address(s_nestedPrevOffRamps[0]), SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2 + mockPrevCommitStore, + s_destRouter, + address(s_nestedPrevOffRamps[0]), + SOURCE_CHAIN_SELECTOR_2, + address(bytes20(ON_RAMP_ADDRESS_2)) ); EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(s_prevOffRamp) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, - metadataHash: METADATA_HASH_2, + onRamp: ON_RAMP_ADDRESS_2, isEnabled: true, prevOffRamp: address(s_nestedPrevOffRamps[1]) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, - metadataHash: METADATA_HASH_3, + onRamp: ON_RAMP_ADDRESS_3, isEnabled: true, prevOffRamp: address(0) }); @@ -986,6 +991,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { function test_NoPrevOffRampForChain_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); uint64 startNonceChain3 = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_3, messages[0].sender); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); @@ -1011,6 +1017,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { function test_UpgradedSenderNoncesReadsPreviousRamp_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); for (uint64 i = 1; i < 4; ++i) { @@ -1019,7 +1026,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { // messages contains a single message - update for the next execution messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); assertEq(startNonce + i, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); } @@ -1027,6 +1034,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { function test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_2, ON_RAMP_ADDRESS_2); + messages[0].messageId = Internal._hash(messages[0], s_nestedPrevOffRamps[0].metadataHash()); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_2, messages[0].sender); for (uint64 i = 1; i < 4; ++i) { @@ -1037,7 +1045,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { // messages contains a single message - update for the next execution messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_2); + messages[0].messageId = Internal._hash(messages[0], s_nestedPrevOffRamps[0].metadataHash()); // Read through prev sender nonce through prevOffRamp -> prevPrevOffRamp assertEq(startNonce + i, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_2, messages[0].sender)); @@ -1046,6 +1054,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { function test_UpgradedNonceStartsAtV1Nonce_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); @@ -1053,7 +1062,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { assertEq(startNonce + 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1069,7 +1078,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { messages[0].nonce++; messages[0].sequenceNumber++; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1086,12 +1095,13 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { function test_UpgradedNonceNewSenderStartsAtZero_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); address newSender = address(1234567); messages[0].sender = newSender; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1114,7 +1124,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { address newSender = address(1234567); messages[0].sender = newSender; messages[0].nonce = 2; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); uint64 startNonce = s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender); @@ -1128,14 +1138,15 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { assertEq(startNonce, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce = 1; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); // previous offramp executes msg and increases nonce + messages[0].messageId = Internal._hash(messages[0], s_prevOffRamp.metadataHash()); s_prevOffRamp.execute(_generateSingleRampReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0)); assertEq(startNonce + 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); messages[0].nonce = 2; - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); // new offramp is able to execute vm.expectEmit(); @@ -1170,7 +1181,7 @@ contract EVM2EVMMultiOffRamp_execute_upgrade is EVM2EVMMultiOffRampSetup { new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(prevOffRamp) }); @@ -1318,7 +1329,7 @@ contract EVM2EVMMultiOffRamp_executeSingleMessage is EVM2EVMMultiOffRampSetup { // Setup the receiver to a non-CCIP Receiver, which will skip the Router call (but should still perform the validation) MaybeRevertMessageReceiverNo165 newReceiver = new MaybeRevertMessageReceiverNo165(true); message.receiver = address(newReceiver); - message.messageId = Internal._hash(message, METADATA_HASH_1); + message.messageId = Internal._hash(message); s_inboundMessageValidator.setMessageIdValidationState(message.messageId, true); vm.expectRevert( @@ -1527,7 +1538,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); s_reverting_receiver.setRevert(false); @@ -1549,7 +1560,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_WithGasOverride_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); s_reverting_receiver.setRevert(false); @@ -1573,7 +1584,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { function test_manuallyExecute_DoesNotRevertIfUntouched_Success() public { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); assertEq(messages[0].nonce - 1, s_offRamp.getSenderNonce(SOURCE_CHAIN_SELECTOR_1, messages[0].sender)); @@ -1606,13 +1617,13 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { for (uint64 i = 0; i < 3; ++i) { messages1[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); messages1[i].receiver = address(s_reverting_receiver); - messages1[i].messageId = Internal._hash(messages1[i], METADATA_HASH_1); + messages1[i].messageId = Internal._hash(messages1[i]); } for (uint64 i = 0; i < 2; ++i) { messages2[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_3, ON_RAMP_ADDRESS_3, i + 1); messages2[i].receiver = address(s_reverting_receiver); - messages2[i].messageId = Internal._hash(messages2[i], METADATA_HASH_3); + messages2[i].messageId = Internal._hash(messages2[i]); } Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](2); @@ -1663,7 +1674,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { messages[i] = _generateAny2EVMMessageNoTokens(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1, i + 1); } messages[1].receiver = address(s_reverting_receiver); - messages[1].messageId = Internal._hash(messages[1], METADATA_HASH_1); + messages[1].messageId = Internal._hash(messages[1]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1723,7 +1734,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].gasLimit = 1; messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken)); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ExecutionStateChanged( @@ -1864,7 +1875,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); messages[0].receiver = address(s_reverting_receiver); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); s_offRamp.batchExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[][](1)); @@ -1911,7 +1922,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup { }) ); - messages[0].messageId = Internal._hash(messages[0], METADATA_HASH_1); + messages[0].messageId = Internal._hash(messages[0]); Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); @@ -2885,7 +2896,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); @@ -2894,7 +2905,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam isEnabled: true, minSeqNr: 1, prevOffRamp: address(0), - metadataHash: METADATA_HASH_1 + onRamp: ON_RAMP_ADDRESS_1 }); vm.expectEmit(); @@ -2913,7 +2924,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); @@ -2925,7 +2936,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam isEnabled: false, minSeqNr: 1, prevOffRamp: address(0), - metadataHash: METADATA_HASH_1 + onRamp: ON_RAMP_ADDRESS_1 }); vm.expectEmit(); @@ -2950,19 +2961,19 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: abi.encode(ON_RAMP_ADDRESS_1, 0), isEnabled: true, prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, - metadataHash: bytes32(uint256(METADATA_HASH_1) + 1), + onRamp: abi.encode(ON_RAMP_ADDRESS_1, 1), isEnabled: false, prevOffRamp: address(999) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 2, - metadataHash: bytes32(uint256(METADATA_HASH_1) + 2), + onRamp: abi.encode(ON_RAMP_ADDRESS_1, 2), isEnabled: true, prevOffRamp: address(1000) }); @@ -2974,7 +2985,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam isEnabled: sourceChainConfigs[i].isEnabled, minSeqNr: 1, prevOffRamp: sourceChainConfigs[i].prevOffRamp, - metadataHash: bytes32(uint256(METADATA_HASH_1) + i) + onRamp: abi.encode(ON_RAMP_ADDRESS_1, i) }); vm.expectEmit(); @@ -3005,13 +3016,13 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam ) public { // Skip invalid inputs vm.assume(sourceChainConfigArgs.sourceChainSelector != 0); - vm.assume(sourceChainConfigArgs.metadataHash != bytes32("")); + vm.assume(sourceChainConfigArgs.onRamp.length != 0); EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(42) }); @@ -3019,18 +3030,16 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam // Handle cases when an update occurs bool isNewChain = sourceChainConfigs[1].sourceChainSelector != SOURCE_CHAIN_SELECTOR_1; - if (isNewChain) { - vm.assume(sourceChainConfigs[1].metadataHash != METADATA_HASH_1); - } else { + if (!isNewChain) { sourceChainConfigs[1].prevOffRamp = sourceChainConfigs[0].prevOffRamp; - sourceChainConfigs[1].metadataHash = sourceChainConfigs[0].metadataHash; + sourceChainConfigs[1].onRamp = sourceChainConfigs[0].onRamp; } EVM2EVMMultiOffRamp.SourceChainConfig memory expectedSourceChainConfig = EVM2EVMMultiOffRamp.SourceChainConfig({ isEnabled: sourceChainConfigArgs.isEnabled, minSeqNr: 1, prevOffRamp: sourceChainConfigArgs.prevOffRamp, - metadataHash: sourceChainConfigArgs.metadataHash + onRamp: sourceChainConfigArgs.onRamp }); if (isNewChain) { @@ -3050,17 +3059,17 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam // Reverts - function test_ZeroMetadataHash_Revert() public { + function test_ZeroOnRampAddress_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: bytes32(""), + onRamp: new bytes(0), isEnabled: true, prevOffRamp: address(0) }); - vm.expectRevert(EVM2EVMMultiOffRamp.ZeroMetadataHashNotAllowed.selector); + vm.expectRevert(EVM2EVMMultiOffRamp.ZeroAddressNotAllowed.selector); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } @@ -3069,7 +3078,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: 0, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); @@ -3083,7 +3092,7 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); @@ -3096,61 +3105,23 @@ contract EVM2EVMMultiOffRamp_applySourceChainConfigUpdates is EVM2EVMMultiOffRam s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - function test_ReplaceExistingChainMetadataHash_Revert() public { + function test_ReplaceExistingChainOnRamp_Revert() public { EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - sourceChainConfigs[0].metadataHash = bytes32(uint256(METADATA_HASH_1) + 1); + sourceChainConfigs[0].onRamp = ON_RAMP_ADDRESS_2; vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.InvalidStaticConfig.selector, SOURCE_CHAIN_SELECTOR_1)); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } - - function test_DuplicateMetadataHash_Revert() public { - EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = - new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](1); - sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ - sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, - isEnabled: true, - prevOffRamp: address(0) - }); - - s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - - sourceChainConfigs[0].sourceChainSelector = SOURCE_CHAIN_SELECTOR_2; - - vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.DuplicateMetadataHash.selector, METADATA_HASH_1)); - s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - } - - function test_DuplicateMetadataHashOnSameUpdate_Revert() public { - EVM2EVMMultiOffRamp.SourceChainConfigArgs[] memory sourceChainConfigs = - new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](2); - sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ - sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, - isEnabled: true, - prevOffRamp: address(0) - }); - sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ - sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, - metadataHash: METADATA_HASH_1, - isEnabled: true, - prevOffRamp: address(0) - }); - - vm.expectRevert(abi.encodeWithSelector(EVM2EVMMultiOffRamp.DuplicateMetadataHash.selector, METADATA_HASH_1)); - s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); - } } contract EVM2EVMMultiOffRamp_commit is EVM2EVMMultiOffRampSetup { diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol index a70722b06a..2ffdf2f054 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol @@ -36,21 +36,9 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba uint64 internal constant SOURCE_CHAIN_SELECTOR_2 = 6433500567565415381; uint64 internal constant SOURCE_CHAIN_SELECTOR_3 = 4051577828743386545; - address internal constant ON_RAMP_ADDRESS_1 = ON_RAMP_ADDRESS; - address internal constant ON_RAMP_ADDRESS_2 = 0xaA3f843Cf8E33B1F02dd28303b6bD87B1aBF8AE4; - address internal constant ON_RAMP_ADDRESS_3 = 0x71830C37Cb193e820de488Da111cfbFcC680a1b9; - - bytes32 internal constant METADATA_HASH_1 = keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_1, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_1) - ); - - bytes32 internal constant METADATA_HASH_2 = keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_2, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_2) - ); - - bytes32 internal constant METADATA_HASH_3 = keccak256( - abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, SOURCE_CHAIN_SELECTOR_3, DEST_CHAIN_SELECTOR, ON_RAMP_ADDRESS_3) - ); + bytes internal constant ON_RAMP_ADDRESS_1 = abi.encode(ON_RAMP_ADDRESS); + bytes internal constant ON_RAMP_ADDRESS_2 = abi.encode(0xaA3f843Cf8E33B1F02dd28303b6bD87B1aBF8AE4); + bytes internal constant ON_RAMP_ADDRESS_3 = abi.encode(0x71830C37Cb193e820de488Da111cfbFcC680a1b9); address internal constant BLESS_VOTE_ADDR = address(8888); @@ -179,19 +167,19 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](3); sourceChainConfigs[0] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, - metadataHash: METADATA_HASH_1, + onRamp: ON_RAMP_ADDRESS_1, isEnabled: true, prevOffRamp: address(0) }); sourceChainConfigs[1] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, - metadataHash: METADATA_HASH_2, + onRamp: ON_RAMP_ADDRESS_2, isEnabled: false, prevOffRamp: address(0) }); sourceChainConfigs[2] = EVM2EVMMultiOffRamp.SourceChainConfigArgs({ sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, - metadataHash: METADATA_HASH_3, + onRamp: ON_RAMP_ADDRESS_3, isEnabled: true, prevOffRamp: address(0) }); @@ -275,7 +263,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba function _generateAny2EVMMessageNoTokens( uint64 sourceChainSelector, - address onRamp, + bytes memory onRamp, uint64 sequenceNumber ) internal view returns (Internal.EVM2EVMMessage memory) { return _generateAny2EVMMessage(sourceChainSelector, onRamp, sequenceNumber, new Client.EVMTokenAmount[](0), false); @@ -283,7 +271,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba function _generateAny2EVMMessageWithTokens( uint64 sourceChainSelector, - address onRamp, + bytes memory onRamp, uint64 sequenceNumber, uint256[] memory amounts ) internal view returns (Internal.EVM2EVMMessage memory) { @@ -296,7 +284,8 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba function _generateAny2EVMMessage( uint64 sourceChainSelector, - address onRamp, + // TODO: currently unused - but it will be required after the message struct is updated + bytes memory _onRamp, uint64 sequenceNumber, Client.EVMTokenAmount[] memory tokenAmounts, bool allowOutOfOrderExecution @@ -329,16 +318,14 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba ); } - message.messageId = Internal._hash( - message, keccak256(abi.encode(Internal.EVM_2_EVM_MESSAGE_HASH, sourceChainSelector, DEST_CHAIN_SELECTOR, onRamp)) - ); + message.messageId = Internal._hash(message); return message; } function _generateSingleBasicMessage( uint64 sourceChainSelector, - address onRamp + bytes memory onRamp ) internal view returns (Internal.EVM2EVMMessage[] memory) { Internal.EVM2EVMMessage[] memory messages = new Internal.EVM2EVMMessage[](1); messages[0] = _generateAny2EVMMessageNoTokens(sourceChainSelector, onRamp, 1); @@ -347,7 +334,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba function _generateMessagesWithTokens( uint64 sourceChainSelector, - address onRamp + bytes memory onRamp ) internal view returns (Internal.EVM2EVMMessage[] memory) { Internal.EVM2EVMMessage[] memory messages = new Internal.EVM2EVMMessage[](2); Client.EVMTokenAmount[] memory tokenAmounts = getCastedSourceEVMTokenAmountsWithZeroAmounts(); @@ -434,7 +421,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba assertEq(config1.isEnabled, config2.isEnabled); assertEq(config1.minSeqNr, config2.minSeqNr); assertEq(config1.prevOffRamp, config2.prevOffRamp); - assertEq(config1.metadataHash, config2.metadataHash); + assertEq(config1.onRamp, config2.onRamp); } function _getDefaultSourceTokenData(Client.EVMTokenAmount[] memory srcTokenAmounts) From ebbea12a0d7df9bbef8c5108ddc2b2ca6510d41d Mon Sep 17 00:00:00 2001 From: "app-token-issuer-infra-releng[bot]" <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Date: Wed, 26 Jun 2024 13:51:01 +0000 Subject: [PATCH 4/4] Update gethwrappers --- .../evm_2_evm_multi_offramp.go | 16 ++++++++-------- ...d-wrapper-dependency-versions-do-not-edit.txt | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go index c74ef7f6ae..b1ac6833c9 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go @@ -69,17 +69,17 @@ type EVM2EVMMultiOffRampMerkleRoot struct { } type EVM2EVMMultiOffRampSourceChainConfig struct { - IsEnabled bool - MinSeqNr uint64 - PrevOffRamp common.Address - MetadataHash [32]byte + IsEnabled bool + MinSeqNr uint64 + PrevOffRamp common.Address + OnRamp []byte } type EVM2EVMMultiOffRampSourceChainConfigArgs struct { SourceChainSelector uint64 IsEnabled bool PrevOffRamp common.Address - MetadataHash [32]byte + OnRamp []byte } type EVM2EVMMultiOffRampStaticConfig struct { @@ -155,8 +155,8 @@ type MultiOCR3BaseOCRConfigArgs struct { } var EVM2EVMMultiOffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"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\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"InvalidMessageId\",\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"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\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"error\",\"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\":[{\"components\":[{\"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[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":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\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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: "0x6101006040523480156200001257600080fd5b506040516200678738038062006787833981016040819052620000359162000648565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c1565b5050466080525060208201516001600160a01b03161580620000ec575060408201516001600160a01b0316155b156200010b576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001375760405163c656089560e01b815260040160405180910390fd5b81516001600160401b0390811660a052602080840180516001600160a01b0390811660c05260408087018051831660e052815188519096168652925182169385019390935290511682820152517f2f56698ec552a5d53d27d6f4b3dd8b6989f6426b6151a36aff61160c1d07efdf9181900360600190a1620001b9816200026c565b5050620007d0565b336001600160a01b038216036200021b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b81518110156200051c576000828281518110620002905762000290620007ba565b60200260200101519050600081600001519050806001600160401b0316600003620002ce5760405163c656089560e01b815260040160405180910390fd5b60608201516001600160a01b0316620002fa576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260076020526040902060018101546001600160a01b031662000400576200035c8284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36200052060201b60201c565b600282015560608301516001820180546001600160a01b039283166001600160a01b03199091161790556040808501518354610100600160481b03199190931669010000000000000000000216610100600160e81b031990921691909117610100178255516001600160401b03831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a16200046f565b606083015160018201546001600160a01b03908116911614158062000444575060408301518154690100000000000000000090046001600160a01b03908116911614155b156200046f5760405163c39a620560e01b81526001600160401b038316600482015260240162000083565b6020830151815490151560ff199091161781556040516001600160401b038316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d309062000505908490815460ff811615158252600881901c6001600160401b0316602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a25050508060010190506200026f565b5050565b60a0805160408051602081018590526001600160401b0380881692820192909252911660608201526001600160a01b0384166080820152600091016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005b557620005b56200057a565b60405290565b604051608081016001600160401b0381118282101715620005b557620005b56200057a565b604051601f8201601f191681016001600160401b03811182821017156200060b576200060b6200057a565b604052919050565b80516001600160401b03811681146200062b57600080fd5b919050565b80516001600160a01b03811681146200062b57600080fd5b6000808284036080808212156200065e57600080fd5b6060808312156200066e57600080fd5b6200067862000590565b9250620006858662000613565b835260206200069681880162000630565b818501526040620006aa6040890162000630565b604086015260608801519496506001600160401b0380861115620006cd57600080fd5b858901955089601f870112620006e257600080fd5b855181811115620006f757620006f76200057a565b62000707848260051b01620005e0565b818152848101925060079190911b87018401908b8211156200072857600080fd5b968401965b81881015620007a85786888d031215620007475760008081fd5b62000751620005bb565b6200075c8962000613565b8152858901518015158114620007725760008081fd5b818701526200078389860162000630565b8582015262000794878a0162000630565b81880152835296860196918401916200072d565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e051615f5a6200082d6000396000818161021301526131a40152600081816101e401528181611573015261162a0152600081816101b401526130c6015260008181611bc60152611c120152615f5a6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806385572ffb116100d8578063d2a15d351161008c578063f52121a511610066578063f52121a514610668578063f716f99f1461067b578063ff888fb11461068e57600080fd5b8063d2a15d3514610534578063e9d68a8e14610547578063f2fde38b1461065557600080fd5b80638da5cb5b116100bd5780638da5cb5b146104b4578063c673e584146104cf578063ccd37ba3146104ef57600080fd5b806385572ffb146104935780638b364334146104a157600080fd5b8063403b2d631161013a5780637437ff9f116101145780637437ff9f1461036357806379ba5097146104785780637f63b7111461048057600080fd5b8063403b2d631461031d578063542625af146103305780635e36480c1461034357600080fd5b80632d04ab761161016b5780632d04ab76146102ce578063311cd513146102e35780633f4b04aa146102f657600080fd5b806306285c6914610187578063181f5a7714610285575b600080fd5b610243604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60408051825167ffffffffffffffff1681526020808401516001600160a01b039081169183019190915292820151909216908201526060015b60405180910390f35b6102c16040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b60405161027c91906141e0565b6102e16102dc36600461428b565b6106b1565b005b6102e16102f136600461433e565b610a77565b600b5467ffffffffffffffff165b60405167ffffffffffffffff909116815260200161027c565b6102e161032b3660046144eb565b610ae0565b6102e161033e366004614b0f565b610c9d565b610356610351366004614c3a565b610e42565b60405161027c9190614c9d565b61040f6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152600160c01b8304811694840194909452600160e01b90910490921660608201526005548216608082015260065490911660a082015290565b60405161027c9190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b6102e1610e98565b6102e161048e366004614cab565b610f56565b6102e1610182366004614d8f565b6103046104af366004614dca565b610f6a565b6000546040516001600160a01b03909116815260200161027c565b6104e26104dd366004614e09565b610f80565b60405161027c9190614e69565b6105266104fd366004614ede565b67ffffffffffffffff919091166000908152600a60209081526040808320938352929052205490565b60405190815260200161027c565b6102e1610542366004614f0a565b6110de565b6105f8610555366004614f7f565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091525067ffffffffffffffff908116600090815260076020908152604091829020825160a081018452815460ff8116151582526101008104909516928101929092526001600160a01b0369010000000000000000009094048416928201929092526001820154909216606083015260020154608082015290565b60405161027c9190600060a08201905082511515825267ffffffffffffffff602084015116602083015260408301516001600160a01b03808216604085015280606086015116606085015250506080830151608083015292915050565b6102e1610663366004614f9c565b611198565b6102e1610676366004614fb9565b6111a9565b6102e1610689366004615085565b6114db565b6106a161069c3660046151d0565b61151d565b604051901515815260200161027c565b60006106bf87890189615361565b805151519091501515806106d857508051602001515115155b156107d857600b5460208a01359067ffffffffffffffff8083169116101561079757600b805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f916107609160040161559f565b600060405180830381600087803b15801561077a57600080fd5b505af115801561078e573d6000803e3d6000fd5b505050506107d6565b8160200151516000036107d6576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b8160200151518110156109c057600082602001518281518110610800576108006154cc565b6020026020010151905060008160000151905061081c816115de565b6000610827826116e0565b602084015151815491925067ffffffffffffffff90811661010090920416141580610869575060208084015190810151905167ffffffffffffffff9182169116115b156108b257825160208401516040517feefb0cac0000000000000000000000000000000000000000000000000000000081526108a99291906004016155b2565b60405180910390fd5b6040830151806108ee576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600a60209081526040808320848452909152902054156109615783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016108a9565b60208085015101516109749060016155fd565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600a6020908152604080832094835293905291909120429055506001016107db565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d816040516109f09190615625565b60405180910390a1610a6c60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b9250611740915050565b505050505050505050565b610ab7610a86828401846156c2565b6040805160008082526020820190925290610ab1565b6060815260200190600190039081610a9c5790505b50611ab7565b604080516000808252602082019092529050610ada600185858585866000611740565b50505050565b610ae8611b67565b60a08101516001600160a01b03161580610b0a575080516001600160a01b0316155b15610b41576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b610ca5611bc3565b815181518114610ce1576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610e32576000848281518110610d0057610d006154cc565b60200260200101519050600081602001515190506000858481518110610d2857610d286154cc565b6020026020010151905080518214610d6c576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610e23576000828281518110610d8b57610d8b6154cc565b6020026020010151905080600014158015610dc6575084602001518281518110610db757610db76154cc565b60200260200101516080015181105b15610e1a5784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064016108a9565b50600101610d6f565b50505050806001019050610ce4565b50610e3d8383611ab7565b505050565b6000610e50600160046156f7565b6002610e5d608085615720565b67ffffffffffffffff16610e719190615747565b610e7b8585611c44565b901c166003811115610e8f57610e8f614c73565b90505b92915050565b6001546001600160a01b03163314610ef25760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108a9565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610f5e611b67565b610f6781611c8b565b50565b600080610f778484611f9c565b50949350505050565b610fc36040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c08201529485529182018054845181840281018401909552808552929385830193909283018282801561106c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161104e575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156110ce57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116110b0575b5050505050815250509050919050565b6110e6611b67565b60005b81811015610e3d576000838383818110611105576111056154cc565b90506040020180360381019061111b919061575e565b905061112a816020015161151d565b61118f57805167ffffffffffffffff166000908152600a602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b506001016110e9565b6111a0611b67565b610f67816120ad565b3330146111e2576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516000808252602082019092528161121f565b60408051808201909152600080825260208201528152602001906001900390816111f85790505b5061014084015151909150156112805761127d836101400151846020015160405160200161125c91906001600160a01b0391909116815260200190565b60408051601f19818403018152918152860151865161016088015187612163565b90505b600061128c8483612210565b6005549091506001600160a01b03168015611379576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a1906112e6908590600401615846565b600060405180830381600087803b15801561130057600080fd5b505af1925050508015611311575060015b611379573d80801561133f576040519150601f19603f3d011682016040523d82523d6000602084013e611344565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016108a991906141e0565b6101208501515115801561138f57506080850151155b806113a6575060408501516001600160a01b03163b155b806113e6575060408501516113e4906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006122b3565b155b156113f2575050505050565b60048054608087015160408089015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf979839361144d938a9361138893929101615859565b6000604051808303816000875af115801561146c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261149491908101906158da565b5091509150816114d257806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016108a991906141e0565b50505050505050565b6114e3611b67565b60005b815181101561151957611511828281518110611504576115046154cc565b60200260200101516122cf565b6001016114e6565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa1580156115ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e929190615934565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169d9190615934565b15610f67576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108a9565b67ffffffffffffffff81166000908152600760205260408120805460ff16610e92576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108a9565b60ff8781166000908152600260209081526040808320815160808101835281548152600190910154808616938201939093526101008304851691810191909152620100009091049092161515606083015287359061179f8760a4615951565b90508260600151156117e75784516117b8906020615747565b86516117c5906020615747565b6117d09060a0615951565b6117da9190615951565b6117e49082615951565b90505b368114611829576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016108a9565b50815181146118715781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016108a9565b611879611bc3565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156118c7576118c7614c73565b60028111156118d8576118d8614c73565b90525090506002816020015160028111156118f5576118f5614c73565b1480156119495750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611931576119316154cc565b6000918252602090912001546001600160a01b031633145b61197f576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611a6157602082015161199a906001615964565b60ff168551146119d6576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611a11576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611a2392919061597d565b604051908190038120611a3a918b9060200161598d565b604051602081830303815290604052805190602001209050611a5f8a828888886125da565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611af1576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611b6057611b58858281518110611b2657611b266154cc565b602002602001015184611b5257858381518110611b4557611b456154cc565b60200260200101516127f1565b836127f1565b600101611b08565b5050505050565b6000546001600160a01b03163314611bc15760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108a9565b565b467f000000000000000000000000000000000000000000000000000000000000000014611bc1576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016108a9565b67ffffffffffffffff8216600090815260096020526040812081611c696080856159a1565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b60005b8151811015611519576000828281518110611cab57611cab6154cc565b602002602001015190506000816000015190508067ffffffffffffffff16600003611d02576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60608201516001600160a01b0316611d46576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff8116600090815260076020526040902060018101546001600160a01b0316611e6957611da08284606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36130c0565b600282015560608301516001820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff19909116179055604080850151835468ffffffffffffffff001991909316690100000000000000000002167fffffff00000000000000000000000000000000000000000000000000000000ff909216919091176101001782555167ffffffffffffffff831681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611eef565b606083015160018201546001600160a01b039081169116141580611eac575060408301518154690100000000000000000090046001600160a01b03908116911614155b15611eef576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526024016108a9565b6020830151815490151560ff1990911617815560405167ffffffffffffffff8316907fa73c588738263db34ef8c1942db8f99559bc6696f6a812d42e76bafb4c0e8d3090611f86908490815460ff811615158252600881901c67ffffffffffffffff16602083015260481c6001600160a01b0390811660408301526001830154166060820152600290910154608082015260a00190565b60405180910390a2505050806001019050611c8e565b67ffffffffffffffff80831660009081526008602090815260408083206001600160a01b0386168452909152812054909182911680820361209f5767ffffffffffffffff8516600090815260076020526040902054690100000000000000000090046001600160a01b0316801561209d576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015282169063856c824790602401602060405180830381865afa15801561206c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209091906159c8565b60019350935050506120a6565b505b9150600090505b9250929050565b336001600160a01b038216036121055760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108a9565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8560005b8751811015612205576121e0888281518110612185576121856154cc565b6020026020010151602001518888888886815181106121a6576121a66154cc565b60200260200101518060200190518101906121c191906159e5565b8887815181106121d3576121d36154cc565b6020026020010151613143565b8282815181106121f2576121f26154cc565b6020908102919091010152600101612167565b509695505050505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff168152602001846020015160405160200161228891906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006122be836134bc565b8015610e8f5750610e8f8383613508565b806040015160ff166000036122fa576000604051631b3fab5160e11b81526004016108a99190615a9a565b60208082015160ff8082166000908152600290935260408320600181015492939092839216900361234b576060840151600182018054911515620100000262ff0000199092169190911790556123a0565b6060840151600182015460ff62010000909104161515901515146123a0576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016108a9565b60a08401518051601f60ff821611156123cf576001604051631b3fab5160e11b81526004016108a99190615a9a565b612435858560030180548060200260200160405190810160405280929190818152602001828054801561242b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161240d575b50505050506135aa565b856060015115612547576124a3858560020180548060200260200160405190810160405280929190818152602001828054801561242b576020028201919060005260206000209081546001600160a01b0316815260019091019060200180831161240d5750505050506135aa565b608086015180516124bd90600287019060208401906140ee565b50805160018501805461ff00191661010060ff841690810291909117909155601f1015612500576002604051631b3fab5160e11b81526004016108a99190615a9a565b6040880151612510906003615ab4565b60ff168160ff1611612538576003604051631b3fab5160e11b81526004016108a99190615a9a565b61254487836001613613565b50505b61255385836002613613565b815161256890600386019060208501906140ee565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936125c1938a939260028b01929190615ad0565b60405180910390a16125d285613793565b505050505050565b6125e261415c565b835160005b818110156127e7576000600188868460208110612606576126066154cc565b61261391901a601b615964565b898581518110612625576126256154cc565b602002602001015189868151811061263f5761263f6154cc565b60200260200101516040516000815260200160405260405161267d949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561269f573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b0385168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561270057612700614c73565b600281111561271157612711614c73565b905250905060018160200151600281111561272e5761272e614c73565b14612765576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061277c5761277c6154cc565b6020020151156127b8576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f81106127d3576127d36154cc565b9115156020909202015250506001016125e7565b5050505050505050565b81516127fc816115de565b6000612807826116e0565b602085015151909150600081900361284a576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151518114612888576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156128a3576128a3614392565b6040519080825280602002602001820160405280156128cc578160200160208202803683370190505b50905060005b82811015612991576000876020015182815181106128f2576128f26154cc565b6020026020010151905061290a8186600201546137af565b83838151811061291c5761291c6154cc565b602002602001018181525050806101800151838381518110612940576129406154cc565b602002602001015114612988578061018001516040517f345039be0000000000000000000000000000000000000000000000000000000081526004016108a991815260200190565b506001016128d2565b5060006129a8858389606001518a6080015161390b565b9050806000036129f0576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016108a9565b8551151560005b84811015610a6c57600089602001518281518110612a1757612a176154cc565b602002602001015190506000612a31898360600151610e42565b90506002816003811115612a4757612a47614c73565b03612a9d5760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a150506130b8565b6000816003811115612ab157612ab1614c73565b1480612ace57506003816003811115612acc57612acc614c73565b145b612b1e5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c16600483015290911660248201526044016108a9565b8315612bff5760045460009074010000000000000000000000000000000000000000900463ffffffff16612b5287426156f7565b1190508080612b7257506003826003811115612b7057612b70614c73565b145b612bb4576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b1660048201526024016108a9565b8a8481518110612bc657612bc66154cc565b6020026020010151600014612bf9578a8481518110612be757612be76154cc565b60200260200101518360800181815250505b50612c64565b6000816003811115612c1357612c13614c73565b14612c645760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c16600483015290911660248201526044016108a9565b60c082015167ffffffffffffffff1615612e2057600080612c898b8560200151611f9c565b915091508015612d785760c084015167ffffffffffffffff16612cad8360016155fd565b67ffffffffffffffff1614612d305760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612d1f928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60405180910390a1505050506130b8565b67ffffffffffffffff8b81166000908152600860209081526040808320888301516001600160a01b031684529091529020805467ffffffffffffffff19169184169190911790555b6000836003811115612d8c57612d8c614c73565b03612e1d5760c084015167ffffffffffffffff16612dab8360016155fd565b67ffffffffffffffff1614612e1d5760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612d1f928f9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b50505b60008b604001518481518110612e3857612e386154cc565b6020026020010151905080518361014001515114612e9c5760608301516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808d16600483015290911660248201526044016108a9565b612eac8a84606001516001613961565b600080612eb98584613a09565b91509150612ecc8c866060015184613961565b868015612eea57506003826003811115612ee857612ee8614c73565b145b8015612f0857506000846003811115612f0557612f05614c73565b14155b15612f4857846101800151816040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016108a9929190615b56565b6003826003811115612f5c57612f5c614c73565b14158015612f7c57506002826003811115612f7957612f79614c73565b14155b15612fbc5760608501516040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526108a9918e918590600401615b6f565b60008560c0015167ffffffffffffffff16118015612feb57506000846003811115612fe957612fe9614c73565b145b156130595767ffffffffffffffff808d166000908152600860209081526040808320898301516001600160a01b0316845290915281208054909216919061303183615b95565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff168d67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516130aa929190615bbc565b60405180910390a450505050505b6001016129f7565b600081847f000000000000000000000000000000000000000000000000000000000000000085604051602001613123949392919093845267ffffffffffffffff9283166020850152911660408301526001600160a01b0316606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b604080518082019091526000808252602082015260006131668460200151613c53565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156131eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320f9190615bdc565b90506001600160a01b038116158061325757506132556001600160a01b0382167faff2afbf000000000000000000000000000000000000000000000000000000006122b3565b155b15613299576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016108a9565b600080613364633907753760e01b6040518061010001604052808d81526020018b67ffffffffffffffff1681526020018c6001600160a01b031681526020018e8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016133159190615bf9565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152600454859063ffffffff600160e01b909104166113886084613c95565b509150915081613389578060405163e1cd550960e01b81526004016108a991906141e0565b80516020146133d15780516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016108a9565b6000818060200190518101906133e79190615cd0565b604080516001600160a01b038d16602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260045491925061346a918790600160c01b900463ffffffff166113886084613c95565b50909350915082613490578160405163e1cd550960e01b81526004016108a991906141e0565b604080518082019091526001600160a01b03909516855260208501525091925050509695505050505050565b60006134e8827f01ffc9a700000000000000000000000000000000000000000000000000000000613508565b8015610e925750613501826001600160e01b0319613508565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613593575060208210155b801561359f5750600081115b979650505050505050565b60005b8151811015610e3d5760ff8316600090815260036020526040812083519091908490849081106135df576135df6154cc565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191690556001016135ad565b60005b82518160ff161015610ada576000838260ff1681518110613639576136396154cc565b602002602001015190506000600281111561365657613656614c73565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561369557613695614c73565b146136b6576004604051631b3fab5160e11b81526004016108a99190615a9a565b6001600160a01b0381166136f6576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561371c5761371c614c73565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561377957613779614c73565b0217905550905050508061378c90615ce9565b9050613616565b60ff8116610f6757600b805467ffffffffffffffff1916905550565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016138459897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161387e9190615d08565b604051602081830303815290604052805190602001208761016001516040516020016138aa9190615dbd565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e0015b60405160208183030381529060405280519060200120905092915050565b600080613919858585613dbb565b90506139248161151d565b613932576000915050613959565b67ffffffffffffffff86166000908152600a60209081526040808320938352929052205490505b949350505050565b60006002613970608085615720565b67ffffffffffffffff166139849190615747565b905060006139928585611c44565b9050816139a1600160046156f7565b901b1916818360038111156139b8576139b8614c73565b67ffffffffffffffff871660009081526009602052604081209190921b929092179182916139e76080886159a1565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613a4d9087908790600401615dd0565b600060405180830381600087803b158015613a6757600080fd5b505af1925050508015613a78575060015b613c38573d808015613aa6576040519150601f19603f3d011682016040523d82523d6000602084013e613aab565b606091505b506000613ab782615f15565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000006001600160e01b031982161480613b01575063e1cd550960e01b6001600160e01b03198216145b80613b1c575063046b337b60e51b6001600160e01b03198216145b80613b5057507f78ef8024000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b8457507f0c3b563c000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613bb857507fae9b4ce9000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613bec57507f09c25325000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b15613bfd57506003925090506120a6565b856101800151826040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016108a9929190615b56565b50506040805160208101909152600081526002909250929050565b60008151602014613c79578160405163046b337b60e51b81526004016108a991906141e0565b610e9282806020019051810190613c909190615cd0565b614059565b6000606060008361ffff1667ffffffffffffffff811115613cb857613cb8614392565b6040519080825280601f01601f191660200182016040528015613ce2576020820181803683370190505b509150863b613d15577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613d48577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613d81577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613da45750835b808352806000602085013e50955095509592505050565b8251825160009190818303613dfc576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613e1057506101018111155b613e2d576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613e57576040516309bde33960e01b815260040160405180910390fd5b80600003613e845786600081518110613e7257613e726154cc565b6020026020010151935050505061313c565b60008167ffffffffffffffff811115613e9f57613e9f614392565b604051908082528060200260200182016040528015613ec8578160200160208202803683370190505b50905060008080805b85811015613ff25760006001821b8b811603613f2c5788851015613f15578c5160018601958e918110613f0657613f066154cc565b60200260200101519050613f4e565b8551600185019487918110613f0657613f066154cc565b8b5160018401938d918110613f4357613f436154cc565b602002602001015190505b600089861015613f7e578d5160018701968f918110613f6f57613f6f6154cc565b60200260200101519050613fa0565b8651600186019588918110613f9557613f956154cc565b602002602001015190505b82851115613fc1576040516309bde33960e01b815260040160405180910390fd5b613fcb82826140ad565b878481518110613fdd57613fdd6154cc565b60209081029190910101525050600101613ed1565b50600185038214801561400457508683145b801561400f57508581145b61402c576040516309bde33960e01b815260040160405180910390fd5b836001860381518110614041576140416154cc565b60200260200101519750505050505050509392505050565b60006001600160a01b03821180614071575061040082105b156140a95760408051602081018490520160408051601f198184030181529082905263046b337b60e51b82526108a9916004016141e0565b5090565b60008183106140c5576140c082846140cb565b610e8f565b610e8f83835b6040805160016020820152908101839052606081018290526000906080016138ed565b828054828255906000526020600020908101928215614150579160200282015b82811115614150578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0390911617825560209092019160019091019061410e565b506140a992915061417b565b604051806103e00160405280601f906020820280368337509192915050565b5b808211156140a9576000815560010161417c565b60005b838110156141ab578181015183820152602001614193565b50506000910152565b600081518084526141cc816020860160208601614190565b601f01601f19169290920160200192915050565b602081526000610e8f60208301846141b4565b8060608101831015610e9257600080fd5b60008083601f84011261421657600080fd5b50813567ffffffffffffffff81111561422e57600080fd5b6020830191508360208285010111156120a657600080fd5b60008083601f84011261425857600080fd5b50813567ffffffffffffffff81111561427057600080fd5b6020830191508360208260051b85010111156120a657600080fd5b60008060008060008060008060e0898b0312156142a757600080fd5b6142b18a8a6141f3565b9750606089013567ffffffffffffffff808211156142ce57600080fd5b6142da8c838d01614204565b909950975060808b01359150808211156142f357600080fd5b6142ff8c838d01614246565b909750955060a08b013591508082111561431857600080fd5b506143258b828c01614246565b999c989b50969995989497949560c00135949350505050565b60008060006080848603121561435357600080fd5b61435d85856141f3565b9250606084013567ffffffffffffffff81111561437957600080fd5b61438586828701614204565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156143cb576143cb614392565b60405290565b6040805190810167ffffffffffffffff811182821017156143cb576143cb614392565b6040516101a0810167ffffffffffffffff811182821017156143cb576143cb614392565b60405160a0810167ffffffffffffffff811182821017156143cb576143cb614392565b6040516080810167ffffffffffffffff811182821017156143cb576143cb614392565b6040516060810167ffffffffffffffff811182821017156143cb576143cb614392565b604051601f8201601f1916810167ffffffffffffffff811182821017156144aa576144aa614392565b604052919050565b6001600160a01b0381168114610f6757600080fd5b80356144d2816144b2565b919050565b803563ffffffff811681146144d257600080fd5b600060c082840312156144fd57600080fd5b6145056143a8565b8235614510816144b2565b815261451e602084016144d7565b602082015261452f604084016144d7565b6040820152614540606084016144d7565b60608201526080830135614553816144b2565b608082015260a0830135614566816144b2565b60a08201529392505050565b600067ffffffffffffffff82111561458c5761458c614392565b5060051b60200190565b67ffffffffffffffff81168114610f6757600080fd5b80356144d281614596565b8015158114610f6757600080fd5b80356144d2816145b7565b600067ffffffffffffffff8211156145ea576145ea614392565b50601f01601f191660200190565b600082601f83011261460957600080fd5b813561461c614617826145d0565b614481565b81815284602083860101111561463157600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261465f57600080fd5b8135602061466f61461783614572565b82815260069290921b8401810191818101908684111561468e57600080fd5b8286015b8481101561220557604081890312156146ab5760008081fd5b6146b36143d1565b81356146be816144b2565b81528185013585820152835291830191604001614692565b600082601f8301126146e757600080fd5b813560206146f761461783614572565b82815260059290921b8401810191818101908684111561471657600080fd5b8286015b8481101561220557803567ffffffffffffffff81111561473a5760008081fd5b6147488986838b01016145f8565b84525091830191830161471a565b60006101a0828403121561476957600080fd5b6147716143f4565b905061477c826145ac565b815261478a602083016144c7565b602082015261479b604083016144c7565b60408201526147ac606083016145ac565b6060820152608082013560808201526147c760a083016145c5565b60a08201526147d860c083016145ac565b60c08201526147e960e083016144c7565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561481657600080fd5b614822868387016145f8565b8385015261014092508285013591508082111561483e57600080fd5b61484a8683870161464e565b8385015261016092508285013591508082111561486657600080fd5b50614873858286016146d6565b82840152505061018080830135818301525092915050565b600082601f83011261489c57600080fd5b813560206148ac61461783614572565b82815260059290921b840181019181810190868411156148cb57600080fd5b8286015b8481101561220557803567ffffffffffffffff8111156148ef5760008081fd5b6148fd8986838b0101614756565b8452509183019183016148cf565b600082601f83011261491c57600080fd5b8135602061492c61461783614572565b82815260059290921b8401810191818101908684111561494b57600080fd5b8286015b8481101561220557803567ffffffffffffffff81111561496f5760008081fd5b61497d8986838b01016146d6565b84525091830191830161494f565b600082601f83011261499c57600080fd5b813560206149ac61461783614572565b8083825260208201915060208460051b8701019350868411156149ce57600080fd5b602086015b8481101561220557803583529183019183016149d3565b600082601f8301126149fb57600080fd5b81356020614a0b61461783614572565b82815260059290921b84018101918181019086841115614a2a57600080fd5b8286015b8481101561220557803567ffffffffffffffff80821115614a4f5760008081fd5b9088019060a0828b03601f1901811315614a695760008081fd5b614a71614418565b614a7c8885016145ac565b815260408085013584811115614a925760008081fd5b614aa08e8b8389010161488b565b8a8401525060608086013585811115614ab95760008081fd5b614ac78f8c838a010161490b565b8385015250608091508186013585811115614ae25760008081fd5b614af08f8c838a010161498b565b9184019190915250919093013590830152508352918301918301614a2e565b6000806040808486031215614b2357600080fd5b833567ffffffffffffffff80821115614b3b57600080fd5b614b47878388016149ea565b9450602091508186013581811115614b5e57600080fd5b8601601f81018813614b6f57600080fd5b8035614b7d61461782614572565b81815260059190911b8201840190848101908a831115614b9c57600080fd5b8584015b83811015614c2857803586811115614bb85760008081fd5b8501603f81018d13614bca5760008081fd5b87810135614bda61461782614572565b81815260059190911b82018a0190898101908f831115614bfa5760008081fd5b928b01925b82841015614c185783358252928a0192908a0190614bff565b8652505050918601918601614ba0565b50809750505050505050509250929050565b60008060408385031215614c4d57600080fd5b8235614c5881614596565b91506020830135614c6881614596565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614c9957614c99614c73565b9052565b60208101610e928284614c89565b60006020808385031215614cbe57600080fd5b823567ffffffffffffffff811115614cd557600080fd5b8301601f81018513614ce657600080fd5b8035614cf461461782614572565b81815260079190911b82018301908381019087831115614d1357600080fd5b928401925b8284101561359f5760808489031215614d315760008081fd5b614d3961443b565b8435614d4481614596565b815284860135614d53816145b7565b81870152604085810135614d66816144b2565b90820152606085810135614d79816144b2565b9082015282526080939093019290840190614d18565b600060208284031215614da157600080fd5b813567ffffffffffffffff811115614db857600080fd5b820160a0818503121561313c57600080fd5b60008060408385031215614ddd57600080fd5b8235614de881614596565b91506020830135614c68816144b2565b803560ff811681146144d257600080fd5b600060208284031215614e1b57600080fd5b610e8f82614df8565b60008151808452602080850194506020840160005b83811015614e5e5781516001600160a01b031687529582019590820190600101614e39565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614eb860e0840182614e24565b90506040840151601f198483030160c0850152614ed58282614e24565b95945050505050565b60008060408385031215614ef157600080fd5b8235614efc81614596565b946020939093013593505050565b60008060208385031215614f1d57600080fd5b823567ffffffffffffffff80821115614f3557600080fd5b818501915085601f830112614f4957600080fd5b813581811115614f5857600080fd5b8660208260061b8501011115614f6d57600080fd5b60209290920196919550909350505050565b600060208284031215614f9157600080fd5b813561313c81614596565b600060208284031215614fae57600080fd5b813561313c816144b2565b60008060408385031215614fcc57600080fd5b823567ffffffffffffffff80821115614fe457600080fd5b614ff086838701614756565b9350602085013591508082111561500657600080fd5b50615013858286016146d6565b9150509250929050565b600082601f83011261502e57600080fd5b8135602061503e61461783614572565b8083825260208201915060208460051b87010193508684111561506057600080fd5b602086015b84811015612205578035615078816144b2565b8352918301918301615065565b6000602080838503121561509857600080fd5b823567ffffffffffffffff808211156150b057600080fd5b818501915085601f8301126150c457600080fd5b81356150d261461782614572565b81815260059190911b830184019084810190888311156150f157600080fd5b8585015b838110156151c35780358581111561510c57600080fd5b860160c0818c03601f190112156151235760008081fd5b61512b6143a8565b888201358152604061513e818401614df8565b8a830152606061514f818501614df8565b82840152608091506151628285016145c5565b9083015260a0838101358981111561517a5760008081fd5b6151888f8d8388010161501d565b838501525060c08401359150888211156151a25760008081fd5b6151b08e8c8487010161501d565b90830152508452509186019186016150f5565b5098975050505050505050565b6000602082840312156151e257600080fd5b5035919050565b80356001600160e01b03811681146144d257600080fd5b600082601f83011261521157600080fd5b8135602061522161461783614572565b82815260069290921b8401810191818101908684111561524057600080fd5b8286015b84811015612205576040818903121561525d5760008081fd5b6152656143d1565b813561527081614596565b815261527d8286016151e9565b81860152835291830191604001615244565b600082601f8301126152a057600080fd5b813560206152b061461783614572565b82815260079290921b840181019181810190868411156152cf57600080fd5b8286015b848110156122055780880360808112156152ed5760008081fd5b6152f561445e565b823561530081614596565b81526040601f1983018113156153165760008081fd5b61531e6143d1565b92508684013561532d81614596565b83528381013561533c81614596565b83880152818701929092526060830135918101919091528352918301916080016152d3565b6000602080838503121561537457600080fd5b823567ffffffffffffffff8082111561538c57600080fd5b818501915060408083880312156153a257600080fd5b6153aa6143d1565b8335838111156153b957600080fd5b84016040818a0312156153cb57600080fd5b6153d36143d1565b8135858111156153e257600080fd5b8201601f81018b136153f357600080fd5b803561540161461782614572565b81815260069190911b8201890190898101908d83111561542057600080fd5b928a01925b828410156154705787848f03121561543d5760008081fd5b6154456143d1565b8435615450816144b2565b815261545d858d016151e9565b818d0152825292870192908a0190615425565b84525050508187013593508484111561548857600080fd5b6154948a858401615200565b81880152825250838501359150828211156154ae57600080fd5b6154ba8883860161528f565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561553957835180516001600160a01b031684528501516001600160e01b0316858401529284019291850191600101615502565b50508583015187820388850152805180835290840192506000918401905b80831015615593578351805167ffffffffffffffff1683528501516001600160e01b031685830152928401926001929092019190850190615557565b50979650505050505050565b602081526000610e8f60208301846154e2565b67ffffffffffffffff831681526060810161313c6020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561561e5761561e6155e7565b5092915050565b60006020808352606084516040808487015261564460608701836154e2565b87850151878203601f19016040890152805180835290860193506000918601905b808310156151c357845167ffffffffffffffff8151168352878101516156a489850182805167ffffffffffffffff908116835260209182015116910152565b50840151828701529386019360019290920191608090910190615665565b6000602082840312156156d457600080fd5b813567ffffffffffffffff8111156156eb57600080fd5b613959848285016149ea565b81810381811115610e9257610e926155e7565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061573b5761573b61570a565b92169190910692915050565b8082028115828204841417610e9257610e926155e7565b60006040828403121561577057600080fd5b6157786143d1565b823561578381614596565b81526020928301359281019290925250919050565b60008151808452602080850194506020840160005b83811015614e5e57815180516001600160a01b0316885260209081015190880152604087019650908201906001016157ad565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261581360a08501826141b4565b90506060830151848203606086015261582c82826141b4565b91505060808301518482036080860152614ed58282615798565b602081526000610e8f60208301846157e0565b60808152600061586c60808301876157e0565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b600082601f8301126158a657600080fd5b81516158b4614617826145d0565b8181528460208386010111156158c957600080fd5b613959826020830160208701614190565b6000806000606084860312156158ef57600080fd5b83516158fa816145b7565b602085015190935067ffffffffffffffff81111561591757600080fd5b61592386828701615895565b925050604084015190509250925092565b60006020828403121561594657600080fd5b815161313c816145b7565b80820180821115610e9257610e926155e7565b60ff8181168382160190811115610e9257610e926155e7565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff808416806159bc576159bc61570a565b92169190910492915050565b6000602082840312156159da57600080fd5b815161313c81614596565b6000602082840312156159f757600080fd5b815167ffffffffffffffff80821115615a0f57600080fd5b9083019060608286031215615a2357600080fd5b615a2b61445e565b825182811115615a3a57600080fd5b615a4687828601615895565b825250602083015182811115615a5b57600080fd5b615a6787828601615895565b602083015250604083015182811115615a7f57600080fd5b615a8b87828601615895565b60408301525095945050505050565b6020810160058310615aae57615aae614c73565b91905290565b60ff818116838216029081169081811461561e5761561e6155e7565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b81811015615b2a5784546001600160a01b031683526001948501949284019201615b05565b50508481036060860152615b3e8188614e24565b935050505060ff831660808301529695505050505050565b82815260406020820152600061395960408301846141b4565b67ffffffffffffffff848116825283166020820152606081016139596040830184614c89565b600067ffffffffffffffff808316818103615bb257615bb26155e7565b6001019392505050565b615bc68184614c89565b60406020820152600061395960408301846141b4565b600060208284031215615bee57600080fd5b815161313c816144b2565b6020815260008251610100806020850152615c186101208501836141b4565b91506020850151615c35604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615c6f60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615c8c84836141b4565b935060c08701519150808685030160e0870152615ca984836141b4565b935060e0870151915080868503018387015250615cc683826141b4565b9695505050505050565b600060208284031215615ce257600080fd5b5051919050565b600060ff821660ff8103615cff57615cff6155e7565b60010192915050565b6020808252825182820181905260009190848201906040850190845b81811015615d5757835180516001600160a01b031684526020908101519084015260408301938501939250600101615d24565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015615db057601f19868403018952615d9e8383516141b4565b98840198925090830190600101615d82565b5090979650505050505050565b602081526000610e8f6020830184615d63565b60408152615deb60408201845167ffffffffffffffff169052565b60006020840151615e0760608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615e688185018367ffffffffffffffff169052565b60e08601519150610120615e86818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a06101608181870152615eb66101e08701856141b4565b9350828801519250603f19610180818887030181890152615ed78686615798565b9550828a01519450818887030184890152615ef28686615d63565b9550808a01516101c089015250505050508281036020840152614ed58185615d63565b6000815160208301516001600160e01b031980821693506004831015615f455780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"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\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"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\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"name\":\"InvalidMessageId\",\"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\":\"error\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"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\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"error\",\"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\":[{\"components\":[{\"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[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"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\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":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\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"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\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.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: "0x6101006040523480156200001257600080fd5b5060405162006c6938038062006c698339810160408190526200003591620005e9565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c1565b5050466080525060208201516001600160a01b03161580620000ec575060408201516001600160a01b0316155b156200010b576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160401b0316600003620001375760405163c656089560e01b815260040160405180910390fd5b81516001600160401b0390811660a052602080840180516001600160a01b0390811660c05260408087018051831660e052815188519096168652925182169385019390935290511682820152517f2f56698ec552a5d53d27d6f4b3dd8b6989f6426b6151a36aff61160c1d07efdf9181900360600190a1620001b9816200026c565b505062000a42565b336001600160a01b038216036200021b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b815181101562000517576000828281518110620002905762000290620007f8565b60200260200101519050600081600001519050806001600160401b0316600003620002ce5760405163c656089560e01b815260040160405180910390fd5b6001600160401b0381166000908152600760205260408120600181018054919291620002fa906200080e565b80601f016020809104026020016040519081016040528092919081815260200182805462000328906200080e565b8015620003795780601f106200034d5761010080835404028352916020019162000379565b820191906000526020600020905b8154815290600101906020018083116200035b57829003601f168201915b50505050509050600084606001519050815160000362000448578051600003620003b6576040516342bcdf7f60e11b815260040160405180910390fd5b60018301620003c682826200089f565b506040858101518454610100600160481b03196001600160a01b0390921669010000000000000000000291909116610100600160e81b031990911617610100178455516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620004b0565b8080519060200120828051906020012014158062000485575060408501518354690100000000000000000090046001600160a01b03908116911614155b15620004b05760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b6020850151835460ff19169015151783556040516001600160401b038516907fdae3952b438115cd8dd19e2714218d96a982a46a209ff4ad784eb4f0e807222e90620004fe9086906200096b565b60405180910390a250505050508060010190506200026f565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200055657620005566200051b565b60405290565b604051608081016001600160401b03811182821017156200055657620005566200051b565b604051601f8201601f191681016001600160401b0381118282101715620005ac57620005ac6200051b565b604052919050565b80516001600160401b0381168114620005cc57600080fd5b919050565b80516001600160a01b0381168114620005cc57600080fd5b6000808284036080811215620005fe57600080fd5b60608112156200060d57600080fd5b506200061862000531565b6200062384620005b4565b8152602062000634818601620005d1565b818301526200064660408601620005d1565b604083015260608501519193506001600160401b03808311156200066957600080fd5b828601925086601f8401126200067e57600080fd5b8251818111156200069357620006936200051b565b8060051b620006a484820162000581565b918252848101840191848101908a841115620006bf57600080fd5b85870192505b83831015620007e757825185811115620006de57600080fd5b8701601f196080828e0382011215620006f657600080fd5b620007006200055c565b6200070d898401620005b4565b8152604083015180151581146200072357600080fd5b818a01526200073560608401620005d1565b60408201526080830151888111156200074d57600080fd5b8084019350508d603f8401126200076357600080fd5b88830151888111156200077a576200077a6200051b565b6200078c8a84601f8401160162000581565b92508083528e6040828601011115620007a457600080fd5b60005b81811015620007c557848101604001518482018c01528a01620007a7565b5060009083018a015260608101919091528352509185019190850190620006c5565b809750505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200082357607f821691505b6020821081036200084457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200089a576000816000526020600020601f850160051c81016020861015620008755750805b601f850160051c820191505b81811015620008965782815560010162000881565b5050505b505050565b81516001600160401b03811115620008bb57620008bb6200051b565b620008d381620008cc84546200080e565b846200084a565b602080601f8311600181146200090b5760008415620008f25750858301515b600019600386901b1c1916600185901b17855562000896565b600085815260208120601f198616915b828110156200093c578886015182559484019460019091019084016200091b565b50858210156200095b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252825460ff8116151583830152600881901c6001600160401b0316604084015260481c6001600160a01b03166060830152608080830152600180840180546000939291908490620009c0816200080e565b8060a089015260c06001831660008114620009e4576001811462000a015762000a33565b60ff19841660c08b015260c083151560051b8b0101945062000a33565b85600052602060002060005b8481101562000a2a5781548c820185015290880190890162000a0d565b8b0160c0019550505b50929998505050505050505050565b60805160a05160c05160e0516161d162000a9860003960008181610213015261312d0152600081816101e40152818161159d0152611654015260006101b4015260008181611bf00152611c3c01526161d16000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806385572ffb116100d8578063d2a15d351161008c578063f52121a511610066578063f52121a51461057a578063f716f99f1461058d578063ff888fb1146105a057600080fd5b8063d2a15d3514610534578063e9d68a8e14610547578063f2fde38b1461056757600080fd5b80638da5cb5b116100bd5780638da5cb5b146104b4578063c673e584146104cf578063ccd37ba3146104ef57600080fd5b806385572ffb146104935780638b364334146104a157600080fd5b8063403b2d631161013a5780635e36480c116101145780635e36480c146103565780637437ff9f1461037657806379ba50971461048b57600080fd5b8063403b2d631461031d578063542625af14610330578063556bdef01461034357600080fd5b80632d04ab761161016b5780632d04ab76146102ce578063311cd513146102e35780633f4b04aa146102f657600080fd5b806306285c6914610187578063181f5a7714610285575b600080fd5b610243604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60408051825167ffffffffffffffff1681526020808401516001600160a01b039081169183019190915292820151909216908201526060015b60405180910390f35b6102c16040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b60405161027c91906141ad565b6102e16102dc366004614258565b6105c3565b005b6102e16102f136600461430b565b610989565b600b5467ffffffffffffffff165b60405167ffffffffffffffff909116815260200161027c565b6102e161032b3660046144b8565b6109f2565b6102e161033e366004614adc565b610baf565b6102e1610351366004614c07565b610d54565b610369610364366004614d28565b610d68565b60405161027c9190614d8b565b6104226040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152600160c01b8304811694840194909452600160e01b90910490921660608201526005548216608082015260065490911660a082015290565b60405161027c9190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b6102e1610dbe565b6102e1610182366004614d99565b6103046104af366004614dd4565b610e7c565b6000546040516001600160a01b03909116815260200161027c565b6104e26104dd366004614e13565b610e92565b60405161027c9190614e73565b6105266104fd366004614ee8565b67ffffffffffffffff919091166000908152600a60209081526040808320938352929052205490565b60405190815260200161027c565b6102e1610542366004614f14565b610ff0565b61055a610555366004614f89565b6110aa565b60405161027c9190614fa6565b6102e1610575366004614ff4565b6111c2565b6102e1610588366004615011565b6111d3565b6102e161059b3660046150dd565b611505565b6105b36105ae36600461521b565b611547565b604051901515815260200161027c565b60006105d1878901896153ac565b805151519091501515806105ea57508051602001515115155b156106ea57600b5460208a01359067ffffffffffffffff808316911610156106a957600b805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f91610672916004016155ea565b600060405180830381600087803b15801561068c57600080fd5b505af11580156106a0573d6000803e3d6000fd5b505050506106e8565b8160200151516000036106e8576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b8160200151518110156108d25760008260200151828151811061071257610712615517565b6020026020010151905060008160000151905061072e81611608565b60006107398261170a565b602084015151815491925067ffffffffffffffff9081166101009092041614158061077b575060208084015190810151905167ffffffffffffffff9182169116115b156107c457825160208401516040517feefb0cac0000000000000000000000000000000000000000000000000000000081526107bb9291906004016155fd565b60405180910390fd5b604083015180610800576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600a60209081526040808320848452909152902054156108735783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018290526044016107bb565b6020808501510151610886906001615648565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600a6020908152604080832094835293905291909120429055506001016106ed565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d816040516109029190615670565b60405180910390a161097e60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b925061176a915050565b505050505050505050565b6109c96109988284018461570d565b60408051600080825260208201909252906109c3565b60608152602001906001900390816109ae5790505b50611ae1565b6040805160008082526020820190925290506109ec60018585858586600061176a565b50505050565b6109fa611b91565b60a08101516001600160a01b03161580610a1c575080516001600160a01b0316155b15610a53576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b610bb7611bed565b815181518114610bf3576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d44576000848281518110610c1257610c12615517565b60200260200101519050600081602001515190506000858481518110610c3a57610c3a615517565b6020026020010151905080518214610c7e576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610d35576000828281518110610c9d57610c9d615517565b6020026020010151905080600014158015610cd8575084602001518281518110610cc957610cc9615517565b60200260200101516080015181105b15610d2c5784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260248101839052604481018290526064016107bb565b50600101610c81565b50505050806001019050610bf6565b50610d4f8383611ae1565b505050565b610d5c611b91565b610d6581611c6e565b50565b6000610d7660016004615742565b6002610d8360808561576b565b67ffffffffffffffff16610d979190615792565b610da18585611f69565b901c166003811115610db557610db5614d61565b90505b92915050565b6001546001600160a01b03163314610e185760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016107bb565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600080610e898484611fb0565b50949350505050565b610ed56040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c082015294855291820180548451818402810184019095528085529293858301939092830182828015610f7e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610f60575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610fe057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610fc2575b5050505050815250509050919050565b610ff8611b91565b60005b81811015610d4f57600083838381811061101757611017615517565b90506040020180360381019061102d91906157a9565b905061103c8160200151611547565b6110a157805167ffffffffffffffff166000908152600a602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b50600101610ffb565b604080516080810182526000808252602082018190529181019190915260608082015267ffffffffffffffff8281166000908152600760209081526040918290208251608081018452815460ff81161515825261010081049095169281019290925269010000000000000000009093046001600160a01b031691810191909152600182018054919291606084019190611142906157e3565b80601f016020809104026020016040519081016040528092919081815260200182805461116e906157e3565b8015610fe05780601f1061119057610100808354040283529160200191610fe0565b820191906000526020600020905b81548152906001019060200180831161119e57505050919092525091949350505050565b6111ca611b91565b610d65816120c1565b33301461120c576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611249565b60408051808201909152600080825260208201528152602001906001900390816112225790505b5061014084015151909150156112aa576112a7836101400151846020015160405160200161128691906001600160a01b0391909116815260200190565b60408051601f19818403018152918152860151865161016088015187612177565b90505b60006112b68483612225565b6005549091506001600160a01b031680156113a3576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a1906113109085906004016158cb565b600060405180830381600087803b15801561132a57600080fd5b505af192505050801561133b575060015b6113a3573d808015611369576040519150601f19603f3d011682016040523d82523d6000602084013e61136e565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016107bb91906141ad565b610120850151511580156113b957506080850151155b806113d0575060408501516001600160a01b03163b155b806114105750604085015161140e906001600160a01b03167f85572ffb000000000000000000000000000000000000000000000000000000006122c8565b155b1561141c575050505050565b60048054608087015160408089015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf9798393611477938a93611388939291016158de565b6000604051808303816000875af1158015611496573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114be919081019061595f565b5091509150816114fc57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107bb91906141ad565b50505050505050565b61150d611b91565b60005b81518110156115435761153b82828151811061152e5761152e615517565b60200260200101516122e4565b600101611510565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa1580156115e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db891906159b9565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa1580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c791906159b9565b15610d65576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016107bb565b67ffffffffffffffff81166000908152600760205260408120805460ff16610db8576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016107bb565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906117c98760a46159d6565b90508260600151156118115784516117e2906020615792565b86516117ef906020615792565b6117fa9060a06159d6565b61180491906159d6565b61180e90826159d6565b90505b368114611853576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016107bb565b508151811461189b5781516040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016107bb565b6118a3611bed565b60ff808a16600090815260036020908152604080832033845282528083208151808301909252805480861683529394919390928401916101009091041660028111156118f1576118f1614d61565b600281111561190257611902614d61565b905250905060028160200151600281111561191f5761191f614d61565b1480156119735750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff168154811061195b5761195b615517565b6000918252602090912001546001600160a01b031633145b6119a9576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816060015115611a8b5760208201516119c49060016159e9565b60ff16855114611a00576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351855114611a3b576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008787604051611a4d929190615a02565b604051908190038120611a64918b90602001615a12565b604051602081830303815290604052805190602001209050611a898a828888886125ef565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611b1b576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611b8a57611b82858281518110611b5057611b50615517565b602002602001015184611b7c57858381518110611b6f57611b6f615517565b6020026020010151612806565b83612806565b600101611b32565b5050505050565b6000546001600160a01b03163314611beb5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107bb565b565b467f000000000000000000000000000000000000000000000000000000000000000014611beb576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016107bb565b60005b8151811015611543576000828281518110611c8e57611c8e615517565b602002602001015190506000816000015190508067ffffffffffffffff16600003611ce5576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600760205260408120600181018054919291611d10906157e3565b80601f0160208091040260200160405190810160405280929190818152602001828054611d3c906157e3565b8015611d895780601f10611d5e57610100808354040283529160200191611d89565b820191906000526020600020905b815481529060010190602001808311611d6c57829003601f168201915b505050505090506000846060015190508151600003611e85578051600003611ddd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301611deb8282615a6e565b50604085810151845468ffffffffffffffff00196001600160a01b03909216690100000000000000000002919091167fffffff00000000000000000000000000000000000000000000000000000000ff909116176101001784555167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611f04565b80805190602001208280519060200120141580611ec1575060408501518354690100000000000000000090046001600160a01b03908116911614155b15611f04576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016107bb565b6020850151835460ff191690151517835560405167ffffffffffffffff8516907fdae3952b438115cd8dd19e2714218d96a982a46a209ff4ad784eb4f0e807222e90611f51908690615b2e565b60405180910390a25050505050806001019050611c71565b67ffffffffffffffff8216600090815260096020526040812081611f8e608085615bfc565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b67ffffffffffffffff80831660009081526008602090815260408083206001600160a01b038616845290915281205490918291168082036120b35767ffffffffffffffff8516600090815260076020526040902054690100000000000000000090046001600160a01b031680156120b1576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015282169063856c824790602401602060405180830381865afa158015612080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a49190615c23565b60019350935050506120ba565b505b9150600090505b9250929050565b336001600160a01b038216036121195760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107bb565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8560005b8751811015612219576121f488828151811061219957612199615517565b6020026020010151602001518888888886815181106121ba576121ba615517565b60200260200101518060200190518101906121d59190615c40565b8887815181106121e7576121e7615517565b60200260200101516130cc565b82828151811061220657612206615517565b602090810291909101015260010161217b565b505b9695505050505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff168152602001846020015160405160200161229d91906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006122d383613445565b8015610db55750610db58383613491565b806040015160ff1660000361230f576000604051631b3fab5160e11b81526004016107bb9190615cf5565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003612360576060840151600182018054911515620100000262ff0000199092169190911790556123b5565b6060840151600182015460ff62010000909104161515901515146123b5576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff841660048201526024016107bb565b60a08401518051601f60ff821611156123e4576001604051631b3fab5160e11b81526004016107bb9190615cf5565b61244a858560030180548060200260200160405190810160405280929190818152602001828054801561244057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612422575b5050505050613533565b85606001511561255c576124b88585600201805480602002602001604051908101604052809291908181526020018280548015612440576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311612422575050505050613533565b608086015180516124d290600287019060208401906140bb565b50805160018501805461ff00191661010060ff841690810291909117909155601f1015612515576002604051631b3fab5160e11b81526004016107bb9190615cf5565b6040880151612525906003615d0f565b60ff168160ff161161254d576003604051631b3fab5160e11b81526004016107bb9190615cf5565b6125598783600161359c565b50505b6125688583600261359c565b815161257d90600386019060208501906140bb565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547936125d6938a939260028b01929190615d2b565b60405180910390a16125e78561371c565b505050505050565b6125f7614129565b835160005b818110156127fc57600060018886846020811061261b5761261b615517565b61262891901a601b6159e9565b89858151811061263a5761263a615517565b602002602001015189868151811061265457612654615517565b602002602001015160405160008152602001604052604051612692949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156126b4573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b0385168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561271557612715614d61565b600281111561272657612726614d61565b905250905060018160200151600281111561274357612743614d61565b1461277a576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061279157612791615517565b6020020151156127cd576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f81106127e8576127e8615517565b9115156020909202015250506001016125fc565b5050505050505050565b815161281181611608565b61281a8161170a565b50602083015151600081900361285b576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360400151518114612899576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff8111156128b4576128b461435f565b6040519080825280602002602001820160405280156128dd578160200160208202803683370190505b50905060005b8281101561299d5760008660200151828151811061290357612903615517565b6020026020010151905061291681613738565b83838151811061292857612928615517565b60200260200101818152505080610180015183838151811061294c5761294c615517565b602002602001015114612994578061018001516040517f345039be0000000000000000000000000000000000000000000000000000000081526004016107bb91815260200190565b506001016128e3565b5060006129b484838860600151896080015161389d565b9050806000036129fc576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016107bb565b8451151560005b848110156127fc57600088602001518281518110612a2357612a23615517565b602002602001015190506000612a3d888360600151610d68565b90506002816003811115612a5357612a53614d61565b03612aa95760608201516040805167ffffffffffffffff808c16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a150506130c4565b6000816003811115612abd57612abd614d61565b1480612ada57506003816003811115612ad857612ad8614d61565b145b612b2a5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808b16600483015290911660248201526044016107bb565b8315612c0b5760045460009074010000000000000000000000000000000000000000900463ffffffff16612b5e8742615742565b1190508080612b7e57506003826003811115612b7c57612b7c614d61565b145b612bc0576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8a1660048201526024016107bb565b898481518110612bd257612bd2615517565b6020026020010151600014612c0557898481518110612bf357612bf3615517565b60200260200101518360800181815250505b50612c70565b6000816003811115612c1f57612c1f614d61565b14612c705760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808b16600483015290911660248201526044016107bb565b60c082015167ffffffffffffffff1615612e2c57600080612c958a8560200151611fb0565b915091508015612d845760c084015167ffffffffffffffff16612cb9836001615648565b67ffffffffffffffff1614612d3c5760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612d2b928e9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b60405180910390a1505050506130c4565b67ffffffffffffffff8a81166000908152600860209081526040808320888301516001600160a01b031684529091529020805467ffffffffffffffff19169184169190911790555b6000836003811115612d9857612d98614d61565b03612e295760c084015167ffffffffffffffff16612db7836001615648565b67ffffffffffffffff1614612e295760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612d2b928e9267ffffffffffffffff93841681529190921660208201526001600160a01b0391909116604082015260600190565b50505b60008a604001518481518110612e4457612e44615517565b6020026020010151905080518361014001515114612ea85760608301516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c16600483015290911660248201526044016107bb565b612eb889846060015160016138f3565b600080612ec5858461399b565b91509150612ed88b8660600151846138f3565b868015612ef657506003826003811115612ef457612ef4614d61565b145b8015612f1457506000846003811115612f1157612f11614d61565b14155b15612f5457846101800151816040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016107bb929190615dd7565b6003826003811115612f6857612f68614d61565b14158015612f8857506002826003811115612f8557612f85614d61565b14155b15612fc85760608501516040517f926c5a3e0000000000000000000000000000000000000000000000000000000081526107bb918d918590600401615df0565b60008560c0015167ffffffffffffffff16118015612ff757506000846003811115612ff557612ff5614d61565b145b156130655767ffffffffffffffff808c166000908152600860209081526040808320898301516001600160a01b0316845290915281208054909216919061303d83615e16565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff168c67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df285856040516130b6929190615e3d565b60405180910390a450505050505b600101612a03565b604080518082019091526000808252602082015260006130ef8460200151613be5565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015613174573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131989190615e5d565b90506001600160a01b03811615806131e057506131de6001600160a01b0382167faff2afbf000000000000000000000000000000000000000000000000000000006122c8565b155b15613222576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016107bb565b6000806132ed633907753760e01b6040518061010001604052808d81526020018b67ffffffffffffffff1681526020018c6001600160a01b031681526020018e8152602001876001600160a01b031681526020018a6000015181526020018a6040015181526020018981525060405160240161329e9190615e7a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152600454859063ffffffff600160e01b909104166113886084613c27565b509150915081613312578060405163e1cd550960e01b81526004016107bb91906141ad565b805160201461335a5780516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016107bb565b6000818060200190518101906133709190615f47565b604080516001600160a01b038d16602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb000000000000000000000000000000000000000000000000000000001790526004549192506133f3918790600160c01b900463ffffffff166113886084613c27565b50909350915082613419578160405163e1cd550960e01b81526004016107bb91906141ad565b604080518082019091526001600160a01b03909516855260208501525091925050509695505050505050565b6000613471827f01ffc9a700000000000000000000000000000000000000000000000000000000613491565b8015610db8575061348a826001600160e01b0319613491565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561351c575060208210155b80156135285750600081115b979650505050505050565b60005b8151811015610d4f5760ff83166000908152600360205260408120835190919084908490811061356857613568615517565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613536565b60005b82518160ff1610156109ec576000838260ff16815181106135c2576135c2615517565b60200260200101519050600060028111156135df576135df614d61565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561361e5761361e614d61565b1461363f576004604051631b3fab5160e11b81526004016107bb9190615cf5565b6001600160a01b03811661367f576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156136a5576136a5614d61565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff19161761010083600281111561370257613702614d61565b0217905550905050508061371590615f60565b905061359f565b60ff8116610d6557600b805467ffffffffffffffff1916905550565b60008060001b826000015183602001518460400151856060015186608001518760a001518860c001518960e001518a61010001516040516020016137de9998979695949392919067ffffffffffffffff998a1681526001600160a01b03988916602082015296881660408801529488166060870152608086019390935290151560a085015290941660c08301529290911660e08201526101008101919091526101200190565b60405160208183030381529060405280519060200120836101200151805190602001208461014001516040516020016138179190615f7f565b604051602081830303815290604052805190602001208561016001516040516020016138439190616034565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c001604051602081830303815290604052805190602001209050919050565b6000806138ab858585613d4d565b90506138b681611547565b6138c45760009150506138eb565b67ffffffffffffffff86166000908152600a60209081526040808320938352929052205490505b949350505050565b6000600261390260808561576b565b67ffffffffffffffff166139169190615792565b905060006139248585611f69565b90508161393360016004615742565b901b19168183600381111561394a5761394a614d61565b67ffffffffffffffff871660009081526009602052604081209190921b92909217918291613979608088615bfc565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906139df9087908790600401616047565b600060405180830381600087803b1580156139f957600080fd5b505af1925050508015613a0a575060015b613bca573d808015613a38576040519150601f19603f3d011682016040523d82523d6000602084013e613a3d565b606091505b506000613a498261618c565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000006001600160e01b031982161480613a93575063e1cd550960e01b6001600160e01b03198216145b80613aae575063046b337b60e51b6001600160e01b03198216145b80613ae257507f78ef8024000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b1657507f0c3b563c000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b4a57507fae9b4ce9000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b80613b7e57507f09c25325000000000000000000000000000000000000000000000000000000006001600160e01b03198216145b15613b8f57506003925090506120ba565b856101800151826040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016107bb929190615dd7565b50506040805160208101909152600081526002909250929050565b60008151602014613c0b578160405163046b337b60e51b81526004016107bb91906141ad565b610db882806020019051810190613c229190615f47565b613fec565b6000606060008361ffff1667ffffffffffffffff811115613c4a57613c4a61435f565b6040519080825280601f01601f191660200182016040528015613c74576020820181803683370190505b509150863b613ca7577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613cda577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613d13577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613d365750835b808352806000602085013e50955095509592505050565b8251825160009190818303613d8e576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613da257506101018111155b613dbf576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613de9576040516309bde33960e01b815260040160405180910390fd5b80600003613e165786600081518110613e0457613e04615517565b60200260200101519350505050613fe5565b60008167ffffffffffffffff811115613e3157613e3161435f565b604051908082528060200260200182016040528015613e5a578160200160208202803683370190505b50905060008080805b85811015613f845760006001821b8b811603613ebe5788851015613ea7578c5160018601958e918110613e9857613e98615517565b60200260200101519050613ee0565b8551600185019487918110613e9857613e98615517565b8b5160018401938d918110613ed557613ed5615517565b602002602001015190505b600089861015613f10578d5160018701968f918110613f0157613f01615517565b60200260200101519050613f32565b8651600186019588918110613f2757613f27615517565b602002602001015190505b82851115613f53576040516309bde33960e01b815260040160405180910390fd5b613f5d8282614040565b878481518110613f6f57613f6f615517565b60209081029190910101525050600101613e63565b506001850382148015613f9657508683145b8015613fa157508581145b613fbe576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613fd357613fd3615517565b60200260200101519750505050505050505b9392505050565b60006001600160a01b03821180614004575061040082105b1561403c5760408051602081018490520160408051601f198184030181529082905263046b337b60e51b82526107bb916004016141ad565b5090565b60008183106140825760408051600160208083019190915281830185905260608083018790528351808403909101815260809092019092528051910120610db5565b60408051600160208083019190915281830186905260608083018690528351808403909101815260809092019092528051910120610db5565b82805482825590600052602060002090810192821561411d579160200282015b8281111561411d578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039091161782556020909201916001909101906140db565b5061403c929150614148565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561403c5760008155600101614149565b60005b83811015614178578181015183820152602001614160565b50506000910152565b6000815180845261419981602086016020860161415d565b601f01601f19169290920160200192915050565b602081526000610db56020830184614181565b8060608101831015610db857600080fd5b60008083601f8401126141e357600080fd5b50813567ffffffffffffffff8111156141fb57600080fd5b6020830191508360208285010111156120ba57600080fd5b60008083601f84011261422557600080fd5b50813567ffffffffffffffff81111561423d57600080fd5b6020830191508360208260051b85010111156120ba57600080fd5b60008060008060008060008060e0898b03121561427457600080fd5b61427e8a8a6141c0565b9750606089013567ffffffffffffffff8082111561429b57600080fd5b6142a78c838d016141d1565b909950975060808b01359150808211156142c057600080fd5b6142cc8c838d01614213565b909750955060a08b01359150808211156142e557600080fd5b506142f28b828c01614213565b999c989b50969995989497949560c00135949350505050565b60008060006080848603121561432057600080fd5b61432a85856141c0565b9250606084013567ffffffffffffffff81111561434657600080fd5b614352868287016141d1565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156143985761439861435f565b60405290565b6040805190810167ffffffffffffffff811182821017156143985761439861435f565b6040516101a0810167ffffffffffffffff811182821017156143985761439861435f565b60405160a0810167ffffffffffffffff811182821017156143985761439861435f565b6040516080810167ffffffffffffffff811182821017156143985761439861435f565b6040516060810167ffffffffffffffff811182821017156143985761439861435f565b604051601f8201601f1916810167ffffffffffffffff811182821017156144775761447761435f565b604052919050565b6001600160a01b0381168114610d6557600080fd5b803561449f8161447f565b919050565b803563ffffffff8116811461449f57600080fd5b600060c082840312156144ca57600080fd5b6144d2614375565b82356144dd8161447f565b81526144eb602084016144a4565b60208201526144fc604084016144a4565b604082015261450d606084016144a4565b606082015260808301356145208161447f565b608082015260a08301356145338161447f565b60a08201529392505050565b600067ffffffffffffffff8211156145595761455961435f565b5060051b60200190565b67ffffffffffffffff81168114610d6557600080fd5b803561449f81614563565b8015158114610d6557600080fd5b803561449f81614584565b600067ffffffffffffffff8211156145b7576145b761435f565b50601f01601f191660200190565b600082601f8301126145d657600080fd5b81356145e96145e48261459d565b61444e565b8181528460208386010111156145fe57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261462c57600080fd5b8135602061463c6145e48361453f565b82815260069290921b8401810191818101908684111561465b57600080fd5b8286015b8481101561221957604081890312156146785760008081fd5b61468061439e565b813561468b8161447f565b8152818501358582015283529183019160400161465f565b600082601f8301126146b457600080fd5b813560206146c46145e48361453f565b82815260059290921b840181019181810190868411156146e357600080fd5b8286015b8481101561221957803567ffffffffffffffff8111156147075760008081fd5b6147158986838b01016145c5565b8452509183019183016146e7565b60006101a0828403121561473657600080fd5b61473e6143c1565b905061474982614579565b815261475760208301614494565b602082015261476860408301614494565b604082015261477960608301614579565b60608201526080820135608082015261479460a08301614592565b60a08201526147a560c08301614579565b60c08201526147b660e08301614494565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156147e357600080fd5b6147ef868387016145c5565b8385015261014092508285013591508082111561480b57600080fd5b6148178683870161461b565b8385015261016092508285013591508082111561483357600080fd5b50614840858286016146a3565b82840152505061018080830135818301525092915050565b600082601f83011261486957600080fd5b813560206148796145e48361453f565b82815260059290921b8401810191818101908684111561489857600080fd5b8286015b8481101561221957803567ffffffffffffffff8111156148bc5760008081fd5b6148ca8986838b0101614723565b84525091830191830161489c565b600082601f8301126148e957600080fd5b813560206148f96145e48361453f565b82815260059290921b8401810191818101908684111561491857600080fd5b8286015b8481101561221957803567ffffffffffffffff81111561493c5760008081fd5b61494a8986838b01016146a3565b84525091830191830161491c565b600082601f83011261496957600080fd5b813560206149796145e48361453f565b8083825260208201915060208460051b87010193508684111561499b57600080fd5b602086015b8481101561221957803583529183019183016149a0565b600082601f8301126149c857600080fd5b813560206149d86145e48361453f565b82815260059290921b840181019181810190868411156149f757600080fd5b8286015b8481101561221957803567ffffffffffffffff80821115614a1c5760008081fd5b9088019060a0828b03601f1901811315614a365760008081fd5b614a3e6143e5565b614a49888501614579565b815260408085013584811115614a5f5760008081fd5b614a6d8e8b83890101614858565b8a8401525060608086013585811115614a865760008081fd5b614a948f8c838a01016148d8565b8385015250608091508186013585811115614aaf5760008081fd5b614abd8f8c838a0101614958565b91840191909152509190930135908301525083529183019183016149fb565b6000806040808486031215614af057600080fd5b833567ffffffffffffffff80821115614b0857600080fd5b614b14878388016149b7565b9450602091508186013581811115614b2b57600080fd5b8601601f81018813614b3c57600080fd5b8035614b4a6145e48261453f565b81815260059190911b8201840190848101908a831115614b6957600080fd5b8584015b83811015614bf557803586811115614b855760008081fd5b8501603f81018d13614b975760008081fd5b87810135614ba76145e48261453f565b81815260059190911b82018a0190898101908f831115614bc75760008081fd5b928b01925b82841015614be55783358252928a0192908a0190614bcc565b8652505050918601918601614b6d565b50809750505050505050509250929050565b60006020808385031215614c1a57600080fd5b823567ffffffffffffffff80821115614c3257600080fd5b818501915085601f830112614c4657600080fd5b8135614c546145e48261453f565b81815260059190911b83018401908481019088831115614c7357600080fd5b8585015b83811015614d1b57803585811115614c8f5760008081fd5b86016080818c03601f1901811315614ca75760008081fd5b614caf614408565b89830135614cbc81614563565b8152604083810135614ccd81614584565b828c0152606084810135614ce08161447f565b83830152928401359289841115614cf957600091508182fd5b614d078f8d868801016145c5565b908301525085525050918601918601614c77565b5098975050505050505050565b60008060408385031215614d3b57600080fd5b8235614d4681614563565b91506020830135614d5681614563565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614d8757614d87614d61565b9052565b60208101610db88284614d77565b600060208284031215614dab57600080fd5b813567ffffffffffffffff811115614dc257600080fd5b820160a08185031215613fe557600080fd5b60008060408385031215614de757600080fd5b8235614df281614563565b91506020830135614d568161447f565b803560ff8116811461449f57600080fd5b600060208284031215614e2557600080fd5b610db582614e02565b60008151808452602080850194506020840160005b83811015614e685781516001600160a01b031687529582019590820190600101614e43565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614ec260e0840182614e2e565b90506040840151601f198483030160c0850152614edf8282614e2e565b95945050505050565b60008060408385031215614efb57600080fd5b8235614f0681614563565b946020939093013593505050565b60008060208385031215614f2757600080fd5b823567ffffffffffffffff80821115614f3f57600080fd5b818501915085601f830112614f5357600080fd5b813581811115614f6257600080fd5b8660208260061b8501011115614f7757600080fd5b60209290920196919550909350505050565b600060208284031215614f9b57600080fd5b8135613fe581614563565b6020815281511515602082015267ffffffffffffffff60208301511660408201526001600160a01b036040830151166060820152600060608301516080808401526138eb60a0840182614181565b60006020828403121561500657600080fd5b8135613fe58161447f565b6000806040838503121561502457600080fd5b823567ffffffffffffffff8082111561503c57600080fd5b61504886838701614723565b9350602085013591508082111561505e57600080fd5b5061506b858286016146a3565b9150509250929050565b600082601f83011261508657600080fd5b813560206150966145e48361453f565b8083825260208201915060208460051b8701019350868411156150b857600080fd5b602086015b848110156122195780356150d08161447f565b83529183019183016150bd565b600060208083850312156150f057600080fd5b823567ffffffffffffffff8082111561510857600080fd5b818501915085601f83011261511c57600080fd5b813561512a6145e48261453f565b81815260059190911b8301840190848101908883111561514957600080fd5b8585015b83811015614d1b5780358581111561516457600080fd5b860160c0818c03601f1901121561517b5760008081fd5b615183614375565b8882013581526040615196818401614e02565b8a83015260606151a7818501614e02565b82840152608091506151ba828501614592565b9083015260a083810135898111156151d25760008081fd5b6151e08f8d83880101615075565b838501525060c08401359150888211156151fa5760008081fd5b6152088e8c84870101615075565b908301525084525091860191860161514d565b60006020828403121561522d57600080fd5b5035919050565b80356001600160e01b038116811461449f57600080fd5b600082601f83011261525c57600080fd5b8135602061526c6145e48361453f565b82815260069290921b8401810191818101908684111561528b57600080fd5b8286015b8481101561221957604081890312156152a85760008081fd5b6152b061439e565b81356152bb81614563565b81526152c8828601615234565b8186015283529183019160400161528f565b600082601f8301126152eb57600080fd5b813560206152fb6145e48361453f565b82815260079290921b8401810191818101908684111561531a57600080fd5b8286015b848110156122195780880360808112156153385760008081fd5b61534061442b565b823561534b81614563565b81526040601f1983018113156153615760008081fd5b61536961439e565b92508684013561537881614563565b83528381013561538781614563565b838801528187019290925260608301359181019190915283529183019160800161531e565b600060208083850312156153bf57600080fd5b823567ffffffffffffffff808211156153d757600080fd5b818501915060408083880312156153ed57600080fd5b6153f561439e565b83358381111561540457600080fd5b84016040818a03121561541657600080fd5b61541e61439e565b81358581111561542d57600080fd5b8201601f81018b1361543e57600080fd5b803561544c6145e48261453f565b81815260069190911b8201890190898101908d83111561546b57600080fd5b928a01925b828410156154bb5787848f0312156154885760008081fd5b61549061439e565b843561549b8161447f565b81526154a8858d01615234565b818d0152825292870192908a0190615470565b8452505050818701359350848411156154d357600080fd5b6154df8a85840161524b565b81880152825250838501359150828211156154f957600080fd5b615505888386016152da565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561558457835180516001600160a01b031684528501516001600160e01b031685840152928401929185019160010161554d565b50508583015187820388850152805180835290840192506000918401905b808310156155de578351805167ffffffffffffffff1683528501516001600160e01b0316858301529284019260019290920191908501906155a2565b50979650505050505050565b602081526000610db5602083018461552d565b67ffffffffffffffff8316815260608101613fe56020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561566957615669615632565b5092915050565b60006020808352606084516040808487015261568f606087018361552d565b87850151878203601f19016040890152805180835290860193506000918601905b80831015614d1b57845167ffffffffffffffff8151168352878101516156ef89850182805167ffffffffffffffff908116835260209182015116910152565b508401518287015293860193600192909201916080909101906156b0565b60006020828403121561571f57600080fd5b813567ffffffffffffffff81111561573657600080fd5b6138eb848285016149b7565b81810381811115610db857610db8615632565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061578657615786615755565b92169190910692915050565b8082028115828204841417610db857610db8615632565b6000604082840312156157bb57600080fd5b6157c361439e565b82356157ce81614563565b81526020928301359281019290925250919050565b600181811c908216806157f757607f821691505b60208210810361581757634e487b7160e01b600052602260045260246000fd5b50919050565b60008151808452602080850194506020840160005b83811015614e6857815180516001600160a01b031688526020908101519088015260408701965090820190600101615832565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261589860a0850182614181565b9050606083015184820360608601526158b18282614181565b91505060808301518482036080860152614edf828261581d565b602081526000610db56020830184615865565b6080815260006158f16080830187615865565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b600082601f83011261592b57600080fd5b81516159396145e48261459d565b81815284602083860101111561594e57600080fd5b6138eb82602083016020870161415d565b60008060006060848603121561597457600080fd5b835161597f81614584565b602085015190935067ffffffffffffffff81111561599c57600080fd5b6159a88682870161591a565b925050604084015190509250925092565b6000602082840312156159cb57600080fd5b8151613fe581614584565b80820180821115610db857610db8615632565b60ff8181168382160190811115610db857610db8615632565b8183823760009101908152919050565b828152606082602083013760800192915050565b601f821115610d4f576000816000526020600020601f850160051c81016020861015615a4f5750805b601f850160051c820191505b818110156125e757828155600101615a5b565b815167ffffffffffffffff811115615a8857615a8861435f565b615a9c81615a9684546157e3565b84615a26565b602080601f831160018114615ad15760008415615ab95750858301515b600019600386901b1c1916600185901b1785556125e7565b600085815260208120601f198616915b82811015615b0057888601518255948401946001909101908401615ae1565b5085821015615b1e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808352835460ff81161515602085015267ffffffffffffffff8160081c1660408501526001600160a01b038160481c16606085015250600180850160808086015260008154615b80816157e3565b8060a089015260c06001831660008114615ba15760018114615bbd57615bed565b60ff19841660c08b015260c083151560051b8b01019450615bed565b85600052602060002060005b84811015615be45781548c8201850152908801908901615bc9565b8b0160c0019550505b50929998505050505050505050565b600067ffffffffffffffff80841680615c1757615c17615755565b92169190910492915050565b600060208284031215615c3557600080fd5b8151613fe581614563565b600060208284031215615c5257600080fd5b815167ffffffffffffffff80821115615c6a57600080fd5b9083019060608286031215615c7e57600080fd5b615c8661442b565b825182811115615c9557600080fd5b615ca18782860161591a565b825250602083015182811115615cb657600080fd5b615cc28782860161591a565b602083015250604083015182811115615cda57600080fd5b615ce68782860161591a565b60408301525095945050505050565b6020810160058310615d0957615d09614d61565b91905290565b60ff818116838216029081169081811461566957615669615632565b600060a0820160ff881683526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b81811015615d835784546001600160a01b031683526001948501949284019201615d5e565b50508481036060860152865180825290820192508187019060005b81811015615dc35782516001600160a01b031685529383019391830191600101615d9e565b50505060ff8516608085015250905061221b565b8281526040602082015260006138eb6040830184614181565b67ffffffffffffffff848116825283166020820152606081016138eb6040830184614d77565b600067ffffffffffffffff808316818103615e3357615e33615632565b6001019392505050565b615e478184614d77565b6040602082015260006138eb6040830184614181565b600060208284031215615e6f57600080fd5b8151613fe58161447f565b6020815260008251610100806020850152615e99610120850183614181565b91506020850151615eb6604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615ef060a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615f0d8483614181565b935060c08701519150808685030160e0870152615f2a8483614181565b935060e087015191508086850301838701525061221b8382614181565b600060208284031215615f5957600080fd5b5051919050565b600060ff821660ff8103615f7657615f76615632565b60010192915050565b6020808252825182820181905260009190848201906040850190845b81811015615fce57835180516001600160a01b031684526020908101519084015260408301938501939250600101615f9b565b50909695505050505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561602757601f19868403018952616015838351614181565b98840198925090830190600101615ff9565b5090979650505050505050565b602081526000610db56020830184615fda565b6040815261606260408201845167ffffffffffffffff169052565b6000602084015161607e60608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006160df8185018367ffffffffffffffff169052565b60e086015191506101206160fd818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a0610160818187015261612d6101e0870185614181565b9350828801519250603f1961018081888703018189015261614e868661581d565b9550828a015194508188870301848901526161698686615fda565b9550808a01516101c089015250505050508281036020840152614edf8185615fda565b6000815160208301516001600160e01b0319808216935060048310156161bc5780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", } var EVM2EVMMultiOffRampABI = EVM2EVMMultiOffRampMetaData.ABI @@ -2492,7 +2492,7 @@ func (EVM2EVMMultiOffRampSkippedSenderWithPreviousRampMessageInflight) Topic() c } func (EVM2EVMMultiOffRampSourceChainConfigSet) Topic() common.Hash { - return common.HexToHash("0xb8f0c74385134334c728fcac437ec6c6397c9f2c1440532b0c44175a090b1401") + return common.HexToHash("0xdae3952b438115cd8dd19e2714218d96a982a46a209ff4ad784eb4f0e807222e") } func (EVM2EVMMultiOffRampSourceChainSelectorAdded) Topic() common.Hash { 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 30dda5afe5..85d6f07059 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 @@ -9,7 +9,7 @@ ccip_capability_configuration: ../../../contracts/solc/v0.8.24/CCIPCapabilityCon commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51 commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69 ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de -evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 4bd848e0d37d36bec5cad3b50dce994e53c1c753668af6fc4a60658e7c3149a2 +evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin ce81b85e5935d1af69398a0865f6b25f35102273ea5164017e43f961fe0df964 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin f62d32fffd8f9f1e6e48a6e146c29415d67b081d31b9667f701b088c558f3bcf evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin b6132cb22370d62b1b20174bbe832ec87df61f6ab65f7fe2515733bdd10a30f5 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 383e9930fbc1b7fbb6554cc8857229d207fd6742e87c7fb1a37002347e8de8e2