From e1c14fb73706e707e4c3bc2e766437e23ab997d6 Mon Sep 17 00:00:00 2001 From: Ryan <80392855+RayXpub@users.noreply.github.com> Date: Wed, 19 Jun 2024 13:53:59 +0400 Subject: [PATCH] Remove nops and weights from multi onramp (#912) ## Motivation Remove nops and weights logic from the `EVM2EVMMultiOnRamp` and outsource the logic to an external fee aggregator contract. ## Solution All fee tokens are now transferred to the configured `feeAggregator` address which will handle payment logic. The below state variables have been removed: - `s_nops` - `s_nopWeightsTotal` - `s_nopFeesJuels`: replaced by events - `i_maxNopFeesJuels`: replaced by `i_maxFeeJuelsPerMsg` which applies a check at the message level Out of scope: - Full coverage --- .changeset/quick-kangaroos-tell.md | 5 + contracts/.changeset/tall-toys-attack.md | 5 + contracts/gas-snapshots/ccip.gas-snapshot | 139 +++++---- contracts/src/v0.8/ccip/PriceRegistry.sol | 3 +- .../v0.8/ccip/interfaces/IPriceRegistry.sol | 4 + .../v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol | 204 +++--------- contracts/src/v0.8/ccip/test/BaseTest.t.sol | 2 + .../test/helpers/EVM2EVMMultiOnRampHelper.sol | 6 +- .../ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol | 162 +++++++--- .../test/onRamp/EVM2EVMMultiOnRampSetup.t.sol | 30 +- .../evm_2_evm_multi_onramp.go | 290 ++++++------------ ...rapper-dependency-versions-do-not-edit.txt | 2 +- 12 files changed, 360 insertions(+), 492 deletions(-) create mode 100644 .changeset/quick-kangaroos-tell.md create mode 100644 contracts/.changeset/tall-toys-attack.md diff --git a/.changeset/quick-kangaroos-tell.md b/.changeset/quick-kangaroos-tell.md new file mode 100644 index 0000000000..d62674ca54 --- /dev/null +++ b/.changeset/quick-kangaroos-tell.md @@ -0,0 +1,5 @@ +--- +"ccip": minor +--- + +#removed nops and weights logic from multi onramp diff --git a/contracts/.changeset/tall-toys-attack.md b/contracts/.changeset/tall-toys-attack.md new file mode 100644 index 0000000000..def559d994 --- /dev/null +++ b/contracts/.changeset/tall-toys-attack.md @@ -0,0 +1,5 @@ +--- +"@chainlink/contracts-ccip": minor +--- + +remove nops and weights logic from multi onramp diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 45c847e174..c5ce3f6e8f 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -211,87 +211,85 @@ EVM2EVMMultiOffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 123 EVM2EVMMultiOffRamp_verify:test_NotBlessed_Success() (gas: 83460) EVM2EVMMultiOffRamp_verify:test_Paused_Revert() (gas: 19039) EVM2EVMMultiOffRamp_verify:test_TooManyLeaves_Revert() (gas: 53617) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 33587) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16712) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 30485) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero() (gas: 16762) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 12405) -EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 172285) -EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13529) -EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesByAdmin_Success() (gas: 86361) -EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54159) -EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 44899) -EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12350) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 33520) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16645) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_InvalidDestChainConfigNewPrevOnRampOnExistingChain_Revert() (gas: 30418) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero() (gas: 16695) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput() (gas: 12338) +EVM2EVMMultiOnRamp_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 172172) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfigByAdmin_Success() (gas: 48870) -EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 90979) +EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 90887) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13116) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17292) EVM2EVMMultiOnRamp_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14279) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 191166) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 186824) -EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 189074) -EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 5993084) -EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 34396) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 155621) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 157649) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 163425) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 155236) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 61735) -EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 61997) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() (gas: 188963) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigLinkTokenEqAddressZero_Revert() (gas: 181803) +EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 184035) +EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 5244232) +EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 34352) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 151858) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 153908) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 159662) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 151495) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 57970) +EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 58232) EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 28070) EVM2EVMMultiOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 28009) EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 86613) -EVM2EVMMultiOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 35053) EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29755) EVM2EVMMultiOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 108398) +EVM2EVMMultiOnRamp_forwardFromRouter:test_MesssageFeeTooHigh_Revert() (gas: 32020) EVM2EVMMultiOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 23173) -EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 247666) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 35874) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 26019) +EVM2EVMMultiOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 246702) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 38638) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25996) EVM2EVMMultiOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59783) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 196821) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 135831) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 162864) -EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3762028) -EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30958) -EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 44306) -EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 127389) -EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 548325) -EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 90514) -EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 155813) -EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 201027) -EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 126085) -EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_Upgrade_Success() (gas: 103180) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 123904) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 197662) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 132675) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 159890) +EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3765224) +EVM2EVMMultiOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30915) +EVM2EVMMultiOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 44328) +EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 126448) +EVM2EVMMultiOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 510675) +EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 89506) +EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 152050) +EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 198121) +EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125905) +EVM2EVMMultiOnRamp_forwardFromRouter_upgrade:test_Upgrade_Success() (gas: 99417) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 123791) EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 11968) -EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 24481) -EVM2EVMMultiOnRamp_getFee:test_DestinationChainNotEnabled_Revert() (gas: 15503) -EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 92449) -EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 248999) -EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 17143) -EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95772) -EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 176388) -EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 20119) -EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 133309) -EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 18280) -EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 77714) +EVM2EVMMultiOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 24458) +EVM2EVMMultiOnRamp_getFee:test_DestinationChainNotEnabled_Revert() (gas: 15436) +EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 92269) +EVM2EVMMultiOnRamp_getFee:test_HighGasMessage_Success() (gas: 248819) +EVM2EVMMultiOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 17076) +EVM2EVMMultiOnRamp_getFee:test_MessageTooLarge_Revert() (gas: 95705) +EVM2EVMMultiOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 176010) +EVM2EVMMultiOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 20052) +EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 133023) +EVM2EVMMultiOnRamp_getFee:test_TooManyTokens_Revert() (gas: 18213) +EVM2EVMMultiOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 77534) EVM2EVMMultiOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460) EVM2EVMMultiOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35393) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 47759) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 35589) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28663) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 133282) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15304) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28471) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21336) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 43607) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 41524) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28516) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 41314) -EVM2EVMMultiOnRamp_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 31970) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 27605) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 15704) -EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 31137) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 47729) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 35559) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28633) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 133054) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15297) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28441) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21329) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_ValidatedPriceStaleness_Revert() (gas: 43600) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 41494) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28486) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 41307) +EVM2EVMMultiOnRamp_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 31940) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfigFeeAggregatorEqAddressZero_Revert() (gas: 11230) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfigPriceRegistryEqAddressZero_Revert() (gas: 11196) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 11187) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 15989) +EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 34402) +EVM2EVMMultiOnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97209) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38076) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 108387) EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_revert_Revert() (gas: 116928) @@ -370,6 +368,11 @@ EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 146778) EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162464) EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16667) EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197660) +EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13485) +EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesByAdmin_Success() (gas: 86317) +EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54115) +EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 44855) +EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12306) EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5635586) EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35880) EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Success() (gas: 99622) @@ -600,7 +603,7 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24205) MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 62379) MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39969) MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 33006) -MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1346374) +MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1339684) OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12171) OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42233) OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84124) diff --git a/contracts/src/v0.8/ccip/PriceRegistry.sol b/contracts/src/v0.8/ccip/PriceRegistry.sol index 39489e8846..44d63aff5f 100644 --- a/contracts/src/v0.8/ccip/PriceRegistry.sol +++ b/contracts/src/v0.8/ccip/PriceRegistry.sol @@ -237,8 +237,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, ITypeAndVersion { // │ Fee tokens │ // ================================================================ - /// @notice Get the list of fee tokens. - /// @return The tokens set as fee tokens. + /// @inheritdoc IPriceRegistry function getFeeTokens() external view returns (address[] memory) { return s_feeTokens.values(); } diff --git a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol index f5911393fd..f3c9bb0115 100644 --- a/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol +++ b/contracts/src/v0.8/ccip/interfaces/IPriceRegistry.sol @@ -67,4 +67,8 @@ interface IPriceRegistry { uint256 fromTokenAmount, address toToken ) external view returns (uint256 toTokenAmount); + + /// @notice Get the list of fee tokens. + /// @return The tokens set as fee tokens. + function getFeeTokens() external view returns (address[] memory); } diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol index a4b917b7c4..3ce71ee100 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol @@ -9,7 +9,6 @@ import {IPool} from "../interfaces/IPool.sol"; import {IPriceRegistry} from "../interfaces/IPriceRegistry.sol"; import {IRMN} from "../interfaces/IRMN.sol"; import {ITokenAdminRegistry} from "../interfaces/ITokenAdminRegistry.sol"; -import {ILinkAvailable} from "../interfaces/automation/ILinkAvailable.sol"; import {AggregateRateLimiter} from "../AggregateRateLimiter.sol"; import {Client} from "../libraries/Client.sol"; @@ -20,28 +19,22 @@ import {USDPriceWith18Decimals} from "../libraries/USDPriceWith18Decimals.sol"; import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"; import {SafeERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; -import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableMap.sol"; -/// @notice The EVM2EVMMultiOnRamp is a contract that handles lane-specific fee logic, NOP payments and -/// bridgeable token support. +/// @notice The EVM2EVMMultiOnRamp is a contract that handles lane-specific fee logic /// @dev The EVM2EVMMultiOnRamp, MultiCommitStore and EVM2EVMMultiOffRamp form an xchain upgradeable unit. Any change to one of them /// results an onchain upgrade of all 3. -contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRateLimiter, ITypeAndVersion { +contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, AggregateRateLimiter, ITypeAndVersion { using SafeERC20 for IERC20; - using EnumerableMap for EnumerableMap.AddressToUintMap; using USDPriceWith18Decimals for uint224; error InvalidExtraArgsTag(); error OnlyCallableByOwnerOrAdmin(); - error OnlyCallableByOwnerOrAdminOrNop(); error InvalidWithdrawParams(); error NoFeesToPay(); - error NoNopsToPay(); - error InsufficientBalance(); - error TooManyNops(); error MaxFeeBalanceReached(); error MessageTooLarge(uint256 maxSize, uint256 actualSize); error MessageGasLimitTooHigh(); + error MessageFeeTooHigh(uint256 msgFeeJuels, uint256 maxFeeJuelsPerMsg); error UnsupportedNumberOfTokens(); error UnsupportedToken(address token); error MustBeCalledByRouter(); @@ -49,7 +42,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat error InvalidConfig(); error CursedByRMN(uint64 sourceChainSelector); error LinkBalanceNotSettled(); - error InvalidNopAddress(address nop); error NotAFeeToken(address token); error CannotSendZeroTokens(); error SourceTokenDataTooLarge(address token); @@ -60,7 +52,8 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat error InvalidDestBytesOverhead(address token, uint32 destBytesOverhead); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); - event NopPaid(address indexed nop, uint256 amount); + event FeePaid(address indexed feeToken, uint256 feeValueJuels); + event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount); event PremiumMultiplierWeiPerEthUpdated(address indexed token, uint64 premiumMultiplierWeiPerEth); event TokenTransferFeeConfigUpdated( uint64 indexed destChainSelector, address indexed token, TokenTransferFeeConfig tokenTransferFeeConfig @@ -68,7 +61,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat event TokenTransferFeeConfigDeleted(uint256 indexed destChainSelector, address indexed token); /// RMN depends on this event, if changing, please notify the RMN maintainers. event CCIPSendRequested(uint64 indexed destChainSelector, Internal.EVM2EVMMessage message); - event NopsSet(uint256 nopWeightsTotal, NopAndWeight[] nopsAndWeights); event DestChainAdded(uint64 indexed destChainSelector, DestChainConfig destChainConfig); event DestChainDynamicConfigUpdated(uint64 indexed destChainSelector, DestChainDynamicConfig dynamicConfig); @@ -78,7 +70,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat struct StaticConfig { address linkToken; // ────────╮ Link token address uint64 chainSelector; // ─────╯ Source chainSelector - uint96 maxNopFeesJuels; // ───╮ Max nop fee balance onramp can have + uint96 maxFeeJuelsPerMsg; // ─╮ Maximum fee that can be charged for a message address rmnProxy; // ─────────╯ Address of RMN proxy address tokenAdminRegistry; // Token admin registry address } @@ -88,6 +80,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat struct DynamicConfig { address router; // Router address address priceRegistry; // Price registry address + address feeAggregator; // Fee aggregator address } /// @dev Struct to hold the fee token configuration for a token, same as the s_premiumMultiplierWeiPerEth but with @@ -171,21 +164,15 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat //solhint-disable gas-struct-packing struct DestChainConfigArgs { uint64 destChainSelector; // Destination chain selector - DestChainDynamicConfig dynamicConfig; // struct to hold the configs for a destination chain + DestChainDynamicConfig dynamicConfig; // Struct to hold the configs for a destination chain address prevOnRamp; // Address of previous-version OnRamp. } - /// @dev Nop address and weight, used to set the nops and their weights - struct NopAndWeight { - address nop; // ────╮ Address of the node operator - uint16 weight; // ──╯ Weight for nop rewards - } - // STATIC CONFIG string public constant override typeAndVersion = "EVM2EVMMultiOnRamp 1.6.0-dev"; - /// @dev Maximum nop fee that can accumulate in this onramp - uint96 internal immutable i_maxNopFeesJuels; - /// @dev The link token address - known to pay nops for their work + /// @dev Maximum fee that can be charged for a message. This is a guard to prevent massively overcharging due to misconfiguation. + uint96 internal immutable i_maxFeeJuelsPerMsg; + /// @dev The link token address address internal immutable i_linkToken; /// @dev The chain ID of the source chain that this contract is deployed to uint64 internal immutable i_chainSelector; @@ -200,8 +187,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat // DYNAMIC CONFIG /// @dev The config for the onRamp DynamicConfig internal s_dynamicConfig; - /// @dev (address nop => uint256 weight) - EnumerableMap.AddressToUintMap internal s_nops; /// @dev The destination chain specific configs mapping(uint64 destChainSelector => DestChainConfig destChainConfig) internal s_destChainConfig; @@ -228,8 +213,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat DestChainConfigArgs[] memory destChainConfigArgs, RateLimiter.Config memory rateLimiterConfig, PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs, - TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs, - NopAndWeight[] memory nopsAndWeights + TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs ) AggregateRateLimiter(rateLimiterConfig) { if ( staticConfig.linkToken == address(0) || staticConfig.chainSelector == 0 || staticConfig.rmnProxy == address(0) @@ -240,7 +224,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat i_linkToken = staticConfig.linkToken; i_chainSelector = staticConfig.chainSelector; - i_maxNopFeesJuels = staticConfig.maxNopFeesJuels; + i_maxFeeJuelsPerMsg = staticConfig.maxFeeJuelsPerMsg; i_rmnProxy = staticConfig.rmnProxy; i_tokenAdminRegistry = staticConfig.tokenAdminRegistry; @@ -248,7 +232,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat _applyDestChainConfigUpdates(destChainConfigArgs); _applyPremiumMultiplierWeiPerEthUpdates(premiumMultiplierWeiPerEthArgs); _applyTokenTransferFeeConfigUpdates(tokenTransferFeeConfigArgs, new TokenTransferFeeConfigRemoveArgs[](0)); - _setNops(nopsAndWeights); } // ================================================================ @@ -380,17 +363,18 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat if (value > 0) _rateLimitValue(value); } + uint256 msgFeeJuels; // Convert feeToken to link if not already in link if (message.feeToken == i_linkToken) { - // Since there is only 1b link this is safe - s_nopFeesJuels += uint96(feeTokenAmount); + msgFeeJuels = feeTokenAmount; } else { - // the cast from uint256 to uint96 is considered safe, uint96 can store more than max supply of link token - s_nopFeesJuels += uint96( - IPriceRegistry(s_dynamicConfig.priceRegistry).convertTokenAmount(message.feeToken, feeTokenAmount, i_linkToken) - ); + msgFeeJuels = + IPriceRegistry(s_dynamicConfig.priceRegistry).convertTokenAmount(message.feeToken, feeTokenAmount, i_linkToken); } - if (s_nopFeesJuels > i_maxNopFeesJuels) revert MaxFeeBalanceReached(); + + emit FeePaid(message.feeToken, msgFeeJuels); + + if (msgFeeJuels > i_maxFeeJuelsPerMsg) revert MessageFeeTooHigh(msgFeeJuels, i_maxFeeJuelsPerMsg); uint64 nonce = getSenderNonce(destChainSelector, originalSender) + 1; s_senderNonce[destChainSelector][originalSender] = nonce; @@ -458,7 +442,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat return StaticConfig({ linkToken: i_linkToken, chainSelector: i_chainSelector, - maxNopFeesJuels: i_maxNopFeesJuels, + maxFeeJuelsPerMsg: i_maxFeeJuelsPerMsg, rmnProxy: i_rmnProxy, tokenAdminRegistry: i_tokenAdminRegistry }); @@ -479,7 +463,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat /// @notice Internal version of setDynamicConfig to allow for reuse in the constructor. function _setDynamicConfig(DynamicConfig memory dynamicConfig) internal { // We permit router to be set to zero as a way to pause the contract. - if (dynamicConfig.priceRegistry == address(0)) revert InvalidConfig(); + if (dynamicConfig.priceRegistry == address(0) || dynamicConfig.feeAggregator == address(0)) revert InvalidConfig(); s_dynamicConfig = dynamicConfig; @@ -487,7 +471,7 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat StaticConfig({ linkToken: i_linkToken, chainSelector: i_chainSelector, - maxNopFeesJuels: i_maxNopFeesJuels, + maxFeeJuelsPerMsg: i_maxFeeJuelsPerMsg, rmnProxy: i_rmnProxy, tokenAdminRegistry: i_tokenAdminRegistry }), @@ -835,140 +819,24 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyMultiOnRamp, ILinkAvailable, AggregateRat } } - // ================================================================ - // │ NOP payments │ - // ================================================================ - - /// @notice Get the total amount of fees to be paid to the Nops (in LINK) - /// @return totalNopFees - function getNopFeesJuels() external view returns (uint96) { - return s_nopFeesJuels; - } - - /// @notice Gets the Nops and their weights - /// @return nopsAndWeights Array of NopAndWeight structs - /// @return weightsTotal The sum weight of all Nops - function getNops() external view returns (NopAndWeight[] memory nopsAndWeights, uint256 weightsTotal) { - uint256 length = s_nops.length(); - nopsAndWeights = new NopAndWeight[](length); - for (uint256 i = 0; i < length; ++i) { - (address nopAddress, uint256 nopWeight) = s_nops.at(i); - nopsAndWeights[i] = NopAndWeight({nop: nopAddress, weight: uint16(nopWeight)}); - } - weightsTotal = s_nopWeightsTotal; - return (nopsAndWeights, weightsTotal); - } + /// @notice Withdraws the outstanding fee token balances to the fee aggregator. + /// @dev This function can be permissionless as it only transfers accepted fee tokens to the fee aggregator which is a trusted address. + function withdrawFeeTokens() external { + address[] memory feeTokens = IPriceRegistry(s_dynamicConfig.priceRegistry).getFeeTokens(); + address feeAggregator = s_dynamicConfig.feeAggregator; - /// @notice Sets the Nops and their weights - /// @param nopsAndWeights Array of NopAndWeight structs - function setNops(NopAndWeight[] calldata nopsAndWeights) external { - _onlyOwnerOrAdmin(); - _setNops(nopsAndWeights); - } - - /// @param nopsAndWeights New set of nops and weights - /// @dev Clears existing nops, sets new nops and weights - /// @dev We permit fees to accrue before nops are configured, in which case - /// they will go to the first set of configured nops. - function _setNops(NopAndWeight[] memory nopsAndWeights) internal { - uint256 numberOfNops = nopsAndWeights.length; - if (numberOfNops > MAX_NUMBER_OF_NOPS) revert TooManyNops(); - - // Make sure all nops have been paid before removing nops - // We only have to pay when there are nops and there is enough - // outstanding NOP balance to trigger a payment. - if (s_nopWeightsTotal > 0 && s_nopFeesJuels >= s_nopWeightsTotal) { - payNops(); - } + for (uint256 i = 0; i < feeTokens.length; ++i) { + IERC20 feeToken = IERC20(feeTokens[i]); + uint256 feeTokenBalance = feeToken.balanceOf(address(this)); - // Remove all previous nops, move from end to start to avoid shifting - for (uint256 i = s_nops.length(); i > 0; --i) { - (address nop,) = s_nops.at(i - 1); - s_nops.remove(nop); - } + if (feeTokenBalance > 0) { + feeToken.safeTransfer(feeAggregator, feeTokenBalance); - // Add new - uint32 nopWeightsTotal = 0; - // nopWeightsTotal is bounded by the MAX_NUMBER_OF_NOPS and the weight of - // a single nop being of type uint16. This ensures nopWeightsTotal will - // always fit into the uint32 type. - for (uint256 i = 0; i < numberOfNops; ++i) { - // Make sure the LINK token is not a nop because the link token doesn't allow - // self transfers. If set as nop, payNops would always revert. Since setNops - // calls payNops, we can never remove the LINK token as a nop. - address nop = nopsAndWeights[i].nop; - uint16 weight = nopsAndWeights[i].weight; - if (nop == i_linkToken || nop == address(0)) revert InvalidNopAddress(nop); - s_nops.set(nop, weight); - nopWeightsTotal += weight; - } - s_nopWeightsTotal = nopWeightsTotal; - emit NopsSet(nopWeightsTotal, nopsAndWeights); - } - - /// @notice Pays the Node Ops their outstanding balances. - /// @dev some balance can remain after payments are done. This is at most the sum - /// of the weight of all nops. Since nop weights are uint16s and we can have at - /// most MAX_NUMBER_OF_NOPS NOPs, the highest possible value is 2**22 or 0.04 gjuels. - function payNops() public { - if (msg.sender != owner() && msg.sender != s_admin && !s_nops.contains(msg.sender)) { - revert OnlyCallableByOwnerOrAdminOrNop(); - } - uint256 weightsTotal = s_nopWeightsTotal; - if (weightsTotal == 0) revert NoNopsToPay(); - - uint96 totalFeesToPay = s_nopFeesJuels; - if (totalFeesToPay < weightsTotal) revert NoFeesToPay(); - if (linkAvailableForPayment() < 0) revert InsufficientBalance(); - - uint96 fundsLeft = totalFeesToPay; - uint256 numberOfNops = s_nops.length(); - for (uint256 i = 0; i < numberOfNops; ++i) { - (address nop, uint256 weight) = s_nops.at(i); - // amount can never be higher than totalFeesToPay so the cast to uint96 is safe - uint96 amount = uint96((totalFeesToPay * weight) / weightsTotal); - fundsLeft -= amount; - IERC20(i_linkToken).safeTransfer(nop, amount); - emit NopPaid(nop, amount); - } - // Some funds can remain, since this is an incredibly small - // amount we consider this OK. - s_nopFeesJuels = fundsLeft; - } - - /// @notice Allows the owner to withdraw any ERC20 token from the contract. - /// The NOP link balance is not withdrawable. - /// @param feeToken The token to withdraw - /// @param to The address to send the tokens to - function withdrawNonLinkFees(address feeToken, address to) external { - _onlyOwnerOrAdmin(); - if (to == address(0)) revert InvalidWithdrawParams(); - - // We require the link balance to be settled before allowing withdrawal of non-link fees. - int256 linkAfterNopFees = linkAvailableForPayment(); - if (linkAfterNopFees < 0) revert LinkBalanceNotSettled(); - - if (feeToken == i_linkToken) { - // Withdraw only the left over link balance - IERC20(feeToken).safeTransfer(to, uint256(linkAfterNopFees)); - } else { - // Withdrawal all non-link tokens in the contract - IERC20(feeToken).safeTransfer(to, IERC20(feeToken).balanceOf(address(this))); + emit FeeTokenWithdrawn(feeAggregator, address(feeToken), feeTokenBalance); + } } } - // ================================================================ - // │ Link monitoring │ - // ================================================================ - - /// @notice Calculate remaining LINK balance after paying nops - /// @dev Allow keeper to monitor funds available for paying nops - /// @return balance if nops were to be paid - function linkAvailableForPayment() public view returns (int256) { - // Since LINK caps at uint96, casting to int256 is safe - return int256(IERC20(i_linkToken).balanceOf(address(this))) - int256(uint256(s_nopFeesJuels)); - } - // ================================================================ // │ Access │ // ================================================================ diff --git a/contracts/src/v0.8/ccip/test/BaseTest.t.sol b/contracts/src/v0.8/ccip/test/BaseTest.t.sol index 7682f4da0b..b150ec892b 100644 --- a/contracts/src/v0.8/ccip/test/BaseTest.t.sol +++ b/contracts/src/v0.8/ccip/test/BaseTest.t.sol @@ -15,6 +15,7 @@ contract BaseTest is Test { address internal constant DUMMY_CONTRACT_ADDRESS = 0x1111111111111111111111111111111111111112; address internal constant ON_RAMP_ADDRESS = 0x11118e64e1FB0c487f25dD6D3601FF6aF8d32E4e; address internal constant ZERO_ADDRESS = address(0); + address internal constant FEE_AGGREGATOR = 0xa33CDB32eAEce34F6affEfF4899cef45744EDea3; address internal constant USER_1 = address(1); address internal constant USER_2 = address(2); @@ -32,6 +33,7 @@ contract BaseTest is Test { // Onramp uint96 internal constant MAX_NOP_FEES_JUELS = 1e27; + uint96 internal constant MAX_MSG_FEES_JUELS = 1e18; uint32 internal constant DEST_GAS_OVERHEAD = 350_000; uint16 internal constant DEST_GAS_PER_PAYLOAD_BYTE = 16; diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOnRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOnRampHelper.sol index dbe0febaff..cf1ab9ed2b 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOnRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMMultiOnRampHelper.sol @@ -11,8 +11,7 @@ contract EVM2EVMMultiOnRampHelper is EVM2EVMMultiOnRamp, IgnoreContractSize { DestChainConfigArgs[] memory destChainConfigs, RateLimiter.Config memory rateLimiterConfig, PremiumMultiplierWeiPerEthArgs[] memory premiumMultiplierWeiPerEthArgs, - TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs, - NopAndWeight[] memory nopsAndWeights + TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs ) EVM2EVMMultiOnRamp( staticConfig, @@ -20,8 +19,7 @@ contract EVM2EVMMultiOnRampHelper is EVM2EVMMultiOnRamp, IgnoreContractSize { destChainConfigs, rateLimiterConfig, premiumMultiplierWeiPerEthArgs, - tokenTransferFeeConfigArgs, - nopsAndWeights + tokenTransferFeeConfigArgs ) {} diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol index 55cdf9cf21..b4feae093e 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol @@ -22,7 +22,7 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { EVM2EVMMultiOnRamp.StaticConfig memory staticConfig = EVM2EVMMultiOnRamp.StaticConfig({ linkToken: s_sourceTokens[0], chainSelector: SOURCE_CHAIN_SELECTOR, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS, rmnProxy: address(s_mockRMN), tokenAdminRegistry: address(s_tokenAdminRegistry) }); @@ -94,7 +94,7 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { EVM2EVMMultiOnRamp.StaticConfig({ linkToken: address(0), chainSelector: SOURCE_CHAIN_SELECTOR, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, rmnProxy: address(s_mockRMN), tokenAdminRegistry: address(s_tokenAdminRegistry) }), @@ -102,18 +102,28 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { _generateDestChainConfigArgs(), getOutboundRateLimiterConfig(), s_premiumMultiplierWeiPerEthArgs, - s_tokenTransferFeeConfigArgs, - _getMultiOnRampNopsAndWeights() + s_tokenTransferFeeConfigArgs ); } - function test_Constructor_InvalidConfigChainSelectorEqZero_Revert() public { + function test_Constructor_InvalidConfigLinkChainSelectorEqZero_Revert() public { + EVM2EVMMultiOnRamp.DynamicConfig memory dynamicConfig = + _generateDynamicMultiOnRampConfig(address(s_sourceRouter), address(s_priceRegistry)); + EVM2EVMMultiOnRamp.DestChainConfigArgs[] memory destChainConfigArgs = _generateDestChainConfigArgs(); + EVM2EVMMultiOnRamp.StaticConfig memory staticConfig = EVM2EVMMultiOnRamp.StaticConfig({ + linkToken: s_sourceTokens[0], + chainSelector: 0, + maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, + rmnProxy: address(s_mockRMN), + tokenAdminRegistry: address(s_tokenAdminRegistry) + }); + vm.expectRevert(EVM2EVMMultiOnRamp.InvalidConfig.selector); new EVM2EVMMultiOnRampHelper( EVM2EVMMultiOnRamp.StaticConfig({ linkToken: s_sourceTokens[0], chainSelector: 0, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, rmnProxy: address(s_mockRMN), tokenAdminRegistry: address(s_tokenAdminRegistry) }), @@ -121,8 +131,7 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { _generateDestChainConfigArgs(), getOutboundRateLimiterConfig(), s_premiumMultiplierWeiPerEthArgs, - s_tokenTransferFeeConfigArgs, - _getMultiOnRampNopsAndWeights() + s_tokenTransferFeeConfigArgs ); } @@ -132,7 +141,7 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { EVM2EVMMultiOnRamp.StaticConfig({ linkToken: s_sourceTokens[0], chainSelector: SOURCE_CHAIN_SELECTOR, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, rmnProxy: address(0), tokenAdminRegistry: address(s_tokenAdminRegistry) }), @@ -140,8 +149,7 @@ contract EVM2EVMMultiOnRamp_constructor is EVM2EVMMultiOnRampSetup { _generateDestChainConfigArgs(), getOutboundRateLimiterConfig(), s_premiumMultiplierWeiPerEthArgs, - s_tokenTransferFeeConfigArgs, - _getMultiOnRampNopsAndWeights() + s_tokenTransferFeeConfigArgs ); } } @@ -316,7 +324,7 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { } function setUp() public virtual override { - EVM2EVMMultiOnRampSetup.setUp(); + super.setUp(); address[] memory feeTokens = new address[](1); feeTokens[0] = s_sourceTokens[1]; @@ -405,10 +413,11 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { uint256 feeAmount = 1234567890; IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount); + vm.expectEmit(); + emit EVM2EVMMultiOnRamp.FeePaid(s_sourceFeeToken, feeAmount); s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), feeAmount); - assertEq(s_onRamp.getNopFeesJuels(), feeAmount); } function test_ShouldStoreNonLinkFees() public { @@ -418,17 +427,17 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { uint256 feeAmount = 1234567890; IERC20(s_sourceTokens[1]).transferFrom(OWNER, address(s_onRamp), feeAmount); - s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); - - assertEq(IERC20(s_sourceTokens[1]).balanceOf(address(s_onRamp)), feeAmount); - // Calculate conversion done by prices contract uint256 feeTokenPrice = s_priceRegistry.getTokenPrice(s_sourceTokens[1]).value; uint256 linkTokenPrice = s_priceRegistry.getTokenPrice(s_sourceFeeToken).value; uint256 conversionRate = (feeTokenPrice * 1e18) / linkTokenPrice; uint256 expectedJuels = (feeAmount * conversionRate) / 1e18; - assertEq(s_onRamp.getNopFeesJuels(), expectedJuels); + vm.expectEmit(); + emit EVM2EVMMultiOnRamp.FeePaid(s_sourceTokens[1], expectedJuels); + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); + + assertEq(IERC20(s_sourceTokens[1]).balanceOf(address(s_onRamp)), feeAmount); } // Make sure any valid sender, receiver and feeAmount can be handled. @@ -440,7 +449,7 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { // To avoid RouterMustSetOriginalSender vm.assume(originalSender != address(0)); vm.assume(uint160(receiver) >= Internal.PRECOMPILE_SPACE); - vm.assume(feeTokenAmount <= MAX_NOP_FEES_JUELS); + feeTokenAmount = uint96(bound(feeTokenAmount, 0, MAX_MSG_FEES_JUELS)); Client.EVM2AnyMessage memory message = _generateEmptyMessage(); message.receiver = abi.encode(receiver); @@ -450,6 +459,8 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { Internal.EVM2EVMMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeTokenAmount, originalSender); + vm.expectEmit(); + emit EVM2EVMMultiOnRamp.FeePaid(s_sourceFeeToken, feeTokenAmount); vm.expectEmit(false, false, false, true); emit EVM2EVMMultiOnRamp.CCIPSendRequested(DEST_CHAIN_SELECTOR, expectedEvent); @@ -457,8 +468,6 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { assertEq( expectedEvent.messageId, s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeTokenAmount, originalSender) ); - // Assert the fee token amount is correctly assigned to the nop fee pool - assertEq(feeTokenAmount, s_onRamp.getNopFeesJuels()); } function test_OverValueWithARLOff_Success() public { @@ -670,12 +679,14 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup { } } - function test_MaxFeeBalanceReached_Revert() public { + function test_MesssageFeeTooHigh_Revert() public { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); - vm.expectRevert(EVM2EVMMultiOnRamp.MaxFeeBalanceReached.selector); + vm.expectRevert( + abi.encodeWithSelector(EVM2EVMMultiOnRamp.MessageFeeTooHigh.selector, MAX_MSG_FEES_JUELS + 1, MAX_MSG_FEES_JUELS) + ); - s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, MAX_NOP_FEES_JUELS + 1, OWNER); + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, MAX_MSG_FEES_JUELS + 1, OWNER); } function test_InvalidChainSelector_Revert() public { @@ -847,7 +858,7 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter_upgrade is EVM2EVMMultiOnRampSetup EVM2EVMMultiOnRamp.StaticConfig({ linkToken: s_sourceTokens[0], chainSelector: SOURCE_CHAIN_SELECTOR, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_NOP_FEES_JUELS, rmnProxy: address(s_mockRMN), tokenAdminRegistry: address(s_tokenAdminRegistry) }), @@ -855,8 +866,7 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter_upgrade is EVM2EVMMultiOnRampSetup destChainConfigArgs, getOutboundRateLimiterConfig(), s_premiumMultiplierWeiPerEthArgs, - s_tokenTransferFeeConfigArgs, - _getMultiOnRampNopsAndWeights() + s_tokenTransferFeeConfigArgs ); s_metadataHash = keccak256( @@ -938,7 +948,7 @@ contract EVM2EVMMultiOnRamp_getFeeSetup is EVM2EVMMultiOnRampSetup { address internal s_selfServeTokenDefaultPricing = makeAddr("self-serve-token-default-pricing"); function setUp() public virtual override { - EVM2EVMMultiOnRampSetup.setUp(); + super.setUp(); // Add additional pool addresses for test tokens to mark them as supported s_tokenAdminRegistry.registerAdministratorPermissioned(s_sourceRouter.getWrappedNative(), OWNER); @@ -1651,8 +1661,11 @@ contract EVM2EVMMultiOnRamp_getTokenTransferCost is EVM2EVMMultiOnRamp_getFeeSet contract EVM2EVMMultiOnRamp_setDynamicConfig is EVM2EVMMultiOnRampSetup { function test_SetDynamicConfig_Success() public { EVM2EVMMultiOnRamp.StaticConfig memory staticConfig = s_onRamp.getStaticConfig(); - EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = - EVM2EVMMultiOnRamp.DynamicConfig({router: address(2134), priceRegistry: address(23423)}); + EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = EVM2EVMMultiOnRamp.DynamicConfig({ + router: address(2134), + priceRegistry: address(23423), + feeAggregator: FEE_AGGREGATOR + }); vm.expectEmit(); emit EVM2EVMMultiOnRamp.ConfigSet(staticConfig, newConfig); @@ -1666,17 +1679,37 @@ contract EVM2EVMMultiOnRamp_setDynamicConfig is EVM2EVMMultiOnRampSetup { // Reverts + function test_SetConfigInvalidConfigPriceRegistryEqAddressZero_Revert() public { + EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = EVM2EVMMultiOnRamp.DynamicConfig({ + router: address(2134), + priceRegistry: address(0), + feeAggregator: FEE_AGGREGATOR + }); + + vm.expectRevert(EVM2EVMMultiOnRamp.InvalidConfig.selector); + s_onRamp.setDynamicConfig(newConfig); + } + function test_SetConfigInvalidConfig_Revert() public { - EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = - EVM2EVMMultiOnRamp.DynamicConfig({router: address(1), priceRegistry: address(23423)}); + EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = EVM2EVMMultiOnRamp.DynamicConfig({ + router: address(1), + priceRegistry: address(23423), + feeAggregator: FEE_AGGREGATOR + }); // Invalid price reg reverts. newConfig.priceRegistry = address(0); vm.expectRevert(EVM2EVMMultiOnRamp.InvalidConfig.selector); s_onRamp.setDynamicConfig(newConfig); + } - // Succeeds if valid - newConfig.priceRegistry = address(23423); + function test_SetConfigInvalidConfigFeeAggregatorEqAddressZero_Revert() public { + EVM2EVMMultiOnRamp.DynamicConfig memory newConfig = EVM2EVMMultiOnRamp.DynamicConfig({ + router: address(2134), + priceRegistry: address(23423), + feeAggregator: address(0) + }); + vm.expectRevert(EVM2EVMMultiOnRamp.InvalidConfig.selector); s_onRamp.setDynamicConfig(newConfig); } @@ -1690,7 +1723,66 @@ contract EVM2EVMMultiOnRamp_setDynamicConfig is EVM2EVMMultiOnRampSetup { } } -contract EVM2EVMMultiOnRamp_applyPremiumMultiplierWeiPerEthUpdates is EVM2EVMMultiOnRampSetup { +contract EVM2EVMMultiOnRamp_withdrawFeeTokens is EVM2EVMMultiOnRampSetup { + mapping(address => uint256) internal s_nopFees; + + function setUp() public virtual override { + super.setUp(); + + // Since we'll mostly be testing for valid calls from the router we'll + // mock all calls to be originating from the router and re-mock in + // tests that require failure. + vm.startPrank(address(s_sourceRouter)); + + uint256 feeAmount = 1234567890; + + // Send a bunch of messages, increasing the juels in the contract + for (uint256 i = 0; i < s_sourceFeeTokens.length; ++i) { + Client.EVM2AnyMessage memory message = _generateEmptyMessage(); + message.feeToken = s_sourceFeeTokens[i % s_sourceFeeTokens.length]; + uint256 newFeeTokenBalance = IERC20(message.feeToken).balanceOf(address(s_onRamp)) + feeAmount; + deal(message.feeToken, address(s_onRamp), newFeeTokenBalance); + s_nopFees[message.feeToken] = newFeeTokenBalance; + s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER); + } + } + + function test_Fuzz_WithdrawFeeTokens_Success(uint256[5] memory amounts) public { + vm.startPrank(OWNER); + address[] memory feeTokens = new address[](amounts.length); + for (uint256 i = 0; i < amounts.length; ++i) { + vm.assume(amounts[i] > 0); + feeTokens[i] = _deploySourceToken("", amounts[i], 18); + IERC20(feeTokens[i]).transfer(address(s_onRamp), amounts[i]); + } + + s_priceRegistry.applyFeeTokensUpdates(feeTokens, new address[](0)); + + for (uint256 i = 0; i < feeTokens.length; ++i) { + vm.expectEmit(); + emit EVM2EVMMultiOnRamp.FeeTokenWithdrawn(FEE_AGGREGATOR, feeTokens[i], amounts[i]); + } + + s_onRamp.withdrawFeeTokens(); + + for (uint256 i = 0; i < feeTokens.length; ++i) { + assertEq(IERC20(feeTokens[i]).balanceOf(FEE_AGGREGATOR), amounts[i]); + assertEq(IERC20(feeTokens[i]).balanceOf(address(s_onRamp)), 0); + } + } + + function test_WithdrawFeeTokens_Success() public { + vm.expectEmit(); + emit EVM2EVMMultiOnRamp.FeeTokenWithdrawn(FEE_AGGREGATOR, s_sourceFeeToken, s_nopFees[s_sourceFeeToken]); + + s_onRamp.withdrawFeeTokens(); + + assertEq(IERC20(s_sourceFeeToken).balanceOf(FEE_AGGREGATOR), s_nopFees[s_sourceFeeToken]); + assertEq(IERC20(s_sourceFeeToken).balanceOf(address(s_onRamp)), 0); + } +} + +contract EVM2EVMOnRamp_applyPremiumMultiplierWeiPerEthUpdates is EVM2EVMMultiOnRampSetup { function test_Fuzz_applyPremiumMultiplierWeiPerEthUpdates_Success( EVM2EVMMultiOnRamp.PremiumMultiplierWeiPerEthArgs memory premiumMultiplierWeiPerEthArg ) public { diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRampSetup.t.sol index 52e65947b0..f7dbc19ee2 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRampSetup.t.sol @@ -221,6 +221,14 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { return messageEvent; } + function _generateDynamicMultiOnRampConfig( + address router, + address priceRegistry + ) internal pure returns (EVM2EVMMultiOnRamp.DynamicConfig memory) { + return + EVM2EVMMultiOnRamp.DynamicConfig({router: router, priceRegistry: priceRegistry, feeAggregator: FEE_AGGREGATOR}); + } + // Slicing is only available for calldata. So we have to build a new bytes array. function _removeFirst4Bytes(bytes memory data) internal pure returns (bytes memory) { bytes memory result = new bytes(data.length - 4); @@ -230,13 +238,6 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { return result; } - function _generateDynamicMultiOnRampConfig( - address router, - address priceRegistry - ) internal pure returns (EVM2EVMMultiOnRamp.DynamicConfig memory) { - return EVM2EVMMultiOnRamp.DynamicConfig({router: router, priceRegistry: priceRegistry}); - } - function _generateDestChainConfigArgs() internal pure returns (EVM2EVMMultiOnRamp.DestChainConfigArgs[] memory) { EVM2EVMMultiOnRamp.DestChainConfigArgs[] memory destChainConfigs = new EVM2EVMMultiOnRamp.DestChainConfigArgs[](1); destChainConfigs[0] = EVM2EVMMultiOnRamp.DestChainConfigArgs({ @@ -276,14 +277,6 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { return tokenTransferFeeConfigArgs; } - function _getMultiOnRampNopsAndWeights() internal pure returns (EVM2EVMMultiOnRamp.NopAndWeight[] memory) { - EVM2EVMMultiOnRamp.NopAndWeight[] memory nopsAndWeights = new EVM2EVMMultiOnRamp.NopAndWeight[](3); - nopsAndWeights[0] = EVM2EVMMultiOnRamp.NopAndWeight({nop: USER_1, weight: 19284}); - nopsAndWeights[1] = EVM2EVMMultiOnRamp.NopAndWeight({nop: USER_2, weight: 52935}); - nopsAndWeights[2] = EVM2EVMMultiOnRamp.NopAndWeight({nop: USER_3, weight: 8}); - return nopsAndWeights; - } - function _deployOnRamp( uint64 sourceChainSelector, address sourceRouter, @@ -293,7 +286,7 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { EVM2EVMMultiOnRamp.StaticConfig({ linkToken: s_sourceTokens[0], chainSelector: sourceChainSelector, - maxNopFeesJuels: MAX_NOP_FEES_JUELS, + maxFeeJuelsPerMsg: MAX_MSG_FEES_JUELS, rmnProxy: address(s_mockRMN), tokenAdminRegistry: tokenAdminRegistry }), @@ -301,8 +294,7 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { _generateDestChainConfigArgs(), getOutboundRateLimiterConfig(), s_premiumMultiplierWeiPerEthArgs, - s_tokenTransferFeeConfigArgs, - _getMultiOnRampNopsAndWeights() + s_tokenTransferFeeConfigArgs ); onRamp.setAdmin(ADMIN); @@ -340,7 +332,7 @@ contract EVM2EVMMultiOnRampSetup is TokenSetup, PriceRegistrySetup { ) internal pure { assertEq(a.linkToken, b.linkToken); assertEq(a.chainSelector, b.chainSelector); - assertEq(a.maxNopFeesJuels, b.maxNopFeesJuels); + assertEq(a.maxFeeJuelsPerMsg, b.maxFeeJuelsPerMsg); assertEq(a.rmnProxy, b.rmnProxy); assertEq(a.tokenAdminRegistry, b.tokenAdminRegistry); } diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go index f10dc6bda9..a206675a87 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go @@ -77,11 +77,7 @@ type EVM2EVMMultiOnRampDestChainDynamicConfig struct { type EVM2EVMMultiOnRampDynamicConfig struct { Router common.Address PriceRegistry common.Address -} - -type EVM2EVMMultiOnRampNopAndWeight struct { - Nop common.Address - Weight uint16 + FeeAggregator common.Address } type EVM2EVMMultiOnRampPremiumMultiplierWeiPerEthArgs struct { @@ -92,7 +88,7 @@ type EVM2EVMMultiOnRampPremiumMultiplierWeiPerEthArgs struct { type EVM2EVMMultiOnRampStaticConfig struct { LinkToken common.Address ChainSelector uint64 - MaxNopFeesJuels *big.Int + MaxFeeJuelsPerMsg *big.Int RmnProxy common.Address TokenAdminRegistry common.Address } @@ -153,15 +149,15 @@ type RateLimiterTokenBucket struct { } var EVM2EVMMultiOnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"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\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"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\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"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\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"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\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainDynamicConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"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\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"destChainSelector\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"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\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"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\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"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\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162008b3c38038062008b3c83398101604081905262000035916200207b565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000282565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060608701516001600160a01b0316155b8062000197575060808701516001600160a01b0316155b15620001b6576040516306b7c75960e31b815260040160405180910390fd5b86516001600160a01b0390811660a05260208801516001600160401b031660c05260408801516001600160601b031660809081526060890151821660e052880151166101005262000207866200032d565b62000212856200047b565b6200021d83620009d8565b604080516000808252602082019092526200026a9184919062000263565b60408051808201909152600080825260208201528152602001906001900390816200023b5790505b5062000aa4565b620002758162000e01565b5050505050505062002672565b336001600160a01b03821603620002dc5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60208101516001600160a01b031662000359576040516306b7c75960e31b815260040160405180910390fd5b8051600580546001600160a01b039283166001600160a01b0319918216179091556020808401516006805491851691909316179091556040805160a08082018352518416815260c0516001600160401b031692810192909252608080516001600160601b03168383015260e05184166060840152610100519093169282019290925290517f2436895da154cdfddf5eb1175c9be7129f01727fee8af2fa04f68641e8ea5ec8916200047091849082516001600160a01b0390811682526020808501516001600160401b0316818401526040808601516001600160601b0316908401526060808601518316908401526080948501518216948301949094528251811660a083015291909201511660c082015260e00190565b60405180910390a150565b60005b8151811015620009d45760008282815181106200049f576200049f62002175565b602002602001015190506000838381518110620004c057620004c062002175565b6020026020010151600001519050806001600160401b031660001480620004f75750602082015161018001516001600160401b0316155b15620005225760405163c35aa79d60e01b81526001600160401b038216600482015260240162000084565b6000600a6000836001600160401b03166001600160401b0316815260200190815260200160002090506000836040015190506000604051806080016040528086602001518152602001836001600160a01b031681526020018460020160149054906101000a90046001600160401b03166001600160401b031681526020018460030154815250905080600001518360000160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555090505082600301546000801b03620008f15760c051604080517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b360208201526001600160401b0392831691810191909152908516606082015230608082015260a00160408051601f1981840301815291905280516020909101206060820181905260038401556001600160a01b03821615620008a8576002830180546001600160a01b0319166001600160a01b0384161790555b836001600160401b03167f7a70081ee29c1fc27898089ba2a5fc35ac0106b043c82ccecd24c6fd48f6ca8684604051620008e391906200218b565b60405180910390a2620009c3565b60028301546001600160a01b038381169116146200092e5760405163c35aa79d60e01b81526001600160401b038516600482015260240162000084565b60208560200151610160015163ffffffff1610156200097b57602085015161016001516040516312766e0160e11b81526000600482015263ffffffff909116602482015260440162000084565b836001600160401b03167f944eb884a589931130671ee4a7379fbe5fe65ed605a048ba99c454582f2460b08660200151604051620009ba91906200231f565b60405180910390a25b50505050508060010190506200047e565b5050565b60005b8151811015620009d4576000828281518110620009fc57620009fc62002175565b6020026020010151600001519050600083838151811062000a215762000a2162002175565b6020908102919091018101518101516001600160a01b0384166000818152600b845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101620009db565b60005b825181101562000d3657600083828151811062000ac85762000ac862002175565b6020026020010151905060008160000151905060005b82602001515181101562000d275760008360200151828151811062000b075762000b0762002175565b602002602001015160200151905060008460200151838151811062000b305762000b3062002175565b60200260200101516000015190506020826080015163ffffffff16101562000b895760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000084565b6001600160401b0384166000818152600c602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c015160c08d01511515600160981b0260ff60981b19911515600160901b0260ff60901b1963ffffffff948516600160701b021664ffffffffff60701b199585166a01000000000000000000000263ffffffff60501b1961ffff90981668010000000000000000029790971665ffffffffffff60401b19988616640100000000026001600160401b0319909d1695909916949094179a909a179590951695909517929092171617949094171692909217909155519091907f16a6faa936552870f38ad6586ca4ae10b5d085667b357895aebb320becccf8d49062000d14908690600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b60405180910390a3505060010162000ade565b50505080600101905062000aa7565b5060005b815181101562000dfc57600082828151811062000d5b5762000d5b62002175565b6020026020010151600001519050600083838151811062000d805762000d8062002175565b6020908102919091018101518101516001600160401b0384166000818152600c845260408082206001600160a01b038516808452955280822080546001600160a01b03191690555192945090917ffa22e84f9c809b5b7e94f084eb45cf17a5e4703cecef8f27ed35e54b719bffcd9190a3505060010162000d3a565b505050565b8051604081111562000e2657604051635ad0867d60e11b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff161580159062000e705750600e5463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000e805762000e8062001023565b600062000e8e60076200121b565b90505b801562000eda57600062000eb462000eab60018462002468565b6007906200122e565b50905062000ec46007826200124c565b50508062000ed2906200247e565b905062000e91565b506000805b8281101562000fba57600084828151811062000eff5762000eff62002175565b6020026020010151600001519050600085838151811062000f245762000f2462002175565b602002602001015160200151905060a0516001600160a01b0316826001600160a01b0316148062000f5c57506001600160a01b038216155b1562000f8757604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000f9960078361ffff84166200126a565b5062000faa61ffff82168562002498565b9350505080600101905062000edf565b50600e805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd2490620010169083908690620024b8565b60405180910390a1505050565b6000546001600160a01b031633148015906200104a57506002546001600160a01b03163314155b80156200106157506200105f6007336200128a565b155b15620010805760405163032bb72b60e31b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff166000819003620010bc5760405163990e30bf60e01b815260040160405180910390fd5b600e546001600160601b031681811015620010ea576040516311a1ee3b60e31b815260040160405180910390fd5b6000620010f6620012a1565b12156200111657604051631e9acf1760e31b815260040160405180910390fd5b8060006200112560076200121b565b905060005b81811015620011f557600080620011436007846200122e565b909250905060008762001160836001600160601b038a1662002528565b6200116c919062002542565b90506200117a818762002565565b60a0519096506200119f906001600160a01b0316846001600160601b0384166200132f565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508060010190506200112a565b5050600e80546001600160601b0319166001600160601b03929092169190911790555050565b6000620012288262001387565b92915050565b60008080806200123f868662001394565b9097909650945050505050565b600062001263836001600160a01b038416620013c1565b9392505050565b600062001282846001600160a01b03851684620013e0565b949350505050565b600062001263836001600160a01b038416620013ff565b600e5460a0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa158015620012f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200131e919062002588565b6200132a9190620025a2565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000dfc9185916200140d16565b60006200122882620014de565b60008080620013a48585620014e9565b600081815260029690960160205260409095205494959350505050565b60008181526002830160205260408120819055620012638383620014f7565b6000828152600284016020526040812082905562001282848462001505565b600062001263838362001513565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200145c906001600160a01b0385169084906200152c565b80519091501562000dfc57808060200190518101906200147d9190620025c5565b62000dfc5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b600062001228825490565b60006200126383836200153d565b60006200126383836200156a565b600062001263838362001675565b6000818152600183016020526040812054151562001263565b6060620012828484600085620016c7565b600082600001828154811062001557576200155762002175565b9060005260206000200154905092915050565b60008181526001830160205260408120548015620016635760006200159160018362002468565b8554909150600090620015a79060019062002468565b905081811462001613576000866000018281548110620015cb57620015cb62002175565b9060005260206000200154905080876000018481548110620015f157620015f162002175565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620016275762001627620025e3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062001228565b600091505062001228565b5092915050565b6000818152600183016020526040812054620016be5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562001228565b50600062001228565b6060824710156200172a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b031685876040516200174891906200261f565b60006040518083038185875af1925050503d806000811462001787576040519150601f19603f3d011682016040523d82523d6000602084013e6200178c565b606091505b509092509050620017a087838387620017ab565b979650505050505050565b606083156200181f57825160000362001817576001600160a01b0385163b620018175760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001282565b620012828383815115620018365781518083602001fd5b8060405162461bcd60e51b81526004016200008491906200263d565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200188d576200188d62001852565b60405290565b604051606081016001600160401b03811182821017156200188d576200188d62001852565b6040516101e081016001600160401b03811182821017156200188d576200188d62001852565b60405160e081016001600160401b03811182821017156200188d576200188d62001852565b604051601f8201601f191681016001600160401b03811182821017156200192e576200192e62001852565b604052919050565b80516001600160a01b03811681146200194e57600080fd5b919050565b80516001600160401b03811681146200194e57600080fd5b600060a082840312156200197e57600080fd5b60405160a081016001600160401b0381118282101715620019a357620019a362001852565b604052905080620019b48362001936565b8152620019c46020840162001953565b602082015260408301516001600160601b0381168114620019e457600080fd5b6040820152620019f76060840162001936565b606082015262001a0a6080840162001936565b60808201525092915050565b60006040828403121562001a2957600080fd5b62001a3362001868565b905062001a408262001936565b815262001a506020830162001936565b602082015292915050565b60006001600160401b0382111562001a775762001a7762001852565b5060051b60200190565b805180151581146200194e57600080fd5b805161ffff811681146200194e57600080fd5b805163ffffffff811681146200194e57600080fd5b600082601f83011262001acc57600080fd5b8151602062001ae562001adf8362001a5b565b62001903565b828152610220928302850182019282820191908785111562001b0657600080fd5b8387015b8581101562001cb0578089038281121562001b255760008081fd5b62001b2f62001893565b62001b3a8362001953565b81526101e080601f198401121562001b525760008081fd5b62001b5c620018b8565b925062001b6b88850162001a81565b8352604062001b7c81860162001a92565b89850152606062001b8f81870162001aa5565b82860152608062001ba281880162001aa5565b8287015260a0915062001bb782880162001aa5565b9086015260c062001bca87820162001a92565b8287015260e0915062001bdf82880162001aa5565b9086015261010062001bf387820162001a92565b82870152610120915062001c0982880162001a92565b9086015261014062001c1d87820162001a92565b82870152610160915062001c3382880162001aa5565b9086015261018062001c4787820162001aa5565b828701526101a0915062001c5d82880162001953565b908601526101c062001c7187820162001953565b8287015262001c8284880162001aa5565b818701525050838984015262001c9c610200860162001936565b908301525085525092840192810162001b0a565b5090979650505050505050565b80516001600160801b03811681146200194e57600080fd5b60006060828403121562001ce857600080fd5b62001cf262001893565b905062001cff8262001a81565b815262001d0f6020830162001cbd565b602082015262001d226040830162001cbd565b604082015292915050565b600082601f83011262001d3f57600080fd5b8151602062001d5262001adf8362001a5b565b82815260069290921b8401810191818101908684111562001d7257600080fd5b8286015b8481101562001dc8576040818903121562001d915760008081fd5b62001d9b62001868565b62001da68262001936565b815262001db585830162001953565b8186015283529183019160400162001d76565b509695505050505050565b600082601f83011262001de557600080fd5b8151602062001df862001adf8362001a5b565b82815260059290921b8401810191818101908684111562001e1857600080fd5b8286015b8481101562001dc85780516001600160401b038082111562001e3e5760008081fd5b908801906040601f19838c03810182131562001e5a5760008081fd5b62001e6462001868565b62001e7189860162001953565b8152828501518481111562001e865760008081fd5b8086019550508c603f86011262001e9f57600093508384fd5b88850151935062001eb462001adf8562001a5b565b84815260089490941b8501830193898101908e86111562001ed55760008081fd5b958401955b8587101562001fc957868f0361010081121562001ef75760008081fd5b62001f0162001868565b62001f0c8962001936565b815260e080878401121562001f215760008081fd5b62001f2b620018de565b925062001f3a8e8b0162001aa5565b835262001f49888b0162001aa5565b8e840152606062001f5c818c0162001a92565b89850152608062001f6f818d0162001aa5565b8286015260a0915062001f84828d0162001aa5565b9085015260c062001f978c820162001a81565b8286015262001fa8838d0162001a81565b908501525050808d019190915282526101009690960195908a019062001eda565b828b01525087525050509284019250830162001e1c565b600082601f83011262001ff257600080fd5b815160206200200562001adf8362001a5b565b82815260069290921b840181019181810190868411156200202557600080fd5b8286015b8481101562001dc85760408189031215620020445760008081fd5b6200204e62001868565b620020598262001936565b81526200206885830162001a92565b8186015283529183019160400162002029565b60008060008060008060006101c0888a0312156200209857600080fd5b620020a489896200196b565b9650620020b58960a08a0162001a16565b60e08901519096506001600160401b0380821115620020d357600080fd5b620020e18b838c0162001aba565b9650620020f38b6101008c0162001cd5565b95506101608a01519150808211156200210b57600080fd5b620021198b838c0162001d2d565b94506101808a01519150808211156200213157600080fd5b6200213f8b838c0162001dd3565b93506101a08a01519150808211156200215757600080fd5b50620021668a828b0162001fe0565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815460ff81161515825261024082019061ffff600882901c8116602085015263ffffffff601883901c81166040860152620021d360608601828560381c1663ffffffff169052565b620021eb60808601828560581c1663ffffffff169052565b6200220160a08601838560781c1661ffff169052565b6200221960c08601828560881c1663ffffffff169052565b6200222f60e08601838560a81c1661ffff169052565b620022466101008601838560b81c1661ffff169052565b6200225d6101208601838560c81c1661ffff169052565b620022766101408601828560d81c1663ffffffff169052565b600186015463ffffffff8282161661016087015292506001600160401b03602084901c81166101808701529150620022bf6101a08601838560601c166001600160401b03169052565b620022d86101c08601828560a01c1663ffffffff169052565b5060028501546001600160a01b0381166101e086015291506200230c6102008501828460a01c166001600160401b03169052565b5050600383015461022083015292915050565b8151151581526101e08101602083015162002340602084018261ffff169052565b50604083015162002359604084018263ffffffff169052565b50606083015162002372606084018263ffffffff169052565b5060808301516200238b608084018263ffffffff169052565b5060a0830151620023a260a084018261ffff169052565b5060c0830151620023bb60c084018263ffffffff169052565b5060e0830151620023d260e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b03908116918501919091526101a080860151909116908401526101c09384015116929091019190915290565b634e487b7160e01b600052601160045260246000fd5b8181038181111562001228576200122862002452565b60008162002490576200249062002452565b506000190190565b63ffffffff8181168382160190808211156200166e576200166e62002452565b6000604080830163ffffffff8616845260206040602086015281865180845260608701915060208801935060005b818110156200251a57845180516001600160a01b0316845284015161ffff16848401529383019391850191600101620024e6565b509098975050505050505050565b808202811582820484141762001228576200122862002452565b6000826200256057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b038281168282160390808211156200166e576200166e62002452565b6000602082840312156200259b57600080fd5b5051919050565b81810360008312801583831316838312821617156200166e576200166e62002452565b600060208284031215620025d857600080fd5b620012638262001a81565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562002616578181015183820152602001620025fc565b50506000910152565b6000825162002633818460208701620025f9565b9190910192915050565b60208152600082518060208401526200265e816040850160208701620025f9565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051616415620027276000396000818161032201528181610eb50152612e5b0152600081816102f301528181612e3301526131ed01526000818161028f01528181612dce015281816137d60152613f9a015260008181610260015281816110620152818161163201528181611cc901528181612b8901528181612da90152818161355001526136490152600081816102bf01528181612e00015261371501526164156000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806379ba509711610104578063b06d41bc116100a2578063e080bcba11610071578063e080bcba146109e4578063eff7cc48146109f7578063f2fde38b146109ff578063fbca3b7414610a1257600080fd5b8063b06d41bc146109a0578063c92b2832146109b6578063d09dc339146109c9578063df0aa9e9146109d157600080fd5b80638b364334116100de5780638b364334146109565780638da5cb5b146109695780639041be3d1461097a578063a69c64c01461098d57600080fd5b806379ba5097146107a557806382b49eb0146107ad578063869b7f621461094357600080fd5b8063549e946f116101715780636def4ce71161014b5780636def4ce7146104b1578063704b6c021461073e5780637437ff9f1461075157806376f6ae761461079257600080fd5b8063549e946f1461046d57806354b7146814610480578063599f6431146104a057600080fd5b806320487ded116101ad57806320487ded146103a85780634510d293146103c957806348a98aa4146103de578063546719cd1461040957600080fd5b8063061877e3146101d457806306285c6914610225578063181f5a771461035f575b600080fd5b6102076101e2366004614c92565b6001600160a01b03166000908152600b602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020015b60405180910390f35b6103526040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040518060a001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161021c9190614caf565b61039b6040518060400160405280601c81526020017f45564d3245564d4d756c74694f6e52616d7020312e362e302d6465760000000081525081565b60405161021c9190614d5f565b6103bb6103b6366004614dab565b610a32565b60405190815260200161021c565b6103dc6103d7366004614fe2565b610e64565b005b6103f16103ec366004615281565b610e7a565b6040516001600160a01b03909116815260200161021c565b610411610f29565b60405161021c919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6103dc61047b3660046152ba565b610fd1565b600e546040516bffffffffffffffffffffffff909116815260200161021c565b6002546001600160a01b03166103f1565b6107316104bf3660046152d8565b604080516102608101825260006080820181815260a0830182905260c0830182905260e08301829052610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c083018290526101e0830182905261020083018290526102208301829052610240830182905282526020820181905291810182905260608101919091525067ffffffffffffffff9081166000908152600a6020908152604091829020825161026081018452815460ff811615156080830190815261ffff610100808404821660a086015263ffffffff63010000008504811660c08701526701000000000000008504811660e08701526b01000000000000000000000085048116918601919091526f01000000000000000000000000000000840482166101208601527101000000000000000000000000000000000084048116610140860152750100000000000000000000000000000000000000000084048216610160860152770100000000000000000000000000000000000000000000008404821661018086015279010000000000000000000000000000000000000000000000000084049091166101a08501527b0100000000000000000000000000000000000000000000000000000090920482166101c084015260018401548083166101e0850152640100000000810488166102008501526c01000000000000000000000000810488166102208501527401000000000000000000000000000000000000000090819004909216610240840152825260028301546001600160a01b0381169483019490945290920490931691810191909152600390910154606082015290565b60405161021c9190615417565b6103dc61074c366004614c92565b61114a565b604080518082018252600080825260209182015281518083019092526005546001600160a01b039081168352600654169082015260405161021c9190615464565b6103dc6107a0366004615488565b611209565b6103dc61126c565b6108d76107bb366004615281565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525067ffffffffffffffff82166000908152600c602090815260408083206001600160a01b0385168452825291829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c082015292915050565b60405161021c9190600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b6103dc6109513660046154fd565b61132a565b610207610964366004615281565b61133e565b6000546001600160a01b03166103f1565b6102076109883660046152d8565b611437565b6103dc61099b36600461553e565b61147b565b6109a861148c565b60405161021c929190615650565b6103dc6109c4366004615692565b611587565b6103bb6115ef565b6103bb6109df3660046156e2565b6116af565b6103dc6109f236600461574e565b611af9565b6103dc611b0a565b6103dc610a0d366004614c92565b611d9b565b610a25610a203660046152d8565b611dac565b60405161021c9190615948565b67ffffffffffffffff82166000908152600a60205260408120805460ff16610a97576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6000610aa66080850185615995565b159050610ac757610ac2610abd6080860186615995565b611de0565b610adf565b6001820154640100000000900467ffffffffffffffff165b9050610b0985610af26020870187615995565b905083610b0260408901896159dc565b9050611e88565b6000600b81610b1e6080880160608901614c92565b6001600160a01b03168152602081019190915260400160009081205467ffffffffffffffff169150819003610b9b57610b5d6080860160608701614c92565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a8e565b60065460009081906001600160a01b031663ffdb4b37610bc160808a0160608b01614c92565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff8b1660248201526044016040805180830381865afa158015610c2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c509190615a52565b90925090506000808080610c6760408c018c6159dc565b90501115610ca257610c968b610c8360808d0160608e01614c92565b87610c9160408f018f6159dc565b611f98565b91945092509050610cd9565b6001880154610cd69074010000000000000000000000000000000000000000900463ffffffff16662386f26fc10000615a92565b92505b875460009077010000000000000000000000000000000000000000000000900461ffff1615610d4557610d428c6dffffffffffffffffffffffffffff607088901c16610d2860208f018f615995565b90508e8060400190610d3a91906159dc565b9050866123ab565b90505b600089600101600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff168463ffffffff168b600001600f9054906101000a900461ffff1661ffff168e8060200190610d989190615995565b610da3929150615a92565b8c54610dc4906b010000000000000000000000900463ffffffff168d615aa9565b610dce9190615aa9565b610dd89190615aa9565b610df2906dffffffffffffffffffffffffffff8916615a92565b610dfc9190615a92565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff87168282610e3367ffffffffffffffff8c1689615a92565b610e3d9190615aa9565b610e479190615aa9565b610e519190615abc565b9a50505050505050505050505b92915050565b610e6c6124b1565b610e768282612510565b5050565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f229190615ade565b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610fcc9061291e565b905090565b610fd96124b1565b6001600160a01b038116611019576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110236115ef565b90506000811215611060576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036110b2576110ad6001600160a01b03841683836129d0565b505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526110ad9083906001600160a01b038616906370a0823190602401602060405180830381865afa158015611115573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111399190615afb565b6001600160a01b03861691906129d0565b6000546001600160a01b0316331480159061117057506002546001600160a01b03163314155b156111a7576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6112116124b1565b610e768282808060200260200160405190810160405280939291908181526020016000905b828210156112625761125360408302860136819003810190615b14565b81526020019060010190611236565b5050505050612a50565b6001546001600160a01b031633146112c65760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a8e565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611332612cbd565b61133b81612d17565b50565b67ffffffffffffffff8083166000908152600d602090815260408083206001600160a01b0386168452909152812054909116808203610f225767ffffffffffffffff84166000908152600a60205260409020600201546001600160a01b0316801561142f576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015282169063856c824790602401602060405180830381865afa158015611402573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114269190615b47565b92505050610e5e565b509392505050565b67ffffffffffffffff8082166000908152600a60205260408120600201549091610e5e91740100000000000000000000000000000000000000009004166001615b64565b6114836124b1565b61133b81612eb1565b606060008061149b6007612f77565b90508067ffffffffffffffff8111156114b6576114b6614dfb565b6040519080825280602002602001820160405280156114fb57816020015b60408051808201909152600080825260208201528152602001906001900390816114d45790505b50925060005b8181101561156457600080611517600784612f82565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061154f5761154f615b85565b60209081029190910101525050600101611501565b5050600e5491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906115ad57506002546001600160a01b03163314155b156115e4576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61133b600382612fa0565b600e546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a59190615afb565b610fcc9190615b9b565b67ffffffffffffffff84166000908152600a60205260408120816116d68288888888613139565b905060005b81610140015151811015611a8f5760006116f860408901896159dc565b8381811061170857611708615b85565b90506040020180360381019061171e9190615bbb565b905060006117308a8360000151610e7a565b90506001600160a01b03811615806117e657506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa1580156117c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e49190615bf5565b155b1561182b5781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a8e565b6000816001600160a01b0316639a4575b96040518060a001604052808d80600001906118579190615995565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525067ffffffffffffffff8f166020808301919091526001600160a01b03808e16604080850191909152918901516060840152885116608090920191909152517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526119029190600401615c12565b6000604051808303816000875af1158015611921573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119499190810190615cdf565b905060208160200151511180156119aa575067ffffffffffffffff8b166000908152600c6020908152604080832086516001600160a01b0316845282529091205490820151516e01000000000000000000000000000090910463ffffffff16105b156119ef5782516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a8e565b80516119fa90613a0b565b5060408051606081019091526001600160a01b03831660808201528060a081016040516020818303038152906040528152602001826000015181526020018260200151815250604051602001611a509190615d70565b6040516020818303038152906040528561016001518581518110611a7657611a76615b85565b60200260200101819052505050508060010190506116db565b50611a9e818360030154613a66565b61018082015260405167ffffffffffffffff8816907fc79f9c3e610deac14de4e704195fe17eab0983ee9916866bc04d16a00f54daa690611ae0908490615e67565b60405180910390a261018001519150505b949350505050565b611b016124b1565b61133b81613bc1565b6000546001600160a01b03163314801590611b3057506002546001600160a01b03163314155b8015611b445750611b42600733614188565b155b15611b7b576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff166000819003611bcf576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546bffffffffffffffffffffffff1681811015611c1a576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611c246115ef565b1215611c5c576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000611c696007612f77565b905060005b81811015611d5857600080611c84600784612f82565b9092509050600087611ca4836bffffffffffffffffffffffff8a16615a92565b611cae9190615abc565b9050611cba8187615f9c565b9550611cfe6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff84166129d0565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806001019050611c6e565b5050600e80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b611da3612cbd565b61133b8161419d565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f97a657c900000000000000000000000000000000000000000000000000000000611e0d8385615fc1565b7fffffffff000000000000000000000000000000000000000000000000000000001614611e66576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e738260048186616009565b810190611e809190616033565b519392505050565b67ffffffffffffffff84166000908152600a6020526040902080546301000000900463ffffffff16841115611f015780546040517f86933789000000000000000000000000000000000000000000000000000000008152630100000090910463ffffffff16600482015260248101859052604401610a8e565b8054670100000000000000900463ffffffff16831115611f4d576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054610100900461ffff16821115611f91576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000808083815b8181101561239e576000878783818110611fbb57611fbb615b85565b905060400201803603810190611fd19190615bbb565b905060006001600160a01b0316611fec8c8360000151610e7a565b6001600160a01b03160361203a5780516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a8e565b67ffffffffffffffff8b166000908152600c6020908152604080832084516001600160a01b03168452825291829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c082018190526121ca5767ffffffffffffffff8c166000908152600a60205260409020805461216a90790100000000000000000000000000000000000000000000000000900461ffff16662386f26fc10000615a92565b6121749089615aa9565b81549098506121a8907b01000000000000000000000000000000000000000000000000000000900463ffffffff1688616075565b60018201549097506121c09063ffffffff1687616075565b9550505050612396565b604081015160009061ffff16156122e65760008c6001600160a01b031684600001516001600160a01b0316146122895760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690634ab35b0b90602401602060405180830381865afa15801561225e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122829190616092565b905061228c565b508a5b620186a0836040015161ffff166122ce8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661425390919063ffffffff16565b6122d89190615a92565b6122e29190615abc565b9150505b60608201516122f59088616075565b96508160800151866123079190616075565b82519096506000906123269063ffffffff16662386f26fc10000615a92565b9050808210156123455761233a818a615aa9565b985050505050612396565b6000836020015163ffffffff16662386f26fc100006123649190615a92565b90508083111561238457612378818b615aa9565b99505050505050612396565b61238e838b615aa9565b995050505050505b600101611f9f565b5050955095509592505050565b60008063ffffffff83166123c0608086615a92565b6123cc87610220615aa9565b6123d69190615aa9565b6123e09190615aa9565b67ffffffffffffffff88166000908152600a6020526040812080549293509171010000000000000000000000000000000000810463ffffffff1690612442907501000000000000000000000000000000000000000000900461ffff1685615a92565b61244c9190615aa9565b825490915077010000000000000000000000000000000000000000000000900461ffff1661248a6dffffffffffffffffffffffffffff8a1683615a92565b6124949190615a92565b6124a490655af3107a4000615a92565b9998505050505050505050565b6000546001600160a01b031633148015906124d757506002546001600160a01b03163314155b1561250e576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b825181101561285257600083828151811061253057612530615b85565b6020026020010151905060008160000151905060005b8260200151518110156128445760008360200151828151811061256b5761256b615b85565b602002602001015160200151905060008460200151838151811061259157612591615b85565b60200260200101516000015190506020826080015163ffffffff1610156126015760808201516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015263ffffffff9091166024820152604401610a8e565b67ffffffffffffffff84166000818152600c602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c015160c08d01511515730100000000000000000000000000000000000000027fffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff9115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9485166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9585166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9098166801000000000000000002979097167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff9886166401000000000267ffffffffffffffff19909d1695909916949094179a909a179590951695909517929092171617949094171692909217909155519091907f16a6faa936552870f38ad6586ca4ae10b5d085667b357895aebb320becccf8d490612832908690600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b60405180910390a35050600101612546565b505050806001019050612513565b5060005b81518110156110ad57600082828151811061287357612873615b85565b6020026020010151600001519050600083838151811061289557612895615b85565b60209081029190910181015181015167ffffffffffffffff84166000818152600c845260408082206001600160a01b0385168084529552808220805473ffffffffffffffffffffffffffffffffffffffff191690555192945090917ffa22e84f9c809b5b7e94f084eb45cf17a5e4703cecef8f27ed35e54b719bffcd9190a35050600101612856565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526129ac82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261299091906160ad565b85608001516fffffffffffffffffffffffffffffffff16614290565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526110ad9084906142b8565b80516040811115612a8d576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff1615801590612adb5750600e5463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b15612ae857612ae8611b0a565b6000612af46007612f77565b90505b8015612b36576000612b15612b0d6001846160ad565b600790612f82565b509050612b2360078261439d565b505080612b2f906160c0565b9050612af7565b506000805b82811015612c3e576000848281518110612b5757612b57615b85565b60200260200101516000015190506000858381518110612b7957612b79615b85565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480612bce57506001600160a01b038216155b15612c10576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a8e565b612c2060078361ffff84166143b2565b50612c2f61ffff821685616075565b93505050806001019050612b3b565b50600e80547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd2490612cb090839086906160f5565b60405180910390a1505050565b6000546001600160a01b0316331461250e5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a8e565b60208101516001600160a01b0316612d5b576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516005805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b039384161790915560208084015160068054909316908416179091556040805160a0810182527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16928101929092527f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16828201527f0000000000000000000000000000000000000000000000000000000000000000831660608301527f0000000000000000000000000000000000000000000000000000000000000000909216608082015290517f2436895da154cdfddf5eb1175c9be7129f01727fee8af2fa04f68641e8ea5ec8916111fe918490616114565b60005b8151811015610e76576000828281518110612ed157612ed1615b85565b60200260200101516000015190506000838381518110612ef357612ef3615b85565b6020908102919091018101518101516001600160a01b0384166000818152600b8452604090819020805467ffffffffffffffff191667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101612eb4565b6000610e5e826143c8565b6000808080612f9186866143d3565b909450925050505b9250929050565b8154600090612fbc90600160801b900463ffffffff16426160ad565b905080156130395760018301548354612ff7916fffffffffffffffffffffffffffffffff808216928116918591600160801b90910416614290565b83546fffffffffffffffffffffffffffffffff9190911673ffffffffffffffffffffffffffffffffffffffff1990911617600160801b4263ffffffff16021783555b6020820151835461305f916fffffffffffffffffffffffffffffffff90811691166143fe565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612cb09084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018390526101008201839052610120820181905261014082018190526101608201526101808101919091526040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608086901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561323c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132609190615bf5565b156132a3576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610a8e565b6001600160a01b0382166132e3576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314613327576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855460ff1661336e576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610a8e565b600061337d6080860186615995565b15905061339957613394610abd6080870187615995565b6133b1565b6001870154640100000000900467ffffffffffffffff165b905060006133c260408701876159dc565b91506133e09050876133d76020890189615995565b90508484611e88565b8015613546576000805b82811015613534576133ff60408901896159dc565b8281811061340f5761340f615b85565b90506040020160200135600003613452576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152600c6020526040808220919061347a908b018b6159dc565b8481811061348a5761348a615b85565b6134a09260206040909202019081019150614c92565b6001600160a01b031681526020810191909152604001600020547201000000000000000000000000000000000000900460ff161561352c5761351f6134e860408a018a6159dc565b838181106134f8576134f8615b85565b90506040020180360381019061350e9190615bbb565b6006546001600160a01b0316614414565b6135299083615aa9565b91505b6001016133ea565b5080156135445761354481614535565b505b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166135806080880160608901614c92565b6001600160a01b0316036135e457600e80548691906000906135b19084906bffffffffffffffffffffffff16616196565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550613703565b6006546001600160a01b03166241e5be6136046080890160608a01614c92565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015613690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b49190615afb565b600e80546000906136d49084906bffffffffffffffffffffffff16616196565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b600e546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115613770576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061377c888661133e565b613787906001615b64565b67ffffffffffffffff8981166000908152600d602090815260408083206001600160a01b038b1680855290835292819020805467ffffffffffffffff191686861617905580516101a0810182527f000000000000000000000000000000000000000000000000000000000000000090941684529083019190915291925090810161384e6138148a80615995565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613a0b92505050565b6001600160a01b031681526020018a600201601481819054906101000a900467ffffffffffffffff16613880906161bb565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff1681526020018481526020016000151581526020018267ffffffffffffffff1681526020018860600160208101906138e69190614c92565b6001600160a01b0316815260200187815260200188806020019061390a9190615995565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525060200161395160408a018a6159dc565b808060200260200160405190810160405280939291908181526020016000905b8282101561399d5761398e60408302860136819003810190615bbb565b81526020019060010190613971565b505050505081526020018367ffffffffffffffff8111156139c0576139c0614dfb565b6040519080825280602002602001820160405280156139f357816020015b60608152602001906001900390816139de5790505b50815260006020909101529998505050505050505050565b60008151602014613a4a57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610a8e9190614d5f565b610e5e82806020019051810190613a619190615afb565b614542565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613afc9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613b3591906161e2565b60405160208183030381529060405280519060200120876101600151604051602001613b6191906161f5565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60005b8151811015610e76576000828281518110613be157613be1615b85565b602002602001015190506000838381518110613bff57613bff615b85565b60200260200101516000015190508067ffffffffffffffff1660001480613c3757506020820151610180015167ffffffffffffffff16155b15613c7a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610a8e565b6000600a60008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090506000836040015190506000604051806080016040528086602001518152602001836001600160a01b031681526020018460020160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018460030154815250905080600001518360000160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555090505082600301546000801b0361407857604080517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908516606082015230608082015260a00160408051601f1981840301815291905280516020909101206060820181905260038401556001600160a01b038216156140315760028301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b8367ffffffffffffffff167f7a70081ee29c1fc27898089ba2a5fc35ac0106b043c82ccecd24c6fd48f6ca868460405161406b9190616208565b60405180910390a2614178565b60028301546001600160a01b038381169116146140cd576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610a8e565b60208560200151610160015163ffffffff16101561413157602085015161016001516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526000600482015263ffffffff9091166024820152604401610a8e565b8367ffffffffffffffff167f944eb884a589931130671ee4a7379fbe5fe65ed605a048ba99c454582f2460b0866020015160405161416f9190616394565b60405180910390a25b5050505050806001019050613bc4565b6000610f22836001600160a01b0384166145af565b336001600160a01b038216036141f55760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a8e565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000614286837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615a92565b610f229190615abc565b60006142af856142a08486615a92565b6142aa9087615aa9565b6143fe565b95945050505050565b600061430d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145bb9092919063ffffffff16565b8051909150156110ad578080602001905181019061432b9190615bf5565b6110ad5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a8e565b6000610f22836001600160a01b0384166145ca565b6000611af1846001600160a01b038516846145e7565b6000610e5e82614604565b600080806143e1858561460e565b600081815260029690960160205260409095205494959350505050565b600081831061440d5781610f22565b5090919050565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa15801561447a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061449e91906163a3565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036145075783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a8e565b6020840151611af1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690614253565b61133b600382600061461a565b60006001600160a01b0382118061455a575061040082105b156145ab5760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610a8e91600401614d5f565b5090565b6000610f228383614935565b6060611af1848460008561494d565b60008181526002830160205260408120819055610f228383614a3f565b60008281526002840160205260408120829055611af18484614a4b565b6000610e5e825490565b6000610f228383614a57565b825474010000000000000000000000000000000000000000900460ff161580614641575081155b1561464b57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061468490600160801b900463ffffffff16426160ad565b9050801561472a57818311156146c6576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546146f390839085908490600160801b90046fffffffffffffffffffffffffffffffff16614290565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b848210156147c7576001600160a01b03841661477c576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a8e565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a8e565b848310156148b357600186810154600160801b90046fffffffffffffffffffffffffffffffff169060009082906147fe90826160ad565b614808878a6160ad565b6148129190615aa9565b61481c9190615abc565b90506001600160a01b038616614868576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a8e565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a8e565b6148bd85846160ad565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60008181526001830160205260408120541515610f22565b6060824710156149c55760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a8e565b600080866001600160a01b031685876040516149e191906163d6565b60006040518083038185875af1925050503d8060008114614a1e576040519150601f19603f3d011682016040523d82523d6000602084013e614a23565b606091505b5091509150614a3487838387614a81565b979650505050505050565b6000610f228383614afa565b6000610f228383614bf4565b6000826000018281548110614a6e57614a6e615b85565b9060005260206000200154905092915050565b60608315614af0578251600003614ae9576001600160a01b0385163b614ae95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a8e565b5081611af1565b611af18383614c43565b60008181526001830160205260408120548015614be3576000614b1e6001836160ad565b8554909150600090614b32906001906160ad565b9050818114614b97576000866000018281548110614b5257614b52615b85565b9060005260206000200154905080876000018481548110614b7557614b75615b85565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614ba857614ba86163f2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610e5e565b6000915050610e5e565b5092915050565b6000818152600183016020526040812054614c3b57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e5e565b506000610e5e565b815115614c535781518083602001fd5b8060405162461bcd60e51b8152600401610a8e9190614d5f565b6001600160a01b038116811461133b57600080fd5b8035614c8d81614c6d565b919050565b600060208284031215614ca457600080fd5b8135610f2281614c6d565b60a08101610e5e82846001600160a01b0380825116835267ffffffffffffffff60208301511660208401526bffffffffffffffffffffffff6040830151166040840152806060830151166060840152806080830151166080840152505050565b60005b83811015614d2a578181015183820152602001614d12565b50506000910152565b60008151808452614d4b816020860160208601614d0f565b601f01601f19169290920160200192915050565b602081526000610f226020830184614d33565b67ffffffffffffffff8116811461133b57600080fd5b8035614c8d81614d72565b600060a08284031215614da557600080fd5b50919050565b60008060408385031215614dbe57600080fd5b8235614dc981614d72565b9150602083013567ffffffffffffffff811115614de557600080fd5b614df185828601614d93565b9150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614e3457614e34614dfb565b60405290565b60405160e0810167ffffffffffffffff81118282101715614e3457614e34614dfb565b6040516060810167ffffffffffffffff81118282101715614e3457614e34614dfb565b6040516101e0810167ffffffffffffffff81118282101715614e3457614e34614dfb565b604051601f8201601f1916810167ffffffffffffffff81118282101715614ecd57614ecd614dfb565b604052919050565b600067ffffffffffffffff821115614eef57614eef614dfb565b5060051b60200190565b63ffffffff8116811461133b57600080fd5b8035614c8d81614ef9565b803561ffff81168114614c8d57600080fd5b801515811461133b57600080fd5b8035614c8d81614f28565b600082601f830112614f5257600080fd5b81356020614f67614f6283614ed5565b614ea4565b82815260069290921b84018101918181019086841115614f8657600080fd5b8286015b84811015614fd75760408189031215614fa35760008081fd5b614fab614e11565b8135614fb681614d72565b815281850135614fc581614c6d565b81860152835291830191604001614f8a565b509695505050505050565b60008060408385031215614ff557600080fd5b67ffffffffffffffff8335111561500b57600080fd5b83601f84358501011261501d57600080fd5b61502d614f628435850135614ed5565b8335840180358083526020808401939260059290921b9091010186101561505357600080fd5b602085358601015b85358601803560051b0160200181101561524b5767ffffffffffffffff8135111561508557600080fd5b6040601f1982358835890101890301121561509f57600080fd5b6150a7614e11565b6150ba6020833589358a01010135614d72565b863587018235016020810135825267ffffffffffffffff60409091013511156150e257600080fd5b86358701823501604081013501603f810189136150fe57600080fd5b61510e614f626020830135614ed5565b602082810135808352908201919060081b83016040018b101561513057600080fd5b604083015b6040602085013560081b85010181101561523257610100818d03121561515a57600080fd5b615162614e11565b61516c8235614c6d565b8135815260e0601f19838f0301121561518457600080fd5b61518c614e3a565b6151996020840135614ef9565b602083013581526151ad6040840135614ef9565b604083013560208201526151c360608401614f16565b60408201526151d56080840135614ef9565b608083013560608201526151ec60a0840135614ef9565b60a0830135608082015261520260c08401614f36565b60a082015261521360e08401614f36565b60c0820152602082810191909152908452929092019161010001615135565b506020848101919091529286525050928301920161505b565b5092505067ffffffffffffffff6020840135111561526857600080fd5b6152788460208501358501614f41565b90509250929050565b6000806040838503121561529457600080fd5b823561529f81614d72565b915060208301356152af81614c6d565b809150509250929050565b600080604083850312156152cd57600080fd5b823561529f81614c6d565b6000602082840312156152ea57600080fd5b8135610f2281614d72565b8051151582526020810151615310602084018261ffff169052565b506040810151615328604084018263ffffffff169052565b506060810151615340606084018263ffffffff169052565b506080810151615358608084018263ffffffff169052565b5060a081015161536e60a084018261ffff169052565b5060c081015161538660c084018263ffffffff169052565b5060e081015161539c60e084018261ffff169052565b506101008181015161ffff9081169184019190915261012080830151909116908301526101408082015163ffffffff90811691840191909152610160808301518216908401526101808083015167ffffffffffffffff908116918501919091526101a080840151909116908401526101c09182015116910152565b60006102408201905061542b8284516152f5565b60208301516001600160a01b03166101e0830152604083015167ffffffffffffffff166102008301526060909201516102209091015290565b60408101610e5e828480516001600160a01b03908116835260209182015116910152565b6000806020838503121561549b57600080fd5b823567ffffffffffffffff808211156154b357600080fd5b818501915085601f8301126154c757600080fd5b8135818111156154d657600080fd5b8660208260061b85010111156154eb57600080fd5b60209290920196919550909350505050565b60006040828403121561550f57600080fd5b615517614e11565b823561552281614c6d565b8152602083013561553281614c6d565b60208201529392505050565b6000602080838503121561555157600080fd5b823567ffffffffffffffff81111561556857600080fd5b8301601f8101851361557957600080fd5b8035615587614f6282614ed5565b81815260069190911b820183019083810190878311156155a657600080fd5b928401925b82841015614a3457604084890312156155c45760008081fd5b6155cc614e11565b84356155d781614c6d565b8152848601356155e681614d72565b81870152825260409390930192908401906155ab565b60008151808452602080850194506020840160005b8381101561564557815180516001600160a01b0316885283015161ffff168388015260409096019590820190600101615611565b509495945050505050565b60408152600061566360408301856155fc565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614c8d57600080fd5b6000606082840312156156a457600080fd5b6156ac614e5d565b82356156b781614f28565b81526156c560208401615672565b60208201526156d660408401615672565b60408201529392505050565b600080600080608085870312156156f857600080fd5b843561570381614d72565b9350602085013567ffffffffffffffff81111561571f57600080fd5b61572b87828801614d93565b93505060408501359150606085013561574381614c6d565b939692955090935050565b6000602080838503121561576157600080fd5b823567ffffffffffffffff81111561577857600080fd5b8301601f8101851361578957600080fd5b8035615797614f6282614ed5565b81815261022091820283018401918482019190888411156157b757600080fd5b938501935b8385101561593c57848903818112156157d55760008081fd5b6157dd614e5d565b86356157e881614d72565b81526101e0601f1983018113156157ff5760008081fd5b615807614e80565b9250615814898901614f36565b83526040615823818a01614f16565b8a8501526060615834818b01614f0b565b828601526080615845818c01614f0b565b8287015260a09150615858828c01614f0b565b9086015260c06158698b8201614f16565b8287015260e0915061587c828c01614f0b565b9086015261010061588e8b8201614f16565b8287015261012091506158a2828c01614f16565b908601526101406158b48b8201614f16565b8287015261016091506158c8828c01614f0b565b908601526101806158da8b8201614f0b565b828701526101a091506158ee828c01614d88565b908601526101c06159008b8201614d88565b8287015261590f848c01614f0b565b818701525050838a8401526159276102008a01614c82565b908301525084525093840193918501916157bc565b50979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156159895783516001600160a01b031683529284019291840191600101615964565b50909695505050505050565b6000808335601e198436030181126159ac57600080fd5b83018035915067ffffffffffffffff8211156159c757600080fd5b602001915036819003821315612f9957600080fd5b6000808335601e198436030181126159f357600080fd5b83018035915067ffffffffffffffff821115615a0e57600080fd5b6020019150600681901b3603821315612f9957600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614c8d57600080fd5b60008060408385031215615a6557600080fd5b615a6e83615a26565b915061527860208401615a26565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e5e57610e5e615a7c565b80820180821115610e5e57610e5e615a7c565b600082615ad957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615af057600080fd5b8151610f2281614c6d565b600060208284031215615b0d57600080fd5b5051919050565b600060408284031215615b2657600080fd5b615b2e614e11565b8235615b3981614c6d565b815261553260208401614f16565b600060208284031215615b5957600080fd5b8151610f2281614d72565b67ffffffffffffffff818116838216019080821115614bed57614bed615a7c565b634e487b7160e01b600052603260045260246000fd5b8181036000831280158383131683831282161715614bed57614bed615a7c565b600060408284031215615bcd57600080fd5b615bd5614e11565b8235615be081614c6d565b81526020928301359281019290925250919050565b600060208284031215615c0757600080fd5b8151610f2281614f28565b602081526000825160a06020840152615c2e60c0840182614d33565b905067ffffffffffffffff602085015116604084015260408401516001600160a01b038082166060860152606086015160808601528060808701511660a086015250508091505092915050565b600082601f830112615c8c57600080fd5b815167ffffffffffffffff811115615ca657615ca6614dfb565b615cb96020601f19601f84011601614ea4565b818152846020838601011115615cce57600080fd5b611af1826020830160208701614d0f565b600060208284031215615cf157600080fd5b815167ffffffffffffffff80821115615d0957600080fd5b9083019060408286031215615d1d57600080fd5b615d25614e11565b825182811115615d3457600080fd5b615d4087828601615c7b565b825250602083015182811115615d5557600080fd5b615d6187828601615c7b565b60208301525095945050505050565b602081526000825160606020840152615d8c6080840182614d33565b90506020840151601f1980858403016040860152615daa8383614d33565b92506040860151915080858403016060860152506142af8282614d33565b60008151808452602080850194506020840160005b8381101561564557815180516001600160a01b031688528301518388015260409096019590820190600101615ddd565b60008282518085526020808601955060208260051b8401016020860160005b84811015615e5a57601f19868403018952615e48838351614d33565b98840198925090830190600101615e2c565b5090979650505050505050565b60208152615e8260208201835167ffffffffffffffff169052565b60006020830151615e9e60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a0830151615ee760c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615f1a818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615f486101c0860184614d33565b9250808601519050601f19610160818786030181880152615f698584615dc8565b945080880151925050610180818786030181880152615f888584615e0d565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff828116828216039080821115614bed57614bed615a7c565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156160015780818660040360031b1b83161692505b505092915050565b6000808585111561601957600080fd5b8386111561602657600080fd5b5050820193919092039150565b60006020828403121561604557600080fd5b6040516020810181811067ffffffffffffffff8211171561606857616068614dfb565b6040529135825250919050565b63ffffffff818116838216019080821115614bed57614bed615a7c565b6000602082840312156160a457600080fd5b610f2282615a26565b81810381811115610e5e57610e5e615a7c565b6000816160cf576160cf615a7c565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000611af160408301846155fc565b60e0810161617482856001600160a01b0380825116835267ffffffffffffffff60208301511660208401526bffffffffffffffffffffffff6040830151166040840152806060830151166060840152806080830151166080840152505050565b82516001600160a01b0390811660a084015260208401511660c0830152610f22565b6bffffffffffffffffffffffff818116838216019080821115614bed57614bed615a7c565b600067ffffffffffffffff8083168181036161d8576161d8615a7c565b6001019392505050565b602081526000610f226020830184615dc8565b602081526000610f226020830184615e0d565b815460ff81161515825261024082019061ffff600882901c8116602085015263ffffffff601883901c8116604086015261624f60608601828560381c1663ffffffff169052565b61626660808601828560581c1663ffffffff169052565b61627b60a08601838560781c1661ffff169052565b61629260c08601828560881c1663ffffffff169052565b6162a760e08601838560a81c1661ffff169052565b6162bd6101008601838560b81c1661ffff169052565b6162d36101208601838560c81c1661ffff169052565b6162eb6101408601828560d81c1663ffffffff169052565b600186015463ffffffff82821616610160870152925067ffffffffffffffff602084901c811661018087015291506163356101a08601838560601c1667ffffffffffffffff169052565b61634d6101c08601828560a01c1663ffffffff169052565b5060028501546001600160a01b0381166101e086015291506163816102008501828460a01c1667ffffffffffffffff169052565b5050600383015461022083015292915050565b6101e08101610e5e82846152f5565b6000604082840312156163b557600080fd5b6163bd614e11565b6163c683615a26565b8152602083015161553281614ef9565b600082516163e8818460208701614d0f565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"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\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"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\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"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\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"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\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainDynamicConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"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\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"destChainSelector\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"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\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainDynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"metadataHash\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"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\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"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\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101206040523480156200001257600080fd5b506040516200736f3803806200736f83398101604081905262000035916200153c565b8233806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000276565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555085516001600160a01b0316158062000169575060208601516001600160401b0316155b8062000180575060608601516001600160a01b0316155b8062000197575060808601516001600160a01b0316155b15620001b6576040516306b7c75960e31b815260040160405180910390fd5b85516001600160a01b0390811660a05260208701516001600160401b031660c05260408701516001600160601b031660809081526060880151821660e0528701511661010052620002078562000321565b6200021284620004a6565b6200021d8262000a03565b604080516000808252602082019092526200026a9183919062000263565b60408051808201909152600080825260208201528152602001906001900390816200023b5790505b5062000acf565b5050505050506200195f565b336001600160a01b03821603620002d05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60208101516001600160a01b0316158062000347575060408101516001600160a01b0316155b1562000366576040516306b7c75960e31b815260040160405180910390fd5b8051600580546001600160a01b039283166001600160a01b03199182161790915560208084015160068054918516918416919091179055604080850151600780549186169190941617909255815160a08082018452518416815260c0516001600160401b031691810191909152608080516001600160601b03168284015260e051841660608301526101005190931692810192909252517f7d6ca86e1084c492475f59ce7b74c37ad96a7440eb9c217ff5b27c183957b9b8916200049b91849082516001600160a01b0390811682526020808501516001600160401b0316818401526040808601516001600160601b0316818501526060808701518416908501526080958601518316958401959095528351821660a0840152830151811660c083015291909201511660e08201526101000190565b60405180910390a150565b60005b8151811015620009ff576000828281518110620004ca57620004ca62001682565b602002602001015190506000838381518110620004eb57620004eb62001682565b6020026020010151600001519050806001600160401b031660001480620005225750602082015161018001516001600160401b0316155b156200054d5760405163c35aa79d60e01b81526001600160401b038216600482015260240162000084565b600060086000836001600160401b03166001600160401b0316815260200190815260200160002090506000836040015190506000604051806080016040528086602001518152602001836001600160a01b031681526020018460020160149054906101000a90046001600160401b03166001600160401b031681526020018460030154815250905080600001518360000160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a8154816001600160401b0302191690836001600160401b031602179055506101a082015181600101600c6101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555090505082600301546000801b036200091c5760c051604080517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b360208201526001600160401b0392831691810191909152908516606082015230608082015260a00160408051601f1981840301815291905280516020909101206060820181905260038401556001600160a01b03821615620008d3576002830180546001600160a01b0319166001600160a01b0384161790555b836001600160401b03167f7a70081ee29c1fc27898089ba2a5fc35ac0106b043c82ccecd24c6fd48f6ca86846040516200090e919062001698565b60405180910390a2620009ee565b60028301546001600160a01b03838116911614620009595760405163c35aa79d60e01b81526001600160401b038516600482015260240162000084565b60208560200151610160015163ffffffff161015620009a657602085015161016001516040516312766e0160e11b81526000600482015263ffffffff909116602482015260440162000084565b836001600160401b03167f944eb884a589931130671ee4a7379fbe5fe65ed605a048ba99c454582f2460b08660200151604051620009e591906200182c565b60405180910390a25b5050505050806001019050620004a9565b5050565b60005b8151811015620009ff57600082828151811062000a275762000a2762001682565b6020026020010151600001519050600083838151811062000a4c5762000a4c62001682565b6020908102919091018101518101516001600160a01b03841660008181526009845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a06565b60005b825181101562000d6157600083828151811062000af35762000af362001682565b6020026020010151905060008160000151905060005b82602001515181101562000d525760008360200151828151811062000b325762000b3262001682565b602002602001015160200151905060008460200151838151811062000b5b5762000b5b62001682565b60200260200101516000015190506020826080015163ffffffff16101562000bb45760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000084565b6001600160401b0384166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c015160c08d01511515600160981b0260ff60981b19911515600160901b0260ff60901b1963ffffffff948516600160701b021664ffffffffff60701b199585166a01000000000000000000000263ffffffff60501b1961ffff90981668010000000000000000029790971665ffffffffffff60401b19988616640100000000026001600160401b0319909d1695909916949094179a909a179590951695909517929092171617949094171692909217909155519091907f16a6faa936552870f38ad6586ca4ae10b5d085667b357895aebb320becccf8d49062000d3f908690600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b60405180910390a3505060010162000b09565b50505080600101905062000ad2565b5060005b815181101562000e2757600082828151811062000d865762000d8662001682565b6020026020010151600001519050600083838151811062000dab5762000dab62001682565b6020908102919091018101518101516001600160401b0384166000818152600a845260408082206001600160a01b038516808452955280822080546001600160a01b03191690555192945090917ffa22e84f9c809b5b7e94f084eb45cf17a5e4703cecef8f27ed35e54b719bffcd9190a3505060010162000d65565b505050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000e675762000e6762000e2c565b60405290565b6040516101e081016001600160401b038111828210171562000e675762000e6762000e2c565b604080519081016001600160401b038111828210171562000e675762000e6762000e2c565b60405160e081016001600160401b038111828210171562000e675762000e6762000e2c565b60405160a081016001600160401b038111828210171562000e675762000e6762000e2c565b604051601f8201601f191681016001600160401b038111828210171562000f2d5762000f2d62000e2c565b604052919050565b80516001600160a01b038116811462000f4d57600080fd5b919050565b80516001600160401b038116811462000f4d57600080fd5b60006060828403121562000f7d57600080fd5b62000f8762000e42565b905062000f948262000f35565b815262000fa46020830162000f35565b602082015262000fb76040830162000f35565b604082015292915050565b60006001600160401b0382111562000fde5762000fde62000e2c565b5060051b60200190565b8051801515811462000f4d57600080fd5b805161ffff8116811462000f4d57600080fd5b805163ffffffff8116811462000f4d57600080fd5b600082601f8301126200103357600080fd5b815160206200104c620010468362000fc2565b62000f02565b82815261022092830285018201928282019190878511156200106d57600080fd5b8387015b858110156200121757808903828112156200108c5760008081fd5b6200109662000e42565b620010a18362000f52565b81526101e080601f1984011215620010b95760008081fd5b620010c362000e6d565b9250620010d288850162000fe8565b83526040620010e381860162000ff9565b898501526060620010f68187016200100c565b828601526080620011098188016200100c565b8287015260a091506200111e8288016200100c565b9086015260c06200113187820162000ff9565b8287015260e09150620011468288016200100c565b908601526101006200115a87820162000ff9565b8287015261012091506200117082880162000ff9565b908601526101406200118487820162000ff9565b8287015261016091506200119a8288016200100c565b90860152610180620011ae8782016200100c565b828701526101a09150620011c482880162000f52565b908601526101c0620011d887820162000f52565b82870152620011e98488016200100c565b818701525050838984015262001203610200860162000f35565b908301525085525092840192810162001071565b5090979650505050505050565b80516001600160801b038116811462000f4d57600080fd5b6000606082840312156200124f57600080fd5b6200125962000e42565b9050620012668262000fe8565b8152620012766020830162001224565b602082015262000fb76040830162001224565b600082601f8301126200129b57600080fd5b81516020620012ae620010468362000fc2565b82815260069290921b84018101918181019086841115620012ce57600080fd5b8286015b84811015620013245760408189031215620012ed5760008081fd5b620012f762000e93565b620013028262000f35565b81526200131185830162000f52565b81860152835291830191604001620012d2565b509695505050505050565b600082601f8301126200134157600080fd5b8151602062001354620010468362000fc2565b82815260059290921b840181019181810190868411156200137457600080fd5b8286015b84811015620013245780516001600160401b03808211156200139a5760008081fd5b908801906040601f19838c038101821315620013b65760008081fd5b620013c062000e93565b620013cd89860162000f52565b81528285015184811115620013e25760008081fd5b8086019550508c603f860112620013fb57600093508384fd5b88850151935062001410620010468562000fc2565b84815260089490941b8501830193898101908e861115620014315760008081fd5b958401955b858710156200152557868f03610100811215620014535760008081fd5b6200145d62000e93565b620014688962000f35565b815260e08087840112156200147d5760008081fd5b6200148762000eb8565b9250620014968e8b016200100c565b8352620014a5888b016200100c565b8e8401526060620014b8818c0162000ff9565b898501526080620014cb818d016200100c565b8286015260a09150620014e0828d016200100c565b9085015260c0620014f38c820162000fe8565b8286015262001504838d0162000fe8565b908501525050808d019190915282526101009690960195908a019062001436565b828b01525087525050509284019250830162001378565b6000806000806000808688036101c08112156200155857600080fd5b60a08112156200156757600080fd5b506200157262000edd565b6200157d8862000f35565b81526200158d6020890162000f52565b602082015260408801516001600160601b0381168114620015ad57600080fd5b6040820152620015c06060890162000f35565b6060820152620015d36080890162000f35565b60808201529550620015e98860a0890162000f6a565b6101008801519095506001600160401b03808211156200160857600080fd5b620016168a838b0162001021565b9550620016288a6101208b016200123c565b94506101808901519150808211156200164057600080fd5b6200164e8a838b0162001289565b93506101a08901519150808211156200166657600080fd5b506200167589828a016200132f565b9150509295509295509295565b634e487b7160e01b600052603260045260246000fd5b815460ff81161515825261024082019061ffff600882901c8116602085015263ffffffff601883901c81166040860152620016e060608601828560381c1663ffffffff169052565b620016f860808601828560581c1663ffffffff169052565b6200170e60a08601838560781c1661ffff169052565b6200172660c08601828560881c1663ffffffff169052565b6200173c60e08601838560a81c1661ffff169052565b620017536101008601838560b81c1661ffff169052565b6200176a6101208601838560c81c1661ffff169052565b620017836101408601828560d81c1663ffffffff169052565b600186015463ffffffff8282161661016087015292506001600160401b03602084901c81166101808701529150620017cc6101a08601838560601c166001600160401b03169052565b620017e56101c08601828560a01c1663ffffffff169052565b5060028501546001600160a01b0381166101e08601529150620018196102008501828460a01c166001600160401b03169052565b5050600383015461022083015292915050565b8151151581526101e0810160208301516200184d602084018261ffff169052565b50604083015162001866604084018263ffffffff169052565b5060608301516200187f606084018263ffffffff169052565b50608083015162001898608084018263ffffffff169052565b5060a0830151620018af60a084018261ffff169052565b5060c0830151620018c860c084018263ffffffff169052565b5060e0830151620018df60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501516001600160401b03908116918501919091526101a080860151909116908401526101c09384015116929091019190915290565b60805160a05160c05160e05161010051615970620019ff600039600081816102eb01528181611011015261219c0152600081816102bc015281816121740152612aae0152600081816102580152818161210f015281816130820152613847015260008181610229015281816120ea01528181612e130152612ebd0152600081816102880152818161214101528181612f7f0152612fef01526159706000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c80637437ff9f116100e3578063a69c64c01161008c578063e080bcba11610066578063e080bcba14610970578063f2fde38b14610983578063fbca3b741461099657600080fd5b8063a69c64c014610937578063c92b28321461094a578063df0aa9e91461095d57600080fd5b80638b364334116100bd5780638b364334146109005780638da5cb5b146109135780639041be3d1461092457600080fd5b80637437ff9f1461070257806379ba50971461076257806382b49eb01461076a57600080fd5b80634510d29311610145578063599f64311161011f578063599f6431146104515780636def4ce714610462578063704b6c02146106ef57600080fd5b80634510d293146103af57806348a98aa4146103c2578063546719cd146103ed57600080fd5b806320487ded1161017657806320487ded1461037157806334d560e4146103925780633a019940146103a757600080fd5b8063061877e31461019d57806306285c69146101ee578063181f5a7714610328575b600080fd5b6101d06101ab3660046142c5565b6001600160a01b031660009081526009602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020015b60405180910390f35b61031b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040518060a001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516101e591906142e2565b6103646040518060400160405280601c81526020017f45564d3245564d4d756c74694f6e52616d7020312e362e302d6465760000000081525081565b6040516101e59190614392565b61038461037f3660046143de565b6109b6565b6040519081526020016101e5565b6103a56103a0366004614521565b610de8565b005b6103a5610dfc565b6103a56103bd366004614682565b610fc0565b6103d56103d0366004614921565b610fd6565b6040516001600160a01b0390911681526020016101e5565b6103f5611085565b6040516101e5919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03166103d5565b6106e261047036600461495a565b604080516102608101825260006080820181815260a0830182905260c0830182905260e08301829052610100830182905261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c083018290526101e0830182905261020083018290526102208301829052610240830182905282526020820181905291810182905260608101919091525067ffffffffffffffff908116600090815260086020908152604091829020825161026081018452815460ff811615156080830190815261ffff610100808404821660a086015263ffffffff63010000008504811660c08701526701000000000000008504811660e08701526b01000000000000000000000085048116918601919091526f01000000000000000000000000000000840482166101208601527101000000000000000000000000000000000084048116610140860152750100000000000000000000000000000000000000000084048216610160860152770100000000000000000000000000000000000000000000008404821661018086015279010000000000000000000000000000000000000000000000000084049091166101a08501527b0100000000000000000000000000000000000000000000000000000090920482166101c084015260018401548083166101e0850152640100000000810488166102008501526c01000000000000000000000000810488166102208501527401000000000000000000000000000000000000000090819004909216610240840152825260028301546001600160a01b0381169483019490945290920490931691810191909152600390910154606082015290565b6040516101e59190614a99565b6103a56106fd3660046142c5565b61112d565b610755604080516060810182526000808252602082018190529181019190915250604080516060810182526005546001600160a01b03908116825260065481166020830152600754169181019190915290565b6040516101e59190614ae6565b6103a56111ec565b610894610778366004614921565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525067ffffffffffffffff82166000908152600a602090815260408083206001600160a01b0385168452825291829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c082015292915050565b6040516101e59190600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b6101d061090e366004614921565b6112aa565b6000546001600160a01b03166103d5565b6101d061093236600461495a565b6113a3565b6103a5610945366004614b16565b6113e7565b6103a5610958366004614bf4565b6113f8565b61038461096b366004614c38565b611460565b6103a561097e366004614ca4565b6118aa565b6103a56109913660046142c5565b6118bb565b6109a96109a436600461495a565b6118cc565b6040516101e59190614e9e565b67ffffffffffffffff82166000908152600860205260408120805460ff16610a1b576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024015b60405180910390fd5b6000610a2a6080850185614eeb565b159050610a4b57610a46610a416080860186614eeb565b611900565b610a63565b6001820154640100000000900467ffffffffffffffff165b9050610a8d85610a766020870187614eeb565b905083610a866040890189614f39565b90506119a8565b6000600981610aa260808801606089016142c5565b6001600160a01b03168152602081019190915260400160009081205467ffffffffffffffff169150819003610b1f57610ae160808601606087016142c5565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a12565b60065460009081906001600160a01b031663ffdb4b37610b4560808a0160608b016142c5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff8b1660248201526044016040805180830381865afa158015610bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd49190614faf565b90925090506000808080610beb60408c018c614f39565b90501115610c2657610c1a8b610c0760808d0160608e016142c5565b87610c1560408f018f614f39565b611ab8565b91945092509050610c5d565b6001880154610c5a9074010000000000000000000000000000000000000000900463ffffffff16662386f26fc10000615008565b92505b875460009077010000000000000000000000000000000000000000000000900461ffff1615610cc957610cc68c6dffffffffffffffffffffffffffff607088901c16610cac60208f018f614eeb565b90508e8060400190610cbe9190614f39565b905086611ecb565b90505b600089600101600c9054906101000a900467ffffffffffffffff1667ffffffffffffffff168463ffffffff168b600001600f9054906101000a900461ffff1661ffff168e8060200190610d1c9190614eeb565b610d27929150615008565b8c54610d48906b010000000000000000000000900463ffffffff168d61501f565b610d52919061501f565b610d5c919061501f565b610d76906dffffffffffffffffffffffffffff8916615008565b610d809190615008565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff87168282610db767ffffffffffffffff8c1689615008565b610dc1919061501f565b610dcb919061501f565b610dd59190615032565b9a50505050505050505050505b92915050565b610df0611fd1565b610df98161202d565b50565b600654604080517fcdc73d5100000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cdc73d5191600480830192869291908290030181865afa158015610e5e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e86919081019061506d565b6007549091506001600160a01b031660005b8251811015610fbb576000838281518110610eb557610eb56150fc565b60209081029190910101516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610f23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f47919061512b565b90508015610fb157610f636001600160a01b03831685836121f1565b816001600160a01b0316846001600160a01b03167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e83604051610fa891815260200190565b60405180910390a35b5050600101610e98565b505050565b610fc8612271565b610fd282826122ce565b5050565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa15801561105a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107e9190615144565b9392505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152611128906126dc565b905090565b6000546001600160a01b0316331480159061115357506002546001600160a01b03163314155b1561118a576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6001546001600160a01b031633146112465760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a12565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff8083166000908152600b602090815260408083206001600160a01b038616845290915281205490911680820361107e5767ffffffffffffffff84166000908152600860205260409020600201546001600160a01b0316801561139b576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015282169063856c824790602401602060405180830381865afa15801561136e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113929190615161565b92505050610de2565b509392505050565b67ffffffffffffffff8082166000908152600860205260408120600201549091610de29174010000000000000000000000000000000000000000900416600161517e565b6113ef612271565b610df98161278e565b6000546001600160a01b0316331480159061141e57506002546001600160a01b03163314155b15611455576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610df9600382612854565b67ffffffffffffffff841660009081526008602052604081208161148782888888886129fa565b905060005b816101400151518110156118405760006114a96040890189614f39565b838181106114b9576114b96150fc565b9050604002018036038101906114cf91906151a6565b905060006114e18a8360000151610fd6565b90506001600160a01b038116158061159757506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015611571573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159591906151e0565b155b156115dc5781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a12565b6000816001600160a01b0316639a4575b96040518060a001604052808d80600001906116089190614eeb565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525067ffffffffffffffff8f166020808301919091526001600160a01b03808e16604080850191909152918901516060840152885116608090920191909152517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526116b391906004016151fd565b6000604051808303816000875af11580156116d2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116fa91908101906152ca565b9050602081602001515111801561175b575067ffffffffffffffff8b166000908152600a6020908152604080832086516001600160a01b0316845282529091205490820151516e01000000000000000000000000000090910463ffffffff16105b156117a05782516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a12565b80516117ab906132b8565b5060408051606081019091526001600160a01b03831660808201528060a081016040516020818303038152906040528152602001826000015181526020018260200151815250604051602001611801919061535b565b6040516020818303038152906040528561016001518581518110611827576118276150fc565b602002602001018190525050505080600101905061148c565b5061184f818360030154613313565b61018082015260405167ffffffffffffffff8816907fc79f9c3e610deac14de4e704195fe17eab0983ee9916866bc04d16a00f54daa69061189190849061545d565b60405180910390a261018001519150505b949350505050565b6118b2612271565b610df98161346e565b6118c3611fd1565b610df981613a35565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f97a657c90000000000000000000000000000000000000000000000000000000061192d8385615592565b7fffffffff000000000000000000000000000000000000000000000000000000001614611986576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61199382600481866155da565b8101906119a09190615604565b519392505050565b67ffffffffffffffff8416600090815260086020526040902080546301000000900463ffffffff16841115611a215780546040517f86933789000000000000000000000000000000000000000000000000000000008152630100000090910463ffffffff16600482015260248101859052604401610a12565b8054670100000000000000900463ffffffff16831115611a6d576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8054610100900461ffff16821115611ab1576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000808083815b81811015611ebe576000878783818110611adb57611adb6150fc565b905060400201803603810190611af191906151a6565b905060006001600160a01b0316611b0c8c8360000151610fd6565b6001600160a01b031603611b5a5780516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a12565b67ffffffffffffffff8b166000908152600a6020908152604080832084516001600160a01b03168452825291829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c08201819052611cea5767ffffffffffffffff8c1660009081526008602052604090208054611c8a90790100000000000000000000000000000000000000000000000000900461ffff16662386f26fc10000615008565b611c94908961501f565b8154909850611cc8907b01000000000000000000000000000000000000000000000000000000900463ffffffff1688615646565b6001820154909750611ce09063ffffffff1687615646565b9550505050611eb6565b604081015160009061ffff1615611e065760008c6001600160a01b031684600001516001600160a01b031614611da95760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152911690634ab35b0b90602401602060405180830381865afa158015611d7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da29190615663565b9050611dac565b508a5b620186a0836040015161ffff16611dee8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613aeb90919063ffffffff16565b611df89190615008565b611e029190615032565b9150505b6060820151611e159088615646565b9650816080015186611e279190615646565b8251909650600090611e469063ffffffff16662386f26fc10000615008565b905080821015611e6557611e5a818a61501f565b985050505050611eb6565b6000836020015163ffffffff16662386f26fc10000611e849190615008565b905080831115611ea457611e98818b61501f565b99505050505050611eb6565b611eae838b61501f565b995050505050505b600101611abf565b5050955095509592505050565b60008063ffffffff8316611ee0608086615008565b611eec8761022061501f565b611ef6919061501f565b611f00919061501f565b67ffffffffffffffff8816600090815260086020526040812080549293509171010000000000000000000000000000000000810463ffffffff1690611f62907501000000000000000000000000000000000000000000900461ffff1685615008565b611f6c919061501f565b825490915077010000000000000000000000000000000000000000000000900461ffff16611faa6dffffffffffffffffffffffffffff8a1683615008565b611fb49190615008565b611fc490655af3107a4000615008565b9998505050505050505050565b6000546001600160a01b0316331461202b5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a12565b565b60208101516001600160a01b03161580612052575060408101516001600160a01b0316155b15612089576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516005805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b03938416179091556020808401516006805484169185169190911790556040808501516007805490941690851617909255815160a0810183527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16918101919091527f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16818301527f0000000000000000000000000000000000000000000000000000000000000000831660608201527f00000000000000000000000000000000000000000000000000000000000000009092166080830152517f7d6ca86e1084c492475f59ce7b74c37ad96a7440eb9c217ff5b27c183957b9b8916111e191849061567e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610fbb908490613b28565b6000546001600160a01b0316331480159061229757506002546001600160a01b03163314155b1561202b576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156126105760008382815181106122ee576122ee6150fc565b6020026020010151905060008160000151905060005b82602001515181101561260257600083602001518281518110612329576123296150fc565b602002602001015160200151905060008460200151838151811061234f5761234f6150fc565b60200260200101516000015190506020826080015163ffffffff1610156123bf5760808201516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526001600160a01b038316600482015263ffffffff9091166024820152604401610a12565b67ffffffffffffffff84166000818152600a602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c015160c08d01511515730100000000000000000000000000000000000000027fffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff9115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9485166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9585166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9098166801000000000000000002979097167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff9886166401000000000267ffffffffffffffff19909d1695909916949094179a909a179590951695909517929092171617949094171692909217909155519091907f16a6faa936552870f38ad6586ca4ae10b5d085667b357895aebb320becccf8d4906125f0908690600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b60405180910390a35050600101612304565b5050508060010190506122d1565b5060005b8151811015610fbb576000828281518110612631576126316150fc565b60200260200101516000015190506000838381518110612653576126536150fc565b60209081029190910181015181015167ffffffffffffffff84166000818152600a845260408082206001600160a01b0385168084529552808220805473ffffffffffffffffffffffffffffffffffffffff191690555192945090917ffa22e84f9c809b5b7e94f084eb45cf17a5e4703cecef8f27ed35e54b719bffcd9190a35050600101612614565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261276a82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261274e919061570d565b85608001516fffffffffffffffffffffffffffffffff16613c0d565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60005b8151811015610fd25760008282815181106127ae576127ae6150fc565b602002602001015160000151905060008383815181106127d0576127d06150fc565b6020908102919091018101518101516001600160a01b038416600081815260098452604090819020805467ffffffffffffffff191667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a25050600101612791565b815460009061287090600160801b900463ffffffff164261570d565b905080156128ed57600183015483546128ab916fffffffffffffffffffffffffffffffff808216928116918591600160801b90910416613c0d565b83546fffffffffffffffffffffffffffffffff9190911673ffffffffffffffffffffffffffffffffffffffff1990911617600160801b4263ffffffff16021783555b60208201518354612913916fffffffffffffffffffffffffffffffff9081169116613c35565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129ed9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b604080516101a08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e082018390526101008201839052610120820181905261014082018190526101608201526101808101919091526040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608086901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015612afd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2191906151e0565b15612b64576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610a12565b6001600160a01b038216612ba4576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314612be8576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b855460ff16612c2f576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610a12565b6000612c3e6080860186614eeb565b159050612c5a57612c55610a416080870187614eeb565b612c72565b6001870154640100000000900467ffffffffffffffff165b90506000612c836040870187614f39565b9150612ca1905087612c986020890189614eeb565b905084846119a8565b8015612e07576000805b82811015612df557612cc06040890189614f39565b82818110612cd057612cd06150fc565b90506040020160200135600003612d13576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff89166000908152600a60205260408082209190612d3b908b018b614f39565b84818110612d4b57612d4b6150fc565b612d6192602060409092020190810191506142c5565b6001600160a01b031681526020810191909152604001600020547201000000000000000000000000000000000000900460ff1615612ded57612de0612da960408a018a614f39565b83818110612db957612db96150fc565b905060400201803603810190612dcf91906151a6565b6006546001600160a01b0316613c4b565b612dea908361501f565b91505b600101612cab565b508015612e0557612e0581613d6c565b505b60006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016612e436080890160608a016142c5565b6001600160a01b031603612e58575084612f2b565b6006546001600160a01b03166241e5be612e7860808a0160608b016142c5565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015612f04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f28919061512b565b90505b612f3b60808801606089016142c5565b6001600160a01b03167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f82604051612f7591815260200190565b60405180910390a27f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681111561301c576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018290526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610a12565b600061302889876112aa565b61303390600161517e565b67ffffffffffffffff8a81166000908152600b602090815260408083206001600160a01b038c1680855290835292819020805467ffffffffffffffff191686861617905580516101a0810182527f00000000000000000000000000000000000000000000000000000000000000009094168452908301919091529192509081016130fa6130c08b80614eeb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506132b892505050565b6001600160a01b031681526020018b600201601481819054906101000a900467ffffffffffffffff1661312c90615720565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff1681526020018581526020016000151581526020018267ffffffffffffffff16815260200189606001602081019061319291906142c5565b6001600160a01b031681526020018881526020018980602001906131b69190614eeb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020016131fd60408b018b614f39565b808060200260200160405190810160405280939291908181526020016000905b828210156132495761323a604083028601368190038101906151a6565b8152602001906001019061321d565b505050505081526020018467ffffffffffffffff81111561326c5761326c61442e565b60405190808252806020026020018201604052801561329f57816020015b606081526020019060019003908161328a5790505b50815260006020909101529a9950505050505050505050565b600081516020146132f757816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610a129190614392565b610de28280602001905181019061330e919061512b565b613d79565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016133a99897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016133e29190615747565b6040516020818303038152906040528051906020012087610160015160405160200161340e919061575a565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60005b8151811015610fd257600082828151811061348e5761348e6150fc565b6020026020010151905060008383815181106134ac576134ac6150fc565b60200260200101516000015190508067ffffffffffffffff16600014806134e457506020820151610180015167ffffffffffffffff16155b15613527576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610a12565b6000600860008367ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002090506000836040015190506000604051806080016040528086602001518152602001836001600160a01b031681526020018460020160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020018460030154815250905080600001518360000160008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101a082015181600101600c6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555090505082600301546000801b0361392557604080517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908516606082015230608082015260a00160408051601f1981840301815291905280516020909101206060820181905260038401556001600160a01b038216156138de5760028301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384161790555b8367ffffffffffffffff167f7a70081ee29c1fc27898089ba2a5fc35ac0106b043c82ccecd24c6fd48f6ca8684604051613918919061576d565b60405180910390a2613a25565b60028301546001600160a01b0383811691161461397a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610a12565b60208560200151610160015163ffffffff1610156139de57602085015161016001516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526000600482015263ffffffff9091166024820152604401610a12565b8367ffffffffffffffff167f944eb884a589931130671ee4a7379fbe5fe65ed605a048ba99c454582f2460b08660200151604051613a1c91906158f9565b60405180910390a25b5050505050806001019050613471565b336001600160a01b03821603613a8d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a12565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613b1e837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615008565b61107e9190615032565b6000613b7d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613de69092919063ffffffff16565b805190915015610fbb5780806020019051810190613b9b91906151e0565b610fbb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a12565b6000613c2c85613c1d8486615008565b613c27908761501f565b613c35565b95945050505050565b6000818310613c44578161107e565b5090919050565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd59190615908565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613d3e5783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a12565b60208401516118a2907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690613aeb565b610df96003826000613df5565b60006001600160a01b03821180613d91575061040082105b15613de25760408051602081018490520160408051601f19818403018152908290527f8d666f60000000000000000000000000000000000000000000000000000000008252610a1291600401614392565b5090565b60606118a28484600085614110565b825474010000000000000000000000000000000000000000900460ff161580613e1c575081155b15613e2657505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613e5f90600160801b900463ffffffff164261570d565b90508015613f055781831115613ea1576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613ece90839085908490600160801b90046fffffffffffffffffffffffffffffffff16613c0d565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b84821015613fa2576001600160a01b038416613f57576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a12565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a12565b8483101561408e57600186810154600160801b90046fffffffffffffffffffffffffffffffff16906000908290613fd9908261570d565b613fe3878a61570d565b613fed919061501f565b613ff79190615032565b90506001600160a01b038616614043576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a12565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a12565b614098858461570d565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6060824710156141885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a12565b600080866001600160a01b031685876040516141a49190615947565b60006040518083038185875af1925050503d80600081146141e1576040519150601f19603f3d011682016040523d82523d6000602084013e6141e6565b606091505b50915091506141f787838387614202565b979650505050505050565b6060831561427157825160000361426a576001600160a01b0385163b61426a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a12565b50816118a2565b6118a283838151156142865781518083602001fd5b8060405162461bcd60e51b8152600401610a129190614392565b6001600160a01b0381168114610df957600080fd5b80356142c0816142a0565b919050565b6000602082840312156142d757600080fd5b813561107e816142a0565b60a08101610de282846001600160a01b0380825116835267ffffffffffffffff60208301511660208401526bffffffffffffffffffffffff6040830151166040840152806060830151166060840152806080830151166080840152505050565b60005b8381101561435d578181015183820152602001614345565b50506000910152565b6000815180845261437e816020860160208601614342565b601f01601f19169290920160200192915050565b60208152600061107e6020830184614366565b67ffffffffffffffff81168114610df957600080fd5b80356142c0816143a5565b600060a082840312156143d857600080fd5b50919050565b600080604083850312156143f157600080fd5b82356143fc816143a5565b9150602083013567ffffffffffffffff81111561441857600080fd5b614424858286016143c6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156144805761448061442e565b60405290565b6040805190810167ffffffffffffffff811182821017156144805761448061442e565b60405160e0810167ffffffffffffffff811182821017156144805761448061442e565b6040516101e0810167ffffffffffffffff811182821017156144805761448061442e565b604051601f8201601f1916810167ffffffffffffffff811182821017156145195761451961442e565b604052919050565b60006060828403121561453357600080fd5b61453b61445d565b8235614546816142a0565b81526020830135614556816142a0565b60208201526040830135614569816142a0565b60408201529392505050565b600067ffffffffffffffff82111561458f5761458f61442e565b5060051b60200190565b63ffffffff81168114610df957600080fd5b80356142c081614599565b803561ffff811681146142c057600080fd5b8015158114610df957600080fd5b80356142c0816145c8565b600082601f8301126145f257600080fd5b8135602061460761460283614575565b6144f0565b82815260069290921b8401810191818101908684111561462657600080fd5b8286015b8481101561467757604081890312156146435760008081fd5b61464b614486565b8135614656816143a5565b815281850135614665816142a0565b8186015283529183019160400161462a565b509695505050505050565b6000806040838503121561469557600080fd5b67ffffffffffffffff833511156146ab57600080fd5b83601f8435850101126146bd57600080fd5b6146cd6146028435850135614575565b8335840180358083526020808401939260059290921b909101018610156146f357600080fd5b602085358601015b85358601803560051b016020018110156148eb5767ffffffffffffffff8135111561472557600080fd5b6040601f1982358835890101890301121561473f57600080fd5b614747614486565b61475a6020833589358a010101356143a5565b863587018235016020810135825267ffffffffffffffff604090910135111561478257600080fd5b86358701823501604081013501603f8101891361479e57600080fd5b6147ae6146026020830135614575565b602082810135808352908201919060081b83016040018b10156147d057600080fd5b604083015b6040602085013560081b8501018110156148d257610100818d0312156147fa57600080fd5b614802614486565b61480c82356142a0565b8135815260e0601f19838f0301121561482457600080fd5b61482c6144a9565b6148396020840135614599565b6020830135815261484d6040840135614599565b60408301356020820152614863606084016145b6565b60408201526148756080840135614599565b6080830135606082015261488c60a0840135614599565b60a083013560808201526148a260c084016145d6565b60a08201526148b360e084016145d6565b60c08201526020828101919091529084529290920191610100016147d5565b50602084810191909152928652505092830192016146fb565b5092505067ffffffffffffffff6020840135111561490857600080fd5b61491884602085013585016145e1565b90509250929050565b6000806040838503121561493457600080fd5b823561493f816143a5565b9150602083013561494f816142a0565b809150509250929050565b60006020828403121561496c57600080fd5b813561107e816143a5565b8051151582526020810151614992602084018261ffff169052565b5060408101516149aa604084018263ffffffff169052565b5060608101516149c2606084018263ffffffff169052565b5060808101516149da608084018263ffffffff169052565b5060a08101516149f060a084018261ffff169052565b5060c0810151614a0860c084018263ffffffff169052565b5060e0810151614a1e60e084018261ffff169052565b506101008181015161ffff9081169184019190915261012080830151909116908301526101408082015163ffffffff90811691840191909152610160808301518216908401526101808083015167ffffffffffffffff908116918501919091526101a080840151909116908401526101c09182015116910152565b600061024082019050614aad828451614977565b60208301516001600160a01b03166101e0830152604083015167ffffffffffffffff166102008301526060909201516102209091015290565b60608101610de2828480516001600160a01b03908116835260208083015182169084015260409182015116910152565b60006020808385031215614b2957600080fd5b823567ffffffffffffffff811115614b4057600080fd5b8301601f81018513614b5157600080fd5b8035614b5f61460282614575565b81815260069190911b82018301908381019087831115614b7e57600080fd5b928401925b828410156141f75760408489031215614b9c5760008081fd5b614ba4614486565b8435614baf816142a0565b815284860135614bbe816143a5565b8187015282526040939093019290840190614b83565b80356fffffffffffffffffffffffffffffffff811681146142c057600080fd5b600060608284031215614c0657600080fd5b614c0e61445d565b8235614c19816145c8565b8152614c2760208401614bd4565b602082015261456960408401614bd4565b60008060008060808587031215614c4e57600080fd5b8435614c59816143a5565b9350602085013567ffffffffffffffff811115614c7557600080fd5b614c81878288016143c6565b935050604085013591506060850135614c99816142a0565b939692955090935050565b60006020808385031215614cb757600080fd5b823567ffffffffffffffff811115614cce57600080fd5b8301601f81018513614cdf57600080fd5b8035614ced61460282614575565b8181526102209182028301840191848201919088841115614d0d57600080fd5b938501935b83851015614e925784890381811215614d2b5760008081fd5b614d3361445d565b8635614d3e816143a5565b81526101e0601f198301811315614d555760008081fd5b614d5d6144cc565b9250614d6a8989016145d6565b83526040614d79818a016145b6565b8a8501526060614d8a818b016145ab565b828601526080614d9b818c016145ab565b8287015260a09150614dae828c016145ab565b9086015260c0614dbf8b82016145b6565b8287015260e09150614dd2828c016145ab565b90860152610100614de48b82016145b6565b828701526101209150614df8828c016145b6565b90860152610140614e0a8b82016145b6565b828701526101609150614e1e828c016145ab565b90860152610180614e308b82016145ab565b828701526101a09150614e44828c016143bb565b908601526101c0614e568b82016143bb565b82870152614e65848c016145ab565b818701525050838a840152614e7d6102008a016142b5565b90830152508452509384019391850191614d12565b50979650505050505050565b6020808252825182820181905260009190848201906040850190845b81811015614edf5783516001600160a01b031683529284019291840191600101614eba565b50909695505050505050565b6000808335601e19843603018112614f0257600080fd5b83018035915067ffffffffffffffff821115614f1d57600080fd5b602001915036819003821315614f3257600080fd5b9250929050565b6000808335601e19843603018112614f5057600080fd5b83018035915067ffffffffffffffff821115614f6b57600080fd5b6020019150600681901b3603821315614f3257600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146142c057600080fd5b60008060408385031215614fc257600080fd5b614fcb83614f83565b915061491860208401614f83565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610de257610de2614fd9565b80820180821115610de257610de2614fd9565b600082615068577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000602080838503121561508057600080fd5b825167ffffffffffffffff81111561509757600080fd5b8301601f810185136150a857600080fd5b80516150b661460282614575565b81815260059190911b820183019083810190878311156150d557600080fd5b928401925b828410156141f75783516150ed816142a0565b825292840192908401906150da565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561513d57600080fd5b5051919050565b60006020828403121561515657600080fd5b815161107e816142a0565b60006020828403121561517357600080fd5b815161107e816143a5565b67ffffffffffffffff81811683821601908082111561519f5761519f614fd9565b5092915050565b6000604082840312156151b857600080fd5b6151c0614486565b82356151cb816142a0565b81526020928301359281019290925250919050565b6000602082840312156151f257600080fd5b815161107e816145c8565b602081526000825160a0602084015261521960c0840182614366565b905067ffffffffffffffff602085015116604084015260408401516001600160a01b038082166060860152606086015160808601528060808701511660a086015250508091505092915050565b600082601f83011261527757600080fd5b815167ffffffffffffffff8111156152915761529161442e565b6152a46020601f19601f840116016144f0565b8181528460208386010111156152b957600080fd5b6118a2826020830160208701614342565b6000602082840312156152dc57600080fd5b815167ffffffffffffffff808211156152f457600080fd5b908301906040828603121561530857600080fd5b615310614486565b82518281111561531f57600080fd5b61532b87828601615266565b82525060208301518281111561534057600080fd5b61534c87828601615266565b60208301525095945050505050565b6020815260008251606060208401526153776080840182614366565b90506020840151601f19808584030160408601526153958383614366565b9250604086015191508085840301606086015250613c2c8282614366565b60008151808452602080850194506020840160005b838110156153f857815180516001600160a01b0316885283015183880152604090960195908201906001016153c8565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b8481101561545057601f1986840301895261543e838351614366565b98840198925090830190600101615422565b5090979650505050505050565b6020815261547860208201835167ffffffffffffffff169052565b6000602083015161549460408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a08301516154dd60c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615510818501836001600160a01b03169052565b840151610120848101919091528401516101a06101408086018290529192509061553e6101c0860184614366565b9250808601519050601f1961016081878603018188015261555f85846153b3565b94508088015192505061018081878603018188015261557e8584615403565b970151959092019490945250929392505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156155d25780818660040360031b1b83161692505b505092915050565b600080858511156155ea57600080fd5b838611156155f757600080fd5b5050820193919092039150565b60006020828403121561561657600080fd5b6040516020810181811067ffffffffffffffff821117156156395761563961442e565b6040529135825250919050565b63ffffffff81811683821601908082111561519f5761519f614fd9565b60006020828403121561567557600080fd5b61107e82614f83565b61010081016156df82856001600160a01b0380825116835267ffffffffffffffff60208301511660208401526bffffffffffffffffffffffff6040830151166040840152806060830151166060840152806080830151166080840152505050565b82516001600160a01b0390811660a08401526020840151811660c084015260408401511660e083015261107e565b81810381811115610de257610de2614fd9565b600067ffffffffffffffff80831681810361573d5761573d614fd9565b6001019392505050565b60208152600061107e60208301846153b3565b60208152600061107e6020830184615403565b815460ff81161515825261024082019061ffff600882901c8116602085015263ffffffff601883901c811660408601526157b460608601828560381c1663ffffffff169052565b6157cb60808601828560581c1663ffffffff169052565b6157e060a08601838560781c1661ffff169052565b6157f760c08601828560881c1663ffffffff169052565b61580c60e08601838560a81c1661ffff169052565b6158226101008601838560b81c1661ffff169052565b6158386101208601838560c81c1661ffff169052565b6158506101408601828560d81c1663ffffffff169052565b600186015463ffffffff82821616610160870152925067ffffffffffffffff602084901c8116610180870152915061589a6101a08601838560601c1667ffffffffffffffff169052565b6158b26101c08601828560a01c1663ffffffff169052565b5060028501546001600160a01b0381166101e086015291506158e66102008501828460a01c1667ffffffffffffffff169052565b5050600383015461022083015292915050565b6101e08101610de28284614977565b60006040828403121561591a57600080fd5b615922614486565b61592b83614f83565b8152602083015161593b81614599565b60208201529392505050565b60008251615959818460208701614342565b919091019291505056fea164736f6c6343000818000a", } var EVM2EVMMultiOnRampABI = EVM2EVMMultiOnRampMetaData.ABI var EVM2EVMMultiOnRampBin = EVM2EVMMultiOnRampMetaData.Bin -func DeployEVM2EVMMultiOnRamp(auth *bind.TransactOpts, backend bind.ContractBackend, staticConfig EVM2EVMMultiOnRampStaticConfig, dynamicConfig EVM2EVMMultiOnRampDynamicConfig, destChainConfigArgs []EVM2EVMMultiOnRampDestChainConfigArgs, rateLimiterConfig RateLimiterConfig, premiumMultiplierWeiPerEthArgs []EVM2EVMMultiOnRampPremiumMultiplierWeiPerEthArgs, tokenTransferFeeConfigArgs []EVM2EVMMultiOnRampTokenTransferFeeConfigArgs, nopsAndWeights []EVM2EVMMultiOnRampNopAndWeight) (common.Address, *types.Transaction, *EVM2EVMMultiOnRamp, error) { +func DeployEVM2EVMMultiOnRamp(auth *bind.TransactOpts, backend bind.ContractBackend, staticConfig EVM2EVMMultiOnRampStaticConfig, dynamicConfig EVM2EVMMultiOnRampDynamicConfig, destChainConfigArgs []EVM2EVMMultiOnRampDestChainConfigArgs, rateLimiterConfig RateLimiterConfig, premiumMultiplierWeiPerEthArgs []EVM2EVMMultiOnRampPremiumMultiplierWeiPerEthArgs, tokenTransferFeeConfigArgs []EVM2EVMMultiOnRampTokenTransferFeeConfigArgs) (common.Address, *types.Transaction, *EVM2EVMMultiOnRamp, error) { parsed, err := EVM2EVMMultiOnRampMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -170,7 +166,7 @@ func DeployEVM2EVMMultiOnRamp(auth *bind.TransactOpts, backend bind.ContractBack return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EVM2EVMMultiOnRampBin), backend, staticConfig, dynamicConfig, destChainConfigArgs, rateLimiterConfig, premiumMultiplierWeiPerEthArgs, tokenTransferFeeConfigArgs, nopsAndWeights) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(EVM2EVMMultiOnRampBin), backend, staticConfig, dynamicConfig, destChainConfigArgs, rateLimiterConfig, premiumMultiplierWeiPerEthArgs, tokenTransferFeeConfigArgs) if err != nil { return common.Address{}, nil, nil, err } @@ -403,58 +399,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCallerSession) GetFee(destChainSele return _EVM2EVMMultiOnRamp.Contract.GetFee(&_EVM2EVMMultiOnRamp.CallOpts, destChainSelector, message) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCaller) GetNopFeesJuels(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _EVM2EVMMultiOnRamp.contract.Call(opts, &out, "getNopFeesJuels") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) GetNopFeesJuels() (*big.Int, error) { - return _EVM2EVMMultiOnRamp.Contract.GetNopFeesJuels(&_EVM2EVMMultiOnRamp.CallOpts) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCallerSession) GetNopFeesJuels() (*big.Int, error) { - return _EVM2EVMMultiOnRamp.Contract.GetNopFeesJuels(&_EVM2EVMMultiOnRamp.CallOpts) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCaller) GetNops(opts *bind.CallOpts) (GetNops, - - error) { - var out []interface{} - err := _EVM2EVMMultiOnRamp.contract.Call(opts, &out, "getNops") - - outstruct := new(GetNops) - if err != nil { - return *outstruct, err - } - - outstruct.NopsAndWeights = *abi.ConvertType(out[0], new([]EVM2EVMMultiOnRampNopAndWeight)).(*[]EVM2EVMMultiOnRampNopAndWeight) - outstruct.WeightsTotal = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) - - return *outstruct, err - -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) GetNops() (GetNops, - - error) { - return _EVM2EVMMultiOnRamp.Contract.GetNops(&_EVM2EVMMultiOnRamp.CallOpts) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCallerSession) GetNops() (GetNops, - - error) { - return _EVM2EVMMultiOnRamp.Contract.GetNops(&_EVM2EVMMultiOnRamp.CallOpts) -} - func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCaller) GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) { var out []interface{} err := _EVM2EVMMultiOnRamp.contract.Call(opts, &out, "getPoolBySourceToken", arg0, sourceToken) @@ -609,28 +553,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCallerSession) GetTokenTransferFeeC return _EVM2EVMMultiOnRamp.Contract.GetTokenTransferFeeConfig(&_EVM2EVMMultiOnRamp.CallOpts, destChainSelector, token) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCaller) LinkAvailableForPayment(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _EVM2EVMMultiOnRamp.contract.Call(opts, &out, "linkAvailableForPayment") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) LinkAvailableForPayment() (*big.Int, error) { - return _EVM2EVMMultiOnRamp.Contract.LinkAvailableForPayment(&_EVM2EVMMultiOnRamp.CallOpts) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCallerSession) LinkAvailableForPayment() (*big.Int, error) { - return _EVM2EVMMultiOnRamp.Contract.LinkAvailableForPayment(&_EVM2EVMMultiOnRamp.CallOpts) -} - func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampCaller) Owner(opts *bind.CallOpts) (common.Address, error) { var out []interface{} err := _EVM2EVMMultiOnRamp.contract.Call(opts, &out, "owner") @@ -735,18 +657,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) ForwardFromRoute return _EVM2EVMMultiOnRamp.Contract.ForwardFromRouter(&_EVM2EVMMultiOnRamp.TransactOpts, destChainSelector, message, feeTokenAmount, originalSender) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) PayNops(opts *bind.TransactOpts) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.contract.Transact(opts, "payNops") -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) PayNops() (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.PayNops(&_EVM2EVMMultiOnRamp.TransactOpts) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) PayNops() (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.PayNops(&_EVM2EVMMultiOnRamp.TransactOpts) -} - func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) { return _EVM2EVMMultiOnRamp.contract.Transact(opts, "setAdmin", newAdmin) } @@ -771,18 +681,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) SetDynamicConfig return _EVM2EVMMultiOnRamp.Contract.SetDynamicConfig(&_EVM2EVMMultiOnRamp.TransactOpts, dynamicConfig) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) SetNops(opts *bind.TransactOpts, nopsAndWeights []EVM2EVMMultiOnRampNopAndWeight) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.contract.Transact(opts, "setNops", nopsAndWeights) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) SetNops(nopsAndWeights []EVM2EVMMultiOnRampNopAndWeight) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.SetNops(&_EVM2EVMMultiOnRamp.TransactOpts, nopsAndWeights) -} - -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) SetNops(nopsAndWeights []EVM2EVMMultiOnRampNopAndWeight) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.SetNops(&_EVM2EVMMultiOnRamp.TransactOpts, nopsAndWeights) -} - func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) SetRateLimiterConfig(opts *bind.TransactOpts, config RateLimiterConfig) (*types.Transaction, error) { return _EVM2EVMMultiOnRamp.contract.Transact(opts, "setRateLimiterConfig", config) } @@ -807,16 +705,16 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) TransferOwnershi return _EVM2EVMMultiOnRamp.Contract.TransferOwnership(&_EVM2EVMMultiOnRamp.TransactOpts, to) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) WithdrawNonLinkFees(opts *bind.TransactOpts, feeToken common.Address, to common.Address) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.contract.Transact(opts, "withdrawNonLinkFees", feeToken, to) +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactor) WithdrawFeeTokens(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EVM2EVMMultiOnRamp.contract.Transact(opts, "withdrawFeeTokens") } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) WithdrawNonLinkFees(feeToken common.Address, to common.Address) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.WithdrawNonLinkFees(&_EVM2EVMMultiOnRamp.TransactOpts, feeToken, to) +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampSession) WithdrawFeeTokens() (*types.Transaction, error) { + return _EVM2EVMMultiOnRamp.Contract.WithdrawFeeTokens(&_EVM2EVMMultiOnRamp.TransactOpts) } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) WithdrawNonLinkFees(feeToken common.Address, to common.Address) (*types.Transaction, error) { - return _EVM2EVMMultiOnRamp.Contract.WithdrawNonLinkFees(&_EVM2EVMMultiOnRamp.TransactOpts, feeToken, to) +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) WithdrawFeeTokens() (*types.Transaction, error) { + return _EVM2EVMMultiOnRamp.Contract.WithdrawFeeTokens(&_EVM2EVMMultiOnRamp.TransactOpts) } type EVM2EVMMultiOnRampAdminSetIterator struct { @@ -1555,8 +1453,8 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseDestChainDynamicConf return event, nil } -type EVM2EVMMultiOnRampNopPaidIterator struct { - Event *EVM2EVMMultiOnRampNopPaid +type EVM2EVMMultiOnRampFeePaidIterator struct { + Event *EVM2EVMMultiOnRampFeePaid contract *bind.BoundContract event string @@ -1567,7 +1465,7 @@ type EVM2EVMMultiOnRampNopPaidIterator struct { fail error } -func (it *EVM2EVMMultiOnRampNopPaidIterator) Next() bool { +func (it *EVM2EVMMultiOnRampFeePaidIterator) Next() bool { if it.fail != nil { return false @@ -1576,7 +1474,7 @@ func (it *EVM2EVMMultiOnRampNopPaidIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EVM2EVMMultiOnRampNopPaid) + it.Event = new(EVM2EVMMultiOnRampFeePaid) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1591,7 +1489,7 @@ func (it *EVM2EVMMultiOnRampNopPaidIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(EVM2EVMMultiOnRampNopPaid) + it.Event = new(EVM2EVMMultiOnRampFeePaid) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1606,43 +1504,43 @@ func (it *EVM2EVMMultiOnRampNopPaidIterator) Next() bool { } } -func (it *EVM2EVMMultiOnRampNopPaidIterator) Error() error { +func (it *EVM2EVMMultiOnRampFeePaidIterator) Error() error { return it.fail } -func (it *EVM2EVMMultiOnRampNopPaidIterator) Close() error { +func (it *EVM2EVMMultiOnRampFeePaidIterator) Close() error { it.sub.Unsubscribe() return nil } -type EVM2EVMMultiOnRampNopPaid struct { - Nop common.Address - Amount *big.Int - Raw types.Log +type EVM2EVMMultiOnRampFeePaid struct { + FeeToken common.Address + FeeValueJuels *big.Int + Raw types.Log } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) FilterNopPaid(opts *bind.FilterOpts, nop []common.Address) (*EVM2EVMMultiOnRampNopPaidIterator, error) { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*EVM2EVMMultiOnRampFeePaidIterator, error) { - var nopRule []interface{} - for _, nopItem := range nop { - nopRule = append(nopRule, nopItem) + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) } - logs, sub, err := _EVM2EVMMultiOnRamp.contract.FilterLogs(opts, "NopPaid", nopRule) + logs, sub, err := _EVM2EVMMultiOnRamp.contract.FilterLogs(opts, "FeePaid", feeTokenRule) if err != nil { return nil, err } - return &EVM2EVMMultiOnRampNopPaidIterator{contract: _EVM2EVMMultiOnRamp.contract, event: "NopPaid", logs: logs, sub: sub}, nil + return &EVM2EVMMultiOnRampFeePaidIterator{contract: _EVM2EVMMultiOnRamp.contract, event: "FeePaid", logs: logs, sub: sub}, nil } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopPaid(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampNopPaid, nop []common.Address) (event.Subscription, error) { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchFeePaid(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampFeePaid, feeToken []common.Address) (event.Subscription, error) { - var nopRule []interface{} - for _, nopItem := range nop { - nopRule = append(nopRule, nopItem) + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) } - logs, sub, err := _EVM2EVMMultiOnRamp.contract.WatchLogs(opts, "NopPaid", nopRule) + logs, sub, err := _EVM2EVMMultiOnRamp.contract.WatchLogs(opts, "FeePaid", feeTokenRule) if err != nil { return nil, err } @@ -1652,8 +1550,8 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopPaid(opts *bind.W select { case log := <-logs: - event := new(EVM2EVMMultiOnRampNopPaid) - if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "NopPaid", log); err != nil { + event := new(EVM2EVMMultiOnRampFeePaid) + if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "FeePaid", log); err != nil { return err } event.Raw = log @@ -1674,17 +1572,17 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopPaid(opts *bind.W }), nil } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseNopPaid(log types.Log) (*EVM2EVMMultiOnRampNopPaid, error) { - event := new(EVM2EVMMultiOnRampNopPaid) - if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "NopPaid", log); err != nil { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseFeePaid(log types.Log) (*EVM2EVMMultiOnRampFeePaid, error) { + event := new(EVM2EVMMultiOnRampFeePaid) + if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "FeePaid", log); err != nil { return nil, err } event.Raw = log return event, nil } -type EVM2EVMMultiOnRampNopsSetIterator struct { - Event *EVM2EVMMultiOnRampNopsSet +type EVM2EVMMultiOnRampFeeTokenWithdrawnIterator struct { + Event *EVM2EVMMultiOnRampFeeTokenWithdrawn contract *bind.BoundContract event string @@ -1695,7 +1593,7 @@ type EVM2EVMMultiOnRampNopsSetIterator struct { fail error } -func (it *EVM2EVMMultiOnRampNopsSetIterator) Next() bool { +func (it *EVM2EVMMultiOnRampFeeTokenWithdrawnIterator) Next() bool { if it.fail != nil { return false @@ -1704,7 +1602,7 @@ func (it *EVM2EVMMultiOnRampNopsSetIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(EVM2EVMMultiOnRampNopsSet) + it.Event = new(EVM2EVMMultiOnRampFeeTokenWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1719,7 +1617,7 @@ func (it *EVM2EVMMultiOnRampNopsSetIterator) Next() bool { select { case log := <-it.logs: - it.Event = new(EVM2EVMMultiOnRampNopsSet) + it.Event = new(EVM2EVMMultiOnRampFeeTokenWithdrawn) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1734,33 +1632,52 @@ func (it *EVM2EVMMultiOnRampNopsSetIterator) Next() bool { } } -func (it *EVM2EVMMultiOnRampNopsSetIterator) Error() error { +func (it *EVM2EVMMultiOnRampFeeTokenWithdrawnIterator) Error() error { return it.fail } -func (it *EVM2EVMMultiOnRampNopsSetIterator) Close() error { +func (it *EVM2EVMMultiOnRampFeeTokenWithdrawnIterator) Close() error { it.sub.Unsubscribe() return nil } -type EVM2EVMMultiOnRampNopsSet struct { - NopWeightsTotal *big.Int - NopsAndWeights []EVM2EVMMultiOnRampNopAndWeight - Raw types.Log +type EVM2EVMMultiOnRampFeeTokenWithdrawn struct { + FeeAggregator common.Address + FeeToken common.Address + Amount *big.Int + Raw types.Log } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) FilterNopsSet(opts *bind.FilterOpts) (*EVM2EVMMultiOnRampNopsSetIterator, error) { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*EVM2EVMMultiOnRampFeeTokenWithdrawnIterator, error) { - logs, sub, err := _EVM2EVMMultiOnRamp.contract.FilterLogs(opts, "NopsSet") + var feeAggregatorRule []interface{} + for _, feeAggregatorItem := range feeAggregator { + feeAggregatorRule = append(feeAggregatorRule, feeAggregatorItem) + } + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _EVM2EVMMultiOnRamp.contract.FilterLogs(opts, "FeeTokenWithdrawn", feeAggregatorRule, feeTokenRule) if err != nil { return nil, err } - return &EVM2EVMMultiOnRampNopsSetIterator{contract: _EVM2EVMMultiOnRamp.contract, event: "NopsSet", logs: logs, sub: sub}, nil + return &EVM2EVMMultiOnRampFeeTokenWithdrawnIterator{contract: _EVM2EVMMultiOnRamp.contract, event: "FeeTokenWithdrawn", logs: logs, sub: sub}, nil } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopsSet(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampNopsSet) (event.Subscription, error) { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error) { + + var feeAggregatorRule []interface{} + for _, feeAggregatorItem := range feeAggregator { + feeAggregatorRule = append(feeAggregatorRule, feeAggregatorItem) + } + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } - logs, sub, err := _EVM2EVMMultiOnRamp.contract.WatchLogs(opts, "NopsSet") + logs, sub, err := _EVM2EVMMultiOnRamp.contract.WatchLogs(opts, "FeeTokenWithdrawn", feeAggregatorRule, feeTokenRule) if err != nil { return nil, err } @@ -1770,8 +1687,8 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopsSet(opts *bind.W select { case log := <-logs: - event := new(EVM2EVMMultiOnRampNopsSet) - if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "NopsSet", log); err != nil { + event := new(EVM2EVMMultiOnRampFeeTokenWithdrawn) + if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "FeeTokenWithdrawn", log); err != nil { return err } event.Raw = log @@ -1792,9 +1709,9 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchNopsSet(opts *bind.W }), nil } -func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseNopsSet(log types.Log) (*EVM2EVMMultiOnRampNopsSet, error) { - event := new(EVM2EVMMultiOnRampNopsSet) - if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "NopsSet", log); err != nil { +func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseFeeTokenWithdrawn(log types.Log) (*EVM2EVMMultiOnRampFeeTokenWithdrawn, error) { + event := new(EVM2EVMMultiOnRampFeeTokenWithdrawn) + if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "FeeTokenWithdrawn", log); err != nil { return nil, err } event.Raw = log @@ -2591,11 +2508,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseTokensConsumed(log t return event, nil } -type GetNops struct { - NopsAndWeights []EVM2EVMMultiOnRampNopAndWeight - WeightsTotal *big.Int -} - func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRamp) ParseLog(log types.Log) (generated.AbigenLog, error) { switch log.Topics[0] { case _EVM2EVMMultiOnRamp.abi.Events["AdminSet"].ID: @@ -2610,10 +2522,10 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRamp) ParseLog(log types.Log) (generate return _EVM2EVMMultiOnRamp.ParseDestChainAdded(log) case _EVM2EVMMultiOnRamp.abi.Events["DestChainDynamicConfigUpdated"].ID: return _EVM2EVMMultiOnRamp.ParseDestChainDynamicConfigUpdated(log) - case _EVM2EVMMultiOnRamp.abi.Events["NopPaid"].ID: - return _EVM2EVMMultiOnRamp.ParseNopPaid(log) - case _EVM2EVMMultiOnRamp.abi.Events["NopsSet"].ID: - return _EVM2EVMMultiOnRamp.ParseNopsSet(log) + case _EVM2EVMMultiOnRamp.abi.Events["FeePaid"].ID: + return _EVM2EVMMultiOnRamp.ParseFeePaid(log) + case _EVM2EVMMultiOnRamp.abi.Events["FeeTokenWithdrawn"].ID: + return _EVM2EVMMultiOnRamp.ParseFeeTokenWithdrawn(log) case _EVM2EVMMultiOnRamp.abi.Events["OwnershipTransferRequested"].ID: return _EVM2EVMMultiOnRamp.ParseOwnershipTransferRequested(log) case _EVM2EVMMultiOnRamp.abi.Events["OwnershipTransferred"].ID: @@ -2645,7 +2557,7 @@ func (EVM2EVMMultiOnRampConfigChanged) Topic() common.Hash { } func (EVM2EVMMultiOnRampConfigSet) Topic() common.Hash { - return common.HexToHash("0x2436895da154cdfddf5eb1175c9be7129f01727fee8af2fa04f68641e8ea5ec8") + return common.HexToHash("0x7d6ca86e1084c492475f59ce7b74c37ad96a7440eb9c217ff5b27c183957b9b8") } func (EVM2EVMMultiOnRampDestChainAdded) Topic() common.Hash { @@ -2656,12 +2568,12 @@ func (EVM2EVMMultiOnRampDestChainDynamicConfigUpdated) Topic() common.Hash { return common.HexToHash("0x944eb884a589931130671ee4a7379fbe5fe65ed605a048ba99c454582f2460b0") } -func (EVM2EVMMultiOnRampNopPaid) Topic() common.Hash { - return common.HexToHash("0x55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f") +func (EVM2EVMMultiOnRampFeePaid) Topic() common.Hash { + return common.HexToHash("0x075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f") } -func (EVM2EVMMultiOnRampNopsSet) Topic() common.Hash { - return common.HexToHash("0x8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24") +func (EVM2EVMMultiOnRampFeeTokenWithdrawn) Topic() common.Hash { + return common.HexToHash("0x508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e") } func (EVM2EVMMultiOnRampOwnershipTransferRequested) Topic() common.Hash { @@ -2703,12 +2615,6 @@ type EVM2EVMMultiOnRampInterface interface { GetFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) - GetNopFeesJuels(opts *bind.CallOpts) (*big.Int, error) - - GetNops(opts *bind.CallOpts) (GetNops, - - error) - GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) GetPremiumMultiplierWeiPerEth(opts *bind.CallOpts, token common.Address) (uint64, error) @@ -2723,8 +2629,6 @@ type EVM2EVMMultiOnRampInterface interface { GetTokenTransferFeeConfig(opts *bind.CallOpts, destChainSelector uint64, token common.Address) (EVM2EVMMultiOnRampTokenTransferFeeConfig, error) - LinkAvailableForPayment(opts *bind.CallOpts) (*big.Int, error) - Owner(opts *bind.CallOpts) (common.Address, error) TypeAndVersion(opts *bind.CallOpts) (string, error) @@ -2739,19 +2643,15 @@ type EVM2EVMMultiOnRampInterface interface { ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) - PayNops(opts *bind.TransactOpts) (*types.Transaction, error) - SetAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig EVM2EVMMultiOnRampDynamicConfig) (*types.Transaction, error) - SetNops(opts *bind.TransactOpts, nopsAndWeights []EVM2EVMMultiOnRampNopAndWeight) (*types.Transaction, error) - SetRateLimiterConfig(opts *bind.TransactOpts, config RateLimiterConfig) (*types.Transaction, error) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) - WithdrawNonLinkFees(opts *bind.TransactOpts, feeToken common.Address, to common.Address) (*types.Transaction, error) + WithdrawFeeTokens(opts *bind.TransactOpts) (*types.Transaction, error) FilterAdminSet(opts *bind.FilterOpts) (*EVM2EVMMultiOnRampAdminSetIterator, error) @@ -2789,17 +2689,17 @@ type EVM2EVMMultiOnRampInterface interface { ParseDestChainDynamicConfigUpdated(log types.Log) (*EVM2EVMMultiOnRampDestChainDynamicConfigUpdated, error) - FilterNopPaid(opts *bind.FilterOpts, nop []common.Address) (*EVM2EVMMultiOnRampNopPaidIterator, error) + FilterFeePaid(opts *bind.FilterOpts, feeToken []common.Address) (*EVM2EVMMultiOnRampFeePaidIterator, error) - WatchNopPaid(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampNopPaid, nop []common.Address) (event.Subscription, error) + WatchFeePaid(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampFeePaid, feeToken []common.Address) (event.Subscription, error) - ParseNopPaid(log types.Log) (*EVM2EVMMultiOnRampNopPaid, error) + ParseFeePaid(log types.Log) (*EVM2EVMMultiOnRampFeePaid, error) - FilterNopsSet(opts *bind.FilterOpts) (*EVM2EVMMultiOnRampNopsSetIterator, error) + FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*EVM2EVMMultiOnRampFeeTokenWithdrawnIterator, error) - WatchNopsSet(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampNopsSet) (event.Subscription, error) + WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error) - ParseNopsSet(log types.Log) (*EVM2EVMMultiOnRampNopsSet, error) + ParseFeeTokenWithdrawn(log types.Log) (*EVM2EVMMultiOnRampFeeTokenWithdrawn, error) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*EVM2EVMMultiOnRampOwnershipTransferRequestedIterator, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index d5ef79ba7f..fd4e61b123 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 @@ -10,7 +10,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto custom_token_pool: ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.abi ../../../contracts/solc/v0.8.24/CustomTokenPool/CustomTokenPool.bin 488bd34d63be7b731f4fbdf0cd353f7e4fbee990cfa4db26be91973297d3f803 ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin f72f9f4562a6f788f9f59197f34bd603476fe8c2555c9eebba72e9d9b445cbcc evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 51b431ac2cb00e1e8b3f7b97adaed295e8453748a6960a78d33452c0469ef82a -evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 360bc9303662a1f61105370b6bc38fc3afeaf00e4bc856b2e7987fef708a728d +evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 966eb41735dc7ba262848c8776fa40123719aa5204f24126426ea45206a3a890 evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin fddfbb935f68418d29fd2942b6357c85b325dd9ec8819f5b74a6b2c88f50a073 evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf7817f29e24dc5fd6e4b70ba1d281bd64b380c28c39d490e94b78c69306acb8 lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin c65c226e1e4d38414bd4a1b76fc8aca3cb3dd98df61268424c44564f455d3752