diff --git a/contracts/.changeset/shiny-rivers-know.md b/contracts/.changeset/shiny-rivers-know.md new file mode 100644 index 0000000000..caa8502f9d --- /dev/null +++ b/contracts/.changeset/shiny-rivers-know.md @@ -0,0 +1,5 @@ +--- +"@chainlink/contracts-ccip": minor +--- + +#updated ocr3 integration to multi-offramp and ocr3 optimizations diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 358306441e..36e4150dab 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -66,113 +66,117 @@ CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) DefensiveExampleTest:test_Recovery() (gas: 424253) E2E:test_E2E_3MessagesSuccess_gas() (gas: 1097080) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 409610) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 145631) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12398) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 45053) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 45066) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 140666) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 140355) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 140503) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 133936) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 63990) -EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 13004) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 286874) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 232279) -EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 157554) -EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 185204) -EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 142347) -EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 515589) -EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10418) -EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17112) -EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5117887) -EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 97747) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 409540) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 145593) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12376) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreAlreadyInUse_Revert() (gas: 45017) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_CommitStoreMismatchingOnRamp_Revert() (gas: 45030) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRampAndPrevOffRamp_Revert() (gas: 140606) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp_Revert() (gas: 140295) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainPrevOffRamp_Revert() (gas: 140443) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 133876) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 63952) +EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 12982) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 286773) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 232178) +EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 157535) +EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 185188) +EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 142240) +EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 515551) +EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10396) +EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 17155) +EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5585557) +EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 98231) EVM2EVMMultiOffRamp_execute:test_DisabledSourceChain_Revert() (gas: 37356) EVM2EVMMultiOffRamp_execute:test_EmptyReport_Revert() (gas: 21667) EVM2EVMMultiOffRamp_execute:test_InvalidMessageId_Revert() (gas: 41668) -EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 440375) -EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 51679) +EVM2EVMMultiOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 440378) +EVM2EVMMultiOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 51674) EVM2EVMMultiOffRamp_execute:test_MessageTooLarge_Revert() (gas: 160260) EVM2EVMMultiOffRamp_execute:test_MismatchingOnRampAddress_Revert() (gas: 44471) EVM2EVMMultiOffRamp_execute:test_MismatchingSourceChainSelector_Revert() (gas: 41560) EVM2EVMMultiOffRamp_execute:test_NonExistingSourceChain_Revert() (gas: 37571) -EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 176710) -EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190027) -EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 46401) -EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 412253) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 241221) -EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 188775) +EVM2EVMMultiOffRamp_execute:test_ReceiverError_Success() (gas: 176625) +EVM2EVMMultiOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190030) +EVM2EVMMultiOffRamp_execute:test_RootNotCommitted_Revert() (gas: 46345) +EVM2EVMMultiOffRamp_execute:test_RouterYULCall_Revert() (gas: 412256) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokensOtherChain_Success() (gas: 241051) +EVM2EVMMultiOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 188693) EVM2EVMMultiOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 260133) -EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 125315) -EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 381234) +EVM2EVMMultiOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 125318) +EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 381237) EVM2EVMMultiOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 62135) EVM2EVMMultiOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 59579) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 524173) -EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 461744) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 524091) +EVM2EVMMultiOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 461750) EVM2EVMMultiOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35734) -EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 513858) -EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 511443) +EVM2EVMMultiOffRamp_execute:test_UnhealthySingleChainCurse_Revert() (gas: 513864) +EVM2EVMMultiOffRamp_execute:test_Unhealthy_Revert() (gas: 511449) EVM2EVMMultiOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 71668) -EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 478677) -EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 155586) +EVM2EVMMultiOffRamp_execute:test_WithCurseOnAnotherSourceChain_Success() (gas: 478683) +EVM2EVMMultiOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 155589) EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20641) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 245114) EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 22814) EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 199060) -EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 50915) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 50425) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 298166) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 153975) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 278869) -EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 158031) -EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 245677) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 245466) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 297662) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 277997) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247085) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 235145) -EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 5145412) -EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 142656) +EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 50918) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 50428) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 217756) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 73566) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 278872) +EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 77626) +EVM2EVMMultiOffRamp_execute_upgrade:test_NoPrevOffRampForChain_Success() (gas: 245548) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 245381) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 297492) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 277824) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 246909) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 234969) +EVM2EVMMultiOffRamp_execute_upgrade:test_UpgradedWithMultiRamp_Revert() (gas: 5607305) +EVM2EVMMultiOffRamp_execute_upgrade:test_Upgraded_Success() (gas: 142659) EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3591010) EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118288) EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87203) -EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 503772) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 205844) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 28178) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 160396) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79774) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28654) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 208587) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 654319) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 295691) -EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 207991) -EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2345234) +EVM2EVMMultiOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 503734) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 205806) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 28145) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchMultipleReports_Revert() (gas: 160264) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 79686) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 28632) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 208549) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithMultiReportGasOverride_Success() (gas: 654305) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecWithPartialMessages_Success() (gas: 295659) +EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 207953) +EVM2EVMMultiOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2345193) EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnOnRampAddress_Success() (gas: 10983) -EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11036) +EVM2EVMMultiOffRamp_metadataHash:test_MetadataHashChangesOnSourceChain_Success() (gas: 11051) EVM2EVMMultiOffRamp_metadataHash:test_MetadataHash_Success() (gas: 9146) EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 162622) EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAContract_Reverts() (gas: 32046) EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 28422) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 64915) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 64924) EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 50943) EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 72443) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 181632) -EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 281119) -EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 9982) -EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 1494444) -EVM2EVMMultiOffRamp_report:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 378309) -EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 232671) -EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 22752) -EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 140028) -EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 9894) -EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 38342) -EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38844) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 119373) -EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 141928) -EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 234702) -EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 243293) -EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 297462) -EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 277197) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 181629) +EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 281126) +EVM2EVMMultiOffRamp_report:test_IncorrectArrayType_Revert() (gas: 10004) +EVM2EVMMultiOffRamp_report:test_LargeBatch_Success() (gas: 1494537) +EVM2EVMMultiOffRamp_report:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 297890) +EVM2EVMMultiOffRamp_report:test_MultipleReports_Success() (gas: 232683) +EVM2EVMMultiOffRamp_report:test_NonArray_Revert() (gas: 22774) +EVM2EVMMultiOffRamp_report:test_SingleReport_Success() (gas: 140034) +EVM2EVMMultiOffRamp_report:test_ZeroReports_Revert() (gas: 9899) +EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 12363) +EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 11973) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 38920) +EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 33986) +EVM2EVMMultiOffRamp_transmitExec:test_NoConfig_Revert() (gas: 5401691) +EVM2EVMMultiOffRamp_transmitExec:test_SingleReport_Success() (gas: 163098) +EVM2EVMMultiOffRamp_transmitExec:test_UnauthorizedTransmitter_Revert() (gas: 146942) +EVM2EVMMultiOffRamp_transmitExec:test_WrongConfigWithSigners_Revert() (gas: 6181192) +EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 234761) +EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 243352) +EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 297612) +EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 277244) EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16647) EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 30455) EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 12427) @@ -553,21 +557,22 @@ MultiCommitStore_verify:test_NotBlessedWrongChainSelector_Success() (gas: 103743 MultiCommitStore_verify:test_NotBlessed_Success() (gas: 64090) MultiCommitStore_verify:test_Paused_Revert() (gas: 35772) MultiCommitStore_verify:test_TooManyLeaves_Revert() (gas: 36985) -MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59513) -MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44343) -MultiOCR3Base_setOCR3Configs:test_OracleOutOfRegister_Revert() (gas: 90972) -MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283601) -MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 422166) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 825754) -MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 455551) -MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12310) -MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2132649) -MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141616) -MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 814471) -MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 30617) -MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 253932) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 856374) -MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 473599) +MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59396) +MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44544) +MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283912) +MultiOCR3Base_setOCR3Configs:test_RepeatTransmitterAddress_Revert() (gas: 423049) +MultiOCR3Base_setOCR3Configs:test_SetConfigIgnoreSigners_Success() (gas: 510183) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithSigners_Success() (gas: 828082) +MultiOCR3Base_setOCR3Configs:test_SetConfigWithoutSigners_Success() (gas: 455913) +MultiOCR3Base_setOCR3Configs:test_SetConfigsZeroInput_Success() (gas: 12332) +MultiOCR3Base_setOCR3Configs:test_SetMultipleConfigs_Success() (gas: 2138949) +MultiOCR3Base_setOCR3Configs:test_SignerCannotBeZeroAddress_Revert() (gas: 141953) +MultiOCR3Base_setOCR3Configs:test_StaticConfigChange_Revert() (gas: 816847) +MultiOCR3Base_setOCR3Configs:test_TooManySigners_Revert() (gas: 171416) +MultiOCR3Base_setOCR3Configs:test_TooManyTransmitters_Revert() (gas: 30500) +MultiOCR3Base_setOCR3Configs:test_TransmitterCannotBeZeroAddress_Revert() (gas: 254663) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigSigners_Success() (gas: 859688) +MultiOCR3Base_setOCR3Configs:test_UpdateConfigTransmittersWithoutSigners_Success() (gas: 473974) MultiOCR3Base_transmit:test_ConfigDigestMismatch_Revert() (gas: 43919) MultiOCR3Base_transmit:test_ForkedChain_Revert() (gas: 49466) MultiOCR3Base_transmit:test_InsufficientSignatures_Revert() (gas: 81855) diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol index 2574d227ac..1fa3d9bb45 100644 --- a/contracts/src/v0.8/ccip/libraries/Internal.sol +++ b/contracts/src/v0.8/ccip/libraries/Internal.sol @@ -181,4 +181,10 @@ library Internal { SUCCESS, FAILURE } + + /// @notice CCIP OCR plugin type, used to separate execution & commit transmissions and configs + enum OCRPluginType { + Commit, + Execution + } } diff --git a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol index 0bd97c101f..2b0540f1cb 100644 --- a/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol +++ b/contracts/src/v0.8/ccip/ocr/MultiOCR3Base.sol @@ -24,7 +24,15 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { /// use latestConfigDigestAndEpoch with scanLogs set to false. event Transmitted(uint8 indexed ocrPluginType, bytes32 configDigest, uint64 sequenceNumber); - error InvalidConfig(string message); + enum InvalidConfigErrorType { + F_MUST_BE_POSITIVE, + TOO_MANY_TRANSMITTERS, + TOO_MANY_SIGNERS, + F_TOO_HIGH, + REPEATED_ORACLE_ADDRESS + } + + error InvalidConfig(InvalidConfigErrorType errorType); error WrongMessageLength(uint256 expected, uint256 actual); error ConfigDigestMismatch(bytes32 expected, bytes32 actual); error ForkedChain(uint256 expected, uint256 actual); @@ -115,6 +123,8 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { } /// @notice sets offchain reporting protocol configuration incl. participating oracles + /// NOTE: The OCR3 config must be sanity-checked against the home-chain registry configuration, to ensure + /// home-chain and remote-chain parity! /// @param ocrConfigArgs OCR config update args function setOCR3Configs(OCRConfigArgs[] memory ocrConfigArgs) external onlyOwner { for (uint256 i; i < ocrConfigArgs.length; ++i) { @@ -125,7 +135,7 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { /// @notice sets offchain reporting protocol configuration incl. participating oracles for a single OCR plugin type /// @param ocrConfigArgs OCR config update args function _setOCR3Config(OCRConfigArgs memory ocrConfigArgs) internal { - if (ocrConfigArgs.F == 0) revert InvalidConfig("F must be positive"); + if (ocrConfigArgs.F == 0) revert InvalidConfig(InvalidConfigErrorType.F_MUST_BE_POSITIVE); uint8 ocrPluginType = ocrConfigArgs.ocrPluginType; OCRConfig storage ocrConfig = s_ocrConfigs[ocrPluginType]; @@ -146,55 +156,60 @@ abstract contract MultiOCR3Base is ITypeAndVersion, OwnerIsCreator { // Transmitters are expected to never exceed 255 (since this is bounded by MAX_NUM_ORACLES) uint8 newTransmittersLength = uint8(transmitters.length); - if (newTransmittersLength > MAX_NUM_ORACLES) revert InvalidConfig("too many transmitters"); + if (newTransmittersLength > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_TRANSMITTERS); - address[] memory oldTransmitters = ocrConfig.transmitters; - address[] memory oldSigners = ocrConfig.signers; - bool isSignatureVerificationEnabled = ocrConfigArgs.isSignatureVerificationEnabled; - for (uint256 i = 0; i < oldTransmitters.length; ++i) { - delete s_oracles[ocrPluginType][oldTransmitters[i]]; + _clearOracleRoles(ocrPluginType, ocrConfig.transmitters); - // NOTE: oldSigners.length == oldTransmitters.length - if (isSignatureVerificationEnabled) { - delete s_oracles[ocrPluginType][oldSigners[i]]; - } - } + if (ocrConfigArgs.isSignatureVerificationEnabled) { + _clearOracleRoles(ocrPluginType, ocrConfig.signers); - if (isSignatureVerificationEnabled) { - ocrConfig.signers = ocrConfigArgs.signers; address[] memory signers = ocrConfigArgs.signers; + ocrConfig.signers = signers; - if (signers.length != newTransmittersLength) revert InvalidConfig("oracle addresses out of registration"); - if (signers.length <= 3 * ocrConfigArgs.F) revert InvalidConfig("faulty-oracle F too high"); + uint8 signersLength = uint8(signers.length); + configInfo.n = signersLength; - for (uint8 i = 0; i < newTransmittersLength; ++i) { - // add new signer/transmitter addresses - address signer = signers[i]; - if (s_oracles[ocrPluginType][signer].role != Role.Unset) revert InvalidConfig("repeated signer address"); - if (signer == address(0)) revert OracleCannotBeZeroAddress(); - s_oracles[ocrPluginType][signer] = Oracle(uint8(i), Role.Signer); - } - } + if (signersLength > MAX_NUM_ORACLES) revert InvalidConfig(InvalidConfigErrorType.TOO_MANY_SIGNERS); + if (signersLength <= 3 * ocrConfigArgs.F) revert InvalidConfig(InvalidConfigErrorType.F_TOO_HIGH); - for (uint8 i = 0; i < newTransmittersLength; ++i) { - address transmitter = transmitters[i]; - if (s_oracles[ocrPluginType][transmitter].role != Role.Unset) { - revert InvalidConfig("repeated transmitter address"); - } - if (transmitter == address(0)) revert OracleCannotBeZeroAddress(); - s_oracles[ocrPluginType][transmitter] = Oracle(uint8(i), Role.Transmitter); + _assignOracleRoles(ocrPluginType, signers, Role.Signer); } + _assignOracleRoles(ocrPluginType, transmitters, Role.Transmitter); + ocrConfig.transmitters = transmitters; configInfo.F = ocrConfigArgs.F; configInfo.configDigest = ocrConfigArgs.configDigest; - configInfo.n = newTransmittersLength; emit ConfigSet( - ocrPluginType, ocrConfigArgs.configDigest, ocrConfigArgs.signers, ocrConfigArgs.transmitters, ocrConfigArgs.F + ocrPluginType, ocrConfigArgs.configDigest, ocrConfig.signers, ocrConfigArgs.transmitters, ocrConfigArgs.F ); } + /// @notice Clears oracle roles for the provided oracle addresses + /// @param ocrPluginType OCR plugin type to clear roles for + /// @param oracleAddresses Oracle addresses to clear roles for + function _clearOracleRoles(uint8 ocrPluginType, address[] memory oracleAddresses) internal { + for (uint256 i = 0; i < oracleAddresses.length; ++i) { + delete s_oracles[ocrPluginType][oracleAddresses[i]]; + } + } + + /// @notice Assigns oracles roles for the provided oracle addresses with uniqueness verification + /// @param ocrPluginType OCR plugin type to assign roles for + /// @param oracleAddresses Oracle addresses to assign roles to + /// @param role Role to assign + function _assignOracleRoles(uint8 ocrPluginType, address[] memory oracleAddresses, Role role) internal { + for (uint8 i = 0; i < oracleAddresses.length; ++i) { + address oracle = oracleAddresses[i]; + if (s_oracles[ocrPluginType][oracle].role != Role.Unset) { + revert InvalidConfig(InvalidConfigErrorType.REPEATED_ORACLE_ADDRESS); + } + if (oracle == address(0)) revert OracleCannotBeZeroAddress(); + s_oracles[ocrPluginType][oracle] = Oracle(i, role); + } + } + /// @notice _transmit is called to post a new report to the contract. /// The function should be called after the per-DON reporting logic is completed. /// @param ocrPluginType OCR plugin type to transmit report for diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol index 828ae4e8ae..4cda65d8d7 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol @@ -16,7 +16,7 @@ import {EnumerableMapAddresses} from "../../shared/enumerable/EnumerableMapAddre import {Client} from "../libraries/Client.sol"; import {Internal} from "../libraries/Internal.sol"; import {Pool} from "../libraries/Pool.sol"; -import {OCR2BaseNoChecks} from "../ocr/OCR2BaseNoChecks.sol"; +import {MultiOCR3Base} from "../ocr/MultiOCR3Base.sol"; import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/ERC165Checker.sol"; @@ -25,10 +25,11 @@ import {ERC165Checker} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts /// 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 OCR2BaseNoChecks is used to save gas, signatures are not required as the offramp can only execute -/// messages which are committed in the commitStore. We still make use of OCR2 as an executor whitelist -/// and turn-taking mechanism. -contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseNoChecks { +/// @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. +// TODO: merge with MultiCommitStore +contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, MultiOCR3Base { using ERC165Checker for address; using EnumerableMapAddresses for EnumerableMapAddresses.AddressToAddressMap; @@ -133,10 +134,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN // DYNAMIC CONFIG DynamicConfig internal s_dynamicConfig; - // TODO: evaluate whether this should be pulled in (since this can be inferred from SourceChainSelectorAdded events instead) - /// @notice all source chains available in s_sourceChainConfigs - // uint64[] internal s_sourceChainSelectors; - /// @notice SourceConfig per chain /// (forms lane configurations from sourceChainSelector => StaticConfig.chainSelector) mapping(uint64 sourceChainSelector => SourceChainConfig) internal s_sourceChainConfigs; @@ -153,7 +150,7 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN mapping(uint64 sourceChainSelector => mapping(uint64 seqNum => uint256 executionStateBitmap)) internal s_executionStates; - constructor(StaticConfig memory staticConfig, SourceChainConfigArgs[] memory sourceChainConfigs) OCR2BaseNoChecks() { + constructor(StaticConfig memory staticConfig, SourceChainConfigArgs[] memory sourceChainConfigs) MultiOCR3Base() { if (staticConfig.commitStore == address(0)) revert ZeroAddressNotAllowed(); i_commitStore = staticConfig.commitStore; @@ -252,8 +249,9 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN Internal.ExecutionReportSingleChain[] memory reports, uint256[][] memory gasLimitOverrides ) external { - // We do this here because the other _execute path is already covered OCR2BaseXXX. - if (i_chainID != block.chainid) revert OCR2BaseNoChecks.ForkedChain(i_chainID, uint64(block.chainid)); + // We do this here because the other _execute path is already covered by MultiOCR3Base. + // TODO: contract size golfing - split to internal function + if (i_chainID != block.chainid) revert MultiOCR3Base.ForkedChain(i_chainID, uint64(block.chainid)); uint256 numReports = reports.length; if (numReports != gasLimitOverrides.length) revert ManualExecutionGasLimitMismatch(); @@ -277,12 +275,21 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN _batchExecute(reports, gasLimitOverrides); } - /// @notice Entrypoint for execution, called by the OCR network - /// @dev Expects an encoded ExecutionReport - function _report(bytes calldata report) internal override { - Internal.ExecutionReportSingleChain[] memory reports = abi.decode(report, (Internal.ExecutionReportSingleChain[])); + /// @notice Transmit function for execution reports. The function takes no signatures, + /// and expects the exec plugin type to be configured with no signatures. + /// @param report serialized execution report + function transmitExec(bytes32[3] calldata reportContext, bytes calldata report) external { + _reportExec(report); + + // TODO: gas / contract size saving from CONSTANT? + bytes32[] memory emptySigs = new bytes32[](0); + _transmit(uint8(Internal.OCRPluginType.Execution), reportContext, report, emptySigs, emptySigs, bytes32("")); + } - _batchExecute(reports, new uint256[][](0)); + /// @notice Reporting function for the execution plugin + /// @param report encoded ExecutionReport + function _reportExec(bytes calldata report) internal { + _batchExecute(abi.decode(report, (Internal.ExecutionReportSingleChain[])), new uint256[][](0)); } /// @notice Batch executes a set of reports, each report matching one single source chain @@ -599,12 +606,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN return s_sourceChainConfigs[sourceChainSelector]; } - /// @notice Returns all configured source chain selectors - /// @return sourceChainSelectors source chain selectors - // function getSourceChainSelectors() external view returns (uint64[] memory) { - // return s_sourceChainSelectors; - // } - /// @notice Updates source configs /// @param sourceChainConfigUpdates Source chain configs function applySourceChainConfigUpdates(SourceChainConfigArgs[] memory sourceChainConfigUpdates) external onlyOwner { @@ -645,7 +646,6 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN currentConfig.onRamp = sourceConfigUpdate.onRamp; currentConfig.prevOffRamp = sourceConfigUpdate.prevOffRamp; - // s_sourceChainSelectors.push(sourceChainSelector); emit SourceChainSelectorAdded(sourceChainSelector); } else if ( currentConfig.onRamp != sourceConfigUpdate.onRamp || currentConfig.prevOffRamp != sourceConfigUpdate.prevOffRamp @@ -659,17 +659,15 @@ contract EVM2EVMMultiOffRamp is IAny2EVMMultiOffRamp, ITypeAndVersion, OCR2BaseN } } - // TODO: _beforeSetConfig is no longer used in OCR3 - replace this with an external onlyOwner function - /// @notice Sets the dynamic config. This function is called during `setOCR2Config` flow - function _beforeSetConfig(bytes memory onchainConfig) internal override { - DynamicConfig memory dynamicConfig = abi.decode(onchainConfig, (DynamicConfig)); - + /// @notice Sets the dynamic config. + function setDynamicConfig(DynamicConfig memory dynamicConfig) external onlyOwner { if (dynamicConfig.router == address(0)) revert ZeroAddressNotAllowed(); s_dynamicConfig = dynamicConfig; + // TODO: contract size golfing - is StaticConfig needed in the event? emit ConfigSet( - StaticConfig({commitStore: i_commitStore, chainSelector: i_chainSelector, rmnProxy: i_rmnProxy}), dynamicConfig + StaticConfig({chainSelector: i_chainSelector, rmnProxy: i_rmnProxy, commitStore: i_commitStore}), dynamicConfig ); } diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol index ca238c6203..baa8853441 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOffRampHelper.sol @@ -44,8 +44,8 @@ contract EVM2EVMMultiOffRampHelper is EVM2EVMMultiOffRamp, IgnoreContractSize { return _trialExecute(message, offchainTokenData); } - function report(bytes calldata executableReports) external { - _report(executableReports); + function reportExec(bytes calldata executableReports) external { + _reportExec(executableReports); } function execute(Internal.ExecutionReportSingleChain memory rep, uint256[] memory manualExecGasLimits) external { diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol index 8719191b03..52c63e2003 100644 --- a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol +++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3Base.t.sol @@ -2,123 +2,10 @@ pragma solidity 0.8.24; import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; -import {BaseTest} from "../BaseTest.t.sol"; -import {MultiOCR3Helper} from "../helpers/MultiOCR3Helper.sol"; +import {MultiOCR3BaseSetup} from "./MultiOCR3BaseSetup.t.sol"; import {Vm} from "forge-std/Vm.sol"; -contract MultiOCR3BaseSetup is BaseTest { - // Signer private keys used for these test - uint256 internal constant PRIVATE0 = 0x7b2e97fe057e6de99d6872a2ef2abf52c9b4469bc848c2465ac3fcd8d336e81d; - - address[] internal s_validSigners; - address[] internal s_validTransmitters; - uint256[] internal s_validSignerKeys; - - address[] internal s_partialSigners; - address[] internal s_partialTransmitters; - uint256[] internal s_partialSignerKeys; - - address[] internal s_emptySigners; - - bytes internal constant REPORT = abi.encode("testReport"); - MultiOCR3Helper internal s_multiOCR3; - - function setUp() public virtual override { - BaseTest.setUp(); - - uint160 numSigners = 7; - s_validSignerKeys = new uint256[](numSigners); - s_validSigners = new address[](numSigners); - s_validTransmitters = new address[](numSigners); - - for (uint160 i; i < numSigners; ++i) { - s_validTransmitters[i] = address(4 + i); - s_validSignerKeys[i] = PRIVATE0 + i; - s_validSigners[i] = vm.addr(s_validSignerKeys[i]); - } - - s_partialSigners = new address[](4); - s_partialSignerKeys = new uint256[](4); - s_partialTransmitters = new address[](4); - for (uint256 i; i < s_partialSigners.length; ++i) { - s_partialSigners[i] = s_validSigners[i]; - s_partialSignerKeys[i] = s_validSignerKeys[i]; - s_partialTransmitters[i] = s_validTransmitters[i]; - } - - s_emptySigners = new address[](0); - - s_multiOCR3 = new MultiOCR3Helper(); - } - - /// @dev returns a mock config digest with config digest computation logic similar to OCR2Base - function _getBasicConfigDigest( - uint8 F, - address[] memory signers, - address[] memory transmitters - ) internal view returns (bytes32) { - bytes memory configBytes = abi.encode(""); - uint256 configVersion = 1; - - uint256 h = uint256( - keccak256( - abi.encode( - block.chainid, address(s_multiOCR3), signers, transmitters, F, configBytes, configVersion, configBytes - ) - ) - ); - uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00 - uint256 prefix = 0x0001 << (256 - 16); // 0x000100..00 - return bytes32((prefix & prefixMask) | (h & ~prefixMask)); - } - - /// @dev returns a hash value in the same format as the h value on which the signature verified - /// in the _transmit function - function _getTestReportDigest(bytes32 configDigest) internal pure returns (bytes32) { - bytes32[3] memory reportContext = [configDigest, configDigest, configDigest]; - return keccak256(abi.encodePacked(keccak256(REPORT), reportContext)); - } - - function _assertOCRConfigEquality( - MultiOCR3Base.OCRConfig memory configA, - MultiOCR3Base.OCRConfig memory configB - ) internal pure { - vm.assertEq(configA.configInfo.configDigest, configB.configInfo.configDigest); - vm.assertEq(configA.configInfo.F, configB.configInfo.F); - vm.assertEq(configA.configInfo.n, configB.configInfo.n); - vm.assertEq(configA.configInfo.uniqueReports, configB.configInfo.uniqueReports); - vm.assertEq(configA.configInfo.isSignatureVerificationEnabled, configB.configInfo.isSignatureVerificationEnabled); - - vm.assertEq(configA.signers, configB.signers); - vm.assertEq(configA.transmitters, configB.transmitters); - } - - function _assertOCRConfigUnconfigured(MultiOCR3Base.OCRConfig memory config) internal pure { - assertEq(config.configInfo.configDigest, bytes32("")); - assertEq(config.signers.length, 0); - assertEq(config.transmitters.length, 0); - } - - function _getSignaturesForDigest( - uint256[] memory signerPrivateKeys, - bytes32 configDigest, - uint8 signatureCount - ) internal pure returns (bytes32[] memory rs, bytes32[] memory ss, uint8[] memory vs, bytes32 rawVs) { - rs = new bytes32[](signatureCount); - ss = new bytes32[](signatureCount); - vs = new uint8[](signatureCount); - - // Calculate signatures - for (uint256 i; i < signatureCount; ++i) { - (vs[i], rs[i], ss[i]) = vm.sign(signerPrivateKeys[i], _getTestReportDigest(configDigest)); - rawVs = rawVs | (bytes32(bytes1(vs[i] - 27)) >> (8 * i)); - } - - return (rs, ss, vs, rawVs); - } -} - contract MultiOCR3Base_transmit is MultiOCR3BaseSetup { bytes32 internal s_configDigest1; bytes32 internal s_configDigest2; @@ -499,7 +386,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { configInfo: MultiOCR3Base.ConfigInfo({ configDigest: ocrConfigs[0].configDigest, F: ocrConfigs[0].F, - n: uint8(s_validSigners.length), + n: uint8(ocrConfigs[0].signers.length), uniqueReports: ocrConfigs[0].uniqueReports, isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled }), @@ -540,7 +427,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { configInfo: MultiOCR3Base.ConfigInfo({ configDigest: ocrConfigs[0].configDigest, F: ocrConfigs[0].F, - n: uint8(s_validTransmitters.length), + n: uint8(ocrConfigs[0].signers.length), uniqueReports: ocrConfigs[0].uniqueReports, isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled }), @@ -550,6 +437,52 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { _assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig); } + function test_SetConfigIgnoreSigners_Success() public { + uint8 F = 1; + + _assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0)); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: 0, + configDigest: _getBasicConfigDigest(F, new address[](0), s_validTransmitters), + F: F, + uniqueReports: false, + isSignatureVerificationEnabled: false, + signers: s_validSigners, + transmitters: s_validTransmitters + }); + + vm.expectEmit(); + emit MultiOCR3Base.ConfigSet( + ocrConfigs[0].ocrPluginType, + ocrConfigs[0].configDigest, + s_emptySigners, + ocrConfigs[0].transmitters, + ocrConfigs[0].F + ); + s_multiOCR3.setOCR3Configs(ocrConfigs); + + MultiOCR3Base.OCRConfig memory expectedConfig = MultiOCR3Base.OCRConfig({ + configInfo: MultiOCR3Base.ConfigInfo({ + configDigest: ocrConfigs[0].configDigest, + F: ocrConfigs[0].F, + n: 0, + uniqueReports: ocrConfigs[0].uniqueReports, + isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled + }), + signers: s_emptySigners, + transmitters: s_validTransmitters + }); + _assertOCRConfigEquality(s_multiOCR3.latestConfigDetails(0), expectedConfig); + + // Verify no signer role is set + for (uint256 i = 0; i < s_validSigners.length; ++i) { + MultiOCR3Base.Oracle memory signerOracle = s_multiOCR3.getOracle(0, s_validSigners[i]); + assertEq(uint8(signerOracle.role), uint8(MultiOCR3Base.Role.Unset)); + } + } + function test_SetMultipleConfigs_Success() public { _assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(0)); _assertOCRConfigUnconfigured(s_multiOCR3.latestConfigDetails(1)); @@ -618,6 +551,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { function test_Fuzz_SetConfig_Success(MultiOCR3Base.OCRConfigArgs memory ocrConfig, uint64 randomAddressOffset) public { // condition: cannot assume max oracle count vm.assume(ocrConfig.transmitters.length <= 31); + vm.assume(ocrConfig.signers.length <= 31); // condition: F > 0 ocrConfig.F = uint8(bound(ocrConfig.F, 1, 3)); @@ -636,16 +570,13 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { } else { ocrConfig.isSignatureVerificationEnabled = true; - // condition: signers length must equal transmitters length - if (ocrConfig.signers.length != transmittersLength) { - ocrConfig.signers = new address[](transmittersLength); - } - // condition: number of signers > 3F vm.assume(ocrConfig.signers.length > 3 * ocrConfig.F); + uint256 signersLength = ocrConfig.signers.length; + // Force addresses to be unique - continuing generation with an offset after the transmitter addresses - for (uint160 i = 0; i < transmittersLength; ++i) { + for (uint160 i = 0; i < signersLength; ++i) { ocrConfig.signers[i] = vm.addr(PRIVATE0 + randomAddressOffset + i + transmittersLength); // condition: non-zero oracle address vm.assume(ocrConfig.signers[i] != address(0)); @@ -667,7 +598,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { configInfo: MultiOCR3Base.ConfigInfo({ configDigest: ocrConfig.configDigest, F: ocrConfig.F, - n: uint8(ocrConfig.transmitters.length), + n: ocrConfig.isSignatureVerificationEnabled ? uint8(ocrConfig.signers.length) : 0, uniqueReports: ocrConfig.uniqueReports, isSignatureVerificationEnabled: ocrConfig.isSignatureVerificationEnabled }), @@ -713,7 +644,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { configInfo: MultiOCR3Base.ConfigInfo({ configDigest: ocrConfigs[0].configDigest, F: ocrConfigs[0].F, - n: uint8(newTransmitters.length), + n: uint8(ocrConfigs[0].signers.length), uniqueReports: ocrConfigs[0].uniqueReports, isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled }), @@ -774,7 +705,7 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { configInfo: MultiOCR3Base.ConfigInfo({ configDigest: ocrConfigs[0].configDigest, F: ocrConfigs[0].F, - n: uint8(newSigners.length), + n: uint8(ocrConfigs[0].signers.length), uniqueReports: ocrConfigs[0].uniqueReports, isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled }), @@ -822,7 +753,11 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { transmitters: transmitters }); - vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "repeated transmitter address")); + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.REPEATED_ORACLE_ADDRESS + ) + ); s_multiOCR3.setOCR3Configs(ocrConfigs); } @@ -842,7 +777,11 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { transmitters: transmitters }); - vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "repeated signer address")); + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.REPEATED_ORACLE_ADDRESS + ) + ); s_multiOCR3.setOCR3Configs(ocrConfigs); } @@ -928,27 +867,6 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { s_multiOCR3.setOCR3Configs(ocrConfigs); } - function test_OracleOutOfRegister_Revert() public { - address[] memory signers = new address[](10); - address[] memory transmitters = new address[](0); - - MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); - ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ - ocrPluginType: 0, - configDigest: _getBasicConfigDigest(2, signers, transmitters), - F: 1, - uniqueReports: false, - isSignatureVerificationEnabled: true, - signers: signers, - transmitters: transmitters - }); - - vm.expectRevert( - abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "oracle addresses out of registration") - ); - s_multiOCR3.setOCR3Configs(ocrConfigs); - } - function test_FTooHigh_Revert() public { address[] memory signers = new address[](0); address[] memory transmitters = new address[](0); @@ -964,7 +882,9 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { transmitters: transmitters }); - vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "faulty-oracle F too high")); + vm.expectRevert( + abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.F_TOO_HIGH) + ); s_multiOCR3.setOCR3Configs(ocrConfigs); } @@ -980,7 +900,11 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { transmitters: s_validTransmitters }); - vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "F must be positive")); + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.F_MUST_BE_POSITIVE + ) + ); s_multiOCR3.setOCR3Configs(ocrConfigs); } @@ -999,7 +923,33 @@ contract MultiOCR3Base_setOCR3Configs is MultiOCR3BaseSetup { transmitters: transmitters }); - vm.expectRevert(abi.encodeWithSelector(MultiOCR3Base.InvalidConfig.selector, "too many transmitters")); + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.TOO_MANY_TRANSMITTERS + ) + ); + s_multiOCR3.setOCR3Configs(ocrConfigs); + } + + function test_TooManySigners_Revert() public { + address[] memory signers = new address[](32); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: 0, + configDigest: _getBasicConfigDigest(1, signers, s_validTransmitters), + F: 1, + uniqueReports: false, + isSignatureVerificationEnabled: true, + signers: signers, + transmitters: s_validTransmitters + }); + + vm.expectRevert( + abi.encodeWithSelector( + MultiOCR3Base.InvalidConfig.selector, MultiOCR3Base.InvalidConfigErrorType.TOO_MANY_SIGNERS + ) + ); s_multiOCR3.setOCR3Configs(ocrConfigs); } } diff --git a/contracts/src/v0.8/ccip/test/ocr/MultiOCR3BaseSetup.t.sol b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3BaseSetup.t.sol new file mode 100644 index 0000000000..d0c971b3fd --- /dev/null +++ b/contracts/src/v0.8/ccip/test/ocr/MultiOCR3BaseSetup.t.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity 0.8.24; + +import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; +import {BaseTest} from "../BaseTest.t.sol"; +import {MultiOCR3Helper} from "../helpers/MultiOCR3Helper.sol"; + +contract MultiOCR3BaseSetup is BaseTest { + // Signer private keys used for these test + uint256 internal constant PRIVATE0 = 0x7b2e97fe057e6de99d6872a2ef2abf52c9b4469bc848c2465ac3fcd8d336e81d; + + address[] internal s_validSigners; + address[] internal s_validTransmitters; + uint256[] internal s_validSignerKeys; + + address[] internal s_partialSigners; + address[] internal s_partialTransmitters; + uint256[] internal s_partialSignerKeys; + + address[] internal s_emptySigners; + + bytes internal constant REPORT = abi.encode("testReport"); + MultiOCR3Helper internal s_multiOCR3; + + function setUp() public virtual override { + BaseTest.setUp(); + + uint160 numSigners = 7; + s_validSignerKeys = new uint256[](numSigners); + s_validSigners = new address[](numSigners); + s_validTransmitters = new address[](numSigners); + + for (uint160 i; i < numSigners; ++i) { + s_validTransmitters[i] = address(4 + i); + s_validSignerKeys[i] = PRIVATE0 + i; + s_validSigners[i] = vm.addr(s_validSignerKeys[i]); + } + + s_partialSigners = new address[](4); + s_partialSignerKeys = new uint256[](4); + s_partialTransmitters = new address[](4); + for (uint256 i; i < s_partialSigners.length; ++i) { + s_partialSigners[i] = s_validSigners[i]; + s_partialSignerKeys[i] = s_validSignerKeys[i]; + s_partialTransmitters[i] = s_validTransmitters[i]; + } + + s_emptySigners = new address[](0); + + s_multiOCR3 = new MultiOCR3Helper(); + } + + /// @dev returns a mock config digest with config digest computation logic similar to OCR2Base + function _getBasicConfigDigest( + uint8 F, + address[] memory signers, + address[] memory transmitters + ) internal view returns (bytes32) { + bytes memory configBytes = abi.encode(""); + uint256 configVersion = 1; + + uint256 h = uint256( + keccak256( + abi.encode( + block.chainid, address(s_multiOCR3), signers, transmitters, F, configBytes, configVersion, configBytes + ) + ) + ); + uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00 + uint256 prefix = 0x0001 << (256 - 16); // 0x000100..00 + return bytes32((prefix & prefixMask) | (h & ~prefixMask)); + } + + /// @dev returns a hash value in the same format as the h value on which the signature verified + /// in the _transmit function + function _getTestReportDigest(bytes32 configDigest) internal pure returns (bytes32) { + bytes32[3] memory reportContext = [configDigest, configDigest, configDigest]; + return keccak256(abi.encodePacked(keccak256(REPORT), reportContext)); + } + + function _assertOCRConfigEquality( + MultiOCR3Base.OCRConfig memory configA, + MultiOCR3Base.OCRConfig memory configB + ) internal pure { + vm.assertEq(configA.configInfo.configDigest, configB.configInfo.configDigest); + vm.assertEq(configA.configInfo.F, configB.configInfo.F); + vm.assertEq(configA.configInfo.n, configB.configInfo.n); + vm.assertEq(configA.configInfo.uniqueReports, configB.configInfo.uniqueReports); + vm.assertEq(configA.configInfo.isSignatureVerificationEnabled, configB.configInfo.isSignatureVerificationEnabled); + + vm.assertEq(configA.signers, configB.signers); + vm.assertEq(configA.transmitters, configB.transmitters); + } + + function _assertOCRConfigUnconfigured(MultiOCR3Base.OCRConfig memory config) internal pure { + assertEq(config.configInfo.configDigest, bytes32("")); + assertEq(config.signers.length, 0); + assertEq(config.transmitters.length, 0); + } + + function _getSignaturesForDigest( + uint256[] memory signerPrivateKeys, + bytes32 configDigest, + uint8 signatureCount + ) internal pure returns (bytes32[] memory rs, bytes32[] memory ss, uint8[] memory vs, bytes32 rawVs) { + rs = new bytes32[](signatureCount); + ss = new bytes32[](signatureCount); + vs = new uint8[](signatureCount); + + // Calculate signatures + for (uint256 i; i < signatureCount; ++i) { + (vs[i], rs[i], ss[i]) = vm.sign(signerPrivateKeys[i], _getTestReportDigest(configDigest)); + rawVs = rawVs | (bytes32(bytes1(vs[i] - 27)) >> (8 * i)); + } + + return (rs, ss, vs, rawVs); + } +} 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 02dbd38a68..ff4019d130 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol @@ -13,7 +13,7 @@ import {Client} from "../../libraries/Client.sol"; import {Internal} from "../../libraries/Internal.sol"; import {Pool} from "../../libraries/Pool.sol"; import {RateLimiter} from "../../libraries/RateLimiter.sol"; -import {OCR2Abstract} from "../../ocr/OCR2Abstract.sol"; +import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; import {EVM2EVMMultiOffRamp} from "../../offRamp/EVM2EVMMultiOffRamp.sol"; import {LockReleaseTokenPool} from "../../pools/LockReleaseTokenPool.sol"; import {TokenPool} from "../../pools/TokenPool.sol"; @@ -87,9 +87,19 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { s_offRamp = new EVM2EVMMultiOffRampHelper(staticConfig, sourceChainConfigs); - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, abi.encode(dynamicConfig), s_offchainConfigVersion, abi.encode("") - ); + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: uint8(Internal.OCRPluginType.Execution), + configDigest: s_configDigest, + F: s_F, + uniqueReports: false, + isSignatureVerificationEnabled: false, + signers: s_emptySigners, + transmitters: s_validTransmitters + }); + + s_offRamp.setDynamicConfig(dynamicConfig); + s_offRamp.setOCR3Configs(ocrConfigs); // Static config EVM2EVMMultiOffRamp.StaticConfig memory gotStaticConfig = s_offRamp.getStaticConfig(); @@ -100,9 +110,20 @@ contract EVM2EVMMultiOffRamp_constructor is EVM2EVMMultiOffRampSetup { EVM2EVMMultiOffRamp.DynamicConfig memory gotDynamicConfig = s_offRamp.getDynamicConfig(); _assertSameConfig(dynamicConfig, gotDynamicConfig); - (uint32 configCount, uint32 blockNumber,) = s_offRamp.latestConfigDetails(); - assertEq(1, configCount); - assertEq(block.number, blockNumber); + // OCR Config + MultiOCR3Base.OCRConfig memory expectedOCRConfig = MultiOCR3Base.OCRConfig({ + configInfo: MultiOCR3Base.ConfigInfo({ + configDigest: ocrConfigs[0].configDigest, + F: ocrConfigs[0].F, + n: 0, + uniqueReports: ocrConfigs[0].uniqueReports, + isSignatureVerificationEnabled: ocrConfigs[0].isSignatureVerificationEnabled + }), + signers: s_emptySigners, + transmitters: s_validTransmitters + }); + MultiOCR3Base.OCRConfig memory gotOCRConfig = s_offRamp.latestConfigDetails(uint8(Internal.OCRPluginType.Execution)); + _assertOCRConfigEquality(expectedOCRConfig, gotOCRConfig); // uint64[] memory resultSourceChainSelectors = s_offRamp.getSourceChainSelectors(); // assertEq(resultSourceChainSelectors.length, 2); @@ -151,28 +172,11 @@ contract EVM2EVMMultiOffRamp_setDynamicConfig is EVM2EVMMultiOffRampSetup { function test_SetDynamicConfig_Success() public { EVM2EVMMultiOffRamp.StaticConfig memory staticConfig = s_offRamp.getStaticConfig(); EVM2EVMMultiOffRamp.DynamicConfig memory dynamicConfig = generateDynamicMultiOffRampConfig(USER_3); - bytes memory onchainConfig = abi.encode(dynamicConfig); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ConfigSet(staticConfig, dynamicConfig); - vm.expectEmit(); - uint32 configCount = 1; - emit OCR2Abstract.ConfigSet( - uint32(block.number), - getBasicConfigDigest(address(s_offRamp), s_f, configCount, onchainConfig), - configCount + 1, - s_valid_signers, - s_valid_transmitters, - s_f, - onchainConfig, - s_offchainConfigVersion, - abi.encode("") - ); - - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, onchainConfig, s_offchainConfigVersion, abi.encode("") - ); + s_offRamp.setDynamicConfig(dynamicConfig); EVM2EVMMultiOffRamp.DynamicConfig memory newConfig = s_offRamp.getDynamicConfig(); _assertSameConfig(dynamicConfig, newConfig); @@ -182,14 +186,11 @@ contract EVM2EVMMultiOffRamp_setDynamicConfig is EVM2EVMMultiOffRampSetup { EVM2EVMMultiOffRamp.StaticConfig memory staticConfig = s_offRamp.getStaticConfig(); EVM2EVMMultiOffRamp.DynamicConfig memory dynamicConfig = generateDynamicMultiOffRampConfig(USER_3); dynamicConfig.messageValidator = address(s_messageValidator); - bytes memory onchainConfig = abi.encode(dynamicConfig); vm.expectEmit(); emit EVM2EVMMultiOffRamp.ConfigSet(staticConfig, dynamicConfig); - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, onchainConfig, s_offchainConfigVersion, abi.encode("") - ); + s_offRamp.setDynamicConfig(dynamicConfig); EVM2EVMMultiOffRamp.DynamicConfig memory newConfig = s_offRamp.getDynamicConfig(); _assertSameConfig(dynamicConfig, newConfig); @@ -201,9 +202,7 @@ contract EVM2EVMMultiOffRamp_setDynamicConfig is EVM2EVMMultiOffRampSetup { vm.expectRevert("Only callable by owner"); - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, abi.encode(dynamicConfig), s_offchainConfigVersion, abi.encode("") - ); + s_offRamp.setDynamicConfig(dynamicConfig); } function test_RouterZeroAddress_Revert() public { @@ -211,9 +210,7 @@ contract EVM2EVMMultiOffRamp_setDynamicConfig is EVM2EVMMultiOffRampSetup { vm.expectRevert(EVM2EVMMultiOffRamp.ZeroAddressNotAllowed.selector); - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, abi.encode(dynamicConfig), s_offchainConfigVersion, abi.encode("") - ); + s_offRamp.setDynamicConfig(dynamicConfig); } } @@ -1844,7 +1841,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { Internal.MessageExecutionState.SUCCESS, "" ); - s_offRamp.report(abi.encode(reports)); + s_offRamp.reportExec(abi.encode(reports)); } function test_MultipleReports_Success() public { @@ -1886,7 +1883,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { "" ); - s_offRamp.report(abi.encode(reports)); + s_offRamp.reportExec(abi.encode(reports)); } function test_LargeBatch_Success() public { @@ -1913,7 +1910,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { } } - s_offRamp.report(abi.encode(reports)); + s_offRamp.reportExec(abi.encode(reports)); } function test_MultipleReportsWithPartialValidationFailures_Success() public { @@ -1970,7 +1967,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { ) ); - s_offRamp.report(abi.encode(reports)); + s_offRamp.reportExec(abi.encode(reports)); } // Reverts @@ -1979,7 +1976,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { Internal.ExecutionReportSingleChain[] memory reports = new Internal.ExecutionReportSingleChain[](0); vm.expectRevert(EVM2EVMMultiOffRamp.EmptyReport.selector); - s_offRamp.report(abi.encode(reports)); + s_offRamp.reportExec(abi.encode(reports)); } function test_IncorrectArrayType_Revert() public { @@ -1987,7 +1984,7 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { wrongData[0] = 1; vm.expectRevert(); - s_offRamp.report(abi.encode(wrongData)); + s_offRamp.reportExec(abi.encode(wrongData)); } function test_NonArray_Revert() public { @@ -1995,8 +1992,112 @@ contract EVM2EVMMultiOffRamp_report is EVM2EVMMultiOffRampSetup { Internal.ExecutionReportSingleChain memory report = _generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); vm.expectRevert(); - s_offRamp.report(abi.encode(report)); + s_offRamp.reportExec(abi.encode(report)); + } +} + +contract EVM2EVMMultiOffRamp_transmitExec is EVM2EVMMultiOffRampSetup { + function setUp() public virtual override { + super.setUp(); + _setupMultipleOffRamps(); + } + + // Asserts that execute completes + function test_SingleReport_Success() public { + bytes32[3] memory reportContext = [s_configDigest, s_configDigest, s_configDigest]; + + Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.ExecutionReportSingleChain[] memory reports = + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); + + vm.expectEmit(); + emit EVM2EVMMultiOffRamp.ExecutionStateChanged( + SOURCE_CHAIN_SELECTOR_1, + messages[0].sequenceNumber, + messages[0].messageId, + Internal.MessageExecutionState.SUCCESS, + "" + ); + + vm.expectEmit(); + emit MultiOCR3Base.Transmitted( + uint8(Internal.OCRPluginType.Execution), s_configDigest, uint32(uint256(s_configDigest) >> 8) + ); + + vm.startPrank(s_validTransmitters[0]); + s_offRamp.transmitExec(reportContext, abi.encode(reports)); + } + + // Reverts + + function test_UnauthorizedTransmitter_Revert() public { + bytes32[3] memory reportContext = [s_configDigest, s_configDigest, s_configDigest]; + + Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.ExecutionReportSingleChain[] memory reports = + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); + + vm.expectRevert(MultiOCR3Base.UnauthorizedTransmitter.selector); + s_offRamp.transmitExec(reportContext, abi.encode(reports)); + } + + function test_NoConfig_Revert() public { + _redeployOffRampWithNoOCRConfigs(); + + bytes32[3] memory reportContext = [bytes32(""), s_configDigest, s_configDigest]; + + Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.ExecutionReportSingleChain[] memory reports = + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); + + vm.startPrank(s_validTransmitters[0]); + vm.expectRevert(MultiOCR3Base.UnauthorizedTransmitter.selector); + s_offRamp.transmitExec(reportContext, abi.encode(reports)); + } + + function test_WrongConfigWithSigners_Revert() public { + _redeployOffRampWithNoOCRConfigs(); + + s_configDigest = _getBasicConfigDigest(1, s_validSigners, s_validTransmitters); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: uint8(Internal.OCRPluginType.Execution), + configDigest: s_configDigest, + F: s_F, + uniqueReports: false, + isSignatureVerificationEnabled: true, + signers: s_validSigners, + transmitters: s_validTransmitters + }); + s_offRamp.setOCR3Configs(ocrConfigs); + + bytes32[3] memory reportContext = [s_configDigest, s_configDigest, s_configDigest]; + + Internal.EVM2EVMMessage[] memory messages = _generateBasicMessages(SOURCE_CHAIN_SELECTOR_1, ON_RAMP_ADDRESS_1); + Internal.ExecutionReportSingleChain[] memory reports = + _generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages); + + vm.startPrank(s_validTransmitters[0]); + vm.expectRevert(); + s_offRamp.transmitExec(reportContext, abi.encode(reports)); + } + + function _redeployOffRampWithNoOCRConfigs() internal { + s_offRamp = new EVM2EVMMultiOffRampHelper( + EVM2EVMMultiOffRamp.StaticConfig({ + commitStore: address(s_mockCommitStore), + chainSelector: DEST_CHAIN_SELECTOR, + rmnProxy: address(s_mockRMN) + }), + new EVM2EVMMultiOffRamp.SourceChainConfigArgs[](0) + ); + + s_offRamp.setDynamicConfig(generateDynamicMultiOffRampConfig(address(s_destRouter))); + _setupMultipleOffRamps(); } + + // TODO: add revert test when transmitting with Commit transmitter instead of Exec transmitter } contract EVM2EVMMultiOffRamp_getExecutionState 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 9edbf1831c..4824011270 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol @@ -2,13 +2,16 @@ pragma solidity 0.8.24; import {IAny2EVMMessageReceiver} from "../../interfaces/IAny2EVMMessageReceiver.sol"; + +import {IAny2EVMOffRamp} from "../../interfaces/IAny2EVMOffRamp.sol"; import {ICommitStore} from "../../interfaces/ICommitStore.sol"; import {IMultiCommitStore} from "../../interfaces/IMultiCommitStore.sol"; import {Router} from "../../Router.sol"; -import {IAny2EVMOffRamp} from "../../interfaces/IAny2EVMOffRamp.sol"; import {Client} from "../../libraries/Client.sol"; import {Internal} from "../../libraries/Internal.sol"; + +import {MultiOCR3Base} from "../../ocr/MultiOCR3Base.sol"; import {EVM2EVMMultiOffRamp} from "../../offRamp/EVM2EVMMultiOffRamp.sol"; import {EVM2EVMOffRamp} from "../../offRamp/EVM2EVMOffRamp.sol"; import {LockReleaseTokenPool} from "../../pools/LockReleaseTokenPool.sol"; @@ -22,12 +25,12 @@ import {MessageInterceptorHelper} from "../helpers/MessageInterceptorHelper.sol" import {MaybeRevertMessageReceiver} from "../helpers/receivers/MaybeRevertMessageReceiver.sol"; import {MockCommitStore} from "../mocks/MockCommitStore.sol"; import {MockMultiCommitStore} from "../mocks/MockMultiCommitStore.sol"; -import {OCR2BaseSetup} from "../ocr/OCR2Base.t.sol"; +import {MultiOCR3BaseSetup} from "../ocr/MultiOCR3BaseSetup.t.sol"; import {PriceRegistrySetup} from "../priceRegistry/PriceRegistry.t.sol"; import {IERC20} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; -contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup { +contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3BaseSetup { uint64 internal constant SOURCE_CHAIN_SELECTOR_1 = SOURCE_CHAIN_SELECTOR; uint64 internal constant SOURCE_CHAIN_SELECTOR_2 = 6433500567565415381; uint64 internal constant SOURCE_CHAIN_SELECTOR_3 = 4051577828743386545; @@ -47,10 +50,15 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSet MessageInterceptorHelper internal s_messageValidator; address internal s_sourceTokenPool = makeAddr("sourceTokenPool"); - function setUp() public virtual override(TokenSetup, PriceRegistrySetup, OCR2BaseSetup) { + bytes32 internal s_configDigest; + // Used for single-lane offramp + uint64 internal constant s_offchainConfigVersion = 3; + uint8 internal constant s_F = 1; + + function setUp() public virtual override(TokenSetup, PriceRegistrySetup, MultiOCR3BaseSetup) { TokenSetup.setUp(); PriceRegistrySetup.setUp(); - OCR2BaseSetup.setUp(); + MultiOCR3BaseSetup.setUp(); s_messageValidator = new MessageInterceptorHelper(); s_mockCommitStore = new MockMultiCommitStore(); @@ -75,14 +83,22 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSet }), sourceChainConfigs ); - s_offRamp.setOCR2Config( - s_valid_signers, - s_valid_transmitters, - s_f, - abi.encode(generateDynamicMultiOffRampConfig(address(router))), - s_offchainConfigVersion, - abi.encode("") - ); + + s_configDigest = _getBasicConfigDigest(1, s_emptySigners, s_validTransmitters); + + MultiOCR3Base.OCRConfigArgs[] memory ocrConfigs = new MultiOCR3Base.OCRConfigArgs[](1); + ocrConfigs[0] = MultiOCR3Base.OCRConfigArgs({ + ocrPluginType: uint8(Internal.OCRPluginType.Execution), + configDigest: s_configDigest, + F: s_F, + uniqueReports: false, + isSignatureVerificationEnabled: false, + signers: s_emptySigners, + transmitters: s_validTransmitters + }); + + s_offRamp.setDynamicConfig(generateDynamicMultiOffRampConfig(address(router))); + s_offRamp.setOCR3Configs(ocrConfigs); } // TODO: function can be made common across OffRampSetup and MultiOffRampSetup @@ -105,9 +121,9 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSet getInboundRateLimiterConfig() ); offRamp.setOCR2Config( - s_valid_signers, - s_valid_transmitters, - s_f, + s_validSigners, + s_validTransmitters, + s_F, abi.encode(generateDynamicOffRampConfig(address(router), address(s_priceRegistry))), s_offchainConfigVersion, abi.encode("") @@ -429,9 +445,6 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSet function _enableMessageValidator() internal { EVM2EVMMultiOffRamp.DynamicConfig memory dynamicConfig = s_offRamp.getDynamicConfig(); dynamicConfig.messageValidator = address(s_messageValidator); - bytes memory onchainConfig = abi.encode(dynamicConfig); - s_offRamp.setOCR2Config( - s_valid_signers, s_valid_transmitters, s_f, onchainConfig, s_offchainConfigVersion, abi.encode("") - ); + s_offRamp.setDynamicConfig(dynamicConfig); } } 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 b0d82ea32a..08dcfe87d6 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 @@ -97,9 +97,33 @@ type InternalExecutionReportSingleChain struct { ProofFlagBits *big.Int } +type MultiOCR3BaseConfigInfo struct { + ConfigDigest [32]byte + F uint8 + N uint8 + UniqueReports bool + IsSignatureVerificationEnabled bool +} + +type MultiOCR3BaseOCRConfig struct { + ConfigInfo MultiOCR3BaseConfigInfo + Signers []common.Address + Transmitters []common.Address +} + +type MultiOCR3BaseOCRConfigArgs struct { + ConfigDigest [32]byte + OcrPluginType uint8 + F uint8 + UniqueReports bool + IsSignatureVerificationEnabled bool + Signers []common.Address + Transmitters []common.Address +} + var EVM2EVMMultiOffRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"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\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"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\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"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\":\"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\":\"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\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"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\":[{\"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\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"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\":[{\"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\":\"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\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"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\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005e8838038062005e88833981016040819052620000359162000678565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf816200012c565b5050466080525081516001600160a01b0316620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160a01b0390811660a05260208301516001600160401b031660c05260408301511660e0526200012481620001d7565b505062000850565b336001600160a01b03821603620001865760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b81518110156200053a576000828281518110620001fb57620001fb620007e3565b60200260200101519050600081600001519050806001600160401b0316600003620002455760405163c39a620560e01b81526001600160401b038216600482015260240162000083565b60608201516001600160a01b031662000271576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260096020526040902060018101546001600160a01b0316620004395760a0516040516374eb454760e11b81526001600160401b03841660048201526000916001600160a01b03169063e9d68a8e90602401606060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003159190620007f9565b905083606001516001600160a01b031681604001516001600160a01b03161415806200034d575060208101516001600160401b031615155b15620003785760405163c39a620560e01b81526001600160401b038416600482015260240162000083565b620003af8385606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36200053e60201b60201c565b600283015560608401516001830180546001600160a01b0319166001600160a01b039283161790556040808601518454610100600160a81b0319166101009190931602919091178355516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a150620004a0565b606083015160018201546001600160a01b0390811691161415806200047557506040830151815461010090046001600160a01b03908116911614155b15620004a05760405163c39a620560e01b81526001600160401b038316600482015260240162000083565b6020830151815490151560ff199091161781556040516001600160401b038316907fdba8597411dc0624375cfff476f6173674609571f4d98d294dd3a47af07927849062000523908490815460ff81161515825260081c6001600160a01b0390811660208301526001830154166040820152600290910154606082015260800190565b60405180910390a2505050806001019050620001da565b5050565b60c05160408051602081018490526001600160401b0380871692820192909252911660608201526001600160a01b038316608082015260009060a0016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005d457620005d462000599565b60405290565b604051608081016001600160401b0381118282101715620005d457620005d462000599565b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a62000599565b604052919050565b80516001600160a01b03811681146200064a57600080fd5b919050565b80516001600160401b03811681146200064a57600080fd5b805180151581146200064a57600080fd5b6000808284036080808212156200068e57600080fd5b6060808312156200069e57600080fd5b620006a8620005af565b9250620006b58662000632565b83526020620006c68188016200064f565b818501526040620006da6040890162000632565b604086015260608801519496506001600160401b0380861115620006fd57600080fd5b858901955089601f8701126200071257600080fd5b85518181111562000727576200072762000599565b62000737848260051b01620005ff565b818152848101925060079190911b87018401908b8211156200075857600080fd5b968401965b81881015620007d15786888d031215620007775760008081fd5b62000781620005da565b6200078c896200064f565b81526200079b868a0162000667565b86820152620007ac858a0162000632565b85820152620007bd878a0162000632565b81880152835296860196918401916200075d565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6000606082840312156200080c57600080fd5b62000816620005af565b620008218362000667565b815262000831602084016200064f565b6020820152620008446040840162000632565b60408201529392505050565b60805160a05160c05160e0516155b8620008d0600039600081816101d4015281816117ef01526126380152600081816101a4015281816117c9015261307e0152600081816101680152818161179b01528181611ad3015261292d015260008181610a7901528181610ac501528181610f1e0152610f6a01526155b86000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806381ff7048116100b2578063afcb95d711610081578063e9d68a8e11610066578063e9d68a8e146104b0578063f2fde38b146105a2578063f52121a5146105b557600080fd5b8063afcb95d71461047d578063b1dc65a41461049d57600080fd5b806381ff7048146103eb57806385572ffb1461041b5780638b364334146104295780638da5cb5b1461045557600080fd5b80635e36480c116101095780637437ff9f116100ee5780637437ff9f146102cd57806379ba5097146103d05780637f63b711146103d857600080fd5b80635e36480c14610298578063666cab8d146102b857600080fd5b806306285c691461013b578063181f5a77146102275780631ef3817414610270578063542625af14610285575b600080fd5b610211604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161021e9190613b55565b60405180910390f35b6102636040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b60405161021e9190613bea565b61028361027e366004613eaf565b6105c8565b005b610283610293366004614457565b610a76565b6102ab6102a6366004614582565b610c9e565b60405161021e9190614625565b6102c0610d32565b60405161021e9190614685565b6103c36040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e08101825260075463ffffffff808216835264010000000082048116602084015261ffff680100000000000000008304169383019390935273ffffffffffffffffffffffffffffffffffffffff6a0100000000000000000000909104811660608301526008549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b60405161021e9190614698565b610283610da1565b6102836103e6366004614713565b610e9e565b6004546002546040805163ffffffff8085168252640100000000909404909316602084015282015260600161021e565b6102836101363660046147f7565b61043c610437366004614832565b610eb2565b60405167ffffffffffffffff909116815260200161021e565b60005460405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021e565b60408051600181526000602082018190529181019190915260600161021e565b6102836104ab3660046148a5565b610ec8565b6105526104be36600461498a565b6040805160808101825260008082526020820181905291810182905260608101919091525067ffffffffffffffff166000908152600960209081526040918290208251608081018452815460ff81161515825273ffffffffffffffffffffffffffffffffffffffff610100909104811693820193909352600182015490921692820192909252600290910154606082015290565b6040805182511515815260208084015173ffffffffffffffffffffffffffffffffffffffff908116918301919091528383015116918101919091526060918201519181019190915260800161021e565b6102836105b03660046149a7565b611159565b6102836105c33660046149c4565b61116a565b84518460ff16601f82111561063e576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f6f206d616e79207472616e736d697474657273000000000000000000000060448201526064015b60405180910390fd5b806000036106a8576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f66206d75737420626520706f73697469766500000000000000000000000000006044820152606401610635565b6106b0611525565b6106b9856115a8565b60065460005b8181101561073d5760056000600683815481106106de576106de614a28565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690556001016106bf565b50875160005b818110156109335760008a828151811061075f5761075f614a28565b602002602001015190506000600281111561077c5761077c6145bb565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260056020526040902054610100900460ff1660028111156107bb576107bb6145bb565b14610822576040517f89a6198900000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265706561746564207472616e736d69747465722061646472657373000000006044820152606401610635565b73ffffffffffffffffffffffffffffffffffffffff811661086f576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff83168152602081016002905273ffffffffffffffffffffffffffffffffffffffff821660009081526005602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561091f5761091f6145bb565b021790555090505050806001019050610743565b5088516109479060069060208c0190613abf565b506003805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908b1617179055600480546109cd91469130919060009061099f9063ffffffff16614a86565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168d8d8d8d8d8d61184f565b600260000181905550600060048054906101000a900463ffffffff169050436004806101000a81548163ffffffff021916908363ffffffff1602179055507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0581600260000154600460009054906101000a900463ffffffff168e8e8e8e8e8e604051610a6199989796959493929190614aa9565b60405180910390a15050505050505050505050565b467f000000000000000000000000000000000000000000000000000000000000000014610b01576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff46166024820152604401610635565b815181518114610b3d576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610c8e576000848281518110610b5c57610b5c614a28565b60200260200101519050600081602001515190506000858481518110610b8457610b84614a28565b6020026020010151905080518214610bc8576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610c7f576000828281518110610be757610be7614a28565b6020026020010151905080600014158015610c22575084602001518281518110610c1357610c13614a28565b60200260200101516080015181105b15610c765784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810183905260448101829052606401610635565b50600101610bcb565b50505050806001019050610b40565b50610c9983836118dc565b505050565b6000610cac60016004614b3f565b6002610cb9608085614b81565b67ffffffffffffffff16610ccd9190614ba8565b67ffffffffffffffff85166000908152600b6020526040812090610cf2608087614bbf565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c166003811115610d2957610d296145bb565b90505b92915050565b60606006805480602002602001604051908101604052809291908181526020018280548015610d9757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d6c575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610635565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ea6611525565b610eaf8161198c565b50565b600080610ebf8484611e3d565b50949350505050565b610ed28787611f6d565b600254883590808214610f1b576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610635565b467f000000000000000000000000000000000000000000000000000000000000000014610f9c576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610635565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526005602090815260408083208151808301909252805460ff80821684529293919291840191610100909104166002811115611024576110246145bb565b6002811115611035576110356145bb565b9052509050600281602001516002811115611052576110526145bb565b14801561109957506006816000015160ff168154811061107457611074614a28565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b6110cf576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006110dd856020614ba8565b6110e8886020614ba8565b6110f48b610144614be6565b6110fe9190614be6565b6111089190614be6565b905036811461114c576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610635565b5050505050505050505050565b611161611525565b610eaf81611fb4565b3330146111a3576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600080825260208201909252816111e0565b60408051808201909152600080825260208201528152602001906001900390816111b95790505b50610140840151519091501561127b576101408301516040805160608101909152602085015173ffffffffffffffffffffffffffffffffffffffff16608082015261127891908060a0810160408051601f19818403018152918152908252875167ffffffffffffffff1660208301528781015173ffffffffffffffffffffffffffffffffffffffff16910152610160860151856120a9565b90505b60006112878483612532565b60085490915073ffffffffffffffffffffffffffffffffffffffff16801561138e576040517fa219f6e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063a219f6e5906112fb908590600401614cba565b600060405180830381600087803b15801561131557600080fd5b505af1925050508015611326575060015b61138e573d808015611354576040519150601f19603f3d011682016040523d82523d6000602084013e611359565b606091505b50806040517f09c253250000000000000000000000000000000000000000000000000000000081526004016106359190613bea565b610120850151511580156113a457506080850151155b806113c85750604085015173ffffffffffffffffffffffffffffffffffffffff163b155b80611415575060408501516114139073ffffffffffffffffffffffffffffffffffffffff167f85572ffb000000000000000000000000000000000000000000000000000000006125e2565b155b15611421575050505050565b600754608086015160408088015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009384936a010000000000000000000090910473ffffffffffffffffffffffffffffffffffffffff1692633cf979839261149792899261138892600401614ccd565b6000604051808303816000875af11580156114b6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114de9190810190614d5b565b50915091508161151c57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106359190613bea565b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610635565b565b6000818060200190518101906115be9190614dd4565b606081015190915073ffffffffffffffffffffffffffffffffffffffff16611612576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516007805460208085015160408087015160608089015173ffffffffffffffffffffffffffffffffffffffff9081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a179790971798909816959095171790945560808601516008805460a089015160c08a015185167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9190951674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909216938916939093171791909116919091179055825191820183527f00000000000000000000000000000000000000000000000000000000000000008416825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908201527f000000000000000000000000000000000000000000000000000000000000000090921682820152517f59aba10dfd156b1e651f995db6fac7668309035e93bf51547611501a6b08ad4191611843918490614e6f565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a60405160200161187399989796959493929190614f2f565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b8151600003611916576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b84518110156119855761197d85828151811061194b5761194b614a28565b6020026020010151846119775785838151811061196a5761196a614a28565b60200260200101516125fe565b836125fe565b60010161192d565b5050505050565b60005b8151811015611e395760008282815181106119ac576119ac614a28565b602002602001015190506000816000015190508067ffffffffffffffff16600003611a0f576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610635565b606082015173ffffffffffffffffffffffffffffffffffffffff16611a60576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600960205260409020600181015473ffffffffffffffffffffffffffffffffffffffff16611cdd576040517fe9d68a8e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e9d68a8e90602401606060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b539190614fc4565b9050836060015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff16141580611ba55750602081015167ffffffffffffffff1615155b15611be8576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610635565b611c178385606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3613078565b600283015560608401516001830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560408086015184547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010091909316029190911783555167ffffffffffffffff841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a150611d75565b6060830151600182015473ffffffffffffffffffffffffffffffffffffffff9081169116141580611d32575060408301518154610100900473ffffffffffffffffffffffffffffffffffffffff908116911614155b15611d75576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610635565b602083015181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911617815560405167ffffffffffffffff8316907fdba8597411dc0624375cfff476f6173674609571f4d98d294dd3a47af079278490611e23908490815460ff81161515825260081c73ffffffffffffffffffffffffffffffffffffffff90811660208301526001830154166040820152600290910154606082015260800190565b60405180910390a250505080600101905061198f565b5050565b67ffffffffffffffff8083166000908152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120549091829116808203611f5f5767ffffffffffffffff8516600090815260096020526040902054610100900473ffffffffffffffffffffffffffffffffffffffff168015611f5d576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015282169063856c824790602401602060405180830381865afa158015611f2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f509190615018565b6001935093505050611f66565b505b9150600090505b9250929050565b6000611f7b82840184615035565b60408051600080825260208201909252919250610c99918391611fae565b6060815260200190600190039081611f995790505b506118dc565b3373ffffffffffffffffffffffffffffffffffffffff821603612033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610635565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8360005b8551811015610ebf5760008482815181106120ca576120ca614a28565b60200260200101518060200190518101906120e5919061506a565b905060006120f68260200151613108565b905061213873ffffffffffffffffffffffffffffffffffffffff82167faff2afbf000000000000000000000000000000000000000000000000000000006125e2565b612186576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610635565b6000806122ce634059f55b60e01b6040518060e001604052808c6000015181526020018c6020015167ffffffffffffffff1681526020018c6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018d89815181106121ef576121ef614a28565b602002602001015160200151815260200187600001518152602001876040015181526020018a898151811061222657612226614a28565b6020026020010151815250604051602401612241919061511f565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600854859063ffffffff74010000000000000000000000000000000000000000909104166113886084613163565b50915091508161230c57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106359190613bea565b8051604014612356578051604080517f78ef802400000000000000000000000000000000000000000000000000000000815260048101919091526024810191909152604401610635565b6000808280602001905181019061236d91906151db565b91509150600061237c83613289565b60408d810151815173ffffffffffffffffffffffffffffffffffffffff909116602482015260448082018690528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260085491925061243b9183907801000000000000000000000000000000000000000000000000900463ffffffff166113886084613163565b50909550935084158061246b57506000845111801561246b57508380602001905181019061246991906151ff565b155b156124a457836040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106359190613bea565b808989815181106124b7576124b7614a28565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508189898151811061250857612508614a28565b60200260200101516020018181525050505050505050508060010190506120ad565b949350505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff16815260200184602001516040516020016125b7919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006125ed83613302565b8015610d295750610d298383613366565b81516040517f58babe3300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906358babe3390602401602060405180830381865afa158015612694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b891906151ff565b156126fb576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610635565b602083015151600081900361273b576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360400151518114612779576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600960205260409020805460ff166127d9576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610635565b60008267ffffffffffffffff8111156127f4576127f4613bfd565b60405190808252806020026020018201604052801561281d578160200160208202803683370190505b50905060005b838110156128e25760008760200151828151811061284357612843614a28565b6020026020010151905061285b818560020154613435565b83838151811061286d5761286d614a28565b60200260200101818152505080610180015183838151811061289157612891614a28565b6020026020010151146128d9578061018001516040517f345039be00000000000000000000000000000000000000000000000000000000815260040161063591815260200190565b50600101612823565b50606086015160808701516040517ffe41448f00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263fe41448f92612964928a92889260040161524d565b602060405180830381865afa158015612981573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a59190615294565b9050806000036129ed576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610635565b8551151560005b8581101561306d57600089602001518281518110612a1457612a14614a28565b602002602001015190506000612a2e898360600151610c9e565b90506002816003811115612a4457612a446145bb565b03612a9a5760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a15050613065565b6000816003811115612aae57612aae6145bb565b1480612acb57506003816003811115612ac957612ac96145bb565b145b612b1b5760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610635565b8315612be45760075460009063ffffffff16612b378742614b3f565b1190508080612b5757506003826003811115612b5557612b556145bb565b145b612b99576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b166004820152602401610635565b8a8481518110612bab57612bab614a28565b6020026020010151600014612bde578a8481518110612bcc57612bcc614a28565b60200260200101518360800181815250505b50612c49565b6000816003811115612bf857612bf86145bb565b14612c495760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610635565b600080612c5a8b8560200151611e3d565b915091508015612d7a5760c084015167ffffffffffffffff16612c7e8360016152ad565b67ffffffffffffffff1614612d0e5760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612cfd928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60405180910390a150505050613065565b67ffffffffffffffff8b81166000908152600a602090815260408083208883015173ffffffffffffffffffffffffffffffffffffffff168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169184169190911790555b6000836003811115612d8e57612d8e6145bb565b03612e2c5760c084015167ffffffffffffffff16612dad8360016152ad565b67ffffffffffffffff1614612e2c5760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612cfd928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60008d604001518681518110612e4457612e44614a28565b60200260200101519050612e728561018001518d87606001518861014001515189610120015151865161359d565b612e828c866060015160016136bd565b600080612e8f878461379b565b91509150612ea28e8860600151846136bd565b888015612ec057506003826003811115612ebe57612ebe6145bb565b145b15612f0057866101800151816040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016106359291906152d5565b6003826003811115612f1457612f146145bb565b14158015612f3457506002826003811115612f3157612f316145bb565b14155b15612f75578d8760600151836040517f926c5a3e000000000000000000000000000000000000000000000000000000008152600401610635939291906152ee565b6000866003811115612f8957612f896145bb565b036130045767ffffffffffffffff808f166000908152600a602090815260408083208b83015173ffffffffffffffffffffffffffffffffffffffff168452909152812080549092169190612fdc83615314565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df28585604051613055929190615331565b60405180910390a4505050505050505b6001016129f4565b505050505050505050565b600081847f0000000000000000000000000000000000000000000000000000000000000000856040516020016130e8949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b6000815160201461314757816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106359190613bea565b610d2c8280602001905181019061315e9190615294565b613289565b6000606060008361ffff1667ffffffffffffffff81111561318657613186613bfd565b6040519080825280601f01601f1916602001820160405280156131b0576020820181803683370190505b509150863b6131e3577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613216577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b859003604081048103871061324f577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156132725750835b808352806000602085013e50955095509592505050565b600073ffffffffffffffffffffffffffffffffffffffff8211806132ad5750600a82105b156132fe5760408051602081018490520160408051601f19818403018152908290527f8d666f6000000000000000000000000000000000000000000000000000000000825261063591600401613bea565b5090565b600061332e827f01ffc9a700000000000000000000000000000000000000000000000000000000613366565b8015610d2c575061335f827fffffffff00000000000000000000000000000000000000000000000000000000613366565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561341e575060208210155b801561342a5750600081115b979650505050505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016134d898979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016135119190615351565b6040516020818303038152906040528051906020012087610160015160405160200161353d91906153be565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60075468010000000000000000900461ffff168311156135fd576040517fa1e5205a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610635565b80831461364a576040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610635565b600754640100000000900463ffffffff168211156136b5576007546040517f1fd8fd040000000000000000000000000000000000000000000000000000000081526004810188905264010000000090910463ffffffff16602482015260448101839052606401610635565b505050505050565b600060026136cc608085614b81565b67ffffffffffffffff166136e09190614ba8565b67ffffffffffffffff85166000908152600b602052604081209192509081613709608087614bbf565b67ffffffffffffffff16815260208101919091526040016000205490508161373360016004614b3f565b901b19168183600381111561374a5761374a6145bb565b67ffffffffffffffff87166000908152600b602052604081209190921b92909217918291613779608088614bbf565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a5906137df90879087906004016153d1565b600060405180830381600087803b1580156137f957600080fd5b505af192505050801561380a575060015b613aa4573d808015613838576040519150601f19603f3d011682016040523d82523d6000602084013e61383d565b606091505b5060006138498261555b565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821614806138dc57507fe1cd5509000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061392857507f8d666f60000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061397457507f78ef8024000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b806139c057507f0c3b563c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80613a0c57507fae9b4ce9000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80613a5857507f09c25325000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b15613a695750600392509050611f66565b856101800151826040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016106359291906152d5565b50506040805160208101909152600081526002909250929050565b828054828255906000526020600020908101928215613b39579160200282015b82811115613b3957825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613adf565b506132fe9291505b808211156132fe5760008155600101613b41565b60608101610d2c8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015167ffffffffffffffff169084015260409182015116910152565b60005b83811015613bb5578181015183820152602001613b9d565b50506000910152565b60008151808452613bd6816020860160208601613b9a565b601f01601f19169290920160200192915050565b602081526000610d296020830184613bbe565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b60405290565b6040516101a0810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b60405160a0810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b6040516080810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b60405160e0810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b6040516060810167ffffffffffffffff81118282101715613c4f57613c4f613bfd565b604051601f8201601f1916810167ffffffffffffffff81118282101715613d2e57613d2e613bfd565b604052919050565b600067ffffffffffffffff821115613d5057613d50613bfd565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81168114610eaf57600080fd5b8035613d8781613d5a565b919050565b600082601f830112613d9d57600080fd5b81356020613db2613dad83613d36565b613d05565b8083825260208201915060208460051b870101935086841115613dd457600080fd5b602086015b84811015613df9578035613dec81613d5a565b8352918301918301613dd9565b509695505050505050565b803560ff81168114613d8757600080fd5b600067ffffffffffffffff821115613e2f57613e2f613bfd565b50601f01601f191660200190565b600082601f830112613e4e57600080fd5b8135613e5c613dad82613e15565b818152846020838601011115613e7157600080fd5b816020850160208301376000918101602001919091529392505050565b67ffffffffffffffff81168114610eaf57600080fd5b8035613d8781613e8e565b60008060008060008060c08789031215613ec857600080fd5b863567ffffffffffffffff80821115613ee057600080fd5b613eec8a838b01613d8c565b97506020890135915080821115613f0257600080fd5b613f0e8a838b01613d8c565b9650613f1c60408a01613e04565b95506060890135915080821115613f3257600080fd5b613f3e8a838b01613e3d565b9450613f4c60808a01613ea4565b935060a0890135915080821115613f6257600080fd5b50613f6f89828a01613e3d565b9150509295509295509295565b8015158114610eaf57600080fd5b8035613d8781613f7c565b600082601f830112613fa657600080fd5b81356020613fb6613dad83613d36565b82815260069290921b84018101918181019086841115613fd557600080fd5b8286015b84811015613df95760408189031215613ff25760008081fd5b613ffa613c2c565b813561400581613d5a565b81528185013585820152835291830191604001613fd9565b600082601f83011261402e57600080fd5b8135602061403e613dad83613d36565b82815260059290921b8401810191818101908684111561405d57600080fd5b8286015b84811015613df957803567ffffffffffffffff8111156140815760008081fd5b61408f8986838b0101613e3d565b845250918301918301614061565b60006101a082840312156140b057600080fd5b6140b8613c55565b90506140c382613ea4565b81526140d160208301613d7c565b60208201526140e260408301613d7c565b60408201526140f360608301613ea4565b60608201526080820135608082015261410e60a08301613f8a565b60a082015261411f60c08301613ea4565b60c082015261413060e08301613d7c565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561415d57600080fd5b61416986838701613e3d565b8385015261014092508285013591508082111561418557600080fd5b61419186838701613f95565b838501526101609250828501359150808211156141ad57600080fd5b506141ba8582860161401d565b82840152505061018080830135818301525092915050565b600082601f8301126141e357600080fd5b813560206141f3613dad83613d36565b82815260059290921b8401810191818101908684111561421257600080fd5b8286015b84811015613df957803567ffffffffffffffff8111156142365760008081fd5b6142448986838b010161409d565b845250918301918301614216565b600082601f83011261426357600080fd5b81356020614273613dad83613d36565b82815260059290921b8401810191818101908684111561429257600080fd5b8286015b84811015613df957803567ffffffffffffffff8111156142b65760008081fd5b6142c48986838b010161401d565b845250918301918301614296565b600082601f8301126142e357600080fd5b813560206142f3613dad83613d36565b8083825260208201915060208460051b87010193508684111561431557600080fd5b602086015b84811015613df9578035835291830191830161431a565b600082601f83011261434257600080fd5b81356020614352613dad83613d36565b82815260059290921b8401810191818101908684111561437157600080fd5b8286015b84811015613df957803567ffffffffffffffff808211156143965760008081fd5b818901915060a080601f19848d030112156143b15760008081fd5b6143b9613c79565b6143c4888501613ea4565b8152604080850135848111156143da5760008081fd5b6143e88e8b838901016141d2565b8a84015250606080860135858111156144015760008081fd5b61440f8f8c838a0101614252565b838501525060809150818601358581111561442a5760008081fd5b6144388f8c838a01016142d2565b9184019190915250919093013590830152508352918301918301614375565b600080604080848603121561446b57600080fd5b833567ffffffffffffffff8082111561448357600080fd5b61448f87838801614331565b94506020915081860135818111156144a657600080fd5b8601601f810188136144b757600080fd5b80356144c5613dad82613d36565b81815260059190911b8201840190848101908a8311156144e457600080fd5b8584015b83811015614570578035868111156145005760008081fd5b8501603f81018d136145125760008081fd5b87810135614522613dad82613d36565b81815260059190911b82018a0190898101908f8311156145425760008081fd5b928b01925b828410156145605783358252928a0192908a0190614547565b86525050509186019186016144e8565b50809750505050505050509250929050565b6000806040838503121561459557600080fd5b82356145a081613e8e565b915060208301356145b081613e8e565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614621577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b60208101610d2c82846145ea565b60008151808452602080850194506020840160005b8381101561467a57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614648565b509495945050505050565b602081526000610d296020830184614633565b60e08101610d2c828463ffffffff80825116835280602083015116602084015261ffff6040830151166040840152606082015173ffffffffffffffffffffffffffffffffffffffff808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b6000602080838503121561472657600080fd5b823567ffffffffffffffff81111561473d57600080fd5b8301601f8101851361474e57600080fd5b803561475c613dad82613d36565b81815260079190911b8201830190838101908783111561477b57600080fd5b928401925b8284101561342a57608084890312156147995760008081fd5b6147a1613c9c565b84356147ac81613e8e565b8152848601356147bb81613f7c565b818701526040858101356147ce81613d5a565b908201526060858101356147e181613d5a565b9082015282526080939093019290840190614780565b60006020828403121561480957600080fd5b813567ffffffffffffffff81111561482057600080fd5b820160a0818503121561310157600080fd5b6000806040838503121561484557600080fd5b823561485081613e8e565b915060208301356145b081613d5a565b60008083601f84011261487257600080fd5b50813567ffffffffffffffff81111561488a57600080fd5b6020830191508360208260051b8501011115611f6657600080fd5b60008060008060008060008060e0898b0312156148c157600080fd5b606089018a8111156148d257600080fd5b8998503567ffffffffffffffff808211156148ec57600080fd5b818b0191508b601f83011261490057600080fd5b81358181111561490f57600080fd5b8c602082850101111561492157600080fd5b6020830199508098505060808b013591508082111561493f57600080fd5b61494b8c838d01614860565b909750955060a08b013591508082111561496457600080fd5b506149718b828c01614860565b999c989b50969995989497949560c00135949350505050565b60006020828403121561499c57600080fd5b813561310181613e8e565b6000602082840312156149b957600080fd5b813561310181613d5a565b600080604083850312156149d757600080fd5b823567ffffffffffffffff808211156149ef57600080fd5b6149fb8683870161409d565b93506020850135915080821115614a1157600080fd5b50614a1e8582860161401d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103614a9f57614a9f614a57565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614ad98184018a614633565b90508281036080840152614aed8189614633565b905060ff871660a084015282810360c0840152614b0a8187613bbe565b905067ffffffffffffffff851660e0840152828103610100840152614b2f8185613bbe565b9c9b505050505050505050505050565b81810381811115610d2c57610d2c614a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614b9c57614b9c614b52565b92169190910692915050565b8082028115828204841417610d2c57610d2c614a57565b600067ffffffffffffffff80841680614bda57614bda614b52565b92169190910492915050565b80820180821115610d2c57610d2c614a57565b60008151808452602080850194506020840160005b8381101561467a578151805173ffffffffffffffffffffffffffffffffffffffff1688528301518388015260409096019590820190600101614c0e565b8051825267ffffffffffffffff60208201511660208301526000604082015160a06040850152614c7e60a0850182613bbe565b905060608301518482036060860152614c978282613bbe565b91505060808301518482036080860152614cb18282614bf9565b95945050505050565b602081526000610d296020830184614c4b565b608081526000614ce06080830187614c4b565b61ffff95909516602083015250604081019290925273ffffffffffffffffffffffffffffffffffffffff16606090910152919050565b600082601f830112614d2757600080fd5b8151614d35613dad82613e15565b818152846020838601011115614d4a57600080fd5b61252a826020830160208701613b9a565b600080600060608486031215614d7057600080fd5b8351614d7b81613f7c565b602085015190935067ffffffffffffffff811115614d9857600080fd5b614da486828701614d16565b925050604084015190509250925092565b805163ffffffff81168114613d8757600080fd5b8051613d8781613d5a565b600060e08284031215614de657600080fd5b614dee613cbf565b614df783614db5565b8152614e0560208401614db5565b6020820152604083015161ffff81168114614e1f57600080fd5b6040820152614e3060608401614dc9565b6060820152614e4160808401614dc9565b6080820152614e5260a08401614db5565b60a0820152614e6360c08401614db5565b60c08201529392505050565b6101408101614eb58285805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015167ffffffffffffffff169084015260409182015116910152565b613101606083018463ffffffff80825116835280602083015116602084015261ffff6040830151166040840152606082015173ffffffffffffffffffffffffffffffffffffffff808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152614f768285018b614633565b91508382036080850152614f8a828a614633565b915060ff881660a085015283820360c0850152614fa78288613bbe565b90861660e08501528381036101008501529050614b2f8185613bbe565b600060608284031215614fd657600080fd5b614fde613ce2565b8251614fe981613f7c565b81526020830151614ff981613e8e565b6020820152604083015161500c81613d5a565b60408201529392505050565b60006020828403121561502a57600080fd5b815161310181613e8e565b60006020828403121561504757600080fd5b813567ffffffffffffffff81111561505e57600080fd5b61252a84828501614331565b60006020828403121561507c57600080fd5b815167ffffffffffffffff8082111561509457600080fd5b90830190606082860312156150a857600080fd5b6150b0613ce2565b8251828111156150bf57600080fd5b6150cb87828601614d16565b8252506020830151828111156150e057600080fd5b6150ec87828601614d16565b60208301525060408301518281111561510457600080fd5b61511087828601614d16565b60408301525095945050505050565b602081526000825160e0602084015261513c610100840182613bbe565b905067ffffffffffffffff60208501511660408401526040840151615179606085018273ffffffffffffffffffffffffffffffffffffffff169052565b50606084015160808401526080840151601f19808584030160a08601526151a08383613bbe565b925060a08601519150808584030160c08601526151bd8383613bbe565b925060c08601519150808584030160e086015250614cb18282613bbe565b600080604083850312156151ee57600080fd5b505080516020909101519092909150565b60006020828403121561521157600080fd5b815161310181613f7c565b60008151808452602080850194506020840160005b8381101561467a57815187529582019590820190600101615231565b67ffffffffffffffff85168152608060208201526000615270608083018661521c565b8281036040840152615282818661521c565b91505082606083015295945050505050565b6000602082840312156152a657600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156152ce576152ce614a57565b5092915050565b82815260406020820152600061252a6040830184613bbe565b67ffffffffffffffff8481168252831660208201526060810161252a60408301846145ea565b600067ffffffffffffffff808316818103614a9f57614a9f614a57565b61533b81846145ea565b60406020820152600061252a6040830184613bbe565b602081526000610d296020830184614bf9565b60008282518085526020808601955060208260051b8401016020860160005b848110156153b157601f1986840301895261539f838351613bbe565b98840198925090830190600101615383565b5090979650505050505050565b602081526000610d296020830184615364565b604081526153ec60408201845167ffffffffffffffff169052565b60006020840151615415606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006154838185018367ffffffffffffffff169052565b60e086015191506101206154ae8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a061016081818701526154de6101e0870185613bbe565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc061018081888703018189015261551d8686614bf9565b9550828a015194508188870301848901526155388686615364565b9550808a01516101c089015250505050508281036020840152614cb18185615364565b6000815160208301517fffffffff00000000000000000000000000000000000000000000000000000000808216935060048310156155a35780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"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\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"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\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"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\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"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\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":[{\"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\":\"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\":\"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\":[{\"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\":[{\"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\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"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\":[{\"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\":\"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\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"uniqueReports\",\"type\":\"bool\"},{\"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\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"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\":\"uniqueReports\",\"type\":\"bool\"},{\"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\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"transmitExec\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x6101006040523480156200001257600080fd5b506040516200658738038062006587833981016040819052620000359162000678565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf816200012c565b5050466080525081516001600160a01b0316620000ef576040516342bcdf7f60e11b815260040160405180910390fd5b81516001600160a01b0390811660a05260208301516001600160401b031660c05260408301511660e0526200012481620001d7565b505062000850565b336001600160a01b03821603620001865760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b81518110156200053a576000828281518110620001fb57620001fb620007e3565b60200260200101519050600081600001519050806001600160401b0316600003620002455760405163c39a620560e01b81526001600160401b038216600482015260240162000083565b60608201516001600160a01b031662000271576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160401b038116600090815260066020526040902060018101546001600160a01b0316620004395760a0516040516374eb454760e11b81526001600160401b03841660048201526000916001600160a01b03169063e9d68a8e90602401606060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003159190620007f9565b905083606001516001600160a01b031681604001516001600160a01b03161415806200034d575060208101516001600160401b031615155b15620003785760405163c39a620560e01b81526001600160401b038416600482015260240162000083565b620003af8385606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b36200053e60201b60201c565b600283015560608401516001830180546001600160a01b0319166001600160a01b039283161790556040808601518454610100600160a81b0319166101009190931602919091178355516001600160401b03841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a150620004a0565b606083015160018201546001600160a01b0390811691161415806200047557506040830151815461010090046001600160a01b03908116911614155b15620004a05760405163c39a620560e01b81526001600160401b038316600482015260240162000083565b6020830151815490151560ff199091161781556040516001600160401b038316907fdba8597411dc0624375cfff476f6173674609571f4d98d294dd3a47af07927849062000523908490815460ff81161515825260081c6001600160a01b0390811660208301526001830154166040820152600290910154606082015260800190565b60405180910390a2505050806001019050620001da565b5050565b60c05160408051602081018490526001600160401b0380871692820192909252911660608201526001600160a01b038316608082015260009060a0016040516020818303038152906040528051906020012090509392505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715620005d457620005d462000599565b60405290565b604051608081016001600160401b0381118282101715620005d457620005d462000599565b604051601f8201601f191681016001600160401b03811182821017156200062a576200062a62000599565b604052919050565b80516001600160a01b03811681146200064a57600080fd5b919050565b80516001600160401b03811681146200064a57600080fd5b805180151581146200064a57600080fd5b6000808284036080808212156200068e57600080fd5b6060808312156200069e57600080fd5b620006a8620005af565b9250620006b58662000632565b83526020620006c68188016200064f565b818501526040620006da6040890162000632565b604086015260608801519496506001600160401b0380861115620006fd57600080fd5b858901955089601f8701126200071257600080fd5b85518181111562000727576200072762000599565b62000737848260051b01620005ff565b818152848101925060079190911b87018401908b8211156200075857600080fd5b968401965b81881015620007d15786888d031215620007775760008081fd5b62000781620005da565b6200078c896200064f565b81526200079b868a0162000667565b86820152620007ac858a0162000632565b85820152620007bd878a0162000632565b81880152835296860196918401916200075d565b80985050505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6000606082840312156200080c57600080fd5b62000816620005af565b620008218362000667565b815262000831602084016200064f565b6020820152620008446040840162000632565b60408201529392505050565b60805160a05160c05160e051615cb7620008d0600039600081816101b9015281816109de015261281f015260008181610189015281816109b8015261326501526000818161014d0152818161098a015281816114440152612b1401526000818161057e015281816105ca01528181611a5e0152611aaa0152615cb76000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806385572ffb116100b2578063c673e58411610081578063e9d68a8e11610066578063e9d68a8e14610463578063f2fde38b14610555578063f52121a51461056857600080fd5b8063c673e58414610430578063d783efe71461045057600080fd5b806385572ffb146103bb5780638b364334146103c95780638da5cb5b146103f5578063903f9f011461041d57600080fd5b80635e36480c116100ee5780635e36480c1461027d5780637437ff9f1461029d57806379ba5097146103a05780637f63b711146103a857600080fd5b806306285c6914610120578063181f5a771461020c578063542625af1461025557806358ba74571461026a575b600080fd5b6101f6604080516060810182526000808252602082018190529181019190915260405180606001604052807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b6040516102039190614211565b60405180910390f35b6102486040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b60405161020391906142a6565b6102686102633660046149cd565b61057b565b005b610268610278366004614b0c565b6107a8565b61029061028b366004614ba7565b610a3d565b6040516102039190614c23565b6103936040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e08101825260045463ffffffff808216835264010000000082048116602084015261ffff680100000000000000008304169383019390935273ffffffffffffffffffffffffffffffffffffffff6a0100000000000000000000909104811660608301526005549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b6040516102039190614c31565b610268610ad1565b6102686103b6366004614cac565b610bce565b61026861011b366004614d90565b6103dc6103d7366004614dcb565b610be2565b60405167ffffffffffffffff9091168152602001610203565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610203565b61026861042b366004614df9565b610bf8565b61044361043e366004614e92565b610c2b565b6040516102039190614eff565b61026861045e366004614fe9565b610dbc565b610505610471366004615149565b6040805160808101825260008082526020820181905291810182905260608101919091525067ffffffffffffffff166000908152600660209081526040918290208251608081018452815460ff81161515825273ffffffffffffffffffffffffffffffffffffffff610100909104811693820193909352600182015490921692820192909252600290910154606082015290565b6040805182511515815260208084015173ffffffffffffffffffffffffffffffffffffffff9081169183019190915283830151169181019190915260609182015191810191909152608001610203565b610268610563366004615166565b610dfe565b610268610576366004615183565b610e0f565b467f00000000000000000000000000000000000000000000000000000000000000001461060b576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015267ffffffffffffffff461660248201526044015b60405180910390fd5b815181518114610647576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610798576000848281518110610666576106666151e7565b6020026020010151905060008160200151519050600085848151811061068e5761068e6151e7565b60200260200101519050805182146106d2576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b828110156107895760008282815181106106f1576106f16151e7565b602002602001015190508060001415801561072c57508460200151828151811061071d5761071d6151e7565b60200260200101516080015181105b156107805784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810183905260448101829052606401610602565b506001016106d5565b5050505080600101905061064a565b506107a383836111ca565b505050565b6107b061127a565b606081015173ffffffffffffffffffffffffffffffffffffffff16610801576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085015160408087015160608089015173ffffffffffffffffffffffffffffffffffffffff9081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a179790971798909816959095171790945560808601516005805460a089015160c08a015185167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9190951674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909216938916939093171791909116919091179055825191820183527f00000000000000000000000000000000000000000000000000000000000000008416825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016908201527f000000000000000000000000000000000000000000000000000000000000000090921682820152517f59aba10dfd156b1e651f995db6fac7668309035e93bf51547611501a6b08ad4191610a32918490615216565b60405180910390a150565b6000610a4b60016004615305565b6002610a58608085615347565b67ffffffffffffffff16610a6c919061536e565b67ffffffffffffffff8516600090815260086020526040812090610a91608087615385565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c166003811115610ac857610ac8614be0565b90505b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610602565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610bd661127a565b610bdf816112fd565b50565b600080610bef84846117aa565b50949350505050565b610c0282826118da565b604080516000808252602082019092529050610c2560018585858586600061191a565b50505050565b610c766040805161010081019091526000606082018181526080830182905260a0830182905260c0830182905260e08301919091528190815260200160608152602001606081525090565b60ff8083166000908152600260208181526040928390208351610100808201865282546060830190815260018401548089166080850152918204881660a08401526201000082048816151560c08401526301000000909104909616151560e082015294855291820180548451818402810184019095528085529293858301939092830182828015610d3d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d12575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610dac57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610d81575b5050505050815250509050919050565b610dc461127a565b60005b8151811015610dfa57610df2828281518110610de557610de56151e7565b6020026020010151611d6c565b600101610dc7565b5050565b610e0661127a565b610bdf8161219b565b333014610e48576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610e85565b6040805180820190915260008082526020820152815260200190600190039081610e5e5790505b506101408401515190915015610f20576101408301516040805160608101909152602085015173ffffffffffffffffffffffffffffffffffffffff166080820152610f1d91908060a0810160408051601f19818403018152918152908252875167ffffffffffffffff1660208301528781015173ffffffffffffffffffffffffffffffffffffffff1691015261016086015185612290565b90505b6000610f2c8483612719565b60055490915073ffffffffffffffffffffffffffffffffffffffff168015611033576040517fa219f6e500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063a219f6e590610fa0908590600401615464565b600060405180830381600087803b158015610fba57600080fd5b505af1925050508015610fcb575060015b611033573d808015610ff9576040519150601f19603f3d011682016040523d82523d6000602084013e610ffe565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161060291906142a6565b6101208501515115801561104957506080850151155b8061106d5750604085015173ffffffffffffffffffffffffffffffffffffffff163b155b806110ba575060408501516110b89073ffffffffffffffffffffffffffffffffffffffff167f85572ffb000000000000000000000000000000000000000000000000000000006127c9565b155b156110c6575050505050565b60048054608087015160408089015190517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1693633cf979839361113c938a9361138893929101615477565b6000604051808303816000875af115801561115b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111839190810190615505565b5091509150816111c157806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161060291906142a6565b50505050505050565b8151600003611204576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b84518110156112735761126b858281518110611239576112396151e7565b60200260200101518461126557858381518110611258576112586151e7565b60200260200101516127e5565b836127e5565b60010161121b565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610602565b565b60005b8151811015610dfa57600082828151811061131d5761131d6151e7565b602002602001015190506000816000015190508067ffffffffffffffff16600003611380576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610602565b606082015173ffffffffffffffffffffffffffffffffffffffff166113d1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600660205260409020600181015473ffffffffffffffffffffffffffffffffffffffff1661164e576040517fe9d68a8e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff831660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063e9d68a8e90602401606060405180830381865afa1580156114a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c4919061555f565b9050836060015173ffffffffffffffffffffffffffffffffffffffff16816040015173ffffffffffffffffffffffffffffffffffffffff161415806115165750602081015167ffffffffffffffff1615155b15611559576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610602565b6115888385606001517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b361325f565b600283015560608401516001830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92831617905560408086015184547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010091909316029190911783555167ffffffffffffffff841681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1506116e6565b6060830151600182015473ffffffffffffffffffffffffffffffffffffffff90811691161415806116a3575060408301518154610100900473ffffffffffffffffffffffffffffffffffffffff908116911614155b156116e6576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610602565b602083015181549015157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911617815560405167ffffffffffffffff8316907fdba8597411dc0624375cfff476f6173674609571f4d98d294dd3a47af079278490611794908490815460ff81161515825260081c73ffffffffffffffffffffffffffffffffffffffff90811660208301526001830154166040820152600290910154606082015260800190565b60405180910390a2505050806001019050611300565b67ffffffffffffffff808316600090815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281205490918291168082036118cc5767ffffffffffffffff8516600090815260066020526040902054610100900473ffffffffffffffffffffffffffffffffffffffff1680156118ca576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015282169063856c824790602401602060405180830381865afa158015611899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bd91906155b3565b60019350935050506118d3565b505b9150600090505b9250929050565b610dfa6118e9828401846155d0565b6040805160008082526020820190925290611914565b60608152602001906001900390816118ff5790505b506111ca565b60ff8781166000908152600260209081526040808320815160a081018352815481526001909101548086169382019390935261010083048516918101919091526201000082048416151560608201526301000000909104909216151560808301528735906119898760a4615605565b90508260800151156119d15784516119a290602061536e565b86516119af90602061536e565b6119ba9060a0615605565b6119c49190615605565b6119ce9082615605565b90505b368114611a13576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610602565b5081518114611a5b5781516040517f93df584c000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610602565b467f000000000000000000000000000000000000000000000000000000000000000014611adc576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610602565b60ff808a1660009081526003602090815260408083203384528252808320815180830190925280548086168352939491939092840191610100909104166002811115611b2a57611b2a614be0565b6002811115611b3b57611b3b614be0565b9052509050600281602001516002811115611b5857611b58614be0565b148015611bb95750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff1681548110611b9457611b946151e7565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1633145b611bef576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50816080015115611d17576000826060015115611c3b57600283602001518460400151611c1c9190615618565b611c269190615631565b611c31906001615618565b60ff169050611c51565b6020830151611c4b906001615618565b60ff1690505b80865114611c8b576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8451865114611cc6576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060008787604051611cd9929190615653565b604051908190038120611cf0918b90602001615663565b604051602081830303815290604052805190602001209050611d158a828888886132ef565b505b6040805182815260208a81013560081c63ffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b806040015160ff16600003611db05760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106029190615677565b60208082015160ff80821660009081526002909352604083206001810154929390928392169003611e50576060840151600182018054608087015115156301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff9315156201000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff90911617919091179055611eca565b6060840151600182015460ff62010000909104161515901515141580611e8e57506080840151600182015460ff630100000090910416151590151514155b15611eca576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff84166004820152602401610602565b60c08401518051601f60ff82161115611f125760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106029190615677565b611f858585600301805480602002602001604051908101604052809291908181526020018280548015611f7b57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f50575b5050505050613513565b8560800151156120f3576120008585600201805480602002602001604051908101604052809291908181526020018280548015611f7b5760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611f50575050505050613513565b60a0860151805161201a9060028701906020840190614157565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f10156120935760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106029190615677565b60408801516120a3906003615691565b60ff168160ff16116120e45760036040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106029190615677565b6120f0878360016135a6565b50505b6120ff858360026135a6565b81516121149060038601906020850190614157565b506040868101516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316179055875180865560c089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361218b938a939260028b019291906156b4565b60405180910390a1505050505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361221a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610602565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b8360005b8551811015610bef5760008482815181106122b1576122b16151e7565b60200260200101518060200190518101906122cc9190615747565b905060006122dd82602001516137a1565b905061231f73ffffffffffffffffffffffffffffffffffffffff82167faff2afbf000000000000000000000000000000000000000000000000000000006127c9565b61236d576040517fae9b4ce900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610602565b6000806124b5634059f55b60e01b6040518060e001604052808c6000015181526020018c6020015167ffffffffffffffff1681526020018c6040015173ffffffffffffffffffffffffffffffffffffffff1681526020018d89815181106123d6576123d66151e7565b602002602001015160200151815260200187600001518152602001876040015181526020018a898151811061240d5761240d6151e7565b602002602001015181525060405160240161242891906157fc565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152600554859063ffffffff740100000000000000000000000000000000000000009091041661138860846137fc565b5091509150816124f357806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161060291906142a6565b805160401461253d578051604080517f78ef802400000000000000000000000000000000000000000000000000000000815260048101919091526024810191909152604401610602565b6000808280602001905181019061255491906158b8565b91509150600061256383613922565b60408d810151815173ffffffffffffffffffffffffffffffffffffffff909116602482015260448082018690528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526005549192506126229183907801000000000000000000000000000000000000000000000000900463ffffffff1661138860846137fc565b50909550935084158061265257506000845111801561265257508380602001905181019061265091906158dc565b155b1561268b57836040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161060291906142a6565b8089898151811061269e5761269e6151e7565b60200260200101516000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050818989815181106126ef576126ef6151e7565b6020026020010151602001818152505050505050505050806001019050612294565b949350505050565b6040805160a08101825260008082526020820152606091810182905281810182905260808101919091526040518060a001604052808461018001518152602001846000015167ffffffffffffffff168152602001846020015160405160200161279e919073ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6040516020818303038152906040528152602001846101200151815260200183815250905092915050565b60006127d48361399b565b8015610ac85750610ac883836139ff565b81516040517f58babe3300000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906358babe3390602401602060405180830381865afa15801561287b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289f91906158dc565b156128e2576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610602565b6020830151516000819003612922576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360400151518114612960576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff82166000908152600660205260409020805460ff166129c0576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610602565b60008267ffffffffffffffff8111156129db576129db6142b9565b604051908082528060200260200182016040528015612a04578160200160208202803683370190505b50905060005b83811015612ac957600087602001518281518110612a2a57612a2a6151e7565b60200260200101519050612a42818560020154613ace565b838381518110612a5457612a546151e7565b602002602001018181525050806101800151838381518110612a7857612a786151e7565b602002602001015114612ac0578061018001516040517f345039be00000000000000000000000000000000000000000000000000000000815260040161060291815260200190565b50600101612a0a565b50606086015160808701516040517ffe41448f00000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169263fe41448f92612b4b928a92889260040161592a565b602060405180830381865afa158015612b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b8c9190615971565b905080600003612bd4576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610602565b8551151560005b8581101561325457600089602001518281518110612bfb57612bfb6151e7565b602002602001015190506000612c15898360600151610a3d565b90506002816003811115612c2b57612c2b614be0565b03612c815760608201516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a1505061324c565b6000816003811115612c9557612c95614be0565b1480612cb257506003816003811115612cb057612cb0614be0565b145b612d025760608201516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610602565b8315612dcb5760045460009063ffffffff16612d1e8742615305565b1190508080612d3e57506003826003811115612d3c57612d3c614be0565b145b612d80576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b166004820152602401610602565b8a8481518110612d9257612d926151e7565b6020026020010151600014612dc5578a8481518110612db357612db36151e7565b60200260200101518360800181815250505b50612e30565b6000816003811115612ddf57612ddf614be0565b14612e305760608201516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c1660048301529091166024820152604401610602565b600080612e418b85602001516117aa565b915091508015612f615760c084015167ffffffffffffffff16612e6583600161598a565b67ffffffffffffffff1614612ef55760c084015160208501516040517f5444a3301c7c42dd164cbf6ba4b72bf02504f86c049b06a27fc2b662e334bdbd92612ee4928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60405180910390a15050505061324c565b67ffffffffffffffff8b811660009081526007602090815260408083208883015173ffffffffffffffffffffffffffffffffffffffff168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000169184169190911790555b6000836003811115612f7557612f75614be0565b036130135760c084015167ffffffffffffffff16612f9483600161598a565b67ffffffffffffffff16146130135760c084015160208501516040517f852dc8e405695593e311bd83991cf39b14a328f304935eac6d3d55617f911d8992612ee4928f9267ffffffffffffffff938416815291909216602082015273ffffffffffffffffffffffffffffffffffffffff91909116604082015260600190565b60008d60400151868151811061302b5761302b6151e7565b602002602001015190506130598561018001518d876060015188610140015151896101200151518651613c36565b6130698c86606001516001613d55565b6000806130768784613e33565b915091506130898e886060015184613d55565b8880156130a7575060038260038111156130a5576130a5614be0565b145b156130e757866101800151816040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016106029291906159ab565b60038260038111156130fb576130fb614be0565b1415801561311b5750600282600381111561311857613118614be0565b14155b1561315c578d8760600151836040517f926c5a3e000000000000000000000000000000000000000000000000000000008152600401610602939291906159c4565b600086600381111561317057613170614be0565b036131eb5767ffffffffffffffff808f1660009081526007602090815260408083208b83015173ffffffffffffffffffffffffffffffffffffffff1684529091528120805490921691906131c3836159ea565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff168f67ffffffffffffffff167f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df2858560405161323c929190615a11565b60405180910390a4505050505050505b600101612bdb565b505050505050505050565b600081847f0000000000000000000000000000000000000000000000000000000000000000856040516020016132cf949392919093845267ffffffffffffffff92831660208501529116604083015273ffffffffffffffffffffffffffffffffffffffff16606082015260800190565b6040516020818303038152906040528051906020012090505b9392505050565b6132f76141dd565b835160005b8181101561350957600060018886846020811061331b5761331b6151e7565b61332891901a601b615618565b89858151811061333a5761333a6151e7565b6020026020010151898681518110613354576133546151e7565b602002602001015160405160008152602001604052604051613392949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156133b4573d6000803e3d6000fd5b505060408051601f1981015160ff808e1660009081526003602090815285822073ffffffffffffffffffffffffffffffffffffffff85168352815285822085870190965285548084168652939750909550929392840191610100900416600281111561342257613422614be0565b600281111561343357613433614be0565b905250905060018160200151600281111561345057613450614be0565b14613487576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061349e5761349e6151e7565b6020020151156134da576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f81106134f5576134f56151e7565b9115156020909202015250506001016132fc565b5050505050505050565b60005b81518110156107a35760ff831660009081526003602052604081208351909190849084908110613548576135486151e7565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000169055600101613516565b60005b82518160ff161015610c25576000838260ff16815181106135cc576135cc6151e7565b60200260200101519050600060028111156135e9576135e9614be0565b60ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054610100900416600281111561363557613635614be0565b1461366f5760046040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106029190615677565b73ffffffffffffffffffffffffffffffffffffffff81166136bc576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff1681526020018460028111156136e2576136e2614be0565b905260ff808716600090815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845282529091208351815493167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00841681178255918401519092909183917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561378757613787614be0565b0217905550905050508061379a90615a31565b90506135a9565b600081516020146137e057816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161060291906142a6565b610acb828060200190518101906137f79190615971565b613922565b6000606060008361ffff1667ffffffffffffffff81111561381f5761381f6142b9565b6040519080825280601f01601f191660200182016040528015613849576020820181803683370190505b509150863b61387c577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156138af577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106138e8577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d8481111561390b5750835b808352806000602085013e50955095509592505050565b600073ffffffffffffffffffffffffffffffffffffffff8211806139465750600a82105b156139975760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610602916004016142a6565b5090565b60006139c7827f01ffc9a7000000000000000000000000000000000000000000000000000000006139ff565b8015610acb57506139f8827fffffffff000000000000000000000000000000000000000000000000000000006139ff565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613ab7575060208210155b8015613ac35750600081115b979650505050505050565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613b7198979695949392919073ffffffffffffffffffffffffffffffffffffffff9889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613baa9190615a50565b60405160208183030381529060405280519060200120876101600151604051602001613bd69190615abd565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60045468010000000000000000900461ffff16831115613c96576040517fa1e5205a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610602565b808314613ce3576040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808716600483015285166024820152604401610602565b600454640100000000900463ffffffff16821115613d4d57600480546040517f1fd8fd04000000000000000000000000000000000000000000000000000000008152918201889052640100000000900463ffffffff16602482015260448101839052606401610602565b505050505050565b60006002613d64608085615347565b67ffffffffffffffff16613d78919061536e565b67ffffffffffffffff851660009081526008602052604081209192509081613da1608087615385565b67ffffffffffffffff168152602081019190915260400160002054905081613dcb60016004615305565b901b191681836003811115613de257613de2614be0565b67ffffffffffffffff871660009081526008602052604081209190921b92909217918291613e11608088615385565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590613e779087908790600401615ad0565b600060405180830381600087803b158015613e9157600080fd5b505af1925050508015613ea2575060015b61413c573d808015613ed0576040519150601f19603f3d011682016040523d82523d6000602084013e613ed5565b606091505b506000613ee182615c5a565b90507f0a8d6e8c000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082161480613f7457507fe1cd5509000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b80613fc057507f8d666f60000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061400c57507f78ef8024000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b8061405857507f0c3b563c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b806140a457507fae9b4ce9000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b806140f057507f09c25325000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216145b1561410157506003925090506118d3565b856101800151826040517f2b11b8d90000000000000000000000000000000000000000000000000000000081526004016106029291906159ab565b50506040805160208101909152600081526002909250929050565b8280548282559060005260206000209081019282156141d1579160200282015b828111156141d157825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190614177565b506139979291506141fc565b604051806103e00160405280601f906020820280368337509192915050565b5b8082111561399757600081556001016141fd565b60608101610acb8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015167ffffffffffffffff169084015260409182015116910152565b60005b83811015614271578181015183820152602001614259565b50506000910152565b60008151808452614292816020860160208601614256565b601f01601f19169290920160200192915050565b602081526000610ac8602083018461427a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561430b5761430b6142b9565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561430b5761430b6142b9565b60405160a0810167ffffffffffffffff8111828210171561430b5761430b6142b9565b60405160e0810167ffffffffffffffff8111828210171561430b5761430b6142b9565b6040516080810167ffffffffffffffff8111828210171561430b5761430b6142b9565b6040516060810167ffffffffffffffff8111828210171561430b5761430b6142b9565b604051601f8201601f1916810167ffffffffffffffff811182821017156143ea576143ea6142b9565b604052919050565b600067ffffffffffffffff82111561440c5761440c6142b9565b5060051b60200190565b67ffffffffffffffff81168114610bdf57600080fd5b803561443781614416565b919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610bdf57600080fd5b80356144378161443c565b8015158114610bdf57600080fd5b803561443781614469565b600067ffffffffffffffff82111561449c5761449c6142b9565b50601f01601f191660200190565b600082601f8301126144bb57600080fd5b81356144ce6144c982614482565b6143c1565b8181528460208386010111156144e357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261451157600080fd5b813560206145216144c9836143f2565b82815260069290921b8401810191818101908684111561454057600080fd5b8286015b84811015614588576040818903121561455d5760008081fd5b6145656142e8565b81356145708161443c565b81528185013585820152835291830191604001614544565b509695505050505050565b600082601f8301126145a457600080fd5b813560206145b46144c9836143f2565b82815260059290921b840181019181810190868411156145d357600080fd5b8286015b8481101561458857803567ffffffffffffffff8111156145f75760008081fd5b6146058986838b01016144aa565b8452509183019183016145d7565b60006101a0828403121561462657600080fd5b61462e614311565b90506146398261442c565b81526146476020830161445e565b60208201526146586040830161445e565b60408201526146696060830161442c565b60608201526080820135608082015261468460a08301614477565b60a082015261469560c0830161442c565b60c08201526146a660e0830161445e565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156146d357600080fd5b6146df868387016144aa565b838501526101409250828501359150808211156146fb57600080fd5b61470786838701614500565b8385015261016092508285013591508082111561472357600080fd5b5061473085828601614593565b82840152505061018080830135818301525092915050565b600082601f83011261475957600080fd5b813560206147696144c9836143f2565b82815260059290921b8401810191818101908684111561478857600080fd5b8286015b8481101561458857803567ffffffffffffffff8111156147ac5760008081fd5b6147ba8986838b0101614613565b84525091830191830161478c565b600082601f8301126147d957600080fd5b813560206147e96144c9836143f2565b82815260059290921b8401810191818101908684111561480857600080fd5b8286015b8481101561458857803567ffffffffffffffff81111561482c5760008081fd5b61483a8986838b0101614593565b84525091830191830161480c565b600082601f83011261485957600080fd5b813560206148696144c9836143f2565b8083825260208201915060208460051b87010193508684111561488b57600080fd5b602086015b848110156145885780358352918301918301614890565b600082601f8301126148b857600080fd5b813560206148c86144c9836143f2565b82815260059290921b840181019181810190868411156148e757600080fd5b8286015b8481101561458857803567ffffffffffffffff8082111561490c5760008081fd5b818901915060a080601f19848d030112156149275760008081fd5b61492f614335565b61493a88850161442c565b8152604080850135848111156149505760008081fd5b61495e8e8b83890101614748565b8a84015250606080860135858111156149775760008081fd5b6149858f8c838a01016147c8565b83850152506080915081860135858111156149a05760008081fd5b6149ae8f8c838a0101614848565b91840191909152509190930135908301525083529183019183016148eb565b60008060408084860312156149e157600080fd5b833567ffffffffffffffff808211156149f957600080fd5b614a05878388016148a7565b9450602091508186013581811115614a1c57600080fd5b8601601f81018813614a2d57600080fd5b8035614a3b6144c9826143f2565b81815260059190911b8201840190848101908a831115614a5a57600080fd5b8584015b83811015614ae657803586811115614a765760008081fd5b8501603f81018d13614a885760008081fd5b87810135614a986144c9826143f2565b81815260059190911b82018a0190898101908f831115614ab85760008081fd5b928b01925b82841015614ad65783358252928a0192908a0190614abd565b8652505050918601918601614a5e565b50809750505050505050509250929050565b803563ffffffff8116811461443757600080fd5b600060e08284031215614b1e57600080fd5b614b26614358565b614b2f83614af8565b8152614b3d60208401614af8565b6020820152604083013561ffff81168114614b5757600080fd5b6040820152614b686060840161445e565b6060820152614b796080840161445e565b6080820152614b8a60a08401614af8565b60a0820152614b9b60c08401614af8565b60c08201529392505050565b60008060408385031215614bba57600080fd5b8235614bc581614416565b91506020830135614bd581614416565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110614c1f57614c1f614be0565b9052565b60208101610acb8284614c0f565b60e08101610acb828463ffffffff80825116835280602083015116602084015261ffff6040830151166040840152606082015173ffffffffffffffffffffffffffffffffffffffff808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b60006020808385031215614cbf57600080fd5b823567ffffffffffffffff811115614cd657600080fd5b8301601f81018513614ce757600080fd5b8035614cf56144c9826143f2565b81815260079190911b82018301908381019087831115614d1457600080fd5b928401925b82841015613ac35760808489031215614d325760008081fd5b614d3a61437b565b8435614d4581614416565b815284860135614d5481614469565b81870152604085810135614d678161443c565b90820152606085810135614d7a8161443c565b9082015282526080939093019290840190614d19565b600060208284031215614da257600080fd5b813567ffffffffffffffff811115614db957600080fd5b820160a081850312156132e857600080fd5b60008060408385031215614dde57600080fd5b8235614de981614416565b91506020830135614bd58161443c565b600080600060808486031215614e0e57600080fd5b6060840185811115614e1f57600080fd5b8493503567ffffffffffffffff80821115614e3957600080fd5b818601915086601f830112614e4d57600080fd5b813581811115614e5c57600080fd5b876020828501011115614e6e57600080fd5b6020830194508093505050509250925092565b803560ff8116811461443757600080fd5b600060208284031215614ea457600080fd5b610ac882614e81565b60008151808452602080850194506020840160005b83811015614ef457815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614ec2565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff60408201511660608401526060810151151560808401526080810151151560a084015250602083015160e060c0840152614f5b610100840182614ead565b90506040840151601f198483030160e0850152614f788282614ead565b95945050505050565b600082601f830112614f9257600080fd5b81356020614fa26144c9836143f2565b8083825260208201915060208460051b870101935086841115614fc457600080fd5b602086015b84811015614588578035614fdc8161443c565b8352918301918301614fc9565b60006020808385031215614ffc57600080fd5b823567ffffffffffffffff8082111561501457600080fd5b818501915085601f83011261502857600080fd5b81356150366144c9826143f2565b81815260059190911b8301840190848101908883111561505557600080fd5b8585015b8381101561513c5780358581111561507057600080fd5b860160e0818c03601f190112156150875760008081fd5b61508f614358565b88820135815260406150a2818401614e81565b8a83015260606150b3818501614e81565b82840152608091506150c6828501614477565b9083015260a06150d7848201614477565b8284015260c0915081840135898111156150f15760008081fd5b6150ff8f8d83880101614f81565b82850152505060e0830135888111156151185760008081fd5b6151268e8c83870101614f81565b9183019190915250845250918601918601615059565b5098975050505050505050565b60006020828403121561515b57600080fd5b81356132e881614416565b60006020828403121561517857600080fd5b81356132e88161443c565b6000806040838503121561519657600080fd5b823567ffffffffffffffff808211156151ae57600080fd5b6151ba86838701614613565b935060208501359150808211156151d057600080fd5b506151dd85828601614593565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b610140810161525c8285805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015167ffffffffffffffff169084015260409182015116910152565b6132e8606083018463ffffffff80825116835280602083015116602084015261ffff6040830151166040840152606082015173ffffffffffffffffffffffffffffffffffffffff808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610acb57610acb6152d6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061536257615362615318565b92169190910692915050565b8082028115828204841417610acb57610acb6152d6565b600067ffffffffffffffff808416806153a0576153a0615318565b92169190910492915050565b60008151808452602080850194506020840160005b83811015614ef4578151805173ffffffffffffffffffffffffffffffffffffffff16885283015183880152604090960195908201906001016153c1565b8051825267ffffffffffffffff60208201511660208301526000604082015160a0604085015261543160a085018261427a565b90506060830151848203606086015261544a828261427a565b91505060808301518482036080860152614f7882826153ac565b602081526000610ac860208301846153fe565b60808152600061548a60808301876153fe565b61ffff95909516602083015250604081019290925273ffffffffffffffffffffffffffffffffffffffff16606090910152919050565b600082601f8301126154d157600080fd5b81516154df6144c982614482565b8181528460208386010111156154f457600080fd5b612711826020830160208701614256565b60008060006060848603121561551a57600080fd5b835161552581614469565b602085015190935067ffffffffffffffff81111561554257600080fd5b61554e868287016154c0565b925050604084015190509250925092565b60006060828403121561557157600080fd5b61557961439e565b825161558481614469565b8152602083015161559481614416565b602082015260408301516155a78161443c565b60408201529392505050565b6000602082840312156155c557600080fd5b81516132e881614416565b6000602082840312156155e257600080fd5b813567ffffffffffffffff8111156155f957600080fd5b612711848285016148a7565b80820180821115610acb57610acb6152d6565b60ff8181168382160190811115610acb57610acb6152d6565b600060ff83168061564457615644615318565b8060ff84160491505092915050565b8183823760009101908152919050565b828152606082602083013760800192915050565b602081016005831061568b5761568b614be0565b91905290565b60ff81811683821602908116908181146156ad576156ad6152d6565b5092915050565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b8181101561571b57845473ffffffffffffffffffffffffffffffffffffffff16835260019485019492840192016156e9565b5050848103606086015261572f8188614ead565b935050505060ff831660808301529695505050505050565b60006020828403121561575957600080fd5b815167ffffffffffffffff8082111561577157600080fd5b908301906060828603121561578557600080fd5b61578d61439e565b82518281111561579c57600080fd5b6157a8878286016154c0565b8252506020830151828111156157bd57600080fd5b6157c9878286016154c0565b6020830152506040830151828111156157e157600080fd5b6157ed878286016154c0565b60408301525095945050505050565b602081526000825160e0602084015261581961010084018261427a565b905067ffffffffffffffff60208501511660408401526040840151615856606085018273ffffffffffffffffffffffffffffffffffffffff169052565b50606084015160808401526080840151601f19808584030160a086015261587d838361427a565b925060a08601519150808584030160c086015261589a838361427a565b925060c08601519150808584030160e086015250614f78828261427a565b600080604083850312156158cb57600080fd5b505080516020909101519092909150565b6000602082840312156158ee57600080fd5b81516132e881614469565b60008151808452602080850194506020840160005b83811015614ef45781518752958201959082019060010161590e565b67ffffffffffffffff8516815260806020820152600061594d60808301866158f9565b828103604084015261595f81866158f9565b91505082606083015295945050505050565b60006020828403121561598357600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156156ad576156ad6152d6565b828152604060208201526000612711604083018461427a565b67ffffffffffffffff848116825283166020820152606081016127116040830184614c0f565b600067ffffffffffffffff808316818103615a0757615a076152d6565b6001019392505050565b615a1b8184614c0f565b604060208201526000612711604083018461427a565b600060ff821660ff8103615a4757615a476152d6565b60010192915050565b602081526000610ac860208301846153ac565b60008282518085526020808601955060208260051b8401016020860160005b84811015615ab057601f19868403018952615a9e83835161427a565b98840198925090830190600101615a82565b5090979650505050505050565b602081526000610ac86020830184615a63565b60408152615aeb60408201845167ffffffffffffffff169052565b60006020840151615b14606084018273ffffffffffffffffffffffffffffffffffffffff169052565b50604084015173ffffffffffffffffffffffffffffffffffffffff8116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c0840151610100615b828185018367ffffffffffffffff169052565b60e08601519150610120615bad8186018473ffffffffffffffffffffffffffffffffffffffff169052565b81870151925061014091508282860152808701519250506101a06101608181870152615bdd6101e087018561427a565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0610180818887030181890152615c1c86866153ac565b9550828a01519450818887030184890152615c378686615a63565b9550808a01516101c089015250505050508281036020840152614f788185615a63565b6000815160208301517fffffffff0000000000000000000000000000000000000000000000000000000080821693506004831015615ca25780818460040360031b1b83161693505b50505091905056fea164736f6c6343000818000a", } var EVM2EVMMultiOffRampABI = EVM2EVMMultiOffRampMetaData.ABI @@ -368,88 +392,26 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCallerSession) GetStaticConfig() return _EVM2EVMMultiOffRamp.Contract.GetStaticConfig(&_EVM2EVMMultiOffRamp.CallOpts) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCaller) GetTransmitters(opts *bind.CallOpts) ([]common.Address, error) { +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCaller) LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { var out []interface{} - err := _EVM2EVMMultiOffRamp.contract.Call(opts, &out, "getTransmitters") + err := _EVM2EVMMultiOffRamp.contract.Call(opts, &out, "latestConfigDetails", ocrPluginType) if err != nil { - return *new([]common.Address), err + return *new(MultiOCR3BaseOCRConfig), err } - out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + out0 := *abi.ConvertType(out[0], new(MultiOCR3BaseOCRConfig)).(*MultiOCR3BaseOCRConfig) return out0, err } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) GetTransmitters() ([]common.Address, error) { - return _EVM2EVMMultiOffRamp.Contract.GetTransmitters(&_EVM2EVMMultiOffRamp.CallOpts) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _EVM2EVMMultiOffRamp.Contract.LatestConfigDetails(&_EVM2EVMMultiOffRamp.CallOpts, ocrPluginType) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCallerSession) GetTransmitters() ([]common.Address, error) { - return _EVM2EVMMultiOffRamp.Contract.GetTransmitters(&_EVM2EVMMultiOffRamp.CallOpts) -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCaller) LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails, - - error) { - var out []interface{} - err := _EVM2EVMMultiOffRamp.contract.Call(opts, &out, "latestConfigDetails") - - outstruct := new(LatestConfigDetails) - if err != nil { - return *outstruct, err - } - - outstruct.ConfigCount = *abi.ConvertType(out[0], new(uint32)).(*uint32) - outstruct.BlockNumber = *abi.ConvertType(out[1], new(uint32)).(*uint32) - outstruct.ConfigDigest = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte) - - return *outstruct, err - -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) LatestConfigDetails() (LatestConfigDetails, - - error) { - return _EVM2EVMMultiOffRamp.Contract.LatestConfigDetails(&_EVM2EVMMultiOffRamp.CallOpts) -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCallerSession) LatestConfigDetails() (LatestConfigDetails, - - error) { - return _EVM2EVMMultiOffRamp.Contract.LatestConfigDetails(&_EVM2EVMMultiOffRamp.CallOpts) -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCaller) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch, - - error) { - var out []interface{} - err := _EVM2EVMMultiOffRamp.contract.Call(opts, &out, "latestConfigDigestAndEpoch") - - outstruct := new(LatestConfigDigestAndEpoch) - if err != nil { - return *outstruct, err - } - - outstruct.ScanLogs = *abi.ConvertType(out[0], new(bool)).(*bool) - outstruct.ConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) - outstruct.Epoch = *abi.ConvertType(out[2], new(uint32)).(*uint32) - - return *outstruct, err - -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch, - - error) { - return _EVM2EVMMultiOffRamp.Contract.LatestConfigDigestAndEpoch(&_EVM2EVMMultiOffRamp.CallOpts) -} - -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCallerSession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch, - - error) { - return _EVM2EVMMultiOffRamp.Contract.LatestConfigDigestAndEpoch(&_EVM2EVMMultiOffRamp.CallOpts) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCallerSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _EVM2EVMMultiOffRamp.Contract.LatestConfigDetails(&_EVM2EVMMultiOffRamp.CallOpts, ocrPluginType) } func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampCaller) Owner(opts *bind.CallOpts) (common.Address, error) { @@ -544,16 +506,28 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) ManuallyExecut return _EVM2EVMMultiOffRamp.Contract.ManuallyExecute(&_EVM2EVMMultiOffRamp.TransactOpts, reports, gasLimitOverrides) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) SetOCR2Config(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.contract.Transact(opts, "setOCR2Config", signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig EVM2EVMMultiOffRampDynamicConfig) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.contract.Transact(opts, "setDynamicConfig", dynamicConfig) +} + +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) SetDynamicConfig(dynamicConfig EVM2EVMMultiOffRampDynamicConfig) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.SetDynamicConfig(&_EVM2EVMMultiOffRamp.TransactOpts, dynamicConfig) +} + +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) SetDynamicConfig(dynamicConfig EVM2EVMMultiOffRampDynamicConfig) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.SetDynamicConfig(&_EVM2EVMMultiOffRamp.TransactOpts, dynamicConfig) +} + +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.contract.Transact(opts, "setOCR3Configs", ocrConfigArgs) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) SetOCR2Config(signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.Contract.SetOCR2Config(&_EVM2EVMMultiOffRamp.TransactOpts, signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.SetOCR3Configs(&_EVM2EVMMultiOffRamp.TransactOpts, ocrConfigArgs) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) SetOCR2Config(signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.Contract.SetOCR2Config(&_EVM2EVMMultiOffRamp.TransactOpts, signers, transmitters, f, onchainConfig, offchainConfigVersion, offchainConfig) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.SetOCR3Configs(&_EVM2EVMMultiOffRamp.TransactOpts, ocrConfigArgs) } func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { @@ -568,16 +542,16 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) TransferOwners return _EVM2EVMMultiOffRamp.Contract.TransferOwnership(&_EVM2EVMMultiOffRamp.TransactOpts, to) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) Transmit(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, arg4 [32]byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.contract.Transact(opts, "transmit", reportContext, report, rs, ss, arg4) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactor) TransmitExec(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.contract.Transact(opts, "transmitExec", reportContext, report) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) Transmit(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, arg4 [32]byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.Contract.Transmit(&_EVM2EVMMultiOffRamp.TransactOpts, reportContext, report, rs, ss, arg4) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampSession) TransmitExec(reportContext [3][32]byte, report []byte) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.TransmitExec(&_EVM2EVMMultiOffRamp.TransactOpts, reportContext, report) } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) Transmit(reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, arg4 [32]byte) (*types.Transaction, error) { - return _EVM2EVMMultiOffRamp.Contract.Transmit(&_EVM2EVMMultiOffRamp.TransactOpts, reportContext, report, rs, ss, arg4) +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) TransmitExec(reportContext [3][32]byte, report []byte) (*types.Transaction, error) { + return _EVM2EVMMultiOffRamp.Contract.TransmitExec(&_EVM2EVMMultiOffRamp.TransactOpts, reportContext, report) } type EVM2EVMMultiOffRampConfigSetIterator struct { @@ -759,16 +733,12 @@ func (it *EVM2EVMMultiOffRampConfigSet0Iterator) Close() error { } type EVM2EVMMultiOffRampConfigSet0 struct { - PreviousConfigBlockNumber uint32 - ConfigDigest [32]byte - ConfigCount uint64 - Signers []common.Address - Transmitters []common.Address - F uint8 - OnchainConfig []byte - OffchainConfigVersion uint64 - OffchainConfig []byte - Raw types.Log + OcrPluginType uint8 + ConfigDigest [32]byte + Signers []common.Address + Transmitters []common.Address + F uint8 + Raw types.Log } func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) FilterConfigSet0(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampConfigSet0Iterator, error) { @@ -1904,23 +1874,34 @@ func (it *EVM2EVMMultiOffRampTransmittedIterator) Close() error { } type EVM2EVMMultiOffRampTransmitted struct { - ConfigDigest [32]byte - Epoch uint32 - Raw types.Log + OcrPluginType uint8 + ConfigDigest [32]byte + SequenceNumber uint64 + Raw types.Log } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) FilterTransmitted(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampTransmittedIterator, error) { +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*EVM2EVMMultiOffRampTransmittedIterator, error) { + + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } - logs, sub, err := _EVM2EVMMultiOffRamp.contract.FilterLogs(opts, "Transmitted") + logs, sub, err := _EVM2EVMMultiOffRamp.contract.FilterLogs(opts, "Transmitted", ocrPluginTypeRule) if err != nil { return nil, err } return &EVM2EVMMultiOffRampTransmittedIterator{contract: _EVM2EVMMultiOffRamp.contract, event: "Transmitted", logs: logs, sub: sub}, nil } -func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampTransmitted) (event.Subscription, error) { +func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampTransmitted, ocrPluginType []uint8) (event.Subscription, error) { - logs, sub, err := _EVM2EVMMultiOffRamp.contract.WatchLogs(opts, "Transmitted") + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } + + logs, sub, err := _EVM2EVMMultiOffRamp.contract.WatchLogs(opts, "Transmitted", ocrPluginTypeRule) if err != nil { return nil, err } @@ -1961,17 +1942,6 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) ParseTransmitted(log ty return event, nil } -type LatestConfigDetails struct { - ConfigCount uint32 - BlockNumber uint32 - ConfigDigest [32]byte -} -type LatestConfigDigestAndEpoch struct { - ScanLogs bool - ConfigDigest [32]byte - Epoch uint32 -} - func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRamp) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _EVM2EVMMultiOffRamp.abi.Events["ConfigSet"].ID: @@ -2007,7 +1977,7 @@ func (EVM2EVMMultiOffRampConfigSet) Topic() common.Hash { } func (EVM2EVMMultiOffRampConfigSet0) Topic() common.Hash { - return common.HexToHash("0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05") + return common.HexToHash("0xab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547") } func (EVM2EVMMultiOffRampExecutionStateChanged) Topic() common.Hash { @@ -2043,7 +2013,7 @@ func (EVM2EVMMultiOffRampSourceChainSelectorAdded) Topic() common.Hash { } func (EVM2EVMMultiOffRampTransmitted) Topic() common.Hash { - return common.HexToHash("0xb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62") + return common.HexToHash("0x198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0") } func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRamp) Address() common.Address { @@ -2063,15 +2033,7 @@ type EVM2EVMMultiOffRampInterface interface { GetStaticConfig(opts *bind.CallOpts) (EVM2EVMMultiOffRampStaticConfig, error) - GetTransmitters(opts *bind.CallOpts) ([]common.Address, error) - - LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails, - - error) - - LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch, - - error) + LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) Owner(opts *bind.CallOpts) (common.Address, error) @@ -2085,11 +2047,13 @@ type EVM2EVMMultiOffRampInterface interface { ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReportSingleChain, gasLimitOverrides [][]*big.Int) (*types.Transaction, error) - SetOCR2Config(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) + SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig EVM2EVMMultiOffRampDynamicConfig) (*types.Transaction, error) + + SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - Transmit(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte, rs [][32]byte, ss [][32]byte, arg4 [32]byte) (*types.Transaction, error) + TransmitExec(opts *bind.TransactOpts, reportContext [3][32]byte, report []byte) (*types.Transaction, error) FilterConfigSet(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampConfigSetIterator, error) @@ -2151,9 +2115,9 @@ type EVM2EVMMultiOffRampInterface interface { ParseSourceChainSelectorAdded(log types.Log) (*EVM2EVMMultiOffRampSourceChainSelectorAdded, error) - FilterTransmitted(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampTransmittedIterator, error) + FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*EVM2EVMMultiOffRampTransmittedIterator, error) - WatchTransmitted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampTransmitted) (event.Subscription, error) + WatchTransmitted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampTransmitted, ocrPluginType []uint8) (event.Subscription, error) ParseTransmitted(log types.Log) (*EVM2EVMMultiOffRampTransmitted, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 4945e93ac8..1b7d9f72ea 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 bd56fec69d252bd9b87b5dd647e2eca937cf0b92674c824aa5f17427eba1c657 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 f72f9f4562a6f788f9f59197f34bd603476fe8c2555c9eebba72e9d9b445cbcc -evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin b8e0b6a223531eecebae592b364f921e051f63c682e5eb059ba9422671ade0f1 +evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 4f3c439f18f47ac9f8dcf5d5844e3e7fe1b1bf583333574c316f4dad92f513a8 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin c9427dad9d668c494bdad08af2203d98eef9aceb284d3fb17f93352da30c4ce1 evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin c76b35c91ecd153d7ada4da525e9cc54eab49f3fab6a1d27663f1f931f76683c evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin d8a663d8071b93bf09367f406c532fa87f2a4b156e8db250f922ca979cb1fab9