From 68ebce898747dc5b4ec01ab3f6072f4d26af32e5 Mon Sep 17 00:00:00 2001 From: Chunkai Yang Date: Fri, 6 Oct 2023 10:49:12 -0400 Subject: [PATCH] Finalize token transfer fee billing (#187) * make minFee and maxFee per token * nit --- contracts/gas-snapshots/ccip.gas-snapshot | 188 +++++++++--------- .../src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol | 62 +++--- .../ccip/test/helpers/EVM2EVMOnRampHelper.sol | 5 +- .../v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol | 130 ++++++------ .../ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol | 10 +- .../src/v0.8/ccip/test/router/Router.t.sol | 4 - .../evm_2_evm_onramp/evm_2_evm_onramp.go | 34 ++-- ...rapper-dependency-versions-do-not-edit.txt | 2 +- .../ccip/testhelpers/ccip_contracts.go | 56 +++--- docs/CHANGELOG_CCIP.md | 4 + .../ccip-tests/actions/ccip_helpers.go | 28 ++- 11 files changed, 260 insertions(+), 263 deletions(-) diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 04b764ebb5..c5a63cbe0d 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -56,7 +56,7 @@ BurnMintERC677_burn:testPoolBurnRevertNotHealthyReverts() (gas: 58150) BurnMintERC677_burn:testPoolBurnSuccess() (gas: 197641) BurnMintERC677_mint:testPoolMintNotHealthyReverts() (gas: 55384) BurnMintERC677_mint:testPoolMintSuccess() (gas: 93675) -CCIPClientExample_sanity:testExamples() (gas: 2213780) +CCIPClientExample_sanity:testExamples() (gas: 2213963) CommitStore_constructor:testConstructorSuccess() (gas: 3307574) CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71312) CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26019) @@ -86,7 +86,7 @@ CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 174828) DefensiveExampleTest:testRecovery() (gas: 399728) -E2E:testE2E_3MessagesSuccess_gas() (gas: 863423) +E2E:testE2E_3MessagesSuccess_gas() (gas: 864854) EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 426826) EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 100041) EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18159) @@ -157,15 +157,15 @@ EVM2EVMOffRamp_metadataHash:testMetadataHashSuccess() (gas: 6074) EVM2EVMOffRamp_setDynamicConfig:testNonOwnerReverts() (gas: 44264) EVM2EVMOffRamp_setDynamicConfig:testRouterZeroAddressReverts() (gas: 38118) EVM2EVMOffRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 139455) -EVM2EVMOnRamp_applyPoolUpdates:testAddTokenPoolMismatchReverts() (gas: 275660) -EVM2EVMOnRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 301257) -EVM2EVMOnRamp_applyPoolUpdates:testAtomicPoolReplacementSuccess() (gas: 631241) -EVM2EVMOnRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 18495) -EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23154) -EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351576) -EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277882) -EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 616024) -EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5774116) +EVM2EVMOnRamp_applyPoolUpdates:testAddTokenPoolMismatchReverts() (gas: 275638) +EVM2EVMOnRamp_applyPoolUpdates:testApplyPoolUpdatesSuccess() (gas: 301347) +EVM2EVMOnRamp_applyPoolUpdates:testAtomicPoolReplacementSuccess() (gas: 631331) +EVM2EVMOnRamp_applyPoolUpdates:testInvalidTokenPoolConfigReverts() (gas: 18451) +EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23110) +EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351554) +EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277860) +EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 615980) +EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5731911) EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31534) EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126628) EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 126940) @@ -178,12 +178,12 @@ EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32218) EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26907) EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105488) EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20165) -EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49568) +EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49635) EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26836) EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34938) EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 168385) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104372) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123580) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104350) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123558) EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28119) EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42966) EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 108831) @@ -192,65 +192,65 @@ EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess( EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 184775) EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 112643) EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 92203) -EVM2EVMOnRamp_getDataAvailabilityCostUSD:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15075) -EVM2EVMOnRamp_getDataAvailabilityCostUSD:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15388) -EVM2EVMOnRamp_getExpectedNextSequenceNumber:testGetExpectedNextSequenceNumberSuccess() (gas: 7860) -EVM2EVMOnRamp_getFee:testEmptyMessageSuccess() (gas: 68388) -EVM2EVMOnRamp_getFee:testHighGasMessageSuccess() (gas: 224358) -EVM2EVMOnRamp_getFee:testMessageGasLimitTooHighReverts() (gas: 16453) -EVM2EVMOnRamp_getFee:testMessageTooLargeReverts() (gas: 94976) -EVM2EVMOnRamp_getFee:testMessageWithDataAndTokenTransferSuccess() (gas: 129846) -EVM2EVMOnRamp_getFee:testNotAFeeTokenReverts() (gas: 21715) -EVM2EVMOnRamp_getFee:testSingleTokenMessageSuccess() (gas: 99608) -EVM2EVMOnRamp_getFee:testTooManyTokensReverts() (gas: 19644) -EVM2EVMOnRamp_getFee:testZeroDataAvailabilityMultiplierSuccess() (gas: 54013) -EVM2EVMOnRamp_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 51549) -EVM2EVMOnRamp_getTokenPool:testGetTokenPoolSuccess() (gas: 40912) -EVM2EVMOnRamp_getTokenTransferCost:testCustomTokenBpsFeeSuccess() (gas: 40105) -EVM2EVMOnRamp_getTokenTransferCost:testFeeTokenBpsFeeSuccess() (gas: 30352) -EVM2EVMOnRamp_getTokenTransferCost:testLargeTokenTransferChargesMaxFeeAndGasSuccess() (gas: 25697) -EVM2EVMOnRamp_getTokenTransferCost:testMixedTokenTransferFeeSuccess() (gas: 109527) -EVM2EVMOnRamp_getTokenTransferCost:testNoTokenTransferChargesMinFeeSuccess() (gas: 17121) -EVM2EVMOnRamp_getTokenTransferCost:testSmallTokenTransferChargesMinFeeAndGasSuccess() (gas: 25507) -EVM2EVMOnRamp_getTokenTransferCost:testUnsupportedTokenReverts() (gas: 25338) -EVM2EVMOnRamp_getTokenTransferCost:testValidatedPriceStalenessReverts() (gas: 42529) -EVM2EVMOnRamp_getTokenTransferCost:testWETHTokenBpsFeeSuccess() (gas: 36256) -EVM2EVMOnRamp_getTokenTransferCost:testZeroAmountTokenTransferChargesMinFeeAndAgasSuccess() (gas: 25527) -EVM2EVMOnRamp_getTokenTransferCost:testZeroFeeConfigChargesMinFeeSuccess() (gas: 29472) -EVM2EVMOnRamp_linkAvailableForPayment:testInsufficientLinkBalanceSuccess() (gas: 37935) -EVM2EVMOnRamp_linkAvailableForPayment:testLinkAvailableForPaymentSuccess() (gas: 138268) -EVM2EVMOnRamp_payNops:testAdminPayNopsSuccess() (gas: 146336) -EVM2EVMOnRamp_payNops:testInsufficientBalanceReverts() (gas: 32152) -EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131481) -EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136500) -EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149589) -EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144225) -EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299354) -EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19467) -EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37031) -EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25795) -EVM2EVMOnRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 44343) -EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17677) -EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20586) -EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13950) -EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65220) -EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434710) -EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57250) -EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18777) -EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85735) -EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63408) -EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170843) -EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190362) -EVM2EVMOnRamp_setNops:testZeroAddressCannotBeNopReverts() (gas: 53555) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17738) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20647) -EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigSuccess() (gas: 50282) -EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15094) -EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84238) -EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19453) -EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244596) -EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50104) -EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12913) +EVM2EVMOnRamp_getDataAvailabilityCostUSD:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15031) +EVM2EVMOnRamp_getDataAvailabilityCostUSD:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15344) +EVM2EVMOnRamp_getExpectedNextSequenceNumber:testGetExpectedNextSequenceNumberSuccess() (gas: 7838) +EVM2EVMOnRamp_getFee:testEmptyMessageSuccess() (gas: 67455) +EVM2EVMOnRamp_getFee:testHighGasMessageSuccess() (gas: 223338) +EVM2EVMOnRamp_getFee:testMessageGasLimitTooHighReverts() (gas: 16431) +EVM2EVMOnRamp_getFee:testMessageTooLargeReverts() (gas: 94954) +EVM2EVMOnRamp_getFee:testMessageWithDataAndTokenTransferSuccess() (gas: 132339) +EVM2EVMOnRamp_getFee:testNotAFeeTokenReverts() (gas: 21629) +EVM2EVMOnRamp_getFee:testSingleTokenMessageSuccess() (gas: 98946) +EVM2EVMOnRamp_getFee:testTooManyTokensReverts() (gas: 19622) +EVM2EVMOnRamp_getFee:testZeroDataAvailabilityMultiplierSuccess() (gas: 53614) +EVM2EVMOnRamp_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 51483) +EVM2EVMOnRamp_getTokenPool:testGetTokenPoolSuccess() (gas: 41113) +EVM2EVMOnRamp_getTokenTransferCost:testCustomTokenBpsFeeSuccess() (gas: 35454) +EVM2EVMOnRamp_getTokenTransferCost:testFeeTokenBpsFeeSuccess() (gas: 25716) +EVM2EVMOnRamp_getTokenTransferCost:testLargeTokenTransferChargesMaxFeeAndGasSuccess() (gas: 21040) +EVM2EVMOnRamp_getTokenTransferCost:testMixedTokenTransferFeeSuccess() (gas: 104967) +EVM2EVMOnRamp_getTokenTransferCost:testNoTokenTransferChargesZeroFeeSuccess() (gas: 11695) +EVM2EVMOnRamp_getTokenTransferCost:testSmallTokenTransferChargesMinFeeAndGasSuccess() (gas: 20850) +EVM2EVMOnRamp_getTokenTransferCost:testUnsupportedTokenReverts() (gas: 20270) +EVM2EVMOnRamp_getTokenTransferCost:testValidatedPriceStalenessReverts() (gas: 37451) +EVM2EVMOnRamp_getTokenTransferCost:testWETHTokenBpsFeeSuccess() (gas: 31606) +EVM2EVMOnRamp_getTokenTransferCost:testZeroAmountTokenTransferChargesMinFeeAndAgasSuccess() (gas: 20870) +EVM2EVMOnRamp_getTokenTransferCost:testZeroFeeConfigChargesMinFeeSuccess() (gas: 30261) +EVM2EVMOnRamp_linkAvailableForPayment:testInsufficientLinkBalanceSuccess() (gas: 37891) +EVM2EVMOnRamp_linkAvailableForPayment:testLinkAvailableForPaymentSuccess() (gas: 138180) +EVM2EVMOnRamp_payNops:testAdminPayNopsSuccess() (gas: 146292) +EVM2EVMOnRamp_payNops:testInsufficientBalanceReverts() (gas: 32130) +EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131437) +EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136517) +EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149545) +EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144181) +EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299353) +EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19445) +EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37165) +EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25929) +EVM2EVMOnRamp_setDynamicConfig:testSetDynamicConfigSuccess() (gas: 44388) +EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17697) +EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20606) +EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13970) +EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65255) +EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434753) +EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57284) +EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18820) +EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85778) +EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63424) +EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170886) +EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190405) +EVM2EVMOnRamp_setNops:testZeroAddressCannotBeNopReverts() (gas: 53589) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17677) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20586) +EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetTokenTransferFeeSuccess() (gas: 54678) +EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15072) +EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84216) +EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19431) +EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244561) +EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50082) +EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12891) LockReleaseTokenPool_addLiquidity:testLiquidityNotAcceptedReverts() (gas: 2509153) LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquiditySuccess() (gas: 2509647) LockReleaseTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21718) @@ -289,10 +289,10 @@ OCR2Base_transmit:testTransmit2SignersSuccess_gas() (gas: 51741) OCR2Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 23441) OCR2Base_transmit:testUnauthorizedSignerReverts() (gas: 43661) OCR2Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 20507) -OnRampTokenPoolReentrancy:testSuccess() (gas: 332065) -PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146097) +OnRampTokenPoolReentrancy:testSuccess() (gas: 332173) +PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146017) PingPong_plumbing:testPausingSuccess() (gas: 14471) -PingPong_startPingPong:testStartPingPongSuccess() (gas: 171175) +PingPong_startPingPong:testStartPingPongSuccess() (gas: 171015) PriceRegistry_applyFeeTokensUpdates:testApplyFeeTokensUpdatesSuccess() (gas: 77674) PriceRegistry_applyFeeTokensUpdates:testOnlyCallableByOwnerReverts() (gas: 16598) PriceRegistry_applyPriceUpdatersUpdates:testApplyPriceUpdaterUpdatesSuccess() (gas: 80774) @@ -332,25 +332,25 @@ Router_applyRampUpdates:testOffRampDisable() (gas: 192139) Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 108518) Router_applyRampUpdates:testOnRampDisable() (gas: 52147) Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12224) -Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110238) -Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188316) -Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122289) -Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200368) -Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61367) +Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110158) +Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188494) +Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122209) +Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200546) +Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61287) Router_ccipSend:testInvalidMsgValue() (gas: 31860) -Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 64237) -Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 161923) -Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161264) -Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51217) -Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 233465) +Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 63758) +Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 161763) +Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161104) +Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51137) +Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 232157) Router_ccipSend:testUnsupportedDestinationChainReverts() (gas: 24624) Router_ccipSend:testWhenNotHealthyReverts() (gas: 44650) -Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 163363) -Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 229200) +Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 163203) +Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 227812) Router_constructor:testConstructorSuccess() (gas: 9929) -Router_getFee:testGetFeeSupportedChainSuccess() (gas: 38866) +Router_getFee:testGetFeeSupportedChainSuccess() (gas: 38786) Router_getFee:testUnsupportedDestinationChainReverts() (gas: 17079) -Router_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 33435) +Router_getSupportedTokens:testGetSupportedTokensSuccess() (gas: 33413) Router_getSupportedTokens:testUnknownChainSuccess() (gas: 8542) Router_recoverTokens:testRecoverTokensInvalidRecipientReverts() (gas: 11211) Router_recoverTokens:testRecoverTokensNoFundsReverts() (gas: 17675) @@ -379,16 +379,16 @@ TokenPool_setOffRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17975) TokenPool_setOnRampRateLimiterConfig:testNonExistentRampReverts() (gas: 14143) TokenPool_setOnRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17999) TokenProxy_ccipSend:testCcipSendGasShouldBeZeroReverts() (gas: 17053) -TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127348) +TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127459) TokenProxy_ccipSend:testCcipSendInvalidTokenReverts() (gas: 15839) -TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229327) +TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229505) TokenProxy_ccipSend:testCcipSendNoDataAllowedReverts() (gas: 16167) -TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249231) +TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249462) TokenProxy_constructor:testConstructor() (gas: 10651) TokenProxy_getFee:testGetFeeGasShouldBeZeroReverts() (gas: 16734) TokenProxy_getFee:testGetFeeInvalidTokenReverts() (gas: 12616) TokenProxy_getFee:testGetFeeNoDataAllowedReverts() (gas: 15763) -TokenProxy_getFee:testGetFeeSuccess() (gas: 73739) +TokenProxy_getFee:testGetFeeSuccess() (gas: 73961) USDCTokenPool__validateMessage:testValidateInvalidMessageReverts() (gas: 25129) USDCTokenPool_lockOrBurn:testLockOrBurnWithAllowListReverts() (gas: 21826) USDCTokenPool_lockOrBurn:testPermissionsErrorReverts() (gas: 12428) diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index 619f6da79b..a5865e5189 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -93,8 +93,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, /// @dev Struct to hold the execution fee configuration for a fee token struct FeeTokenConfig { uint32 networkFeeUSD; // ───────────╮ Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; // │ Maximum fee to charge for token transfers, multiples of 0.01 USD uint64 gasMultiplier; // │ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost. uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums bool enabled; // ───────────────────╯ Whether this fee token is enabled @@ -105,16 +103,16 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, struct FeeTokenConfigArgs { address token; // ──────────────────╮ Token address uint32 networkFeeUSD; // │ Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; //───╯ Maximum fee to charge for token transfers, multiples of 0.01 USD - uint64 gasMultiplier; // ───╮ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost - uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums + uint64 gasMultiplier; // ───────────╯ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost + uint64 premiumMultiplier; // ───────╮ Multiplier for fee-token-specific premiums bool enabled; // ───────────────────╯ Whether this fee token is enabled } /// @dev Struct to hold the transfer fee configuration for token transfers struct TokenTransferFeeConfig { - uint16 ratio; // ───────────────────╮ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 minFeeUSD; // ───────────────╮ Minimum fee to charge per token transfer, multiples of 0.01 USD + uint32 maxFeeUSD; // │ Maximum fee to charge per token transfer, multiples of 0.01 USD + uint16 ratio; // │ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data } @@ -123,8 +121,10 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, /// token included so that an array of these can be passed in to setTokenTransferFeeConfig struct TokenTransferFeeConfigArgs { address token; // ──────────────────╮ Token address - uint16 ratio; // │ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 - uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + uint32 minFeeUSD; // │ Minimum fee to charge per token transfer, multiples of 0.01 USD + uint32 maxFeeUSD; // │ Maximum fee to charge per token transfer, multiples of 0.01 USD + uint16 ratio; // ───────────────────╯ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // ─────────╮ Gas charged to execute the token transfer on the destination chain uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of fixed transfer data, e.g. USDC source token data and offchain data } @@ -495,8 +495,9 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, uint112 executionGasPrice = uint112(packedGasPrice); // Calculate premiumFee in USD with 18 decimals precision. - // If there are token transfers, premiumFee is calculated from token transfer fees. - // If there are no token transfers, we charge a flat network fee. + // If message-only and no token transfers, a flat network fee is charged. + // If there are token transfers, premiumFee is calculated from token transfer fee. + // If there are both token transfers and message, premiumFee is only calculated from token transfer fee. uint256 premiumFeeUSD = 0; uint32 tokenTransferGas = 0; uint32 tokenTransferBytesOverhead = 0; @@ -504,8 +505,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, (premiumFeeUSD, tokenTransferGas, tokenTransferBytesOverhead) = _getTokenTransferCost( message.feeToken, feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); } else { // Convert USD values with 2 decimals to 18 decimals. @@ -573,22 +573,21 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, /// @notice Returns the token transfer fee. /// A basis point fee is calculated from the USD value of each token transfer. - /// Sum of basis point fees is confined within range [minTokenTransferFeeUSD, maxTokenTransferFeeUSD]. + /// For each individual transfer, this fee is between [minFeeUSD, maxFeeUSD]. + /// Total transfer fee is the sum of each individual token transfer fee. /// @dev Assumes that tokenAmounts are validated to be listed tokens elsewhere. /// @dev Splitting one token transfer into multiple transfers is discouraged, /// as it will result in a transferFee equal or greater than the same amount aggregated/de-duped. /// @param feeToken address of the feeToken. /// @param feeTokenPrice price of feeToken in USD with 18 decimals. /// @param tokenAmounts token transfers in the message. - /// @param feeTokenConfig configuration struct of fee token. /// @return tokenTransferFeeUSD total token transfer bps fee in USD with 36 decimals. /// @return tokenTransferGas total execution gas of the token transfers. /// @return tokenTransferBytesOverhead additional token transfer data passed to destination, e.g. USDC attestation. function _getTokenTransferCost( address feeToken, uint224 feeTokenPrice, - Client.EVMTokenAmount[] calldata tokenAmounts, - FeeTokenConfig memory feeTokenConfig + Client.EVMTokenAmount[] calldata tokenAmounts ) internal view returns (uint256 tokenTransferFeeUSD, uint32 tokenTransferGas, uint32 tokenTransferBytesOverhead) { uint256 numberOfTokens = tokenAmounts.length; @@ -615,21 +614,24 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, bpsFeeUSD = (tokenPrice._calcUSDValueFromTokenAmount(tokenAmount.amount) * transferFeeConfig.ratio) / 1e5; } - tokenTransferFeeUSD += bpsFeeUSD; tokenTransferGas += transferFeeConfig.destGasOverhead; tokenTransferBytesOverhead += transferFeeConfig.destBytesOverhead; - } - // Convert USD values with 2 decimals to 18 decimals. - // Sum of bps fees should be kept within range of [minTokenTransferFeeUSD, maxTokenTransferFeeUSD]. - uint256 minTransferFeeUSD = uint256(feeTokenConfig.minTokenTransferFeeUSD) * 1e16; - if (tokenTransferFeeUSD < minTransferFeeUSD) { - return (minTransferFeeUSD, tokenTransferGas, tokenTransferBytesOverhead); - } + // Bps fees should be kept within range of [minFeeUSD, maxFeeUSD]. + // Convert USD values with 2 decimals to 18 decimals. + uint256 minFeeUSD = uint256(transferFeeConfig.minFeeUSD) * 1e16; + if (bpsFeeUSD < minFeeUSD) { + tokenTransferFeeUSD += minFeeUSD; + continue; + } - uint256 maxTransferFeeUSD = uint256(feeTokenConfig.maxTokenTransferFeeUSD) * 1e16; - if (tokenTransferFeeUSD > maxTransferFeeUSD) { - return (maxTransferFeeUSD, tokenTransferGas, tokenTransferBytesOverhead); + uint256 maxFeeUSD = uint256(transferFeeConfig.maxFeeUSD) * 1e16; + if (bpsFeeUSD > maxFeeUSD) { + tokenTransferFeeUSD += maxFeeUSD; + continue; + } + + tokenTransferFeeUSD += bpsFeeUSD; } return (tokenTransferFeeUSD, tokenTransferGas, tokenTransferBytesOverhead); @@ -656,8 +658,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, s_feeTokenConfig[configArg.token] = FeeTokenConfig({ networkFeeUSD: configArg.networkFeeUSD, - minTokenTransferFeeUSD: configArg.minTokenTransferFeeUSD, - maxTokenTransferFeeUSD: configArg.maxTokenTransferFeeUSD, gasMultiplier: configArg.gasMultiplier, premiumMultiplier: configArg.premiumMultiplier, enabled: configArg.enabled @@ -687,6 +687,8 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, TokenTransferFeeConfigArgs memory configArg = tokenTransferFeeConfigArgs[i]; s_tokenTransferFeeConfig[configArg.token] = TokenTransferFeeConfig({ + minFeeUSD: configArg.minFeeUSD, + maxFeeUSD: configArg.maxFeeUSD, ratio: configArg.ratio, destGasOverhead: configArg.destGasOverhead, destBytesOverhead: configArg.destBytesOverhead diff --git a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOnRampHelper.sol b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOnRampHelper.sol index dbe54f3969..ede4943a43 100644 --- a/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOnRampHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/EVM2EVMOnRampHelper.sol @@ -43,9 +43,8 @@ contract EVM2EVMOnRampHelper is EVM2EVMOnRamp, IgnoreContractSize { function getTokenTransferCost( address feeToken, uint224 feeTokenPrice, - Client.EVMTokenAmount[] calldata tokenAmounts, - FeeTokenConfig memory feeTokenConfig + Client.EVMTokenAmount[] calldata tokenAmounts ) external view returns (uint256, uint32, uint32) { - return _getTokenTransferCost(feeToken, feeTokenPrice, tokenAmounts, feeTokenConfig); + return _getTokenTransferCost(feeToken, feeTokenPrice, tokenAmounts); } } diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol index b7e8c34ab0..a663dca91f 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol @@ -776,24 +776,21 @@ contract EVM2EVMOnRamp_getDataAvailabilityCostUSD is EVM2EVMOnRamp_getFeeSetup { contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { using USDPriceWith18Decimals for uint224; - function testNoTokenTransferChargesMinFeeSuccess() public { + function testNoTokenTransferChargesZeroFeeSuccess() public { Client.EVM2AnyMessage memory message = _generateEmptyMessage(); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.minTokenTransferFeeUSD), feeAmount); + assertEq(0, feeAmount); assertEq(0, destGasOverhead); assertEq(0, destBytesOverhead); } function testSmallTokenTransferChargesMinFeeAndGasSuccess() public { Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1000); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -801,18 +798,16 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.minTokenTransferFeeUSD), feeAmount); + assertEq(configUSDToValue(transferFeeConfig.minFeeUSD), feeAmount); assertEq(transferFeeConfig.destGasOverhead, destGasOverhead); assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead); } function testZeroAmountTokenTransferChargesMinFeeAndAgasSuccess() public { Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 0); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -820,18 +815,16 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.minTokenTransferFeeUSD), feeAmount); + assertEq(configUSDToValue(transferFeeConfig.minFeeUSD), feeAmount); assertEq(transferFeeConfig.destGasOverhead, destGasOverhead); assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead); } function testLargeTokenTransferChargesMaxFeeAndGasSuccess() public { Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1e36); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -839,11 +832,10 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.maxTokenTransferFeeUSD), feeAmount); + assertEq(configUSDToValue(transferFeeConfig.maxFeeUSD), feeAmount); assertEq(transferFeeConfig.destGasOverhead, destGasOverhead); assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead); } @@ -852,7 +844,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { uint256 tokenAmount = 10000e18; Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, tokenAmount); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -860,8 +851,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); uint256 usdValue = calcUSDValueFromTokenAmount(s_feeTokenPrice, tokenAmount); @@ -873,7 +863,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { } function testWETHTokenBpsFeeSuccess() public { - uint256 tokenAmount = 10000e18; + uint256 tokenAmount = 100e18; Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(OWNER), @@ -884,7 +874,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { }); message.tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceRouter.getWrappedNative(), amount: tokenAmount}); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -892,8 +881,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_wrappedTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); uint256 usdValue = calcUSDValueFromTokenAmount(s_wrappedTokenPrice, tokenAmount); @@ -916,7 +904,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { }); message.tokenAmounts[0] = Client.EVMTokenAmount({token: CUSTOM_TOKEN, amount: tokenAmount}); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig = s_onRamp.getTokenTransferFeeConfig( message.tokenAmounts[0].token ); @@ -924,8 +911,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); uint256 usdValue = calcUSDValueFromTokenAmount(s_customTokenPrice, tokenAmount); @@ -941,6 +927,8 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { memory tokenTransferFeeConfigArgs = new EVM2EVMOnRamp.TokenTransferFeeConfigArgs[](1); tokenTransferFeeConfigArgs[0] = EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: s_sourceFeeToken, + minFeeUSD: 1, + maxFeeUSD: 0, ratio: 0, destGasOverhead: 0, destBytesOverhead: 0 @@ -948,16 +936,14 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { s_onRamp.setTokenTransferFeeConfig(tokenTransferFeeConfigArgs); Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1e36); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_feeTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); // if token charges 0 bps, it should cost minFee to transfer - assertEq(configUSDToValue(feeTokenConfig.minTokenTransferFeeUSD), feeAmount); + assertEq(configUSDToValue(tokenTransferFeeConfigArgs[0].minFeeUSD), feeAmount); assertEq(0, destGasOverhead); assertEq(0, destBytesOverhead); } @@ -980,19 +966,16 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { single[0] = Client.EVMTokenAmount({token: s_sourceTokens[0], amount: amount * transfers}); address feeToken = s_sourceRouter.getWrappedNative(); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(feeToken); (uint256 feeSingle, uint32 gasOverheadSingle, uint32 bytesOverheadSingle) = s_onRamp.getTokenTransferCost( feeToken, s_wrappedTokenPrice, - single, - feeTokenConfig + single ); (uint256 feeMultiple, uint32 gasOverheadMultiple, uint32 bytesOverheadMultiple) = s_onRamp.getTokenTransferCost( feeToken, s_wrappedTokenPrice, - multiple, - feeTokenConfig + multiple ); // Note that there can be a rounding error once per split. @@ -1004,6 +987,11 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { function testMixedTokenTransferFeeSuccess() public { address[3] memory testTokens = [s_sourceFeeToken, s_sourceRouter.getWrappedNative(), CUSTOM_TOKEN]; uint224[3] memory tokenPrices = [s_feeTokenPrice, s_wrappedTokenPrice, s_customTokenPrice]; + EVM2EVMOnRamp.TokenTransferFeeConfig[3] memory tokenTransferFeeConfigs = [ + s_onRamp.getTokenTransferFeeConfig(testTokens[0]), + s_onRamp.getTokenTransferFeeConfig(testTokens[1]), + s_onRamp.getTokenTransferFeeConfig(testTokens[2]) + ]; Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({ receiver: abi.encode(OWNER), @@ -1012,7 +1000,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { feeToken: s_sourceRouter.getWrappedNative(), extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT})) }); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); uint256 expectedTotalGas = 0; uint256 expectedTotalBytes = 0; @@ -1025,43 +1012,53 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { (uint256 feeAmount, uint32 destGasOverhead, uint32 destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_wrappedTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.minTokenTransferFeeUSD), feeAmount); + + uint256 expectedFeeUSD = 0; + for (uint256 i = 0; i < testTokens.length; ++i) { + expectedFeeUSD += tokenTransferFeeConfigs[i].minFeeUSD; + } + + assertEq(configUSDToValue(expectedFeeUSD), feeAmount); assertEq(expectedTotalGas, destGasOverhead); assertEq(expectedTotalBytes, destBytesOverhead); - // Set 1st token transfer to a meaningful amount, total bps fee is now between min and max token transfer fees + // Set 1st token transfer to a meaningful amount so its bps fee is now between min and max fee message.tokenAmounts[0] = Client.EVMTokenAmount({token: testTokens[0], amount: 10000e18}); (feeAmount, destGasOverhead, destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_wrappedTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - uint256 usdFeeValue; - for (uint256 i = 0; i < testTokens.length; ++i) { - usdFeeValue += applyBpsRatio( - calcUSDValueFromTokenAmount(tokenPrices[i], message.tokenAmounts[i].amount), - s_tokenTransferFeeConfigArgs[i].ratio - ); - } - assertEq(usdFeeValue, feeAmount); + expectedFeeUSD = applyBpsRatio( + calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), + tokenTransferFeeConfigs[0].ratio + ); + expectedFeeUSD += configUSDToValue(tokenTransferFeeConfigs[1].minFeeUSD); + expectedFeeUSD += configUSDToValue(tokenTransferFeeConfigs[2].minFeeUSD); + + assertEq(expectedFeeUSD, feeAmount); assertEq(expectedTotalGas, destGasOverhead); assertEq(expectedTotalBytes, destBytesOverhead); - // Set 2nd token transfer to a large amount, total bps fee is now higher than max token transfer fee + // Set 2nd token transfer to a large amount that is higher than maxFeeUSD message.tokenAmounts[1] = Client.EVMTokenAmount({token: testTokens[1], amount: 1e36}); (feeAmount, destGasOverhead, destBytesOverhead) = s_onRamp.getTokenTransferCost( message.feeToken, s_wrappedTokenPrice, - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); - assertEq(configUSDToValue(feeTokenConfig.maxTokenTransferFeeUSD), feeAmount); + expectedFeeUSD = applyBpsRatio( + calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), + tokenTransferFeeConfigs[0].ratio + ); + expectedFeeUSD += configUSDToValue(tokenTransferFeeConfigs[1].maxFeeUSD); + expectedFeeUSD += configUSDToValue(tokenTransferFeeConfigs[2].minFeeUSD); + + assertEq(expectedFeeUSD, feeAmount); assertEq(expectedTotalGas, destGasOverhead); assertEq(expectedTotalBytes, destBytesOverhead); } @@ -1070,13 +1067,11 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { function testUnsupportedTokenReverts() public { address NOT_SUPPORTED_TOKEN = address(123); - Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(NOT_SUPPORTED_TOKEN, 200000e18); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); vm.expectRevert(abi.encodeWithSelector(EVM2EVMOnRamp.UnsupportedToken.selector, NOT_SUPPORTED_TOKEN)); - s_onRamp.getTokenTransferCost(message.feeToken, s_feeTokenPrice, message.tokenAmounts, feeTokenConfig); + s_onRamp.getTokenTransferCost(message.feeToken, s_feeTokenPrice, message.tokenAmounts); } function testValidatedPriceStalenessReverts() public { @@ -1084,7 +1079,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1e36); message.tokenAmounts[0].token = s_sourceRouter.getWrappedNative(); - EVM2EVMOnRamp.FeeTokenConfig memory feeTokenConfig = s_onRamp.getFeeTokenConfig(message.feeToken); vm.expectRevert( abi.encodeWithSelector( @@ -1095,7 +1089,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup { ) ); - s_onRamp.getTokenTransferCost(message.feeToken, s_feeTokenPrice, message.tokenAmounts, feeTokenConfig); + s_onRamp.getTokenTransferCost(message.feeToken, s_feeTokenPrice, message.tokenAmounts); } } @@ -1199,8 +1193,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { (uint256 transferFeeUSD, , ) = s_onRamp.getTokenTransferCost( message.feeToken, feeTokenPrices[i], - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); uint256 messageFeeUSD = (transferFeeUSD * feeTokenConfig.premiumMultiplier); uint256 dataAvailabilityFeeUSD = s_onRamp.getDataAvailabilityCostUSD( @@ -1254,8 +1247,7 @@ contract EVM2EVMOnRamp_getFee is EVM2EVMOnRamp_getFeeSetup { (uint256 transferFeeUSD, , ) = s_onRamp.getTokenTransferCost( message.feeToken, feeTokenPrices[i], - message.tokenAmounts, - feeTokenConfig + message.tokenAmounts ); uint256 messageFeeUSD = (transferFeeUSD * feeTokenConfig.premiumMultiplier); uint256 dataAvailabilityFeeUSD = s_onRamp.getDataAvailabilityCostUSD( @@ -1543,17 +1535,21 @@ contract EVM2EVMOnRamp_setFeeTokenConfig is EVM2EVMOnRampSetup { contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { event TokenTransferFeeConfigSet(EVM2EVMOnRamp.TokenTransferFeeConfigArgs[] transferFeeConfig); - function testSetFeeTokenConfigSuccess() public { + function testSetTokenTransferFeeSuccess() public { EVM2EVMOnRamp.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs = new EVM2EVMOnRamp.TokenTransferFeeConfigArgs[](2); tokenTransferFeeConfigArgs[0] = EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: address(0), + minFeeUSD: 0, + maxFeeUSD: 0, ratio: 0, destGasOverhead: 0, destBytesOverhead: 0 }); tokenTransferFeeConfigArgs[1] = EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: address(1), + minFeeUSD: 1, + maxFeeUSD: 1, ratio: 1, destGasOverhead: 1, destBytesOverhead: 1 @@ -1567,6 +1563,8 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig0 = s_onRamp.getTokenTransferFeeConfig( address(0) ); + assertEq(0, tokenTransferFeeConfig0.minFeeUSD); + assertEq(0, tokenTransferFeeConfig0.maxFeeUSD); assertEq(0, tokenTransferFeeConfig0.ratio); assertEq(0, tokenTransferFeeConfig0.destGasOverhead); assertEq(0, tokenTransferFeeConfig0.destBytesOverhead); @@ -1574,6 +1572,8 @@ contract EVM2EVMOnRamp_setTokenTransferFeeConfig is EVM2EVMOnRampSetup { EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig1 = s_onRamp.getTokenTransferFeeConfig( address(1) ); + assertEq(1, tokenTransferFeeConfig1.minFeeUSD); + assertEq(1, tokenTransferFeeConfig1.maxFeeUSD); assertEq(1, tokenTransferFeeConfig1.ratio); assertEq(1, tokenTransferFeeConfig1.destGasOverhead); assertEq(1, tokenTransferFeeConfig1.destBytesOverhead); diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol index f4714f9230..e89b0e81ee 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol @@ -40,8 +40,6 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup { EVM2EVMOnRamp.FeeTokenConfigArgs({ token: s_sourceFeeToken, networkFeeUSD: 1_00, // 1 USD - minTokenTransferFeeUSD: 1_00, // 1 USD - maxTokenTransferFeeUSD: 5000_00, // 5,000 USD gasMultiplier: 1e18, // 1x premiumMultiplier: 5e17, // 0.5x enabled: true @@ -51,8 +49,6 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup { EVM2EVMOnRamp.FeeTokenConfigArgs({ token: WETH, networkFeeUSD: 5_00, // 5 USD - minTokenTransferFeeUSD: 2_00, // 2 USD - maxTokenTransferFeeUSD: 10000_00, // 10,000 USD gasMultiplier: 2e18, // 2x premiumMultiplier: 2e18, // 2x enabled: true @@ -62,6 +58,8 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup { s_tokenTransferFeeConfigArgs.push( EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: s_sourceFeeToken, + minFeeUSD: 1_00, // 1 USD + maxFeeUSD: 1000_00, // 1,000 USD ratio: 2_5, // 2.5 bps, or 0.025% destGasOverhead: 40_000, destBytesOverhead: 0 @@ -70,6 +68,8 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup { s_tokenTransferFeeConfigArgs.push( EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: s_sourceRouter.getWrappedNative(), + minFeeUSD: 50, // 0.5 USD + maxFeeUSD: 500_00, // 500 USD ratio: 5_0, // 5 bps, or 0.05% destGasOverhead: 10_000, destBytesOverhead: 100 @@ -78,6 +78,8 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup { s_tokenTransferFeeConfigArgs.push( EVM2EVMOnRamp.TokenTransferFeeConfigArgs({ token: CUSTOM_TOKEN, + minFeeUSD: 2_00, // 1 USD + maxFeeUSD: 2000_00, // 1,000 USD ratio: 10_0, // 10 bps, or 0.1% destGasOverhead: 1, destBytesOverhead: 200 diff --git a/contracts/src/v0.8/ccip/test/router/Router.t.sol b/contracts/src/v0.8/ccip/test/router/Router.t.sol index b580d9c4a9..a7d4a82c52 100644 --- a/contracts/src/v0.8/ccip/test/router/Router.t.sol +++ b/contracts/src/v0.8/ccip/test/router/Router.t.sol @@ -199,8 +199,6 @@ contract Router_ccipSend is EVM2EVMOnRampSetup { feeTokenConfigArgs[0] = EVM2EVMOnRamp.FeeTokenConfigArgs({ token: s_sourceTokens[1], networkFeeUSD: 1, - minTokenTransferFeeUSD: 1, - maxTokenTransferFeeUSD: 5, gasMultiplier: 108e16, premiumMultiplier: 1e18, enabled: true @@ -275,8 +273,6 @@ contract Router_ccipSend is EVM2EVMOnRampSetup { feeTokenConfigArgs[0] = EVM2EVMOnRamp.FeeTokenConfigArgs({ token: s_sourceTokens[1], networkFeeUSD: 0, - minTokenTransferFeeUSD: 0, - maxTokenTransferFeeUSD: 5, gasMultiplier: 108e16, premiumMultiplier: 1e18, enabled: true diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go index 7ebccb47d4..d21ae3c11e 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go @@ -57,22 +57,18 @@ type EVM2EVMOnRampDynamicConfig struct { } type EVM2EVMOnRampFeeTokenConfig struct { - NetworkFeeUSD uint32 - MinTokenTransferFeeUSD uint32 - MaxTokenTransferFeeUSD uint32 - GasMultiplier uint64 - PremiumMultiplier uint64 - Enabled bool + NetworkFeeUSD uint32 + GasMultiplier uint64 + PremiumMultiplier uint64 + Enabled bool } type EVM2EVMOnRampFeeTokenConfigArgs struct { - Token common.Address - NetworkFeeUSD uint32 - MinTokenTransferFeeUSD uint32 - MaxTokenTransferFeeUSD uint32 - GasMultiplier uint64 - PremiumMultiplier uint64 - Enabled bool + Token common.Address + NetworkFeeUSD uint32 + GasMultiplier uint64 + PremiumMultiplier uint64 + Enabled bool } type EVM2EVMOnRampNopAndWeight struct { @@ -91,6 +87,8 @@ type EVM2EVMOnRampStaticConfig struct { } type EVM2EVMOnRampTokenTransferFeeConfig struct { + MinFeeUSD uint32 + MaxFeeUSD uint32 Ratio uint16 DestGasOverhead uint32 DestBytesOverhead uint32 @@ -98,6 +96,8 @@ type EVM2EVMOnRampTokenTransferFeeConfig struct { type EVM2EVMOnRampTokenTransferFeeConfigArgs struct { Token common.Address + MinFeeUSD uint32 + MaxFeeUSD uint32 Ratio uint16 DestGasOverhead uint32 DestBytesOverhead uint32 @@ -139,8 +139,8 @@ type RateLimiterTokenBucket struct { } var EVM2EVMOnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"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\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"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\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"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\":[],\"name\":\"TokenPoolMismatch\",\"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\":\"contractIERC20\",\"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\":[{\"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\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"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\":\"structEVM2EVMOnRamp.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\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"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\":[{\"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\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"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\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"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: "0x6101806040523480156200001257600080fd5b50604051620083be380380620083be833981016040819052620000359162001e1d565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c082620007e0565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b5050505050505062002408565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062001ff2565b60405180910390a150565b60005b8151811015620007ae57600082828151811062000669576200066962002072565b6020908102919091018101516040805160c080820183528385015163ffffffff908116835283850151811683870190815260608087015183168587019081526080808901516001600160401b0390811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a529690982094518554925198519151965194511515600160e01b0260ff60e01b19958916600160a01b0295909516600160a01b600160e81b0319979098166c0100000000000000000000000002600160601b600160a01b0319928516680100000000000000000292909216600160401b600160a01b0319998516640100000000026001600160401b0319909416919094161791909117969096161794909417919091169190911791909117905550620007a6816200209e565b905062000648565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516200063a9190620020ba565b60005b8151811015620008b357600082828151811062000804576200080462002072565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e909752939095209151825491519451841666010000000000000263ffffffff60301b1995909416620100000265ffffffffffff19909216951694909417939093179190911617905550620008ab816200209e565b9050620007e3565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516200063a919062002172565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021e1565b60079062001025565b509050620009a860078262001043565b505080620009b690620021f7565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002072565b6020026020010151600001519050600085838151811062000a085762000a0862002072565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002211565b935050508062000a9e906200209e565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002231565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002072565b6020026020010151600001519050600084838151811062000b585762000b5862002072565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c43906200209e565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002072565b6020026020010151600001519050600083838151811062000c955762000c9562002072565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f91906200229e565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e05906200209e565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022be565b62000f5b9190620022d8565b905062000f698187620022fb565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe4906200209e565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117291906200231e565b6200117e919062002338565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200235b565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002072565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021e1565b8554909150600090620014b290600190620021e1565b90508181146200151e576000866000018281548110620014d657620014d662002072565b9060005260206000200154905080876000018481548110620014fc57620014fc62002072565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001532576200153262002379565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023b5565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023d3565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b604051608081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200183957620018396200175d565b604052919050565b6001600160a01b03811681146200185757600080fd5b50565b8051620018678162001841565b919050565b80516001600160401b03811681146200186757600080fd5b600060e082840312156200189757600080fd5b620018a162001773565b90508151620018b08162001841565b8152620018c0602083016200186c565b6020820152620018d3604083016200186c565b6040820152620018e6606083016200186c565b606082015260808201516001600160601b03811681146200190657600080fd5b60808201526200191960a083016200185a565b60a08201526200192c60c083016200185a565b60c082015292915050565b805161ffff811681146200186757600080fd5b805163ffffffff811681146200186757600080fd5b600061014082840312156200197357600080fd5b6200197d6200179e565b90506200198a826200185a565b81526200199a6020830162001937565b6020820152620019ad604083016200194a565b6040820152620019c06060830162001937565b6060820152620019d3608083016200194a565b6080820152620019e660a0830162001937565b60a0820152620019f960c0830162001937565b60c082015262001a0c60e083016200185a565b60e082015261010062001a218184016200194a565b9082015261012062001a358382016200194a565b9082015292915050565b60006001600160401b0382111562001a5b5762001a5b6200175d565b5060051b60200190565b600082601f83011262001a7757600080fd5b8151602062001a9062001a8a8362001a3f565b6200180e565b82815260069290921b8401810191818101908684111562001ab057600080fd5b8286015b8481101562001b0a576040818903121562001acf5760008081fd5b62001ad9620017c4565b815162001ae68162001841565b81528185015162001af78162001841565b8186015283529183019160400162001ab4565b509695505050505050565b805180151581146200186757600080fd5b80516001600160801b03811681146200186757600080fd5b60006060828403121562001b5157600080fd5b604051606081016001600160401b038111828210171562001b765762001b766200175d565b60405290508062001b878362001b15565b815262001b976020840162001b26565b602082015262001baa6040840162001b26565b60408201525092915050565b600082601f83011262001bc857600080fd5b8151602062001bdb62001a8a8362001a3f565b82815260e0928302850182019282820191908785111562001bfb57600080fd5b8387015b8581101562001cb05781818a03121562001c195760008081fd5b62001c2362001773565b815162001c308162001841565b815262001c3f8287016200194a565b86820152604062001c528184016200194a565b90820152606062001c658382016200194a565b90820152608062001c788382016200186c565b9082015260a062001c8b8382016200186c565b9082015260c062001c9e83820162001b15565b90820152845292840192810162001bff565b5090979650505050505050565b600082601f83011262001ccf57600080fd5b8151602062001ce262001a8a8362001a3f565b82815260079290921b8401810191818101908684111562001d0257600080fd5b8286015b8481101562001b0a576080818903121562001d215760008081fd5b62001d2b620017e9565b815162001d388162001841565b815262001d4782860162001937565b85820152604062001d5a8184016200194a565b90820152606062001d6d8382016200194a565b9082015283529183019160800162001d06565b600082601f83011262001d9257600080fd5b8151602062001da562001a8a8362001a3f565b82815260069290921b8401810191818101908684111562001dc557600080fd5b8286015b8481101562001b0a576040818903121562001de45760008081fd5b62001dee620017c4565b815162001dfb8162001841565b815262001e0a82860162001937565b8186015283529183019160400162001dc9565b6000806000806000806000610300888a03121562001e3a57600080fd5b62001e46898962001884565b965062001e578960e08a016200195f565b6102208901519096506001600160401b038082111562001e7657600080fd5b62001e848b838c0162001a65565b965062001e968b6102408c0162001b3e565b95506102a08a015191508082111562001eae57600080fd5b62001ebc8b838c0162001bb6565b94506102c08a015191508082111562001ed457600080fd5b62001ee28b838c0162001cbd565b93506102e08a015191508082111562001efa57600080fd5b5062001f098a828b0162001d80565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f3b602084018261ffff169052565b50604081015162001f54604084018263ffffffff169052565b50606081015162001f6b606084018261ffff169052565b50608081015162001f84608084018263ffffffff169052565b5060a081015162001f9b60a084018261ffff169052565b5060c081015162001fb260c084018261ffff169052565b5060e081015162001fce60e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f18565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020b357620020b362002088565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015163ffffffff9081168887015286820151811687870152606080830151909116908601526080808201516001600160401b03169086015260a08082015162002144878301826001600160401b03169052565b505060c09081015115159085015260e09093019290850190600101620020d7565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff908116878701526060918201511690850152608090930192908501906001016200218f565b818103818111156200101f576200101f62002088565b60008162002209576200220962002088565b506000190190565b63ffffffff81811683821601908082111562001579576200157962002088565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200229057845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200225c565b509098975050505050505050565b600060208284031215620022b157600080fd5b81516200105a8162001841565b80820281158282048414176200101f576200101f62002088565b600082620022f657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001579576200157962002088565b6000602082840312156200233157600080fd5b5051919050565b818103600083128015838313168383128216171562001579576200157962002088565b6000602082840312156200236e57600080fd5b6200105a8262001b15565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023ac57818101518382015260200162002392565b50506000910152565b60008251620023c98184602087016200238f565b9190910192915050565b6020815260008251806020840152620023f48160408501602087016200238f565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615eaf6200250f600039600081816103340152818161151d0152613e730152600081816103050152818161143f015281816114a701528181611a8601528181611aee0152613e4401526000818161027101528181610bc201528181611e830152613db001526000818161024101528181611bb90152613d8001526000818161021201528181610f910152818161183101528181611932015281816123b40152818161313f015281816134cc0152613d510152600081816102d1015281816119fe0152613e100152600081816102a1015281816126fb0152613de001526000611f4b0152615eaf6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806375294130116100f9578063b06d41bc11610097578063d3c7c2c711610071578063d3c7c2c71461092c578063e687b40a14610941578063eff7cc4814610954578063f2fde38b1461095c57600080fd5b8063b06d41bc146108fb578063c92b283214610911578063d09dc3391461092457600080fd5b8063856c8247116100d3578063856c8247146107575780638da5cb5b1461076a5780639a113c361461077b578063a7d3e02f146108e857600080fd5b8063752941301461072957806376f6ae761461073c57806379ba50971461074f57600080fd5b8063546719cd11610166578063599f643111610140578063599f64311461056f5780635d86f14114610594578063704b6c02146105a75780637437ff9f146105ba57600080fd5b8063546719cd146104d8578063549e946f1461053c57806354b714681461054f57600080fd5b8063352e4bc8116101a2578063352e4bc81461046e57806338724a95146104835780633a87ac53146104a45780634120fccd146104b757600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a7714610425575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b604051610371919061499c565b60405180910390f35b6103f1610388366004614a3d565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600e825292829020825193840183525461ffff8116845263ffffffff62010000820481169285019290925266010000000000009004169082015290565b60408051825161ffff16815260208084015163ffffffff908116918301919091529282015190921690820152606001610371565b6104616040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614ac8565b61048161047c366004614c67565b61096f565b005b610496610491366004614d9d565b6109d8565b604051908152602001610371565b6104816104b2366004614e6e565b610e38565b6104bf610e4e565b60405167ffffffffffffffff9091168152602001610371565b6104e0610e82565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61048161054a366004614ed2565b610f32565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b61057c6105a2366004614a3d565b6110e7565b6104816105b5366004614a3d565b611146565b61071c6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614fe6565b610481610737366004615007565b611210565b61048161074a3660046150f4565b611276565b61048161132e565b6104bf610765366004614a3d565b611411565b6000546001600160a01b031661057c565b61087e610789366004614a3d565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b03166000908152600d6020908152604091829020825160c081018452905463ffffffff808216835264010000000082048116938301939093526801000000000000000081049092169281019290925267ffffffffffffffff6c0100000000000000000000000082048116606084015274010000000000000000000000000000000000000000820416608083015260ff7c010000000000000000000000000000000000000000000000000000000090910416151560a082015290565b6040516103719190600060c08201905063ffffffff80845116835280602085015116602084015280604085015116604084015250606083015167ffffffffffffffff8082166060850152806080860151166080850152505060a0830151151560a083015292915050565b6104966108f6366004615169565b611519565b610903611fbd565b604051610371929190615217565b61048161091f366004615259565b6120c1565b610496612129565b610934612133565b60405161037191906152c7565b61048161094f366004615314565b6121e4565b6104816121f5565b61048161096a366004614a3d565b61248c565b6000546001600160a01b0316331480159061099557506002546001600160a01b03163314155b156109cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d58161249d565b50565b6000806109f06109eb60808501856153dc565b6126cc565b9050610a1b610a0260208501856153dc565b8351909150610a146040870187615441565b90506127c0565b6000600d81610a306080870160608801614a3d565b6001600160a01b031681526020808201929092526040908101600020815160c081018352905463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316918101919091526c01000000000000000000000000820467ffffffffffffffff90811660608301527401000000000000000000000000000000000000000083041660808201527c010000000000000000000000000000000000000000000000000000000090910460ff16151560a08201819052909150610b4d57610b0a6080850160608601614a3d565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610b7b6080890160608a01614a3d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a91906154d5565b9092509050806000808080610c4260408c018c615441565b90501115610c7d57610c71610c5d60808c0160608d01614a3d565b87610c6b60408e018e615441565b8b6128e9565b91945092509050610c99565b8651610c969063ffffffff16662386f26fc10000615537565b92505b6080870151610cb29067ffffffffffffffff1684615537565b606088015160055491945060009167ffffffffffffffff9091169063ffffffff8516907a010000000000000000000000000000000000000000000000000000900461ffff16610d0460208f018f6153dc565b610d0f929150615537565b6005548c51610d3e91760100000000000000000000000000000000000000000000900463ffffffff169061554e565b610d48919061554e565b610d52919061554e565b610d5c9190615537565b610d76906dffffffffffffffffffffffffffff8716615537565b60065490915060009062010000900461ffff1615610dea576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610de6818e8060200190610dcc91906153dc565b90508f8060400190610dde9190615441565b905087612ba2565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610e14848861554e565b610e1e919061554e565b610e289190615561565b9c9b505050505050505050505050565b610e40612c74565b610e4a8282612cea565b5050565b601054600090610e7d90700100000000000000000000000000000000900467ffffffffffffffff16600161559c565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e7d9061304a565b6000546001600160a01b03163314801590610f5857506002546001600160a01b03163314155b15610f8f576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd657506001600160a01b038116155b1561100d576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110176130fc565b121561104f576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e4a9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d691906155bd565b6001600160a01b03851691906131bc565b60006110f4600a8361323c565b611135576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b611140600a83613251565b92915050565b6000546001600160a01b0316331480159061116c57506002546001600160a01b03163314155b156111a3576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061123657506002546001600160a01b03163314155b1561126d576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d581613266565b6000546001600160a01b0316331480159061129c57506002546001600160a01b03163314155b156112d3576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4a8282808060200260200160405190810160405280939291908181526020016000905b8282101561132457611315604083028601368190038101906155d6565b815260200190600101906112f8565b5050505050613393565b6001546001600160a01b031633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b44565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561146a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611140576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190615615565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190615632565b156115d4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611614576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314611658576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166284806153dc565b90506020146116a95761167584806153dc565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610b44929190615698565b60006116b585806153dc565b8101906116c291906156ac565b90506001600160a01b038111806116d95750600a81105b156116e85761167585806153dc565b60006116fa6109eb60808801886153dc565b519050600061170c6040880188615441565b9150611729905061172060208901896153dc565b905083836127c0565b80156118275760005b818110156117aa576117476040890189615441565b82818110611757576117576156c5565b9050604002016020013560000361179a576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117a3816156f4565b9050611732565b506118276117bb6040890189615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611807576117f86040830286013681900381019061572c565b815260200190600101906117db565b505060065464010000000090046001600160a01b03169250613606915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166118616080890160608a01614a3d565b6001600160a01b0316036118c557601080548791906000906118929084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506119ec565b60065464010000000090046001600160a01b03166241e5be6118ed60808a0160608b01614a3d565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d91906155bd565b601080546000906119bd9084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611a59576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611ab157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611ba9576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b599190615615565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611c269061578b565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611c85911661578b565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611cba60808b0160608c01614a3d565b6001600160a01b03168152602001888152602001898060200190611cde91906153dc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611d2560408b018b615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611d7157611d626040830286013681900381019061572c565b81526020019060010190611d45565b505050505081526020018367ffffffffffffffff811115611d9457611d94614adb565b604051908082528060200260200182016040528015611dc757816020015b6060815260200190600190039081611db25790505b508152600060209091018190529091505b82811015611f44576000611def60408b018b615441565b83818110611dff57611dff6156c5565b905060400201803603810190611e15919061572c565b9050611e2481600001516110e7565b6001600160a01b0316639687544589611e3d8d806153dc565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611eab959493927f0000000000000000000000000000000000000000000000000000000000000000916004016157b2565b6000604051808303816000875af1158015611eca573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f10919081019061580a565b8361016001518381518110611f2757611f276156c5565b60200260200101819052505080611f3d906156f4565b9050611dd8565b50611f6f817f00000000000000000000000000000000000000000000000000000000000000006137c1565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611fa5908390615955565b60405180910390a16101800151979650505050505050565b6060600080611fcc600761393a565b90508067ffffffffffffffff811115611fe757611fe7614adb565b60405190808252806020026020018201604052801561202c57816020015b60408051808201909152600080825260208201528152602001906001900390816120055790505b50925060005b8181101561209e57600080612048600784613945565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110612080576120806156c5565b6020026020010181905250505080612097906156f4565b9050612032565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906120e757506002546001600160a01b03163314155b1561211e576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d5600382613963565b6000610e7d6130fc565b60606000612141600a613b3b565b67ffffffffffffffff81111561215957612159614adb565b604051908082528060200260200182016040528015612182578160200160208202803683370190505b50905060005b81518110156121de5761219c600a82613b46565b508282815181106121af576121af6156c5565b60200260200101816001600160a01b03166001600160a01b031681525050806121d7906156f4565b9050612188565b50919050565b6121ec612c74565b6109d581613b55565b6000546001600160a01b0316331480159061221b57506002546001600160a01b03163314155b801561222f575061222d600733613ead565b155b15612266576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1660008190036122ba576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612305576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061230f6130fc565b1215612347576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000612354600761393a565b905060005b818110156124495760008061236f600784613945565b909250905060008761238f836bffffffffffffffffffffffff8a16615537565b6123999190615561565b90506123a58187615aa8565b95506123e96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff84166131bc565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080612442906156f4565b9050612359565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612494612c74565b6109d581613ec2565b60005b815181101561269c5760008282815181106124bd576124bd6156c5565b6020908102919091018101516040805160c080820183528385015163ffffffff9081168352838501518116838701908152606080870151831685870190815260808089015167ffffffffffffffff90811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a5296909820945185549251985191519651945115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9589167401000000000000000000000000000000000000000002959095167fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff979098166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff9285166801000000000000000002929092167fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff998516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909416919094161791909117969096161794909417919091169190911791909117905550612695816156f4565b90506124a0565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516112059190615acd565b60408051602081019091526000815260008290036127225750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152611140565b7f97a657c90000000000000000000000000000000000000000000000000000000061274d8385615b77565b7fffffffff0000000000000000000000000000000000000000000000000000000016146127a6576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b38260048186615bbf565b8101906115129190615be9565b6006547801000000000000000000000000000000000000000000000000900463ffffffff1680841115612829576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b44565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683111561288b576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff168211156128e3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808084815b81811015612b2d57600088888381811061290c5761290c6156c5565b905060400201803603810190612922919061572c565b80516001600160a01b03166000908152600e60209081526040918290208251606081018452905461ffff8116825263ffffffff620100008204811693830193909352660100000000000090048216928101929092528251929350909161298c91600a919061323c16565b6129d05781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b805160009061ffff1615612ae95760008d6001600160a01b031684600001516001600160a01b031614612a945760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8d9190615c2b565b9050612a97565b508b5b82516020850151620186a09161ffff1690612ad1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851690613f9d565b612adb9190615537565b612ae59190615561565b9150505b612af3818961554e565b9750816020015187612b059190615c46565b9650816040015186612b179190615c46565b955050505080612b26906156f4565b90506128f0565b506000856020015163ffffffff16662386f26fc10000612b4d9190615537565b905080851015612b60579350612b979050565b6000866040015163ffffffff16662386f26fc10000612b7f9190615537565b905080861115612b93579450612b97915050565b5050505b955095509592505050565b60008063ffffffff8316612bb7608086615537565b612bc38761022061554e565b612bcd919061554e565b612bd7919061554e565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612c199061ffff1684615537565b612c23919061554e565b60065490915062010000900461ffff16612c4d6dffffffffffffffffffffffffffff891683615537565b612c579190615537565b612c6790655af3107a4000615537565b925050505b949350505050565b6000546001600160a01b03163314612ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b44565b565b60005b8251811015612e4b576000838281518110612d0a57612d0a6156c5565b60200260200101516000015190506000848381518110612d2c57612d2c6156c5565b6020026020010151602001519050612d4e82600a61323c90919063ffffffff16565b612d8f576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6001600160a01b038116612da4600a84613251565b6001600160a01b031614612de4576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612def600a83613fda565b15612e3857604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612e44906156f4565b9050612ced565b5060005b8151811015613045576000828281518110612e6c57612e6c6156c5565b60200260200101516000015190506000838381518110612e8e57612e8e6156c5565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612ec457506001600160a01b038116155b15612efb576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5d9190615c63565b6001600160a01b0316826001600160a01b031614612fa7576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fb3600a8383613fef565b1561300057604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1613032565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508061303e906156f4565b9050612e4f565b505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526130d882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426130bc9190615c80565b85608001516fffffffffffffffffffffffffffffffff16614005565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561318e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b291906155bd565b610e7d9190615c93565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261304590849061402d565b6000611512836001600160a01b03841661412c565b6000611512836001600160a01b038416614138565b60005b8151811015613363576000828281518110613286576132866156c5565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e90975293909520915182549151945184166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff9590941662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921695169490941793909317919091161790555061335c816156f4565b9050613269565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516112059190615cb3565b805160408111156133d0576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159061341e575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b1561342b5761342b6121f5565b6000613437600761393a565b90505b8015613479576000613458613450600184615c80565b600790613945565b509050613466600782614144565b50508061347290615d20565b905061343a565b506000805b8281101561358757600084828151811061349a5761349a6156c5565b602002602001015160000151905060008583815181106134bc576134bc6156c5565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061351157506001600160a01b038216155b15613553576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b61356360078361ffff8416614159565b5061357261ffff821685615c46565b9350505080613580906156f4565b905061347e565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906135f99083908690615d55565b60405180910390a1505050565b81516000805b828110156137b3576000846001600160a01b031663d02641a0878481518110613637576136376156c5565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190615d74565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613747578582815181106136fd576136fd6156c5565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b61379586838151811061375c5761375c6156c5565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613f9d90919063ffffffff16565b61379f908461554e565b925050806137ac906156f4565b905061360c565b506128e3600382600061416f565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016138579897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016138909190615da7565b604051602081830303815290604052805190602001208761016001516040516020016138bc9190615dba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b6000611140826144be565b600080808061395486866144c9565b909450925050505b9250929050565b815460009061398c90700100000000000000000000000000000000900463ffffffff1642615c80565b90508015613a2e57600183015483546139d4916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416614005565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613a54916fffffffffffffffffffffffffffffffff90811691166144f4565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906135f99084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60006111408261393a565b60008080806139548686613945565b60e08101516001600160a01b0316613b99576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525082604051611205929190615dcd565b6000611512836001600160a01b03841661450a565b336001600160a01b03821603613f34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b44565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613fd0837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615537565b6115129190615561565b6000611512836001600160a01b038416614516565b6000612c6c846001600160a01b03851684614522565b6000614024856140158486615537565b61401f908761554e565b6144f4565b95945050505050565b6000614082826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145389092919063ffffffff16565b80519091501561304557808060200190518101906140a09190615632565b613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b44565b6000611512838361450a565b60006115128383614547565b6000611512836001600160a01b0384166145d1565b6000612c6c846001600160a01b038516846145ee565b825474010000000000000000000000000000000000000000900460ff161580614196575081155b156141a057505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906141e690700100000000000000000000000000000000900463ffffffff1642615c80565b905080156142a65781831115614228576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142629083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16614005565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015614343576001600160a01b0384166142f8576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610b44565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610b44565b8483101561443c5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906143879082615c80565b614391878a615c80565b61439b919061554e565b6143a59190615561565b90506001600160a01b0386166143f1576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610b44565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610b44565b6144468584615c80565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60006111408261460b565b600080806144d78585614615565b600081815260029690960160205260409095205494959350505050565b60008183106145035781611512565b5090919050565b60006115128383614621565b600061151283836145d1565b6000612c6c84846001600160a01b0385166145ee565b6060612c6c8484600085614639565b60008181526002830160205260408120548015158061456b575061456b848461450a565b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b44565b60008181526002830160205260408120819055611512838361473a565b60008281526002840160205260408120829055612c6c8484614746565b6000611140825490565b60006115128383614752565b60008181526001830160205260408120541515611512565b6060824710156146cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b44565b600080866001600160a01b031685876040516146e79190615e57565b60006040518083038185875af1925050503d8060008114614724576040519150601f19603f3d011682016040523d82523d6000602084013e614729565b606091505b5091509150612c678783838761477c565b6000611512838361480f565b60006115128383614909565b6000826000018281548110614769576147696156c5565b9060005260206000200154905092915050565b606083156148055782516000036147fe576001600160a01b0385163b6147fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b44565b5081612c6c565b612c6c8383614958565b600081815260018301602052604081205480156148f8576000614833600183615c80565b855490915060009061484790600190615c80565b90508181146148ac576000866000018281548110614867576148676156c5565b906000526020600020015490508087600001848154811061488a5761488a6156c5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806148bd576148bd615e73565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611140565b6000915050611140565b5092915050565b600081815260018301602052604081205461495057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611140565b506000611140565b8151156149685781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449190614ac8565b60e0810161114082846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146109d557600080fd5b8035614a3881614a18565b919050565b600060208284031215614a4f57600080fd5b813561151281614a18565b60005b83811015614a75578181015183820152602001614a5d565b50506000910152565b60008151808452614a96816020860160208601614a5a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115126020830184614a7e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b60405290565b6040805190810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b6040516080810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051610140810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614be457614be4614adb565b604052919050565b600067ffffffffffffffff821115614c0657614c06614adb565b5060051b60200190565b63ffffffff811681146109d557600080fd5b8035614a3881614c10565b67ffffffffffffffff811681146109d557600080fd5b8035614a3881614c2d565b80151581146109d557600080fd5b8035614a3881614c4e565b60006020808385031215614c7a57600080fd5b823567ffffffffffffffff811115614c9157600080fd5b8301601f81018513614ca257600080fd5b8035614cb5614cb082614bec565b614b9d565b81815260e09182028301840191848201919088841115614cd457600080fd5b938501935b83851015614d7f5780858a031215614cf15760008081fd5b614cf9614b0a565b8535614d0481614a18565b815285870135614d1381614c10565b81880152604086810135614d2681614c10565b90820152606086810135614d3981614c10565b908201526080614d4a878201614c43565b9082015260a0614d5b878201614c43565b9082015260c0614d6c878201614c5c565b9082015283529384019391850191614cd9565b50979650505050505050565b600060a082840312156121de57600080fd5b600060208284031215614daf57600080fd5b813567ffffffffffffffff811115614dc657600080fd5b612c6c84828501614d8b565b600082601f830112614de357600080fd5b81356020614df3614cb083614bec565b82815260069290921b84018101918181019086841115614e1257600080fd5b8286015b84811015614e635760408189031215614e2f5760008081fd5b614e37614b33565b8135614e4281614a18565b815281850135614e5181614a18565b81860152835291830191604001614e16565b509695505050505050565b60008060408385031215614e8157600080fd5b823567ffffffffffffffff80821115614e9957600080fd5b614ea586838701614dd2565b93506020850135915080821115614ebb57600080fd5b50614ec885828601614dd2565b9150509250929050565b60008060408385031215614ee557600080fd5b8235614ef081614a18565b91506020830135614f0081614a18565b809150509250929050565b80516001600160a01b031682526020810151614f2d602084018261ffff169052565b506040810151614f45604084018263ffffffff169052565b506060810151614f5b606084018261ffff169052565b506080810151614f73608084018263ffffffff169052565b5060a0810151614f8960a084018261ffff169052565b5060c0810151614f9f60c084018261ffff169052565b5060e0810151614fba60e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff8116848301526128e3565b61014081016111408284614f0b565b803561ffff81168114614a3857600080fd5b6000602080838503121561501a57600080fd5b823567ffffffffffffffff81111561503157600080fd5b8301601f8101851361504257600080fd5b8035615050614cb082614bec565b81815260079190911b8201830190838101908783111561506f57600080fd5b928401925b828410156150e9576080848903121561508d5760008081fd5b615095614b56565b84356150a081614a18565b81526150ad858701614ff5565b868201526040808601356150c081614c10565b908201526060858101356150d381614c10565b9082015282526080939093019290840190615074565b979650505050505050565b6000806020838503121561510757600080fd5b823567ffffffffffffffff8082111561511f57600080fd5b818501915085601f83011261513357600080fd5b81358181111561514257600080fd5b8660208260061b850101111561515757600080fd5b60209290920196919550909350505050565b60008060006060848603121561517e57600080fd5b833567ffffffffffffffff81111561519557600080fd5b6151a186828701614d8b565b9350506020840135915060408401356151b981614a18565b809150509250925092565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015161ffff1683880152604090960195908201906001016151d8565b509495945050505050565b60408152600061522a60408301856151c4565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614a3857600080fd5b60006060828403121561526b57600080fd5b6040516060810181811067ffffffffffffffff8211171561528e5761528e614adb565b604052823561529c81614c4e565b81526152aa60208401615239565b60208201526152bb60408401615239565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156153085783516001600160a01b0316835292840192918401916001016152e3565b50909695505050505050565b6000610140828403121561532757600080fd5b61532f614b79565b61533883614a2d565b815261534660208401614ff5565b602082015261535760408401614c22565b604082015261536860608401614ff5565b606082015261537960808401614c22565b608082015261538a60a08401614ff5565b60a082015261539b60c08401614ff5565b60c08201526153ac60e08401614a2d565b60e08201526101006153bf818501614c22565b908201526101206153d1848201614c22565b908201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261541157600080fd5b83018035915067ffffffffffffffff82111561542c57600080fd5b60200191503681900382131561395c57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261547657600080fd5b83018035915067ffffffffffffffff82111561549157600080fd5b6020019150600681901b360382131561395c57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614a3857600080fd5b600080604083850312156154e857600080fd5b6154f1836154a9565b91506154ff602084016154a9565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761114057611140615508565b8082018082111561114057611140615508565b600082615597577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561490257614902615508565b6000602082840312156155cf57600080fd5b5051919050565b6000604082840312156155e857600080fd5b6155f0614b33565b82356155fb81614a18565b815261560960208401614ff5565b60208201529392505050565b60006020828403121561562757600080fd5b815161151281614c2d565b60006020828403121561564457600080fd5b815161151281614c4e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612c6c60208301848661564f565b6000602082840312156156be57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361572557615725615508565b5060010190565b60006040828403121561573e57600080fd5b615746614b33565b823561575181614a18565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561490257614902615508565b600067ffffffffffffffff8083168181036157a8576157a8615508565b6001019392505050565b6001600160a01b038716815260a0602082015260006157d560a08301878961564f565b85604084015267ffffffffffffffff8516606084015282810360808401526157fd8185614a7e565b9998505050505050505050565b60006020828403121561581c57600080fd5b815167ffffffffffffffff8082111561583457600080fd5b818401915084601f83011261584857600080fd5b81518181111561585a5761585a614adb565b61588b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b9d565b91508082528560208285010111156158a257600080fd5b6158b3816020840160208601614a5a565b50949350505050565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015183880152604090960195908201906001016158d0565b600081518084526020808501808196508360051b8101915082860160005b85811015615948578284038952615936848351614a7e565b9885019893509084019060010161591e565b5091979650505050505050565b6020815261597060208201835167ffffffffffffffff169052565b6000602083015161598c60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a08301516159d560c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615a08818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615a366101c0860184614a7e565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a7585846158bc565b945080880151925050610180818786030181880152615a948584615900565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015163ffffffff90811688870152868201518116878701526060808301519091169086015260808082015167ffffffffffffffff169086015260a080820151615b578288018267ffffffffffffffff169052565b505060c09081015115159085015260e09093019290850190600101615aea565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615bb75780818660040360031b1b83161692505b505092915050565b60008085851115615bcf57600080fd5b83861115615bdc57600080fd5b5050820193919092039150565b600060208284031215615bfb57600080fd5b6040516020810181811067ffffffffffffffff82111715615c1e57615c1e614adb565b6040529135825250919050565b600060208284031215615c3d57600080fd5b611512826154a9565b63ffffffff81811683821601908082111561490257614902615508565b600060208284031215615c7557600080fd5b815161151281614a18565b8181038181111561114057611140615508565b818103600083128015838313168383128216171561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff90811687870152606091820151169085015260809093019290850190600101615cd0565b600081615d2f57615d2f615508565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612c6c60408301846151c4565b600060408284031215615d8657600080fd5b615d8e614b33565b615d97836154a9565b8152602083015161560981614c10565b60208152600061151260208301846158bc565b6020815260006115126020830184615900565b6102208101615e4a82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61151260e0830184614f0b565b60008251615e69818460208701614a5a565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"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\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"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\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"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\":[],\"name\":\"TokenPoolMismatch\",\"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\":\"contractIERC20\",\"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\":[{\"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\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"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\":\"structEVM2EVMOnRamp.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\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"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\":[{\"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\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"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\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"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\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"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\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.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\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"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: "0x6101806040523480156200001257600080fd5b50604051620083a9380380620083a9833981016040819052620000359162001e40565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c0826200077f565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b505050505050506200241a565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062002015565b60405180910390a150565b60005b81518110156200074d57600082828151811062000669576200066962002095565b60209081029190910181015160408051608080820183528385015163ffffffff9081168352838501516001600160401b03908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d90985294909620925183549451925195511515600160a01b0260ff60a01b199688166c010000000000000000000000000296909616600160601b600160a81b031993909716640100000000026001600160601b0319909516911617929092179190911692909217179055506200074581620020c1565b905062000648565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e816040516200063a9190620020dd565b60005b8151811015620008b3576000828281518110620007a357620007a362002095565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e909952959097209351845491519651975193518316600160701b0263ffffffff60701b199484166a01000000000000000000000263ffffffff60501b199990971668010000000000000000029890981665ffffffffffff60401b19978416640100000000026001600160401b03199093169190931617179490941693909317919091179190911691909117905550620008ab81620020c1565b905062000782565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e9816040516200063a91906200216c565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021f3565b60079062001025565b509050620009a860078262001043565b505080620009b69062002209565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002095565b6020026020010151600001519050600085838151811062000a085762000a0862002095565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002223565b935050508062000a9e90620020c1565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002243565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002095565b6020026020010151600001519050600084838151811062000b585762000b5862002095565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c4390620020c1565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002095565b6020026020010151600001519050600083838151811062000c955762000c9562002095565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f9190620022b0565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e0590620020c1565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022d0565b62000f5b9190620022ea565b905062000f6981876200230d565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe490620020c1565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001172919062002330565b6200117e91906200234a565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200236d565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002095565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021f3565b8554909150600090620014b290600190620021f3565b90508181146200151e576000866000018281548110620014d657620014d662002095565b9060005260206000200154905080876000018481548110620014fc57620014fc62002095565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200153257620015326200238b565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023c7565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023e5565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b60405160a081016001600160401b03811182821017156200179857620017986200175d565b60405160c081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200185e576200185e6200175d565b604052919050565b6001600160a01b03811681146200187c57600080fd5b50565b80516200188c8162001866565b919050565b80516001600160401b03811681146200188c57600080fd5b600060e08284031215620018bc57600080fd5b620018c662001773565b90508151620018d58162001866565b8152620018e56020830162001891565b6020820152620018f86040830162001891565b60408201526200190b6060830162001891565b606082015260808201516001600160601b03811681146200192b57600080fd5b60808201526200193e60a083016200187f565b60a08201526200195160c083016200187f565b60c082015292915050565b805161ffff811681146200188c57600080fd5b805163ffffffff811681146200188c57600080fd5b600061014082840312156200199857600080fd5b620019a26200179e565b9050620019af826200187f565b8152620019bf602083016200195c565b6020820152620019d2604083016200196f565b6040820152620019e5606083016200195c565b6060820152620019f8608083016200196f565b608082015262001a0b60a083016200195c565b60a082015262001a1e60c083016200195c565b60c082015262001a3160e083016200187f565b60e082015261010062001a468184016200196f565b9082015261012062001a5a8382016200196f565b9082015292915050565b60006001600160401b0382111562001a805762001a806200175d565b5060051b60200190565b600082601f83011262001a9c57600080fd5b8151602062001ab562001aaf8362001a64565b62001833565b82815260069290921b8401810191818101908684111562001ad557600080fd5b8286015b8481101562001b2f576040818903121562001af45760008081fd5b62001afe620017c4565b815162001b0b8162001866565b81528185015162001b1c8162001866565b8186015283529183019160400162001ad9565b509695505050505050565b805180151581146200188c57600080fd5b80516001600160801b03811681146200188c57600080fd5b60006060828403121562001b7657600080fd5b604051606081016001600160401b038111828210171562001b9b5762001b9b6200175d565b60405290508062001bac8362001b3a565b815262001bbc6020840162001b4b565b602082015262001bcf6040840162001b4b565b60408201525092915050565b600082601f83011262001bed57600080fd5b8151602062001c0062001aaf8362001a64565b82815260a0928302850182019282820191908785111562001c2057600080fd5b8387015b8581101562001caf5781818a03121562001c3e5760008081fd5b62001c48620017e9565b815162001c558162001866565b815262001c648287016200196f565b86820152604062001c7781840162001891565b90820152606062001c8a83820162001891565b90820152608062001c9d83820162001b3a565b90820152845292840192810162001c24565b5090979650505050505050565b600082601f83011262001cce57600080fd5b8151602062001ce162001aaf8362001a64565b82815260c0928302850182019282820191908785111562001d0157600080fd5b8387015b8581101562001caf5781818a03121562001d1f5760008081fd5b62001d296200180e565b815162001d368162001866565b815262001d458287016200196f565b86820152604062001d588184016200196f565b90820152606062001d6b8382016200195c565b90820152608062001d7e8382016200196f565b9082015260a062001d918382016200196f565b90820152845292840192810162001d05565b600082601f83011262001db557600080fd5b8151602062001dc862001aaf8362001a64565b82815260069290921b8401810191818101908684111562001de857600080fd5b8286015b8481101562001b2f576040818903121562001e075760008081fd5b62001e11620017c4565b815162001e1e8162001866565b815262001e2d8286016200195c565b8186015283529183019160400162001dec565b6000806000806000806000610300888a03121562001e5d57600080fd5b62001e698989620018a9565b965062001e7a8960e08a0162001984565b6102208901519096506001600160401b038082111562001e9957600080fd5b62001ea78b838c0162001a8a565b965062001eb98b6102408c0162001b63565b95506102a08a015191508082111562001ed157600080fd5b62001edf8b838c0162001bdb565b94506102c08a015191508082111562001ef757600080fd5b62001f058b838c0162001cbc565b93506102e08a015191508082111562001f1d57600080fd5b5062001f2c8a828b0162001da3565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f5e602084018261ffff169052565b50604081015162001f77604084018263ffffffff169052565b50606081015162001f8e606084018261ffff169052565b50608081015162001fa7608084018263ffffffff169052565b5060a081015162001fbe60a084018261ffff169052565b5060c081015162001fd560c084018261ffff169052565b5060e081015162001ff160e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f3b565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020d657620020d6620020ab565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff1687860152858101516001600160401b03908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101620020fa565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200215f57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c0909301929085019060010162002189565b818103818111156200101f576200101f620020ab565b6000816200221b576200221b620020ab565b506000190190565b63ffffffff818116838216019080821115620015795762001579620020ab565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b81811015620022a257845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200226e565b509098975050505050505050565b600060208284031215620022c357600080fd5b81516200105a8162001866565b80820281158282048414176200101f576200101f620020ab565b6000826200230857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b03828116828216039080821115620015795762001579620020ab565b6000602082840312156200234357600080fd5b5051919050565b8181036000831280158383131683831282161715620015795762001579620020ab565b6000602082840312156200238057600080fd5b6200105a8262001b3a565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023be578181015183820152602001620023a4565b50506000910152565b60008251620023db818460208701620023a1565b9190910192915050565b602081526000825180602084015262002406816040850160208701620023a1565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615e8862002521600039600081816103340152818161147a0152613cf10152600081816103050152818161139c01528181611404015281816119e301528181611a4b0152613cc201526000818161027101528181610b1c01528181611de00152613c2e01526000818161024101528181611b160152613bfe01526000818161021201528181610eeb0152818161178e0152818161188f0152818161231101528181612f24015281816131840152613bcf0152600081816102d10152818161195b0152613c8e0152600081816102a10152818161248f0152613c5e01526000611ea80152615e886000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379ba5097116100f9578063c92b283211610097578063e687b40a11610071578063e687b40a1461092b578063eff7cc481461093e578063f25561fd14610946578063f2fde38b1461095957600080fd5b8063c92b2832146108fb578063d09dc3391461090e578063d3c7c2c71461091657600080fd5b80638da5cb5b116100d35780638da5cb5b146107bc5780639a113c36146107cd578063a7d3e02f146108d2578063b06d41bc146108e557600080fd5b806379ba50971461078e5780637ec7575114610796578063856c8247146107a957600080fd5b8063549e946f116101665780635d86f141116101405780635d86f141146105e6578063704b6c02146105f95780637437ff9f1461060c57806376f6ae761461077b57600080fd5b8063549e946f1461058e57806354b71468146105a1578063599f6431146105c157600080fd5b806338724a95116101a257806338724a95146104d35780633a87ac53146104f45780634120fccd14610509578063546719cd1461052a57600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a771461048a575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161037191906149a5565b60405180910390f35b61043c610388366004614a46565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000090920416608082015290565b6040516103719190815163ffffffff908116825260208084015182169083015260408084015161ffff1690830152606080840151821690830152608092830151169181019190915260a00190565b6104c66040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614ad1565b6104e66104e1366004614af6565b61096c565b604051908152602001610371565b610507610502366004614d01565b610d92565b005b610511610da8565b60405167ffffffffffffffff9091168152602001610371565b610532610ddc565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61050761059c366004614d65565b610e8c565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b6105ce6105f4366004614a46565b611041565b610507610607366004614a46565b6110a0565b61076e6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614e79565b610507610789366004614e88565b61116a565b610507611222565b6105076107a4366004614f2c565b611305565b6105116107b7366004614a46565b61136e565b6000546001600160a01b03166105ce565b6108886107db366004614a46565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600d60209081526040918290208251608081018452905463ffffffff8116825267ffffffffffffffff64010000000082048116938301939093526c0100000000000000000000000081049092169281019290925260ff74010000000000000000000000000000000000000000909104161515606082015290565b60408051825163ffffffff16815260208084015167ffffffffffffffff90811691830191909152838301511691810191909152606091820151151591810191909152608001610371565b6104e66108e036600461503c565b611476565b6108ed611f1a565b6040516103719291906150ea565b61050761090936600461513a565b61201e565b6104e6612086565b61091e612090565b60405161037191906151a8565b6105076109393660046151f5565b612141565b610507612152565b6105076109543660046152d3565b6123e9565b610507610967366004614a46565b61244f565b60008061098461097f60808501856153c6565b612460565b90506109af61099660208501856153c6565b83519091506109a8604087018761542b565b9050612554565b6000600d816109c46080870160608801614a46565b6001600160a01b0316815260208082019290925260409081016000208151608081018352905463ffffffff81168252640100000000810467ffffffffffffffff908116948301949094526c010000000000000000000000008104909316918101919091527401000000000000000000000000000000000000000090910460ff16151560608201819052909150610aa757610a646080850160608601614a46565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610ad56080890160608a01614a46565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610b60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8491906154bf565b9092509050806000808080610b9c60408c018c61542b565b90501115610bd657610bca610bb760808c0160608d01614a46565b87610bc560408e018e61542b565b61267d565b91945092509050610bf2565b8651610bef9063ffffffff16662386f26fc10000615521565b92505b6040870151610c0b9067ffffffffffffffff1684615521565b60208881015160055492955060009267ffffffffffffffff9091169163ffffffff8616917a010000000000000000000000000000000000000000000000000000900461ffff1690610c5e908f018f6153c6565b610c69929150615521565b6005548c51610c9891760100000000000000000000000000000000000000000000900463ffffffff1690615538565b610ca29190615538565b610cac9190615538565b610cb69190615521565b610cd0906dffffffffffffffffffffffffffff8716615521565b60065490915060009062010000900461ffff1615610d44576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610d40818e8060200190610d2691906153c6565b90508f8060400190610d38919061542b565b905087612987565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610d6e8488615538565b610d789190615538565b610d82919061554b565b9c9b505050505050505050505050565b610d9a612a59565b610da48282612acf565b5050565b601054600090610dd790700100000000000000000000000000000000900467ffffffffffffffff166001615586565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610dd790612e2f565b6000546001600160a01b03163314801590610eb257506002546001600160a01b03163314155b15610ee9576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610f3057506001600160a01b038116155b15610f67576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610f71612ee1565b1215610fa9576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610da49082906001600160a01b038516906370a0823190602401602060405180830381865afa15801561100c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103091906155a7565b6001600160a01b0385169190612fa1565b600061104e600a83613021565b61108f576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b61109a600a83613036565b92915050565b6000546001600160a01b031633148015906110c657506002546001600160a01b03163314155b156110fd576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061119057506002546001600160a01b03163314155b156111c7576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610da48282808060200260200160405190810160405280939291908181526020016000905b8282101561121857611209604083028601368190038101906155c0565b815260200190600101906111ec565b505050505061304b565b6001546001600160a01b03163314611296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610a9e565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000546001600160a01b0316331480159061132b57506002546001600160a01b03163314155b15611362576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b816132be565b50565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff16801580156113c757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b1561109a576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa15801561144b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146f91906155ff565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa919061561c565b15611531576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611571576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b031633146115b5576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115bf84806153c6565b9050602014611606576115d284806153c6565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610a9e929190615682565b600061161285806153c6565b81019061161f9190615696565b90506001600160a01b038111806116365750600a81105b15611645576115d285806153c6565b600061165761097f60808801886153c6565b5190506000611669604088018861542b565b9150611686905061167d60208901896153c6565b90508383612554565b80156117845760005b81811015611707576116a4604089018961542b565b828181106116b4576116b46156af565b905060400201602001356000036116f7576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611700816156de565b905061168f565b50611784611718604089018961542b565b808060200260200160405190810160405280939291908181526020016000905b828210156117645761175560408302860136819003810190615716565b81526020019060010190611738565b505060065464010000000090046001600160a01b03169250613484915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166117be6080890160608a01614a46565b6001600160a01b03160361182257601080548791906000906117ef9084906bffffffffffffffffffffffff16615750565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611949565b60065464010000000090046001600160a01b03166241e5be61184a60808a0160608b01614a46565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156118d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fa91906155a7565b6010805460009061191a9084906bffffffffffffffffffffffff16615750565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156119b6576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611a0e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611b06576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611a92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab691906155ff565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611b8390615775565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611be29116615775565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611c1760808b0160608c01614a46565b6001600160a01b03168152602001888152602001898060200190611c3b91906153c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611c8260408b018b61542b565b808060200260200160405190810160405280939291908181526020016000905b82821015611cce57611cbf60408302860136819003810190615716565b81526020019060010190611ca2565b505050505081526020018367ffffffffffffffff811115611cf157611cf1614b2b565b604051908082528060200260200182016040528015611d2457816020015b6060815260200190600190039081611d0f5790505b508152600060209091018190529091505b82811015611ea1576000611d4c60408b018b61542b565b83818110611d5c57611d5c6156af565b905060400201803603810190611d729190615716565b9050611d818160000151611041565b6001600160a01b0316639687544589611d9a8d806153c6565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611e08959493927f00000000000000000000000000000000000000000000000000000000000000009160040161579c565b6000604051808303816000875af1158015611e27573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e6d91908101906157f4565b8361016001518381518110611e8457611e846156af565b60200260200101819052505080611e9a906156de565b9050611d35565b50611ecc817f000000000000000000000000000000000000000000000000000000000000000061363f565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611f0290839061593f565b60405180910390a16101800151979650505050505050565b6060600080611f2960076137b8565b90508067ffffffffffffffff811115611f4457611f44614b2b565b604051908082528060200260200182016040528015611f8957816020015b6040805180820190915260008082526020820152815260200190600190039081611f625790505b50925060005b81811015611ffb57600080611fa56007846137c3565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110611fdd57611fdd6156af565b6020026020010181905250505080611ff4906156de565b9050611f8f565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b0316331480159061204457506002546001600160a01b03163314155b1561207b576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b6003826137e1565b6000610dd7612ee1565b6060600061209e600a6139b9565b67ffffffffffffffff8111156120b6576120b6614b2b565b6040519080825280602002602001820160405280156120df578160200160208202803683370190505b50905060005b815181101561213b576120f9600a826139c4565b5082828151811061210c5761210c6156af565b60200260200101816001600160a01b03166001600160a01b03168152505080612134906156de565b90506120e5565b50919050565b612149612a59565b61136b816139d3565b6000546001600160a01b0316331480159061217857506002546001600160a01b03163314155b801561218c575061218a600733613d2b565b155b156121c3576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff166000819003612217576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612262576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061226c612ee1565b12156122a4576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006122b160076137b8565b905060005b818110156123a6576000806122cc6007846137c3565b90925090506000876122ec836bffffffffffffffffffffffff8a16615521565b6122f6919061554b565b90506123028187615a92565b95506123466001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff8416612fa1565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508061239f906156de565b90506122b6565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b6000546001600160a01b0316331480159061240f57506002546001600160a01b03163314155b15612446576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61136b81613d40565b612457612a59565b61136b81613ecb565b60408051602081019091526000815260008290036124b65750604080516020810190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815261109a565b7f97a657c9000000000000000000000000000000000000000000000000000000006124e18385615ab7565b7fffffffff00000000000000000000000000000000000000000000000000000000161461253a576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125478260048186615aff565b81019061146f9190615b29565b6006547801000000000000000000000000000000000000000000000000900463ffffffff16808411156125bd576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610a9e565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683111561261f576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff16821115612677576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808083815b8181101561297b5760008787838181106126a0576126a06156af565b9050604002018036038101906126b69190615716565b80516001600160a01b03166000908152600e6020908152604091829020825160a081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e010000000000000000000000000000909204811660808301528251929350909161275391600a919061302116565b6127975781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a9e565b604081015160009061ffff16156128bb5760008c6001600160a01b031684600001516001600160a01b03161461285e5760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128579190615b6b565b9050612861565b508a5b620186a0836040015161ffff166128a38660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613fa690919063ffffffff16565b6128ad9190615521565b6128b7919061554b565b9150505b60608201516128ca9088615b86565b96508160800151866128dc9190615b86565b82519096506000906128fb9063ffffffff16662386f26fc10000615521565b90508082101561291a5761290f818a615538565b98505050505061296b565b6000836020015163ffffffff16662386f26fc100006129399190615521565b9050808311156129595761294d818b615538565b9950505050505061296b565b612963838b615538565b995050505050505b612974816156de565b9050612684565b50509450945094915050565b60008063ffffffff831661299c608086615521565b6129a887610220615538565b6129b29190615538565b6129bc9190615538565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff16906129fe9061ffff1684615521565b612a089190615538565b60065490915062010000900461ffff16612a326dffffffffffffffffffffffffffff891683615521565b612a3c9190615521565b612a4c90655af3107a4000615521565b925050505b949350505050565b6000546001600160a01b03163314612acd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610a9e565b565b60005b8251811015612c30576000838281518110612aef57612aef6156af565b60200260200101516000015190506000848381518110612b1157612b116156af565b6020026020010151602001519050612b3382600a61302190919063ffffffff16565b612b74576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b6001600160a01b038116612b89600a84613036565b6001600160a01b031614612bc9576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bd4600a83613fe3565b15612c1d57604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612c29906156de565b9050612ad2565b5060005b8151811015612e2a576000828281518110612c5157612c516156af565b60200260200101516000015190506000838381518110612c7357612c736156af565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612ca957506001600160a01b038116155b15612ce0576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d429190615ba3565b6001600160a01b0316826001600160a01b031614612d8c576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d98600a8383613ff8565b15612de557604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1612e17565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612e23906156de565b9050612c34565b505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152612ebd82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642612ea19190615bc0565b85608001516fffffffffffffffffffffffffffffffff1661400e565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9791906155a7565b610dd79190615bd3565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612e2a908490614036565b600061146f836001600160a01b038416614135565b600061146f836001600160a01b038416614141565b80516040811115613088576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16158015906130d6575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b156130e3576130e3612152565b60006130ef60076137b8565b90505b8015613131576000613110613108600184615bc0565b6007906137c3565b50905061311e60078261414d565b50508061312a90615bf3565b90506130f2565b506000805b8281101561323f576000848281518110613152576131526156af565b60200260200101516000015190506000858381518110613174576131746156af565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806131c957506001600160a01b038216155b1561320b576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610a9e565b61321b60078361ffff8416614162565b5061322a61ffff821685615b86565b9350505080613238906156de565b9050613136565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906132b19083908690615c28565b60405180910390a1505050565b60005b81518110156134545760008282815181106132de576132de6156af565b6020908102919091018101516040805160a080820183528385015163ffffffff908116835283850151811683870190815260608087015161ffff9081168688019081526080808a0151861693880193845295890151851695870195865297516001600160a01b03166000908152600e9099529590972093518454915196519751935183166e010000000000000000000000000000027fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff9484166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff999097166801000000000000000002989098167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff978416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909316919093161717949094169390931791909117919091169190911790555061344d816156de565b90506132c1565b507f555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e98160405161115f9190615c47565b81516000805b82811015613631576000846001600160a01b031663d02641a08784815181106134b5576134b56156af565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561351c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135409190615ccc565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036135c55785828151811061357b5761357b6156af565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610a9e565b6136138683815181106135da576135da6156af565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613fa690919063ffffffff16565b61361d9084615538565b9250508061362a906156de565b905061348a565b506126776003826000614178565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016136d59897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161370e9190615cff565b6040516020818303038152906040528051906020012087610160015160405160200161373a9190615d12565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b600061109a826144c7565b60008080806137d286866144d2565b909450925050505b9250929050565b815460009061380a90700100000000000000000000000000000000900463ffffffff1642615bc0565b905080156138ac5760018301548354613852916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661400e565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546138d2916fffffffffffffffffffffffffffffffff90811691166144fd565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906132b19084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b600061109a826137b8565b60008080806137d286866137c3565b60e08101516001600160a01b0316613a17576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152508260405161115f929190615d25565b600061146f836001600160a01b038416614513565b60005b8151811015613e9b576000828281518110613d6057613d606156af565b60209081029190910181015160408051608080820183528385015163ffffffff90811683528385015167ffffffffffffffff908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600d9098529490962092518354945192519551151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9688166c0100000000000000000000000002969096167fffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff93909716640100000000027fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090951691161792909217919091169290921717905550613e94816156de565b9050613d43565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e8160405161115f9190615daf565b336001600160a01b03821603613f3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a9e565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613fd9837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615521565b61146f919061554b565b600061146f836001600160a01b03841661451f565b6000612a51846001600160a01b0385168461452b565b600061402d8561401e8486615521565b6140289087615538565b6144fd565b95945050505050565b600061408b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145419092919063ffffffff16565b805190915015612e2a57808060200190518101906140a9919061561c565b612e2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610a9e565b600061146f8383614513565b600061146f8383614550565b600061146f836001600160a01b0384166145da565b6000612a51846001600160a01b038516846145f7565b825474010000000000000000000000000000000000000000900460ff16158061419f575081155b156141a957505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906141ef90700100000000000000000000000000000000900463ffffffff1642615bc0565b905080156142af5781831115614231576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461426b9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661400e565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b8482101561434c576001600160a01b038416614301576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610a9e565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610a9e565b848310156144455760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906143909082615bc0565b61439a878a615bc0565b6143a49190615538565b6143ae919061554b565b90506001600160a01b0386166143fa576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610a9e565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610a9e565b61444f8584615bc0565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600061109a82614614565b600080806144e0858561461e565b600081815260029690960160205260409095205494959350505050565b600081831061450c578161146f565b5090919050565b600061146f838361462a565b600061146f83836145da565b6000612a5184846001600160a01b0385166145f7565b6060612a518484600085614642565b60008181526002830160205260408120548015158061457457506145748484614513565b61146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610a9e565b6000818152600283016020526040812081905561146f8383614743565b60008281526002840160205260408120829055612a51848461474f565b600061109a825490565b600061146f838361475b565b6000818152600183016020526040812054151561146f565b6060824710156146d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610a9e565b600080866001600160a01b031685876040516146f09190615e30565b60006040518083038185875af1925050503d806000811461472d576040519150601f19603f3d011682016040523d82523d6000602084013e614732565b606091505b5091509150612a4c87838387614785565b600061146f8383614818565b600061146f8383614912565b6000826000018281548110614772576147726156af565b9060005260206000200154905092915050565b6060831561480e578251600003614807576001600160a01b0385163b614807576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a9e565b5081612a51565b612a518383614961565b6000818152600183016020526040812054801561490157600061483c600183615bc0565b855490915060009061485090600190615bc0565b90508181146148b5576000866000018281548110614870576148706156af565b9060005260206000200154905080876000018481548110614893576148936156af565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806148c6576148c6615e4c565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061109a565b600091505061109a565b5092915050565b60008181526001830160205260408120546149595750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561109a565b50600061109a565b8151156149715781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e9190614ad1565b60e0810161109a82846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b038116811461136b57600080fd5b8035614a4181614a21565b919050565b600060208284031215614a5857600080fd5b813561146f81614a21565b60005b83811015614a7e578181015183820152602001614a66565b50506000910152565b60008151808452614a9f816020860160208601614a63565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061146f6020830184614a87565b600060a0828403121561213b57600080fd5b600060208284031215614b0857600080fd5b813567ffffffffffffffff811115614b1f57600080fd5b612a5184828501614ae4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715614b7d57614b7d614b2b565b60405290565b60405160c0810167ffffffffffffffff81118282101715614b7d57614b7d614b2b565b604051610140810167ffffffffffffffff81118282101715614b7d57614b7d614b2b565b60405160a0810167ffffffffffffffff81118282101715614b7d57614b7d614b2b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614c3457614c34614b2b565b604052919050565b600067ffffffffffffffff821115614c5657614c56614b2b565b5060051b60200190565b600082601f830112614c7157600080fd5b81356020614c86614c8183614c3c565b614bed565b82815260069290921b84018101918181019086841115614ca557600080fd5b8286015b84811015614cf65760408189031215614cc25760008081fd5b614cca614b5a565b8135614cd581614a21565b815281850135614ce481614a21565b81860152835291830191604001614ca9565b509695505050505050565b60008060408385031215614d1457600080fd5b823567ffffffffffffffff80821115614d2c57600080fd5b614d3886838701614c60565b93506020850135915080821115614d4e57600080fd5b50614d5b85828601614c60565b9150509250929050565b60008060408385031215614d7857600080fd5b8235614d8381614a21565b91506020830135614d9381614a21565b809150509250929050565b80516001600160a01b031682526020810151614dc0602084018261ffff169052565b506040810151614dd8604084018263ffffffff169052565b506060810151614dee606084018261ffff169052565b506080810151614e06608084018263ffffffff169052565b5060a0810151614e1c60a084018261ffff169052565b5060c0810151614e3260c084018261ffff169052565b5060e0810151614e4d60e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff811684830152612677565b610140810161109a8284614d9e565b60008060208385031215614e9b57600080fd5b823567ffffffffffffffff80821115614eb357600080fd5b818501915085601f830112614ec757600080fd5b813581811115614ed657600080fd5b8660208260061b8501011115614eeb57600080fd5b60209290920196919550909350505050565b63ffffffff8116811461136b57600080fd5b8035614a4181614efd565b803561ffff81168114614a4157600080fd5b60006020808385031215614f3f57600080fd5b823567ffffffffffffffff811115614f5657600080fd5b8301601f81018513614f6757600080fd5b8035614f75614c8182614c3c565b81815260c09182028301840191848201919088841115614f9457600080fd5b938501935b838510156150305780858a031215614fb15760008081fd5b614fb9614b83565b8535614fc481614a21565b815285870135614fd381614efd565b81880152604086810135614fe681614efd565b908201526060614ff7878201614f1a565b9082015260808681013561500a81614efd565b9082015260a08681013561501d81614efd565b9082015283529384019391850191614f99565b50979650505050505050565b60008060006060848603121561505157600080fd5b833567ffffffffffffffff81111561506857600080fd5b61507486828701614ae4565b93505060208401359150604084013561508c81614a21565b809150509250925092565b600081518084526020808501945080840160005b838110156150df57815180516001600160a01b0316885283015161ffff1683880152604090960195908201906001016150ab565b509495945050505050565b6040815260006150fd6040830185615097565b90508260208301529392505050565b801515811461136b57600080fd5b80356fffffffffffffffffffffffffffffffff81168114614a4157600080fd5b60006060828403121561514c57600080fd5b6040516060810181811067ffffffffffffffff8211171561516f5761516f614b2b565b604052823561517d8161510c565b815261518b6020840161511a565b602082015261519c6040840161511a565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156151e95783516001600160a01b0316835292840192918401916001016151c4565b50909695505050505050565b6000610140828403121561520857600080fd5b615210614ba6565b61521983614a36565b815261522760208401614f1a565b602082015261523860408401614f0f565b604082015261524960608401614f1a565b606082015261525a60808401614f0f565b608082015261526b60a08401614f1a565b60a082015261527c60c08401614f1a565b60c082015261528d60e08401614a36565b60e08201526101006152a0818501614f0f565b908201526101206152b2848201614f0f565b908201529392505050565b67ffffffffffffffff8116811461136b57600080fd5b600060208083850312156152e657600080fd5b823567ffffffffffffffff8111156152fd57600080fd5b8301601f8101851361530e57600080fd5b803561531c614c8182614c3c565b81815260a0918202830184019184820191908884111561533b57600080fd5b938501935b838510156150305780858a0312156153585760008081fd5b615360614bca565b853561536b81614a21565b81528587013561537a81614efd565b8188015260408681013561538d816152bd565b908201526060868101356153a0816152bd565b908201526080868101356153b38161510c565b9082015283529384019391850191615340565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126153fb57600080fd5b83018035915067ffffffffffffffff82111561541657600080fd5b6020019150368190038213156137da57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261546057600080fd5b83018035915067ffffffffffffffff82111561547b57600080fd5b6020019150600681901b36038213156137da57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614a4157600080fd5b600080604083850312156154d257600080fd5b6154db83615493565b91506154e960208401615493565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761109a5761109a6154f2565b8082018082111561109a5761109a6154f2565b600082615581577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561490b5761490b6154f2565b6000602082840312156155b957600080fd5b5051919050565b6000604082840312156155d257600080fd5b6155da614b5a565b82356155e581614a21565b81526155f360208401614f1a565b60208201529392505050565b60006020828403121561561157600080fd5b815161146f816152bd565b60006020828403121561562e57600080fd5b815161146f8161510c565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612a51602083018486615639565b6000602082840312156156a857600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361570f5761570f6154f2565b5060010190565b60006040828403121561572857600080fd5b615730614b5a565b823561573b81614a21565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561490b5761490b6154f2565b600067ffffffffffffffff808316818103615792576157926154f2565b6001019392505050565b6001600160a01b038716815260a0602082015260006157bf60a083018789615639565b85604084015267ffffffffffffffff8516606084015282810360808401526157e78185614a87565b9998505050505050505050565b60006020828403121561580657600080fd5b815167ffffffffffffffff8082111561581e57600080fd5b818401915084601f83011261583257600080fd5b81518181111561584457615844614b2b565b61587560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614bed565b915080825285602082850101111561588c57600080fd5b61589d816020840160208601614a63565b50949350505050565b600081518084526020808501945080840160005b838110156150df57815180516001600160a01b0316885283015183880152604090960195908201906001016158ba565b600081518084526020808501808196508360051b8101915082860160005b85811015615932578284038952615920848351614a87565b98850198935090840190600101615908565b5091979650505050505050565b6020815261595a60208201835167ffffffffffffffff169052565b6000602083015161597660408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a08301516159bf60c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e08301516101006159f2818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615a206101c0860184614a87565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a5f85846158a6565b945080880151925050610180818786030181880152615a7e85846158ea565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561490b5761490b6154f2565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615af75780818660040360031b1b83161692505b505092915050565b60008085851115615b0f57600080fd5b83861115615b1c57600080fd5b5050820193919092039150565b600060208284031215615b3b57600080fd5b6040516020810181811067ffffffffffffffff82111715615b5e57615b5e614b2b565b6040529135825250919050565b600060208284031215615b7d57600080fd5b61146f82615493565b63ffffffff81811683821601908082111561490b5761490b6154f2565b600060208284031215615bb557600080fd5b815161146f81614a21565b8181038181111561109a5761109a6154f2565b818103600083128015838313168383128216171561490b5761490b6154f2565b600081615c0257615c026154f2565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612a516040830184615097565b602080825282518282018190526000919060409081850190868401855b8281101561593257815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a091820151169085015260c09093019290850190600101615c64565b600060408284031215615cde57600080fd5b615ce6614b5a565b615cef83615493565b815260208301516155f381614efd565b60208152600061146f60208301846158a6565b60208152600061146f60208301846158ea565b6102208101615da282856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61146f60e0830184614d9e565b602080825282518282018190526000919060409081850190868401855b8281101561593257815180516001600160a01b031685528681015163ffffffff16878601528581015167ffffffffffffffff908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101615dcc565b60008251615e42818460208701614a63565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOnRampABI = EVM2EVMOnRampMetaData.ABI @@ -2171,7 +2171,7 @@ func (EVM2EVMOnRampConfigSet) Topic() common.Hash { } func (EVM2EVMOnRampFeeConfigSet) Topic() common.Hash { - return common.HexToHash("0x2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8") + return common.HexToHash("0x067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e") } func (EVM2EVMOnRampNopPaid) Topic() common.Hash { @@ -2199,7 +2199,7 @@ func (EVM2EVMOnRampPoolRemoved) Topic() common.Hash { } func (EVM2EVMOnRampTokenTransferFeeConfigSet) Topic() common.Hash { - return common.HexToHash("0x3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620") + return common.HexToHash("0x555c74101f7a15746d31c6731170310e667bcc607996b2fc0b981a7b26a416e9") } func (_EVM2EVMOnRamp *EVM2EVMOnRamp) Address() common.Address { 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 a8beb856df..c54dd746b1 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 @@ -7,7 +7,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../.. custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin bfea579e0b5100b6e90c2ea4d1533789ff037104fd03ba590e135772a0cf0997 evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin fe22966f5d97a8f386a4f01f901a308592336ea52c8fd06311f4bf1a961033ad -evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 1c21fbc9b49521a9a783c40b0674297bfcb18a64100dae10173682e38ea199fc +evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 16e8043f787ecb8e0728d48f051583527fbd19fd1e57f0414c427972db92005d lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 7f7a28f55f9fb63669cd8038a7f99e31431acd6d15ddeeb6a77188eb0bf85d58 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 mock_arm_contract: ../../../contracts/solc/v0.8.19/MockARM.abi ../../../contracts/solc/v0.8.19/MockARM.bin efcf4cb260a2b6a6e189639f62bb50ab650a135715c1fcd42c92dfa9d04aa0e3 diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go index 3c135ed0e2..063f22b3c3 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go @@ -343,28 +343,26 @@ func (c *CCIPContracts) DeployNewOnRamp(t *testing.T) { }, []evm_2_evm_onramp.EVM2EVMOnRampFeeTokenConfigArgs{ { - Token: c.Source.LinkToken.Address(), - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: 1e18, - PremiumMultiplier: 9e17, - Enabled: true, + Token: c.Source.LinkToken.Address(), + NetworkFeeUSD: 1_00, + GasMultiplier: 1e18, + PremiumMultiplier: 9e17, + Enabled: true, }, { - Token: c.Source.WrappedNative.Address(), - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: 1e18, - PremiumMultiplier: 1e18, - Enabled: true, + Token: c.Source.WrappedNative.Address(), + NetworkFeeUSD: 1_00, + GasMultiplier: 1e18, + PremiumMultiplier: 1e18, + Enabled: true, }, }, []evm_2_evm_onramp.EVM2EVMOnRampTokenTransferFeeConfigArgs{ { Token: c.Source.LinkToken.Address(), - Ratio: 5_0, // 5 bps + MinFeeUSD: 50, // $0.5 + MaxFeeUSD: 1_000_000_00, // $ 1 million + Ratio: 5_0, // 5 bps DestGasOverhead: 34_000, DestBytesOverhead: 0, }, @@ -1027,28 +1025,26 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh }, []evm_2_evm_onramp.EVM2EVMOnRampFeeTokenConfigArgs{ { - Token: sourceLinkTokenAddress, - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: 1e18, - PremiumMultiplier: 9e17, - Enabled: true, + Token: sourceLinkTokenAddress, + NetworkFeeUSD: 1_00, + GasMultiplier: 1e18, + PremiumMultiplier: 9e17, + Enabled: true, }, { - Token: sourceWeth9addr, - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: 1e18, - PremiumMultiplier: 1e18, - Enabled: true, + Token: sourceWeth9addr, + NetworkFeeUSD: 1_00, + GasMultiplier: 1e18, + PremiumMultiplier: 1e18, + Enabled: true, }, }, []evm_2_evm_onramp.EVM2EVMOnRampTokenTransferFeeConfigArgs{ { Token: sourceLinkTokenAddress, - Ratio: 5_0, // 5 bps + MinFeeUSD: 50, // $0.5 + MaxFeeUSD: 1_000_000_00, // $ 1 million + Ratio: 5_0, // 5 bps DestGasOverhead: 34_000, DestBytesOverhead: 0, }, diff --git a/docs/CHANGELOG_CCIP.md b/docs/CHANGELOG_CCIP.md index 3f9713ac2d..a2bdd09e8e 100644 --- a/docs/CHANGELOG_CCIP.md +++ b/docs/CHANGELOG_CCIP.md @@ -20,6 +20,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `destDataAvailabilityOverheadGas` is the extra data availability gas charged on top of message data. - `destGasPerDataAvailabilityByte` is the amount of gas to charge per byte of data that needs data availability. - `destDataAvailabilityMultiplier` is the multiplier for data availability gas. It is in multiples of 1e-4, or 0.0001. It can represent calldata compression factor on Optimistic Rollups. +- OnRamp token transfer fee calculation updated. + - `minTokenTransferFeeUSD` and `maxTokenTransferFeeUSD` are removed from FeeTokenConfig. + - `minFeeUSD` and `maxFeeUSD` are added to TokenTransferFeeConfig, they will be applied at a per-token level. + - token transfer premium is calculated as the sum of each individual token transfer fee. - MessageId hashing logic updated. - the new `sourceTokenData` field is added to the hash. - fixed-size fields are hashed in nested hash function. diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go index 5a5007fe72..3fe9d640f6 100644 --- a/integration-tests/ccip-tests/actions/ccip_helpers.go +++ b/integration-tests/ccip-tests/actions/ccip_helpers.go @@ -652,7 +652,9 @@ func (sourceCCIP *SourceCCIPModule) DeployContracts(lane *laneconfig.LaneConfig) }) tokenTransferFeeConfig = append(tokenTransferFeeConfig, evm_2_evm_onramp.EVM2EVMOnRampTokenTransferFeeConfigArgs{ Token: token.ContractAddress, - Ratio: 5_0, // 5 bps + MinFeeUSD: 50, // $0.5 + MaxFeeUSD: 1_000_000_00, // $ 1 million + Ratio: 5_0, // 5 bps DestGasOverhead: 34_000, DestBytesOverhead: 0, }) @@ -673,22 +675,18 @@ func (sourceCCIP *SourceCCIPModule) DeployContracts(lane *laneconfig.LaneConfig) sourceCCIP.Common.RateLimiterConfig, []evm_2_evm_onramp.EVM2EVMOnRampFeeTokenConfigArgs{ { - Token: common.HexToAddress(sourceCCIP.Common.FeeToken.Address()), - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: GasFeeMultiplier, - PremiumMultiplier: 1e18, - Enabled: true, + Token: common.HexToAddress(sourceCCIP.Common.FeeToken.Address()), + NetworkFeeUSD: 1_00, + GasMultiplier: GasFeeMultiplier, + PremiumMultiplier: 1e18, + Enabled: true, }, { - Token: sourceCCIP.Common.WrappedNative, - NetworkFeeUSD: 1_00, - MinTokenTransferFeeUSD: 1_00, - MaxTokenTransferFeeUSD: 5000_00, - GasMultiplier: GasFeeMultiplier, - PremiumMultiplier: 1e18, - Enabled: true, + Token: sourceCCIP.Common.WrappedNative, + NetworkFeeUSD: 1_00, + GasMultiplier: GasFeeMultiplier, + PremiumMultiplier: 1e18, + Enabled: true, }, }, tokenTransferFeeConfig,