From 4240a366d7cd2397c67c36abd676fb2866033690 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Tue, 6 Aug 2024 11:42:40 +0200 Subject: [PATCH] gas golf and reduce diff --- contracts/gas-snapshots/ccip.gas-snapshot | 172 +++++++++--------- .../scripts/native_solc_compile_all_ccip | 2 +- .../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 30 +-- .../test/helpers/EVM2EVMOffRampHelper.sol | 7 +- .../ccip/test/offRamp/EVM2EVMOffRamp.t.sol | 8 +- .../evm_2_evm_offramp/evm_2_evm_offramp.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 7 files changed, 110 insertions(+), 113 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 2782253503..f35bc5b477 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -122,7 +122,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496) CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785) DefensiveExampleTest:test_HappyPath_Success() (gas: 200018) DefensiveExampleTest:test_Recovery() (gas: 424253) -E2E:test_E2E_3MessagesSuccess_gas() (gas: 1112902) +E2E:test_E2E_3MessagesSuccess_gas() (gas: 1112564) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38157) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108321) EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116789) @@ -290,85 +290,85 @@ EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 1 EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16287) EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 58439) EVM2EVMMultiOnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97185) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38253) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 106262) -EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_revert_Revert() (gas: 114740) -EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 393707) -EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 146343) -EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 793261) -EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 177282) -EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 30601) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62459) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 45676) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 215233) -EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 307795) -EVM2EVMOffRamp__report:test_Report_Success() (gas: 128212) -EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 256721) -EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 265312) -EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 340341) -EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 316387) -EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17009) -EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153250) -EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5339229) -EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143984) -EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21340) -EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36529) -EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51802) -EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 474694) -EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 47673) -EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152563) -EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102736) -EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165602) -EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 180030) -EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 42529) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160937) -EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 176106) -EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249390) -EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115772) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 411709) -EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54299) -EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132842) -EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52244) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 567326) -EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 501893) -EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35518) -EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 550938) -EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64176) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 124075) -EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144241) -EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 429003) -EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 21290) -EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 283068) -EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20919) -EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 220503) -EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49340) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48808) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 318084) -EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 73870) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232864) -EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 282196) -EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262818) -EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 231770) -EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132429) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38147) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 106186) +EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_revert_Revert() (gas: 114669) +EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 393688) +EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 146300) +EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 792936) +EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 177217) +EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 30579) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 62395) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 45654) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 215189) +EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 307760) +EVM2EVMOffRamp__report:test_Report_Success() (gas: 128098) +EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 256634) +EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 265225) +EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 340187) +EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 316321) +EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 16987) +EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153241) +EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5335554) +EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143975) +EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21318) +EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36507) +EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51692) +EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 474394) +EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 47651) +EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152453) +EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102714) +EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165422) +EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 179806) +EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 42507) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 160577) +EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 175812) +EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 249254) +EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115658) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 411499) +EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54189) +EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132662) +EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52156) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 567248) +EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 501657) +EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35496) +EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 550680) +EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64066) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123903) +EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 144091) +EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428867) +EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 21268) +EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 283024) +EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20897) +EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 220438) +EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 49318) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48786) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 318040) +EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 73826) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 232527) +EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 281657) +EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 262239) +EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 231186) +EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 132294) EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38446) -EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3246952) -EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 82871) -EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 485626) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188746) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 26991) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 45246) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27179) -EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 192546) -EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 190249) -EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2062897) -EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145382) -EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8882) -EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40153) -EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38236) -EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142050) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162488) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16667) -EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197698) +EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556) +EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091) +EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 485534) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 188654) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 27057) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 45444) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 27245) +EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 192524) +EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 190157) +EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2062971) +EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 145360) +EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8860) +EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40131) +EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38214) +EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 141984) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162596) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16734) +EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197765) EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5579769) EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35778) EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 98428) @@ -600,13 +600,13 @@ NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23694) NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38763) NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71847) -NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 253259) -NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 255559) -NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 308529) -NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 291650) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 250348) -NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 238382) -NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 144725) +NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 253145) +NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 255401) +NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 308349) +NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 291404) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 249764) +NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 237886) +NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 144703) NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 186694) NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 237762) NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125070) diff --git a/contracts/scripts/native_solc_compile_all_ccip b/contracts/scripts/native_solc_compile_all_ccip index a856dea2f7..a3e116b9ac 100755 --- a/contracts/scripts/native_solc_compile_all_ccip +++ b/contracts/scripts/native_solc_compile_all_ccip @@ -14,7 +14,7 @@ OPTIMIZE_RUNS_MULTI_OFFRAMP=2500 SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt +#python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt solc-select install $SOLC_VERSION solc-select use $SOLC_VERSION export SOLC_VERSION=$SOLC_VERSION diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index 6c7e594bdc..7d492ccd8d 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -280,8 +280,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio uint256 timestampCommitted = ICommitStore(i_commitStore).verify(hashedLeaves, report.proofs, report.proofFlagBits); if (timestampCommitted == 0) revert RootNotCommitted(); - bool manualExecution = manualExecGasLimits.length != 0; - // Execute messages for (uint256 i = 0; i < numMsgs; ++i) { Internal.EVM2EVMMessage memory message = report.messages[i]; @@ -301,10 +299,11 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio emit SkippedAlreadyExecutedMessage(message.sequenceNumber); continue; } - - uint256[] memory destGasAmounts = manualExecution ? manualExecGasLimits[i].destGasAmounts : new uint256[](0); + uint256[] memory destGasAmounts; + bool manualExecution = manualExecGasLimits.length != 0; if (manualExecution) { + destGasAmounts = manualExecGasLimits[i].destGasAmounts; bool isOldCommitReport = (block.timestamp - timestampCommitted) > s_dynamicConfig.permissionLessExecutionThresholdSeconds; // Manually execution is fine if we previously failed or if the commit report is just too old @@ -619,8 +618,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio bytes memory originalSender, address receiver, Internal.SourceTokenData memory sourceTokenData, - bytes memory offchainTokenData, - uint256 destGasAmount + bytes memory offchainTokenData ) internal returns (Client.EVMTokenAmount memory destTokenAmount) { // We need to safely decode the token address from the sourceTokenData, as it could be wrong, // in which case it doesn't have to be a valid EVM address. @@ -635,8 +633,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio revert NotACompatiblePool(localPoolAddress); } - uint256 destinationGasAmount = destGasAmount > 0 ? destGasAmount : sourceTokenData.destGasAmount; - // We determined that the pool address is a valid EVM address, but that does not mean the code at this // address is a (compatible) pool contract. _callWithExactGasSafeReturnData will check if the location // contains a contract. If it doesn't it reverts with a known error, which we catch gracefully. @@ -658,7 +654,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio }) ), localPoolAddress, - destinationGasAmount, + sourceTokenData.destGasAmount, Internal.GAS_FOR_CALL_EXACT_CHECK, Internal.MAX_RET_BYTES ); @@ -677,7 +673,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio (success, returnData,) = CallWithExactGas._callWithExactGasSafeReturnData( abi.encodeCall(IERC20.transfer, (receiver, localAmount)), localToken, - destinationGasAmount - gasUsedReleaseOrMint, + sourceTokenData.destGasAmount - gasUsedReleaseOrMint, Internal.GAS_FOR_CALL_EXACT_CHECK, Internal.MAX_RET_BYTES ); @@ -707,18 +703,22 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio // Creating a copy is more gas efficient than initializing a new array. destTokenAmounts = sourceTokenAmounts; uint256 value = 0; - bool isManualExecution = destGasAmounts.length != 0; for (uint256 i = 0; i < sourceTokenAmounts.length; ++i) { + Internal.SourceTokenData memory sourceTokenData = + abi.decode(encodedSourceTokenData[i], (Internal.SourceTokenData)); + if (destGasAmounts.length != 0) { + if (destGasAmounts[i] != 0) { + sourceTokenData.destGasAmount = uint32(destGasAmounts[i]); + } + } destTokenAmounts[i] = _releaseOrMintToken( sourceTokenAmounts[i].amount, originalSender, receiver, // This should never revert as the onRamp encodes the sourceTokenData struct. Only the inner components from // this struct come from untrusted sources. - abi.decode(encodedSourceTokenData[i], (Internal.SourceTokenData)), - offchainTokenData[i], - // If we are manually executing, we need to account for the gas used in the token transfer. - isManualExecution ? destGasAmounts[i] : 0 + sourceTokenData, + offchainTokenData[i] ); if (s_rateLimitedTokensDestToSource.contains(destTokenAmounts[i].token)) { diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol index a226b21400..2410af7c1c 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOffRampHelper.sol @@ -23,12 +23,9 @@ contract EVM2EVMOffRampHelper is EVM2EVMOffRamp, IgnoreContractSize { bytes calldata originalSender, address receiver, Internal.SourceTokenData calldata sourceTokenData, - bytes calldata offchainTokenData, - uint256 destGasAmount + bytes calldata offchainTokenData ) external returns (Client.EVMTokenAmount memory) { - return _releaseOrMintToken( - sourceTokenAmount, originalSender, receiver, sourceTokenData, offchainTokenData, destGasAmount - ); + return _releaseOrMintToken(sourceTokenAmount, originalSender, receiver, sourceTokenData, offchainTokenData); } function releaseOrMintTokens( diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol index 59254a32a9..4d803eb8b5 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol @@ -1501,7 +1501,7 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup { ) ); - s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData, 0); + s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData); assertEq(startingBalance + amount, dstToken1.balanceOf(OWNER)); } @@ -1532,7 +1532,7 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.NotACompatiblePool.selector, returnedPool)); - s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData, 0); + s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData); // A contract that doesn't support the interface should also revert returnedPool = address(s_offRamp); @@ -1545,7 +1545,7 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup { vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.NotACompatiblePool.selector, returnedPool)); - s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData, 0); + s_offRamp.releaseOrMintToken(amount, originalSender, OWNER, sourceTokenData, offchainTokenData); } function test__releaseOrMintToken_TokenHandlingError_revert_Revert() public { @@ -1568,7 +1568,7 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup { vm.mockCallRevert(destToken, abi.encodeWithSelector(IERC20.transfer.selector, receiver, amount), revertData); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.TokenHandlingError.selector, revertData)); - s_offRamp.releaseOrMintToken(amount, originalSender, receiver, sourceTokenData, offchainTokenData, 0); + s_offRamp.releaseOrMintToken(amount, originalSender, receiver, sourceTokenData, offchainTokenData); } } diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go index d298a6c867..6b19c6b488 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -110,7 +110,7 @@ type RateLimiterTokenBucket struct { var EVM2EVMOffRampMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"uint256[]\",\"name\":\"destGasAmounts\",\"type\":\"uint256[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"destGasAmounts\",\"type\":\"uint256[]\"}],\"internalType\":\"structEVM2EVMOffRamp.GasLimitOverride[]\",\"name\":\"gasLimitOverrides\",\"type\":\"tuple[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101a06040523480156200001257600080fd5b5060405162005f7438038062005f748339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516158ab620006c9600039600081816102ec01528181611a590152612c370152600081816102bd01528181611a310152611ee701526000818161028e015281816110300152818161109501528181611a070152818161247901526124e30152600061208601526000818161025f01526119dd0152600081816101ff015261198101526000818161022f015281816119b501528181611ea401528181612d6501526133fa0152600081816101d00152818161195c0152612166015260008181611dfe0152611e4a01526158ab6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063c92b283211610066578063c92b2832146105f3578063f077b59214610606578063f2fde38b1461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063b1fc6515146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063546719cd1161013a578063704b6c0211610114578063704b6c02146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063546719cd146103c3578063599f643114610427578063666cab8d1461044c57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b57806330c2fd44146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613f4b565b60405180910390f35b610345610340366004613fe1565b61062f565b6040516103299190614041565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b604051610329919061409f565b6103ae6103a93660046142c8565b6106aa565b005b6103ae6103be36600461464a565b610a9e565b6103cb610d41565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610454610df6565b6040516103299190614717565b6103ae61046f36600461472a565b610e58565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b6040516103299190614747565b6103ae610f21565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae61018236600461479d565b61057061056b36600461472a565b611004565b60405167ffffffffffffffff9091168152602001610329565b6103ae610597366004614869565b611107565b6000546001600160a01b0316610434565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614912565b6112da565b6103ae6105ee366004614b85565b6114e5565b6103ae610601366004614cb7565b6115d6565b61060e611641565b604051610329929190614d25565b6103ae61062a36600461472a565b611767565b600061063d60016004614d79565b600261064a608085614dbb565b67ffffffffffffffff1661065e9190614de2565b6010600061066d608087614df9565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4613ffe565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e20565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e20565b61073c611778565b610745856117ee565b60095460005b818110156107bc57600860006009838154811061076a5761076a614e3a565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df614e3a565b60200260200101519050600060028111156107fc576107fc613ffe565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e613ffe565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e20565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b613ffe565b0217905550905050508060010190506107c3565b5087516109739060099060208b0190613eb9565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16614e69565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611ab8565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90614e8c565b60405180910390a150505050505050505050565b333014610ad7576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610b14565b6040805180820190915260008082526020820152815260200190600190039081610aed5790505b506101408501515190915015610b7557610b728461014001518560200151604051602001610b5191906001600160a01b0391909116815260200190565b60405160208183030381529060405286604001518761016001518787611b45565b90505b61012084015151158015610b8b57506080840151155b80610ba2575060408401516001600160a01b03163b155b80610be257506040840151610be0906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611ca3565b155b15610bed5750505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808961018001518152602001896000015167ffffffffffffffff1681526020018960200151604051602001610c6591906001600160a01b0391909116815260200190565b604051602081830303815290604052815260200189610120015181526020018681525061138889608001518a604001516040518563ffffffff1660e01b8152600401610cb49493929190614f67565b6000604051808303816000875af1158015610cd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfb9190810190615071565b509150915081610d3957806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610df190611cbf565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610e4e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e30575b5050505050905090565b6000546001600160a01b03163314801590610e7e57506002546001600160a01b03163314155b15610eb5576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b6001546001600160a01b03163314610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110091906150cb565b9392505050565b61110f611778565b60005b82518110156111e25761114c83828151811061113057611130614e3a565b602002602001015160200151600c611d7190919063ffffffff16565b156111da577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061118457611184614e3a565b6020026020010151600001518483815181106111a2576111a2614e3a565b6020026020010151602001516040516111d19291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611112565b5060005b81518110156112d55761123f82828151811061120457611204614e3a565b60200260200101516020015183838151811061122257611222614e3a565b602002602001015160000151600c611d869092919063ffffffff16565b156112cd577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061127757611277614e3a565b60200260200101516000015183838151811061129557611295614e3a565b6020026020010151602001516040516112c49291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b6001016111e6565b505050565b6112e48787611da4565b60055488359080821461132d576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b611335611dfb565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156113bd576113bd613ffe565b60028111156113ce576113ce613ffe565b90525090506002816020015160028111156113eb576113eb613ffe565b14801561142557506009816000015160ff168154811061140d5761140d614e3a565b6000918252602090912001546001600160a01b031633145b61145b576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611469856020614de2565b611474886020614de2565b6114808b6101446150e8565b61148a91906150e8565b61149491906150e8565b90503681146114d8576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6114ed611dfb565b8151518151811461152a576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156115cb57600083828151811061154957611549614e3a565b6020026020010151600001519050806000146115c257845180518390811061157357611573614e3a565b6020026020010151608001518110156115c2576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b5060010161152d565b506112d58383611e7c565b6000546001600160a01b031633148015906115fc57506002546001600160a01b03163314155b15611633576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163e6003826128ed565b50565b6060806000611650600c612ad2565b90508067ffffffffffffffff81111561166b5761166b6140b2565b604051908082528060200260200182016040528015611694578160200160208202803683370190505b5092508067ffffffffffffffff8111156116b0576116b06140b2565b6040519080825280602002602001820160405280156116d9578160200160208202803683370190505b50915060005b81811015611761576000806116f5600c84612add565b915091508086848151811061170c5761170c614e3a565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061173f5761173f614e3a565b6001600160a01b039092166020928302919091019091015250506001016116df565b50509091565b61176f611778565b61163e81612afb565b6000546001600160a01b031633146117ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b600081806020019051810190611804919061510f565b60608101519091506001600160a01b031661184b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611aac9184906151aa565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611adc9998979695949392919061526c565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b805186906000901515815b8951811015611c8757611bee8a8281518110611b6e57611b6e614e3a565b6020026020010151602001518a8a8a8581518110611b8e57611b8e614e3a565b6020026020010151806020019051810190611ba991906152f4565b8a8681518110611bbb57611bbb614e3a565b602002602001015187611bcf576000612bd6565b8a8781518110611be157611be1614e3a565b6020026020010151612bd6565b848281518110611c0057611c00614e3a565b6020026020010181905250611c3c848281518110611c2057611c20614e3a565b602002602001015160000151600c612fdd90919063ffffffff16565b15611c7f57611c72848281518110611c5657611c56614e3a565b6020908102919091010151600b546001600160a01b0316612ff2565b611c7c90846150e8565b92505b600101611b50565b508115611c9757611c9782613113565b50509695505050505050565b6000611cae83613120565b801561110057506111008383613184565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611d4d82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611d319190614d79565b85608001516fffffffffffffffffffffffffffffffff16613253565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000611100836001600160a01b03841661327b565b6000611d9c846001600160a01b03851684613287565b949350505050565b611df7611db3828401846153ba565b6040805160008082526020820190925290611df1565b604080518082019091526000815260606020820152815260200190600190039081611dc95790505b50611e7c565b5050565b467f0000000000000000000000000000000000000000000000000000000000000000146117ec576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a91906153ef565b15611f91576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611fce576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015151811461200c576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612027576120276140b2565b604051908082528060200260200182016040528015612050578160200160208202803683370190505b50905060005b828110156121285760008560000151828151811061207657612076614e3a565b602002602001015190506120aa817f000000000000000000000000000000000000000000000000000000000000000061329d565b8383815181106120bc576120bc614e3a565b6020026020010181815250508061018001518383815181106120e0576120e0614e3a565b60200260200101511461211f576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101612056565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263320488759261219c9287929160040161543d565b602060405180830381865afa1580156121b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121dd9190615473565b905080600003612219576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156128e45760008760000151828151811061224057612240614e3a565b602002602001015190506000612259826060015161062f565b9050600081600381111561226f5761226f613ffe565b148061228c5750600381600381111561228a5761228a613ffe565b145b6122d257816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506128dc565b6000846122ed5760408051600081526020810190915261230c565b8884815181106122ff576122ff614e3a565b6020026020010151602001515b905084156123cf57600a5460009063ffffffff1661232a8842614d79565b119050808061234a5750600383600381111561234857612348613ffe565b145b612380576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b89858151811061239257612392614e3a565b6020026020010151600001516000146123c9578985815181106123b7576123b7614e3a565b60209081029190910101515160808501525b50612433565b60008260038111156123e3576123e3613ffe565b1461243357606083015160405167ffffffffffffffff90911681527f67d9ba0f63d427c482c2736300e6d5a34c6691dbcdea8ad35828a1f1ba47e8729060200160405180910390a15050506128dc565b60c083015167ffffffffffffffff16156126b4576020808401516001600160a01b03166000908152600f909152604081205467ffffffffffffffff169081900361261e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161561261e5760208401516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa15801561252c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061255091906150cb565b60c085015190915067ffffffffffffffff1661256d82600161548c565b67ffffffffffffffff16146125ce5783602001516001600160a01b03168460c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a3505050506128dc565b6020848101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600083600381111561263257612632613ffe565b036126b25760c084015167ffffffffffffffff1661265182600161548c565b67ffffffffffffffff16146126b25783602001516001600160a01b03168460c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a3505050506128dc565b505b60008a6020015185815181106126cc576126cc614e3a565b602002602001015190506126f884606001518560000151866101400151518761012001515185516133f8565b61270784606001516001613579565b600080612715868486613623565b91509150612727866060015183613579565b871561279357600382600381111561274157612741613ffe565b0361279357600085600381111561275a5761275a613ffe565b1461279357806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b60028260038111156127a7576127a7613ffe565b146127ff5760038260038111156127c0576127c0613ffe565b146127ff578560600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee9291906154ad565b60c086015167ffffffffffffffff161561288757600085600381111561282757612827613ffe565b03612887576020808701516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff169161285f836154cb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b856101800151866060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516128cd9291906154e8565b60405180910390a35050505050505b600101612220565b50505050505050565b815460009061291690700100000000000000000000000000000000900463ffffffff1642614d79565b905080156129b8576001830154835461295e916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613253565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546129de916fffffffffffffffffffffffffffffffff90811691166136f0565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612ac59084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a482613706565b6000808080612aec8686613711565b909450925050505b9250929050565b336001600160a01b03821603612b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60408051808201909152600080825260208201526000612bf98560200151613720565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612c7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca29190615508565b90506001600160a01b0381161580612cea5750612ce86001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611ca3565b155b15612d2c576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b6000808511612d4557866060015163ffffffff16612d47565b845b90506000806000612e436040518061010001604052808e81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018d6001600160a01b031681526020018f8152602001886001600160a01b031681526020018c6000015181526020018c6040015181526020018b815250604051602401612ddf9190615525565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052868661138860846137c6565b92509250925082612e8257816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b8151602014612eca5781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b600082806020019051810190612ee09190615473565b6040516001600160a01b038e16602482015260448101829052909150612f709060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905288612f668589614d79565b61138860846137c6565b50909450925083612faf57826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b604080518082019091526001600160a01b039097168752602087015250939450505050509695505050505050565b6000611100836001600160a01b0384166138ec565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307c91906155fc565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036130e55783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b6020840151611d9c907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906138f8565b61163e6003826000613935565b600061314c827f01ffc9a700000000000000000000000000000000000000000000000000000000613184565b80156106a4575061317d827fffffffff00000000000000000000000000000000000000000000000000000000613184565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561323c575060208210155b80156132485750600081115b979650505050505050565b6000613272856132638486614de2565b61326d90876150e8565b6136f0565b95945050505050565b60006111008383613c84565b6000611d9c84846001600160a01b038516613ca1565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016133339897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161336c919061565c565b6040516020818303038152906040528051906020012087610160015160405160200161339891906156c9565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613471576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff168311156134c9576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b80831461350e576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561357257600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b5050505050565b60006002613588608085614dbb565b67ffffffffffffffff1661359c9190614de2565b905060006010816135ae608087614df9565b67ffffffffffffffff1681526020810191909152604001600020549050816135d860016004614d79565b901b1916818360038111156135ef576135ef613ffe565b901b178060106000613602608088614df9565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517f30c2fd4400000000000000000000000000000000000000000000000000000000815260009060609030906330c2fd4490613669908890889088906004016156dc565b600060405180830381600087803b15801561368357600080fd5b505af1925050508015613694575060015b6136d3573d8080156136c2576040519150601f19603f3d011682016040523d82523d6000602084013e6136c7565b606091505b506003925090506136e8565b50506040805160208101909152600081526002905b935093915050565b60008183106136ff5781611100565b5090919050565b60006106a482613cbe565b6000808080612aec8686613cc9565b6000815160201461375f57816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b6000828060200190518101906137759190615473565b90506001600160a01b0381118061378d575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061409f565b6000606060008361ffff1667ffffffffffffffff8111156137e9576137e96140b2565b6040519080825280601f01601f191660200182016040528015613813576020820181803683370190505b509150863b613846577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613879577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106138b2577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156138d55750835b808352806000602085013e50955095509592505050565b60006111008383613cf4565b6000670de0b6b3a764000061392b837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614de2565b611100919061585b565b825474010000000000000000000000000000000000000000900460ff16158061395c575081155b1561396657505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906139ac90700100000000000000000000000000000000900463ffffffff1642614d79565b90508015613a6c57818311156139ee576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613a289083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613253565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613b09576001600160a01b038416613abe576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613c025760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613b4d9082614d79565b613b57878a614d79565b613b6191906150e8565b613b6b919061585b565b90506001600160a01b038616613bb7576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613c0c8584614d79565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260028301602052604081208190556111008383613d00565b60008281526002840160205260408120829055611d9c8484613d0c565b60006106a482613d18565b60008080613cd78585613d22565b600081815260029690960160205260409095205494959350505050565b60006111008383613d2e565b60006111008383613d46565b60006111008383613e40565b60006106a4825490565b60006111008383613e8f565b60008181526001830160205260408120541515611100565b60008181526001830160205260408120548015613e2f576000613d6a600183614d79565b8554909150600090613d7e90600190614d79565b9050818114613de3576000866000018281548110613d9e57613d9e614e3a565b9060005260206000200154905080876000018481548110613dc157613dc1614e3a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613df457613df461586f565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b6000818152600183016020526040812054613e87575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b6000826000018281548110613ea657613ea6614e3a565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613f26579160200282015b82811115613f2657825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613ed9565b50613f32929150613f36565b5090565b5b80821115613f325760008155600101613f37565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461163e57600080fd5b8035613fdc81613fbb565b919050565b600060208284031215613ff357600080fd5b813561110081613fbb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061403d5761403d613ffe565b9052565b602081016106a4828461402d565b60005b8381101561406a578181015183820152602001614052565b50506000910152565b6000815180845261408b81602086016020860161404f565b601f01601f19169290920160200192915050565b6020815260006111006020830184614073565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614104576141046140b2565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614104576141046140b2565b6040516080810167ffffffffffffffff81118282101715614104576141046140b2565b604051601f8201601f1916810167ffffffffffffffff8111828210171561417a5761417a6140b2565b604052919050565b600067ffffffffffffffff82111561419c5761419c6140b2565b5060051b60200190565b6001600160a01b038116811461163e57600080fd5b8035613fdc816141a6565b600082601f8301126141d757600080fd5b813560206141ec6141e783614182565b614151565b8083825260208201915060208460051b87010193508684111561420e57600080fd5b602086015b84811015614233578035614226816141a6565b8352918301918301614213565b509695505050505050565b803560ff81168114613fdc57600080fd5b600067ffffffffffffffff821115614269576142696140b2565b50601f01601f191660200190565b600082601f83011261428857600080fd5b81356142966141e78261424f565b8181528460208386010111156142ab57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156142e157600080fd5b863567ffffffffffffffff808211156142f957600080fd5b6143058a838b016141c6565b9750602089013591508082111561431b57600080fd5b6143278a838b016141c6565b965061433560408a0161423e565b9550606089013591508082111561434b57600080fd5b6143578a838b01614277565b945061436560808a01613fd1565b935060a089013591508082111561437b57600080fd5b5061438889828a01614277565b9150509295509295509295565b801515811461163e57600080fd5b8035613fdc81614395565b600082601f8301126143bf57600080fd5b813560206143cf6141e783614182565b82815260069290921b840181019181810190868411156143ee57600080fd5b8286015b84811015614233576040818903121561440b5760008081fd5b6144136140e1565b813561441e816141a6565b815281850135858201528352918301916040016143f2565b600082601f83011261444757600080fd5b813560206144576141e783614182565b82815260059290921b8401810191818101908684111561447657600080fd5b8286015b8481101561423357803567ffffffffffffffff81111561449a5760008081fd5b6144a88986838b0101614277565b84525091830191830161447a565b60006101a082840312156144c957600080fd5b6144d161410a565b90506144dc82613fd1565b81526144ea602083016141bb565b60208201526144fb604083016141bb565b604082015261450c60608301613fd1565b60608201526080820135608082015261452760a083016143a3565b60a082015261453860c08301613fd1565b60c082015261454960e083016141bb565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561457657600080fd5b61458286838701614277565b8385015261014092508285013591508082111561459e57600080fd5b6145aa868387016143ae565b838501526101609250828501359150808211156145c657600080fd5b506145d385828601614436565b82840152505061018080830135818301525092915050565b600082601f8301126145fc57600080fd5b8135602061460c6141e783614182565b8083825260208201915060208460051b87010193508684111561462e57600080fd5b602086015b848110156142335780358352918301918301614633565b60008060006060848603121561465f57600080fd5b833567ffffffffffffffff8082111561467757600080fd5b614683878388016144b6565b9450602086013591508082111561469957600080fd5b6146a587838801614436565b935060408601359150808211156146bb57600080fd5b506146c8868287016145eb565b9150509250925092565b60008151808452602080850194506020840160005b8381101561470c5781516001600160a01b0316875295820195908201906001016146e7565b509495945050505050565b60208152600061110060208301846146d2565b60006020828403121561473c57600080fd5b8135611100816141a6565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156147af57600080fd5b813567ffffffffffffffff8111156147c657600080fd5b820160a0818503121561110057600080fd5b600082601f8301126147e957600080fd5b813560206147f96141e783614182565b82815260069290921b8401810191818101908684111561481857600080fd5b8286015b8481101561423357604081890312156148355760008081fd5b61483d6140e1565b8135614848816141a6565b815281850135614857816141a6565b8186015283529183019160400161481c565b6000806040838503121561487c57600080fd5b823567ffffffffffffffff8082111561489457600080fd5b6148a0868387016147d8565b935060208501359150808211156148b657600080fd5b506148c3858286016147d8565b9150509250929050565b60008083601f8401126148df57600080fd5b50813567ffffffffffffffff8111156148f757600080fd5b6020830191508360208260051b8501011115612af457600080fd5b60008060008060008060008060e0898b03121561492e57600080fd5b606089018a81111561493f57600080fd5b8998503567ffffffffffffffff8082111561495957600080fd5b818b0191508b601f83011261496d57600080fd5b81358181111561497c57600080fd5b8c602082850101111561498e57600080fd5b6020830199508098505060808b01359150808211156149ac57600080fd5b6149b88c838d016148cd565b909750955060a08b01359150808211156149d157600080fd5b506149de8b828c016148cd565b999c989b50969995989497949560c00135949350505050565b600082601f830112614a0857600080fd5b81356020614a186141e783614182565b82815260059290921b84018101918181019086841115614a3757600080fd5b8286015b8481101561423357803567ffffffffffffffff811115614a5b5760008081fd5b614a698986838b0101614436565b845250918301918301614a3b565b600060808284031215614a8957600080fd5b614a9161412e565b9050813567ffffffffffffffff80821115614aab57600080fd5b818401915084601f830112614abf57600080fd5b81356020614acf6141e783614182565b82815260059290921b84018101918181019088841115614aee57600080fd5b8286015b84811015614b2657803586811115614b0a5760008081fd5b614b188b86838b01016144b6565b845250918301918301614af2565b5086525085810135935082841115614b3d57600080fd5b614b49878588016149f7565b90850152506040840135915080821115614b6257600080fd5b50614b6f848285016145eb565b6040830152506060820135606082015292915050565b6000806040808486031215614b9957600080fd5b833567ffffffffffffffff80821115614bb157600080fd5b614bbd87838801614a77565b9450602091508186013581811115614bd457600080fd5b8601601f81018813614be557600080fd5b8035614bf36141e782614182565b81815260059190911b8201840190848101908a831115614c1257600080fd5b8584015b83811015614c8557803586811115614c2e5760008081fd5b8501808d03601f1901891315614c445760008081fd5b614c4c6140e1565b8882013581528982013588811115614c645760008081fd5b614c728f8b838601016145eb565b828b015250845250918601918601614c16565b50809750505050505050509250929050565b80356fffffffffffffffffffffffffffffffff81168114613fdc57600080fd5b600060608284031215614cc957600080fd5b6040516060810181811067ffffffffffffffff82111715614cec57614cec6140b2565b6040528235614cfa81614395565b8152614d0860208401614c97565b6020820152614d1960408401614c97565b60408201529392505050565b604081526000614d3860408301856146d2565b828103602084015261327281856146d2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614d4a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614dd657614dd6614d8c565b92169190910692915050565b80820281158282048414176106a4576106a4614d4a565b600067ffffffffffffffff80841680614e1457614e14614d8c565b92169190910492915050565b6020810160038310614e3457614e34613ffe565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614e8257614e82614d4a565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614ebc8184018a6146d2565b90508281036080840152614ed081896146d2565b905060ff871660a084015282810360c0840152614eed8187614073565b905067ffffffffffffffff851660e0840152828103610100840152614f128185614073565b9c9b505050505050505050505050565b60008151808452602080850194506020840160005b8381101561470c57815180516001600160a01b031688528301518388015260409096019590820190600101614f37565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614fa2610120840182614073565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614fde8383614073565b925060808901519150808584030161010086015250614ffd8282614f22565b92505050615011602083018661ffff169052565b83604083015261327260608301846001600160a01b03169052565b600082601f83011261503d57600080fd5b815161504b6141e78261424f565b81815284602083860101111561506057600080fd5b611d9c82602083016020870161404f565b60008060006060848603121561508657600080fd5b835161509181614395565b602085015190935067ffffffffffffffff8111156150ae57600080fd5b6150ba8682870161502c565b925050604084015190509250925092565b6000602082840312156150dd57600080fd5b815161110081613fbb565b808201808211156106a4576106a4614d4a565b805163ffffffff81168114613fdc57600080fd5b600060a0828403121561512157600080fd5b60405160a0810181811067ffffffffffffffff82111715615144576151446140b2565b604052615150836150fb565b815261515e602084016150fb565b6020820152604083015161ffff8116811461517857600080fd5b6040820152606083015161518b816141a6565b6060820152608083015161519e816141a6565b60808201529392505050565b610180810161521b82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152611100565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526152a68285018b6146d2565b915083820360808501526152ba828a6146d2565b915060ff881660a085015283820360c08501526152d78288614073565b90861660e08501528381036101008501529050614f128185614073565b60006020828403121561530657600080fd5b815167ffffffffffffffff8082111561531e57600080fd5b908301906080828603121561533257600080fd5b61533a61412e565b82518281111561534957600080fd5b6153558782860161502c565b82525060208301518281111561536a57600080fd5b6153768782860161502c565b60208301525060408301518281111561538e57600080fd5b61539a8782860161502c565b6040830152506153ac606084016150fb565b606082015295945050505050565b6000602082840312156153cc57600080fd5b813567ffffffffffffffff8111156153e357600080fd5b611d9c84828501614a77565b60006020828403121561540157600080fd5b815161110081614395565b60008151808452602080850194506020840160005b8381101561470c57815187529582019590820190600101615421565b606081526000615450606083018661540c565b8281036020840152615462818661540c565b915050826040830152949350505050565b60006020828403121561548557600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613e3957613e39614d4a565b67ffffffffffffffff8316815260408101611100602083018461402d565b600067ffffffffffffffff808316818103614e8257614e82614d4a565b6154f2818461402d565b604060208201526000611d9c6040830184614073565b60006020828403121561551a57600080fd5b8151611100816141a6565b6020815260008251610100806020850152615544610120850183614073565b91506020850151615561604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161559b60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526155b88483614073565b935060c08701519150808685030160e08701526155d58483614073565b935060e08701519150808685030183870152506155f28382614073565b9695505050505050565b60006040828403121561560e57600080fd5b6156166140e1565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461564257600080fd5b8152615650602084016150fb565b60208201529392505050565b6020815260006111006020830184614f22565b60008282518085526020808601955060208260051b8401016020860160005b848110156156bc57601f198684030189526156aa838351614073565b9884019892509083019060010161568e565b5090979650505050505050565b602081526000611100602083018461566f565b606081526156f760608201855167ffffffffffffffff169052565b6000602085015161571360808401826001600160a01b03169052565b5060408501516001600160a01b03811660a084015250606085015167ffffffffffffffff811660c084015250608085015160e083015260a085015161010061575e8185018315159052565b60c0870151915061012061577d8186018467ffffffffffffffff169052565b60e0880151925061014061579b818701856001600160a01b03169052565b828901519350610160925083838701528189015193506101a0915061018082818801526157cc610200880186614073565b9450818a015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08088870301848901526158088684614f22565b948b01518886039091016101c0890152939450615825858561566f565b9450808a01516101e0880152505050508281036020840152615847818661566f565b905082810360408401526155f2818561540c565b60008261586a5761586a614d8c565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", + Bin: "0x6101a06040523480156200001257600080fd5b5060405162005f6b38038062005f6b8339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516158a2620006c9600039600081816102ec01528181611a590152612c480152600081816102bd01528181611a310152611f1301526000818161028e015281816110300152818161109501528181611a070152818161249001526124fa015260006120b201526000818161025f01526119dd0152600081816101ff015261198101526000818161022f015281816119b501528181611ed001528181612d5901526133fc0152600081816101d00152818161195c0152612192015260008181611e2a0152611e7601526158a26000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063c92b283211610066578063c92b2832146105f3578063f077b59214610606578063f2fde38b1461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063b1fc6515146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063546719cd1161013a578063704b6c0211610114578063704b6c02146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063546719cd146103c3578063599f643114610427578063666cab8d1461044c57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b57806330c2fd44146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613f4d565b60405180910390f35b610345610340366004613fe3565b61062f565b6040516103299190614043565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b60405161032991906140a1565b6103ae6103a93660046142bf565b6106aa565b005b6103ae6103be366004614641565b610a9e565b6103cb610d41565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610454610df6565b604051610329919061470e565b6103ae61046f366004614721565b610e58565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b604051610329919061473e565b6103ae610f21565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614794565b61057061056b366004614721565b611004565b60405167ffffffffffffffff9091168152602001610329565b6103ae610597366004614860565b611107565b6000546001600160a01b0316610434565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614909565b6112da565b6103ae6105ee366004614b7c565b6114e5565b6103ae610601366004614cae565b6115d6565b61060e611641565b604051610329929190614d1c565b6103ae61062a366004614721565b611767565b600061063d60016004614d70565b600261064a608085614db2565b67ffffffffffffffff1661065e9190614dd9565b6010600061066d608087614df0565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4614000565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e17565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e17565b61073c611778565b610745856117ee565b60095460005b818110156107bc57600860006009838154811061076a5761076a614e31565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df614e31565b60200260200101519050600060028111156107fc576107fc614000565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e614000565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614e17565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b614000565b0217905550905050508060010190506107c3565b5087516109739060099060208b0190613ebb565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16614e60565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611ab8565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90614e83565b60405180910390a150505050505050505050565b333014610ad7576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281610b14565b6040805180820190915260008082526020820152815260200190600190039081610aed5790505b506101408501515190915015610b7557610b728461014001518560200151604051602001610b5191906001600160a01b0391909116815260200190565b60405160208183030381529060405286604001518761016001518787611b45565b90505b61012084015151158015610b8b57506080840151155b80610ba2575060408401516001600160a01b03163b155b80610be257506040840151610be0906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000611ccf565b155b15610bed5750505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808961018001518152602001896000015167ffffffffffffffff1681526020018960200151604051602001610c6591906001600160a01b0391909116815260200190565b604051602081830303815290604052815260200189610120015181526020018681525061138889608001518a604001516040518563ffffffff1660e01b8152600401610cb49493929190614f5e565b6000604051808303816000875af1158015610cd3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cfb9190810190615068565b509150915081610d3957806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610df190611ceb565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610e4e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e30575b5050505050905090565b6000546001600160a01b03163314801590610e7e57506002546001600160a01b03163314155b15610eb5576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b6001546001600160a01b03163314610f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156110dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110091906150c2565b9392505050565b61110f611778565b60005b82518110156111e25761114c83828151811061113057611130614e31565b602002602001015160200151600c611d9d90919063ffffffff16565b156111da577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061118457611184614e31565b6020026020010151600001518483815181106111a2576111a2614e31565b6020026020010151602001516040516111d19291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611112565b5060005b81518110156112d55761123f82828151811061120457611204614e31565b60200260200101516020015183838151811061122257611222614e31565b602002602001015160000151600c611db29092919063ffffffff16565b156112cd577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061127757611277614e31565b60200260200101516000015183838151811061129557611295614e31565b6020026020010151602001516040516112c49291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b6001016111e6565b505050565b6112e48787611dd0565b60055488359080821461132d576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b611335611e27565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff808216845292939192918401916101009091041660028111156113bd576113bd614000565b60028111156113ce576113ce614000565b90525090506002816020015160028111156113eb576113eb614000565b14801561142557506009816000015160ff168154811061140d5761140d614e31565b6000918252602090912001546001600160a01b031633145b61145b576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611469856020614dd9565b611474886020614dd9565b6114808b6101446150df565b61148a91906150df565b61149491906150df565b90503681146114d8576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6114ed611e27565b8151518151811461152a576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156115cb57600083828151811061154957611549614e31565b6020026020010151600001519050806000146115c257845180518390811061157357611573614e31565b6020026020010151608001518110156115c2576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b5060010161152d565b506112d58383611ea8565b6000546001600160a01b031633148015906115fc57506002546001600160a01b03163314155b15611633576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61163e6003826128fe565b50565b6060806000611650600c612ae3565b90508067ffffffffffffffff81111561166b5761166b6140b4565b604051908082528060200260200182016040528015611694578160200160208202803683370190505b5092508067ffffffffffffffff8111156116b0576116b06140b4565b6040519080825280602002602001820160405280156116d9578160200160208202803683370190505b50915060005b81811015611761576000806116f5600c84612aee565b915091508086848151811061170c5761170c614e31565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061173f5761173f614e31565b6001600160a01b039092166020928302919091019091015250506001016116df565b50509091565b61176f611778565b61163e81612b0c565b6000546001600160a01b031633146117ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b6000818060200190518101906118049190615106565b60608101519091506001600160a01b031661184b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611aac9184906151a1565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611adc99989796959493929190615263565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b856000805b8851811015611cb4576000868281518110611b6757611b67614e31565b6020026020010151806020019051810190611b8291906152eb565b90508451600014611bd757848281518110611b9f57611b9f614e31565b6020026020010151600014611bd757848281518110611bc057611bc0614e31565b602090810291909101015163ffffffff1660608201525b611c1a8a8381518110611bec57611bec614e31565b6020026020010151602001518a8a848a8781518110611c0d57611c0d614e31565b6020026020010151612be7565b848381518110611c2c57611c2c614e31565b6020026020010181905250611c68848381518110611c4c57611c4c614e31565b602002602001015160000151600c612fe890919063ffffffff16565b15611cab57611c9e848381518110611c8257611c82614e31565b6020908102919091010151600b546001600160a01b0316612ffd565b611ca890846150df565b92505b50600101611b4a565b508015611cc457611cc48161311e565b509695505050505050565b6000611cda8361312b565b80156111005750611100838361318f565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611d7982606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611d5d9190614d70565b85608001516fffffffffffffffffffffffffffffffff1661325e565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6000611100836001600160a01b03841661327d565b6000611dc8846001600160a01b03851684613289565b949350505050565b611e23611ddf828401846153b1565b6040805160008082526020820190925290611e1d565b604080518082019091526000815260606020820152815260200190600190039081611df55790505b50611ea8565b5050565b467f0000000000000000000000000000000000000000000000000000000000000000146117ec576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906153e6565b15611fbd576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611ffa576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114612038576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115612053576120536140b4565b60405190808252806020026020018201604052801561207c578160200160208202803683370190505b50905060005b82811015612154576000856000015182815181106120a2576120a2614e31565b602002602001015190506120d6817f000000000000000000000000000000000000000000000000000000000000000061329f565b8383815181106120e8576120e8614e31565b60200260200101818152505080610180015183838151811061210c5761210c614e31565b60200260200101511461214b576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101612082565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016926332048875926121c892879291600401615434565b602060405180830381865afa1580156121e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612209919061546a565b905080600003612245576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610d395760008660000151828151811061226857612268614e31565b602002602001015190506000612281826060015161062f565b9050600081600381111561229757612297614000565b14806122b4575060038160038111156122b2576122b2614000565b145b6122fa57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506128f6565b8651606090158015906123e55788858151811061231957612319614e31565b6020908102919091018101510151600a5490925060009063ffffffff166123408842614d70565b11905080806123605750600384600381111561235e5761235e614000565b145b612396576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8986815181106123a8576123a8614e31565b6020026020010151600001516000146123df578986815181106123cd576123cd614e31565b60209081029190910101515160808601525b5061244a565b60008360038111156123f9576123f9614000565b1461244a57606084015160405167ffffffffffffffff90911681527f67d9ba0f63d427c482c2736300e6d5a34c6691dbcdea8ad35828a1f1ba47e8729060200160405180910390a1505050506128f6565b60c084015167ffffffffffffffff16156126cd576020808501516001600160a01b03166000908152600f909152604081205467ffffffffffffffff1690819003612636577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156126365760208501516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612543573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256791906150c2565b60c086015190915067ffffffffffffffff16612584826001615483565b67ffffffffffffffff16146125e65784602001516001600160a01b03168560c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a350505050506128f6565b6020858101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600084600381111561264a5761264a614000565b036126cb5760c085015167ffffffffffffffff16612669826001615483565b67ffffffffffffffff16146126cb5784602001516001600160a01b03168560c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a350505050506128f6565b505b60008a6020015186815181106126e5576126e5614e31565b6020026020010151905061271185606001518660000151876101400151518861012001515185516133fa565b6127208560600151600161357b565b60008061272e878487613625565b9150915061274087606001518361357b565b83156127ac57600382600381111561275a5761275a614000565b036127ac57600086600381111561277357612773614000565b146127ac57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b60028260038111156127c0576127c0614000565b146128185760038260038111156127d9576127d9614000565b14612818578660600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee9291906154a4565b60c087015167ffffffffffffffff16156128a057600086600381111561284057612840614000565b036128a0576020808801516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff1691612878836154c2565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b866101800151876060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516128e69291906154df565b60405180910390a3505050505050505b600101612248565b815460009061292790700100000000000000000000000000000000900463ffffffff1642614d70565b905080156129c9576001830154835461296f916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661325e565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546129ef916fffffffffffffffffffffffffffffffff90811691166136f2565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612ad69084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a482613708565b6000808080612afd8686613713565b909450925050505b9250929050565b336001600160a01b03821603612b7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60408051808201909152600080825260208201526000612c0a8460200151613722565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb391906154ff565b90506001600160a01b0381161580612cfb5750612cf96001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000611ccf565b155b15612d3d576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b6000806000612e426040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a60400151815260200189815250604051602401612dd3919061551c565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905260608a0151869063ffffffff1661138860846137c8565b92509250925082612e8157816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b8151602014612ec95781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b600082806020019051810190612edf919061546a565b6040516001600160a01b038c16602482015260448101829052909150612f7c9060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260608b01518890612f7290869063ffffffff16614d70565b61138860846137c8565b50909450925083612fbb57826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b604080518082019091526001600160a01b0390961686526020860152509293505050505b95945050505050565b6000611100836001600160a01b0384166138ee565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613063573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308791906155f3565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036130f05783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b6020840151611dc8907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906138fa565b61163e6003826000613937565b6000613157827f01ffc9a70000000000000000000000000000000000000000000000000000000061318f565b80156106a45750613188827fffffffff0000000000000000000000000000000000000000000000000000000061318f565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613247575060208210155b80156132535750600081115b979650505050505050565b6000612fdf8561326e8486614dd9565b61327890876150df565b6136f2565b60006111008383613c86565b6000611dc884846001600160a01b038516613ca3565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016133359897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161336e9190615653565b6040516020818303038152906040528051906020012087610160015160405160200161339a91906156c0565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614613473576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff168311156134cb576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b808314613510576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561357457600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b5050505050565b6000600261358a608085614db2565b67ffffffffffffffff1661359e9190614dd9565b905060006010816135b0608087614df0565b67ffffffffffffffff1681526020810191909152604001600020549050816135da60016004614d70565b901b1916818360038111156135f1576135f1614000565b901b178060106000613604608088614df0565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517f30c2fd4400000000000000000000000000000000000000000000000000000000815260009060609030906330c2fd449061366b908890889088906004016156d3565b600060405180830381600087803b15801561368557600080fd5b505af1925050508015613696575060015b6136d5573d8080156136c4576040519150601f19603f3d011682016040523d82523d6000602084013e6136c9565b606091505b506003925090506136ea565b50506040805160208101909152600081526002905b935093915050565b60008183106137015781611100565b5090919050565b60006106a482613cc0565b6000808080612afd8686613ccb565b6000815160201461376157816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b600082806020019051810190613777919061546a565b90506001600160a01b0381118061378f575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee91906140a1565b6000606060008361ffff1667ffffffffffffffff8111156137eb576137eb6140b4565b6040519080825280601f01601f191660200182016040528015613815576020820181803683370190505b509150863b613848577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a8581101561387b577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106138b4577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156138d75750835b808352806000602085013e50955095509592505050565b60006111008383613cf6565b6000670de0b6b3a764000061392d837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614dd9565b6111009190615852565b825474010000000000000000000000000000000000000000900460ff16158061395e575081155b1561396857505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906139ae90700100000000000000000000000000000000900463ffffffff1642614d70565b90508015613a6e57818311156139f0576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613a2a9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661325e565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613b0b576001600160a01b038416613ac0576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613c045760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613b4f9082614d70565b613b59878a614d70565b613b6391906150df565b613b6d9190615852565b90506001600160a01b038616613bb9576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613c0e8584614d70565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600081815260028301602052604081208190556111008383613d02565b60008281526002840160205260408120829055611dc88484613d0e565b60006106a482613d1a565b60008080613cd98585613d24565b600081815260029690960160205260409095205494959350505050565b60006111008383613d30565b60006111008383613d48565b60006111008383613e42565b60006106a4825490565b60006111008383613e91565b60008181526001830160205260408120541515611100565b60008181526001830160205260408120548015613e31576000613d6c600183614d70565b8554909150600090613d8090600190614d70565b9050818114613de5576000866000018281548110613da057613da0614e31565b9060005260206000200154905080876000018481548110613dc357613dc3614e31565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613df657613df6615866565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b6000818152600183016020526040812054613e89575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b6000826000018281548110613ea857613ea8614e31565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613f28579160200282015b82811115613f2857825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613edb565b50613f34929150613f38565b5090565b5b80821115613f345760008155600101613f39565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461163e57600080fd5b8035613fde81613fbd565b919050565b600060208284031215613ff557600080fd5b813561110081613fbd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061403f5761403f614000565b9052565b602081016106a4828461402f565b60005b8381101561406c578181015183820152602001614054565b50506000910152565b6000815180845261408d816020860160208601614051565b601f01601f19169290920160200192915050565b6020815260006111006020830184614075565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614106576141066140b4565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614106576141066140b4565b6040516080810167ffffffffffffffff81118282101715614106576141066140b4565b604051601f8201601f1916810167ffffffffffffffff8111828210171561417c5761417c6140b4565b604052919050565b600067ffffffffffffffff82111561419e5761419e6140b4565b5060051b60200190565b6001600160a01b038116811461163e57600080fd5b8035613fde816141a8565b600082601f8301126141d957600080fd5b813560206141ee6141e983614184565b614153565b8083825260208201915060208460051b87010193508684111561421057600080fd5b602086015b84811015611cc4578035614228816141a8565b8352918301918301614215565b803560ff81168114613fde57600080fd5b600067ffffffffffffffff821115614260576142606140b4565b50601f01601f191660200190565b600082601f83011261427f57600080fd5b813561428d6141e982614246565b8181528460208386010111156142a257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156142d857600080fd5b863567ffffffffffffffff808211156142f057600080fd5b6142fc8a838b016141c8565b9750602089013591508082111561431257600080fd5b61431e8a838b016141c8565b965061432c60408a01614235565b9550606089013591508082111561434257600080fd5b61434e8a838b0161426e565b945061435c60808a01613fd3565b935060a089013591508082111561437257600080fd5b5061437f89828a0161426e565b9150509295509295509295565b801515811461163e57600080fd5b8035613fde8161438c565b600082601f8301126143b657600080fd5b813560206143c66141e983614184565b82815260069290921b840181019181810190868411156143e557600080fd5b8286015b84811015611cc457604081890312156144025760008081fd5b61440a6140e3565b8135614415816141a8565b815281850135858201528352918301916040016143e9565b600082601f83011261443e57600080fd5b8135602061444e6141e983614184565b82815260059290921b8401810191818101908684111561446d57600080fd5b8286015b84811015611cc457803567ffffffffffffffff8111156144915760008081fd5b61449f8986838b010161426e565b845250918301918301614471565b60006101a082840312156144c057600080fd5b6144c861410c565b90506144d382613fd3565b81526144e1602083016141bd565b60208201526144f2604083016141bd565b604082015261450360608301613fd3565b60608201526080820135608082015261451e60a0830161439a565b60a082015261452f60c08301613fd3565b60c082015261454060e083016141bd565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561456d57600080fd5b6145798683870161426e565b8385015261014092508285013591508082111561459557600080fd5b6145a1868387016143a5565b838501526101609250828501359150808211156145bd57600080fd5b506145ca8582860161442d565b82840152505061018080830135818301525092915050565b600082601f8301126145f357600080fd5b813560206146036141e983614184565b8083825260208201915060208460051b87010193508684111561462557600080fd5b602086015b84811015611cc4578035835291830191830161462a565b60008060006060848603121561465657600080fd5b833567ffffffffffffffff8082111561466e57600080fd5b61467a878388016144ad565b9450602086013591508082111561469057600080fd5b61469c8783880161442d565b935060408601359150808211156146b257600080fd5b506146bf868287016145e2565b9150509250925092565b60008151808452602080850194506020840160005b838110156147035781516001600160a01b0316875295820195908201906001016146de565b509495945050505050565b60208152600061110060208301846146c9565b60006020828403121561473357600080fd5b8135611100816141a8565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156147a657600080fd5b813567ffffffffffffffff8111156147bd57600080fd5b820160a0818503121561110057600080fd5b600082601f8301126147e057600080fd5b813560206147f06141e983614184565b82815260069290921b8401810191818101908684111561480f57600080fd5b8286015b84811015611cc4576040818903121561482c5760008081fd5b6148346140e3565b813561483f816141a8565b81528185013561484e816141a8565b81860152835291830191604001614813565b6000806040838503121561487357600080fd5b823567ffffffffffffffff8082111561488b57600080fd5b614897868387016147cf565b935060208501359150808211156148ad57600080fd5b506148ba858286016147cf565b9150509250929050565b60008083601f8401126148d657600080fd5b50813567ffffffffffffffff8111156148ee57600080fd5b6020830191508360208260051b8501011115612b0557600080fd5b60008060008060008060008060e0898b03121561492557600080fd5b606089018a81111561493657600080fd5b8998503567ffffffffffffffff8082111561495057600080fd5b818b0191508b601f83011261496457600080fd5b81358181111561497357600080fd5b8c602082850101111561498557600080fd5b6020830199508098505060808b01359150808211156149a357600080fd5b6149af8c838d016148c4565b909750955060a08b01359150808211156149c857600080fd5b506149d58b828c016148c4565b999c989b50969995989497949560c00135949350505050565b600082601f8301126149ff57600080fd5b81356020614a0f6141e983614184565b82815260059290921b84018101918181019086841115614a2e57600080fd5b8286015b84811015611cc457803567ffffffffffffffff811115614a525760008081fd5b614a608986838b010161442d565b845250918301918301614a32565b600060808284031215614a8057600080fd5b614a88614130565b9050813567ffffffffffffffff80821115614aa257600080fd5b818401915084601f830112614ab657600080fd5b81356020614ac66141e983614184565b82815260059290921b84018101918181019088841115614ae557600080fd5b8286015b84811015614b1d57803586811115614b015760008081fd5b614b0f8b86838b01016144ad565b845250918301918301614ae9565b5086525085810135935082841115614b3457600080fd5b614b40878588016149ee565b90850152506040840135915080821115614b5957600080fd5b50614b66848285016145e2565b6040830152506060820135606082015292915050565b6000806040808486031215614b9057600080fd5b833567ffffffffffffffff80821115614ba857600080fd5b614bb487838801614a6e565b9450602091508186013581811115614bcb57600080fd5b8601601f81018813614bdc57600080fd5b8035614bea6141e982614184565b81815260059190911b8201840190848101908a831115614c0957600080fd5b8584015b83811015614c7c57803586811115614c255760008081fd5b8501808d03601f1901891315614c3b5760008081fd5b614c436140e3565b8882013581528982013588811115614c5b5760008081fd5b614c698f8b838601016145e2565b828b015250845250918601918601614c0d565b50809750505050505050509250929050565b80356fffffffffffffffffffffffffffffffff81168114613fde57600080fd5b600060608284031215614cc057600080fd5b6040516060810181811067ffffffffffffffff82111715614ce357614ce36140b4565b6040528235614cf18161438c565b8152614cff60208401614c8e565b6020820152614d1060408401614c8e565b60408201529392505050565b604081526000614d2f60408301856146c9565b8281036020840152612fdf81856146c9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614d41565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614dcd57614dcd614d83565b92169190910692915050565b80820281158282048414176106a4576106a4614d41565b600067ffffffffffffffff80841680614e0b57614e0b614d83565b92169190910492915050565b6020810160038310614e2b57614e2b614000565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614e7957614e79614d41565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614eb38184018a6146c9565b90508281036080840152614ec781896146c9565b905060ff871660a084015282810360c0840152614ee48187614075565b905067ffffffffffffffff851660e0840152828103610100840152614f098185614075565b9c9b505050505050505050505050565b60008151808452602080850194506020840160005b8381101561470357815180516001600160a01b031688528301518388015260409096019590820190600101614f2e565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614f99610120840182614075565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614fd58383614075565b925060808901519150808584030161010086015250614ff48282614f19565b92505050615008602083018661ffff169052565b836040830152612fdf60608301846001600160a01b03169052565b600082601f83011261503457600080fd5b81516150426141e982614246565b81815284602083860101111561505757600080fd5b611dc8826020830160208701614051565b60008060006060848603121561507d57600080fd5b83516150888161438c565b602085015190935067ffffffffffffffff8111156150a557600080fd5b6150b186828701615023565b925050604084015190509250925092565b6000602082840312156150d457600080fd5b815161110081613fbd565b808201808211156106a4576106a4614d41565b805163ffffffff81168114613fde57600080fd5b600060a0828403121561511857600080fd5b60405160a0810181811067ffffffffffffffff8211171561513b5761513b6140b4565b604052615147836150f2565b8152615155602084016150f2565b6020820152604083015161ffff8116811461516f57600080fd5b60408201526060830151615182816141a8565b60608201526080830151615195816141a8565b60808201529392505050565b610180810161521282856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152611100565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b16604085015281606085015261529d8285018b6146c9565b915083820360808501526152b1828a6146c9565b915060ff881660a085015283820360c08501526152ce8288614075565b90861660e08501528381036101008501529050614f098185614075565b6000602082840312156152fd57600080fd5b815167ffffffffffffffff8082111561531557600080fd5b908301906080828603121561532957600080fd5b615331614130565b82518281111561534057600080fd5b61534c87828601615023565b82525060208301518281111561536157600080fd5b61536d87828601615023565b60208301525060408301518281111561538557600080fd5b61539187828601615023565b6040830152506153a3606084016150f2565b606082015295945050505050565b6000602082840312156153c357600080fd5b813567ffffffffffffffff8111156153da57600080fd5b611dc884828501614a6e565b6000602082840312156153f857600080fd5b81516111008161438c565b60008151808452602080850194506020840160005b8381101561470357815187529582019590820190600101615418565b6060815260006154476060830186615403565b82810360208401526154598186615403565b915050826040830152949350505050565b60006020828403121561547c57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613e3b57613e3b614d41565b67ffffffffffffffff8316815260408101611100602083018461402f565b600067ffffffffffffffff808316818103614e7957614e79614d41565b6154e9818461402f565b604060208201526000611dc86040830184614075565b60006020828403121561551157600080fd5b8151611100816141a8565b602081526000825161010080602085015261553b610120850183614075565b91506020850151615558604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161559260a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526155af8483614075565b935060c08701519150808685030160e08701526155cc8483614075565b935060e08701519150808685030183870152506155e98382614075565b9695505050505050565b60006040828403121561560557600080fd5b61560d6140e3565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461563957600080fd5b8152615647602084016150f2565b60208201529392505050565b6020815260006111006020830184614f19565b60008282518085526020808601955060208260051b8401016020860160005b848110156156b357601f198684030189526156a1838351614075565b98840198925090830190600101615685565b5090979650505050505050565b6020815260006111006020830184615666565b606081526156ee60608201855167ffffffffffffffff169052565b6000602085015161570a60808401826001600160a01b03169052565b5060408501516001600160a01b03811660a084015250606085015167ffffffffffffffff811660c084015250608085015160e083015260a08501516101006157558185018315159052565b60c087015191506101206157748186018467ffffffffffffffff169052565b60e08801519250610140615792818701856001600160a01b03169052565b828901519350610160925083838701528189015193506101a0915061018082818801526157c3610200880186614075565b9450818a015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08088870301848901526157ff8684614f19565b948b01518886039091016101c089015293945061581c8585615666565b9450808a01516101e088015250505050828103602084015261583e8186615666565b905082810360408401526155e98185615403565b60008261586157615861614d83565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a", } var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI 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 b15a6f90f3..6c35a72e6e 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -12,7 +12,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 3ea3974c9848e0df0dbe1fc7192134589e7735017c2ea8d4755084b3c95035d1 evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin a9aaf33667cab483adab20358d2c04b0694f4ecb26cf90c8e489f78e7f5f407a -evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin d2ce60dac71118efee007eb99422c1bc6d09534bb7557cea8157639a4ea2becc +evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin 8eee3de7fb9c7dd30611be45f13e511ce9c8c5127f5fe83abdab3eb1de861941 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf1a3090a2f8d1632b82a6d45200cf6f3833a1e27303745405c1ed13ffc0cf83 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin f049909cfef0aa3b8158c85e7b64516b9d7b32f4930705574090e5b9cab534b1 lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin d897366aa5c58f426eaf3fc748d9def8f78111d9ac8c122e390952f640de22fc