diff --git a/contracts/.changeset/slow-gorillas-notice.md b/contracts/.changeset/slow-gorillas-notice.md new file mode 100644 index 00000000000..d470fb5832e --- /dev/null +++ b/contracts/.changeset/slow-gorillas-notice.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': patch +--- + +#internal cap max accounts in svm extra args + + +PR issue: CCIP-5111 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 130c747ab21..7754c141eac 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -7,7 +7,7 @@ BurnMintWithLockReleaseFlagTokenPool_lockOrBurn:test_LockOrBurn_CorrectReturnDat BurnToAddressMintTokenPool_lockOrBurn:test_LockOrBurn() (gas: 235440) BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn() (gas: 239012) BurnWithFromMintTokenPool_lockOrBurn:test_Setup() (gas: 24169) -CCIPClientExample_sanity:test_ImmutableExamples() (gas: 2079619) +CCIPClientExample_sanity:test_ImmutableExamples() (gas: 2079575) CCIPHome__validateConfig:test__validateConfig() (gas: 300016) CCIPHome__validateConfig:test__validateConfigLessTransmittersThanSigners() (gas: 332965) CCIPHome__validateConfig:test__validateConfigSmallerFChain() (gas: 459322) @@ -25,7 +25,7 @@ CCIPHome_setCandidate:test_setCandidate() (gas: 1365392) CCIPHome_supportsInterface:test_supportsInterface() (gas: 9885) DefensiveExampleTest:test_HappyPath() (gas: 200535) DefensiveExampleTest:test_Recovery() (gas: 424996) -E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1514547) +E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1514514) ERC165CheckerReverting_supportsInterfaceReverting:test__supportsInterfaceReverting() (gas: 10517) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96964) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49797) @@ -63,12 +63,12 @@ FactoryBurnMintERC20_transfer:test_Transfer() (gas: 42505) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates() (gas: 149279) FeeQuoter_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroInput() (gas: 12515) FeeQuoter_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates() (gas: 162585) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens() (gas: 54881) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken() (gas: 45364) -FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12468) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens() (gas: 54859) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken() (gas: 45342) +FeeQuoter_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12446) FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig() (gas: 88736) FeeQuoter_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13218) -FeeQuoter_constructor:test_Setup() (gas: 5447819) +FeeQuoter_constructor:test_Setup() (gas: 5466278) FeeQuoter_convertTokenAmount:test_ConvertTokenAmount() (gas: 68417) FeeQuoter_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost() (gas: 98860) FeeQuoter_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost() (gas: 21439) @@ -88,11 +88,11 @@ FeeQuoter_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas() (gas FeeQuoter_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas() (gas: 25230) FeeQuoter_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee() (gas: 37788) FeeQuoter_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults() (gas: 26924) -FeeQuoter_getValidatedFee:test_EmptyMessage() (gas: 84896) -FeeQuoter_getValidatedFee:test_HighGasMessage() (gas: 242832) +FeeQuoter_getValidatedFee:test_EmptyMessage() (gas: 84963) +FeeQuoter_getValidatedFee:test_HighGasMessage() (gas: 242854) FeeQuoter_getValidatedFee:test_MessageWithDataAndTokenTransfer() (gas: 143454) FeeQuoter_getValidatedFee:test_SingleTokenMessage() (gas: 114959) -FeeQuoter_getValidatedFee:test_SolChainFamilySelector() (gas: 61180) +FeeQuoter_getValidatedFee:test_SolChainFamilySelector() (gas: 61307) FeeQuoter_getValidatedFee:test_ZeroDataAvailabilityMultiplier() (gas: 66298) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPrice() (gas: 58927) FeeQuoter_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeed() (gas: 65137) @@ -109,20 +109,20 @@ FeeQuoter_onReport:test_onReport() (gas: 88964) FeeQuoter_onReport:test_onReport_withKeystoneForwarderContract() (gas: 122592) FeeQuoter_parseSVMExtraArgsFromBytes:test_SVMExtraArgsV1() (gas: 23255) FeeQuoter_parseSVMExtraArgsFromBytes:test_SVMExtraArgsV1TagSelector() (gas: 3157) -FeeQuoter_processChainFamilySelector:test_processChainFamilySelectorEVM() (gas: 19479) -FeeQuoter_processChainFamilySelector:test_processChainFamilySelectorSVM_NoTokenTransfer() (gas: 22666) -FeeQuoter_processChainFamilySelector:test_processChainFamilySelectorSVM_WithTokenTransfer() (gas: 22655) -FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2() (gas: 29047) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount() (gas: 33060) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData() (gas: 77633) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1() (gas: 28678) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs() (gas: 26538) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount() (gas: 22722) -FeeQuoter_processMessageArgs:test_processMessageArgs_WithSVMExtraArgsV1() (gas: 63617) -FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsDefault() (gas: 17135) -FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV1() (gas: 16202) +FeeQuoter_processChainFamilySelector:test_processChainFamilySelector_EVM() (gas: 19466) +FeeQuoter_processChainFamilySelector:test_processChainFamilySelector_SVM_NoTokenTransfer() (gas: 22476) +FeeQuoter_processChainFamilySelector:test_processChainFamilySelector_SVM_WithTokenTransfer() (gas: 22458) +FeeQuoter_processMessageArgs:test_processMessageArgs_WitEVMExtraArgsV2() (gas: 29014) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithConvertedTokenAmount() (gas: 33049) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithCorrectPoolReturnData() (gas: 77622) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEVMExtraArgsV1() (gas: 28645) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithEmptyEVMExtraArgs() (gas: 26505) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithLinkTokenAmount() (gas: 22711) +FeeQuoter_processMessageArgs:test_processMessageArgs_WithSVMExtraArgsV1() (gas: 63549) +FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsDefault() (gas: 17113) +FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV1() (gas: 16180) FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV1TagSelector() (gas: 3169) -FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV2() (gas: 16328) +FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV2() (gas: 16306) FeeQuoter_resolveGasLimitForDestination:test_EVMExtraArgsV2TagSelector() (gas: 3168) FeeQuoter_supportsInterface:test_SupportsInterface() (gas: 13264) FeeQuoter_updatePrices:test_OnlyGasPrice() (gas: 23934) @@ -211,10 +211,10 @@ NonceManager_getIncrementedOutboundNonce:test_getIncrementedOutboundNonce() (gas NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce() (gas: 38746) NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce_SkippedIncorrectNonce() (gas: 23739) NonceManager_getIncrementedOutboundNonce:test_incrementNoncesInboundAndOutbound() (gas: 71886) -NonceManager_getOutboundNonce:test_getOutboundNonce_Upgrade() (gas: 105945) -NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceNewSenderStartsAtZero() (gas: 168148) -NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceStartsAtV1Nonce() (gas: 198559) -NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeSenderNoncesReadsPreviousRamp() (gas: 146214) +NonceManager_getOutboundNonce:test_getOutboundNonce_Upgrade() (gas: 105912) +NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceNewSenderStartsAtZero() (gas: 168104) +NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceStartsAtV1Nonce() (gas: 198482) +NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeSenderNoncesReadsPreviousRamp() (gas: 146181) OffRampWithMessageTransformer_executeSingleReport:test_executeSingleReport() (gas: 307118) OffRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() (gas: 701222) OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains() (gas: 626140) @@ -285,34 +285,34 @@ OffRamp_trialExecute:test_trialExecute_SenderIsNotGasEstimator_CallWithExactGasR OffRamp_trialExecute:test_trialExecute_TokenHandlingErrorIsCaught() (gas: 131998) OffRamp_trialExecute:test_trialExecute_TokenPoolIsNotAContract() (gas: 286580) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy() (gas: 245211) -OnRampWithMessageTransformer_executeSingleMessage:test_forwardFromRouter() (gas: 122477) +OnRampWithMessageTransformer_executeSingleMessage:test_forwardFromRouter() (gas: 122444) OnRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() (gas: 701204) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates() (gas: 325996) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17190) OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates() (gas: 65874) OnRamp_constructor:test_Constructor() (gas: 2694309) -OnRamp_forwardFromRouter:test_ForwardFromRouter() (gas: 146075) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2() (gas: 146887) -OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue() (gas: 116066) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 146473) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 144729) -OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 146714) -OnRamp_forwardFromRouter:test_ForwardFromRouter_ConfigurableSourceRouter() (gas: 144032) -OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered() (gas: 188546) -OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce() (gas: 214923) -OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 147720) -OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception() (gas: 275420) +OnRamp_forwardFromRouter:test_ForwardFromRouter() (gas: 146042) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2() (gas: 146854) +OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue() (gas: 116033) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 146440) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessEmptyExtraArgs() (gas: 144696) +OnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 146681) +OnRamp_forwardFromRouter:test_ForwardFromRouter_ConfigurableSourceRouter() (gas: 144021) +OnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered() (gas: 188447) +OnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce() (gas: 214824) +OnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 147687) +OnRamp_forwardFromRouter:test_forwardFromRouter_WithInterception() (gas: 275387) OnRamp_getFee:test_EmptyMessage() (gas: 100129) -OnRamp_getFee:test_GetFeeOfZeroForTokenMessage() (gas: 89370) +OnRamp_getFee:test_GetFeeOfZeroForTokenMessage() (gas: 89348) OnRamp_getFee:test_SingleTokenMessage() (gas: 115447) OnRamp_getTokenPool:test_GetTokenPool() (gas: 35404) OnRamp_setDynamicConfig:test_setDynamicConfig() (gas: 56650) OnRamp_withdrawFeeTokens:test_WithdrawFeeTokens() (gas: 125835) -PingPong_ccipReceive:test_CcipReceive() (gas: 167476) +PingPong_ccipReceive:test_CcipReceive() (gas: 167465) PingPong_setOutOfOrderExecution:test_OutOfOrderExecution() (gas: 20284) PingPong_setPaused:test_Pausing() (gas: 17760) -PingPong_startPingPong:test_StartPingPong_With_OOO() (gas: 146627) -PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered() (gas: 172258) +PingPong_startPingPong:test_StartPingPong_With_OOO() (gas: 146616) +PingPong_startPingPong:test_StartPingPong_With_Sequenced_Ordered() (gas: 172247) RMNHome_getConfigDigests:test_getConfigDigests() (gas: 1081176) RMNHome_promoteCandidateAndRevokeActive:test_promoteCandidateAndRevokeActive() (gas: 1086556) RMNHome_revokeCandidate:test_revokeCandidate() (gas: 28085) @@ -342,17 +342,17 @@ RegistryModuleOwnerCustom_registerAdminViaGetCCIPAdmin:test_registerAdminViaGetC RegistryModuleOwnerCustom_registerAdminViaOwner:test_registerAdminViaOwner() (gas: 129941) Router_applyRampUpdates:test_applyRampUpdates_OffRampUpdatesWithRouting() (gas: 10864375) Router_applyRampUpdates:test_applyRampUpdates_OnRampDisable() (gas: 56445) -Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 126090) -Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 213515) +Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 126079) +Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 213504) Router_ccipSend:test_InvalidMsgValue() (gas: 27856) -Router_ccipSend:test_NativeFeeToken() (gas: 186866) +Router_ccipSend:test_NativeFeeToken() (gas: 186855) Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 62696) -Router_ccipSend:test_NativeFeeTokenOverpay() (gas: 188261) +Router_ccipSend:test_NativeFeeTokenOverpay() (gas: 188250) Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 54788) -Router_ccipSend:test_NonLinkFeeToken() (gas: 221193) -Router_ccipSend:test_WrappedNativeFeeToken() (gas: 189083) -Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 135248) -Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 222716) +Router_ccipSend:test_NonLinkFeeToken() (gas: 221182) +Router_ccipSend:test_WrappedNativeFeeToken() (gas: 189072) +Router_ccipSend:test_ccipSend_nativeFeeNoTokenSuccess_gas() (gas: 135237) +Router_ccipSend:test_ccipSend_nativeFeeOneTokenSuccess_gas() (gas: 222705) Router_constructor:test_Constructor() (gas: 13170) Router_getArmProxy:test_getArmProxy() (gas: 10573) Router_getFee:test_GetFeeSupportedChain() (gas: 52367) diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 699edeefbea..ff210b9a9f1 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -48,6 +48,8 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, error InvalidFeeRange(uint256 minFeeUSDCents, uint256 maxFeeUSDCents); error InvalidChainFamilySelector(bytes4 chainFamilySelector); error InvalidTokenReceiver(); + error TooManySVMExtraArgsAccounts(uint256 numAccounts, uint256 maxAccounts); + error InvalidSVMExtraArgsWritableBitmap(uint64 accountIsWritableBitmap, uint256 numAccounts); event FeeTokenAdded(address indexed feeToken); event FeeTokenRemoved(address indexed feeToken); @@ -1004,6 +1006,12 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, if (numberOfTokens > 0 && svmExtraArgsV1.tokenReceiver == bytes32(0)) { revert InvalidTokenReceiver(); } + if (svmExtraArgsV1.accounts.length > Client.SVM_EXTRA_ARGS_MAX_ACCOUNTS) { + revert TooManySVMExtraArgsAccounts(svmExtraArgsV1.accounts.length, Client.SVM_EXTRA_ARGS_MAX_ACCOUNTS); + } + if (svmExtraArgsV1.accountIsWritableBitmap >> svmExtraArgsV1.accounts.length != 0) { + revert InvalidSVMExtraArgsWritableBitmap(svmExtraArgsV1.accountIsWritableBitmap, svmExtraArgsV1.accounts.length); + } gasLimit = svmExtraArgsV1.computeUnits; } else { revert InvalidChainFamilySelector(destChainConfig.chainFamilySelector); @@ -1042,8 +1050,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, if (msgFeeJuels > i_maxFeeJuelsPerMsg) revert MessageFeeTooHigh(msgFeeJuels, i_maxFeeJuelsPerMsg); - (convertedExtraArgs, isOutOfOrderExecution) = - _processChainFamilySelector(destChainSelector, sourceTokenAmounts.length > 0, extraArgs); + (convertedExtraArgs, isOutOfOrderExecution) = _processChainFamilySelector(destChainSelector, extraArgs); destExecDataPerToken = _processPoolReturnData(destChainSelector, onRampTokenTransfers, sourceTokenAmounts); @@ -1052,26 +1059,22 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, /// @notice Parses the extra Args based on the chain family selector. Isolated into a separate function /// as it was the only way to prevent a stack too deep error, and makes future chain family additions easier. + // solhint-disable-next-line chainlink-solidity/explicit-returns function _processChainFamilySelector( uint64 destChainSelector, - bool isMessageWithTokenTransfer, bytes calldata extraArgs - ) internal view returns (bytes memory, bool) { + ) internal view returns (bytes memory validatedExtraArgs, bool allowOutOfOrderExecution) { + // Since this function is called after getFee, which already validates the params, no validation is necessary. DestChainConfig memory destChainConfig = s_destChainConfigs[destChainSelector]; if (destChainConfig.chainFamilySelector == Internal.CHAIN_FAMILY_SELECTOR_EVM) { - // Since the message is called after getFee, which already validates the params, no validation is necessary. Client.EVMExtraArgsV2 memory parsedExtraArgs = _parseUnvalidatedEVMExtraArgsFromBytes(extraArgs, destChainConfig.defaultTxGasLimit); return (Client._argsToBytes(parsedExtraArgs), parsedExtraArgs.allowOutOfOrderExecution); } if (destChainConfig.chainFamilySelector == Internal.CHAIN_FAMILY_SELECTOR_SVM) { - bytes32 tokenReceiver = _parseSVMExtraArgsFromBytes( - extraArgs, destChainConfig.maxPerMsgGasLimit, destChainConfig.enforceOutOfOrder - ).tokenReceiver; - if (isMessageWithTokenTransfer && tokenReceiver == bytes32(0)) { - revert InvalidTokenReceiver(); - } + // If extraArgs passes the parsing it's valid and can be returned unchanged. + _parseSVMExtraArgsFromBytes(extraArgs, destChainConfig.maxPerMsgGasLimit, destChainConfig.enforceOutOfOrder); // ExtraArgs are required on SVM, meaning the supplied extraArgs are either invalid and we would have reverted // or we have valid extraArgs and we can return them without having to re-encode them. diff --git a/contracts/src/v0.8/ccip/libraries/Client.sol b/contracts/src/v0.8/ccip/libraries/Client.sol index a3b89fdc59f..e8e585839ad 100644 --- a/contracts/src/v0.8/ccip/libraries/Client.sol +++ b/contracts/src/v0.8/ccip/libraries/Client.sol @@ -45,6 +45,9 @@ library Client { // bytes4(keccak256("CCIP SVMExtraArgsV1")); bytes4 public constant SVM_EXTRA_ARGS_V1_TAG = 0x1f3b3aba; + /// @dev The maximum number of accounts that can be passed in SVMExtraArgs. + uint256 public constant SVM_EXTRA_ARGS_MAX_ACCOUNTS = 64; + /// @param gasLimit: gas limit for the callback on the destination chain. /// @param allowOutOfOrderExecution: if true, it indicates that the message can be executed in any order relative to /// other messages from the same sender. This value's default varies by chain. On some chains, a particular value is diff --git a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol index 0571e427860..f4ba4ef8de9 100644 --- a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol @@ -97,15 +97,15 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { SiloConfig storage remoteConfig = s_chainConfigs[releaseOrMintIn.remoteChainSelector]; // Since remoteConfig.isSiloed is used more than once, caching in memory saves gas instead of multiple SLOADs. - bool isSiloed = remoteConfig.isSiloed; + bool chainIsSiloed = remoteConfig.isSiloed; // Prevent A silent underflow by explicitly ensuring that enough funds are available to release - uint256 availableLiquidity = isSiloed ? remoteConfig.tokenBalance : s_unsiloedTokenBalance; + uint256 availableLiquidity = chainIsSiloed ? remoteConfig.tokenBalance : s_unsiloedTokenBalance; if (localAmount > availableLiquidity) revert InsufficientLiquidity(availableLiquidity, localAmount); // Tracking balances independently by chain is a security measure to prevent liquidity for one chain from being // released by another chain. - if (isSiloed) { + if (chainIsSiloed) { remoteConfig.tokenBalance -= localAmount; } else { s_unsiloedTokenBalance -= localAmount; diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol index fd1f7d3d255..432820e2a10 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.getValidatedFee.t.sol @@ -290,15 +290,11 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup { } function test_RevertWhen_SVMMessageWithTokenTransferAndInvalidTokenReceiver() public { - vm.stopPrank(); //setup to set chainFamilySelector for SVM so that token receiver's check flow is enabled - vm.startPrank(OWNER); - FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs(); destChainConfigArgs[0].destChainConfig.chainFamilySelector = Internal.CHAIN_FAMILY_SELECTOR_SVM; s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs); - vm.stopPrank(); Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1); // replace with SVM Extra Args @@ -314,4 +310,51 @@ contract FeeQuoter_getValidatedFee is FeeQuoterFeeSetup { vm.expectRevert(FeeQuoter.InvalidTokenReceiver.selector); s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message); } + + function test_getValidatedFee_RevertWhen_TooManySVMExtraArgsAccounts() public { + FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs(); + destChainConfigArgs[0].destChainConfig.chainFamilySelector = Internal.CHAIN_FAMILY_SELECTOR_SVM; + + s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs); + + uint256 maxAccounts = Client.SVM_EXTRA_ARGS_MAX_ACCOUNTS; + + Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1); + message.extraArgs = Client._svmArgsToBytes( + Client.SVMExtraArgsV1({ + computeUnits: GAS_LIMIT, + accountIsWritableBitmap: 0, + allowOutOfOrderExecution: true, + tokenReceiver: bytes32(uint256(1)), + accounts: new bytes32[](maxAccounts + 1) + }) + ); + vm.expectRevert( + abi.encodeWithSelector(FeeQuoter.TooManySVMExtraArgsAccounts.selector, maxAccounts + 1, maxAccounts) + ); + s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message); + } + + function test_getValidatedFee_RevertWhen_InvalidSVMExtraArgsWritableBitmap() public { + FeeQuoter.DestChainConfigArgs[] memory destChainConfigArgs = _generateFeeQuoterDestChainConfigArgs(); + destChainConfigArgs[0].destChainConfig.chainFamilySelector = Internal.CHAIN_FAMILY_SELECTOR_SVM; + + s_feeQuoter.applyDestChainConfigUpdates(destChainConfigArgs); + + uint256 accounts = 4; + uint64 wrongBitmap = uint64(1 << (accounts + 1)); + + Client.EVM2AnyMessage memory message = _generateSingleTokenMessage(s_sourceFeeToken, 1); + message.extraArgs = Client._svmArgsToBytes( + Client.SVMExtraArgsV1({ + computeUnits: GAS_LIMIT, + accountIsWritableBitmap: wrongBitmap, + allowOutOfOrderExecution: true, + tokenReceiver: bytes32(uint256(1)), + accounts: new bytes32[](accounts) + }) + ); + vm.expectRevert(abi.encodeWithSelector(FeeQuoter.InvalidSVMExtraArgsWritableBitmap.selector, wrongBitmap, accounts)); + s_feeQuoter.getValidatedFee(DEST_CHAIN_SELECTOR, message); + } } diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processChainFamilySelector.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processChainFamilySelector.t.sol index e90034d3a9e..43a199baef6 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processChainFamilySelector.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.processChainFamilySelector.t.sol @@ -35,27 +35,17 @@ contract FeeQuoter_processChainFamilySelector is FeeQuoterSetup { s_feeQuoter.applyDestChainConfigUpdates(configs); } - // ---------------------------------------------------------------- - // TEST: EVM path - // ---------------------------------------------------------------- - function test_processChainFamilySelectorEVM() public { + function test_processChainFamilySelector_EVM() public { Client.EVMExtraArgsV2 memory evmArgs = Client.EVMExtraArgsV2({gasLimit: 400_000, allowOutOfOrderExecution: true}); bytes memory encodedEvmArgs = Client._argsToBytes(evmArgs); - (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector( - EVM_SELECTOR, - false, // isMessageWithTokenTransfer - encodedEvmArgs - ); + (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector(EVM_SELECTOR, encodedEvmArgs); assertEq(resultBytes, encodedEvmArgs, "Should return the same EVM-encoded bytes"); assertEq(outOfOrder, evmArgs.allowOutOfOrderExecution, "Out-of-order mismatch"); } - // ---------------------------------------------------------------- - // TEST: SVM path - // ---------------------------------------------------------------- - function test_processChainFamilySelectorSVM_WithTokenTransfer() public { + function test_processChainFamilySelector_SVM_WithTokenTransfer() public { // Construct an SVMExtraArgsV1 with a non-zero tokenReceiver Client.SVMExtraArgsV1 memory svmArgs = Client.SVMExtraArgsV1({ computeUnits: 1_500_000, // within the limit @@ -66,11 +56,7 @@ contract FeeQuoter_processChainFamilySelector is FeeQuoterSetup { }); bytes memory encodedSvmArgs = Client._svmArgsToBytes(svmArgs); - (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector( - SVM_SELECTOR, - true, // isMessageWithTokenTransfer - encodedSvmArgs - ); + (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector(SVM_SELECTOR, encodedSvmArgs); // The function should NOT revert since tokenReceiver != 0 // Check that it returned the SVM-encoded bytes @@ -79,7 +65,7 @@ contract FeeQuoter_processChainFamilySelector is FeeQuoterSetup { assertTrue(outOfOrder, "Out-of-order for SVM must be true"); } - function test_processChainFamilySelectorSVM_NoTokenTransfer() public { + function test_processChainFamilySelector_SVM_NoTokenTransfer() public { Client.SVMExtraArgsV1 memory svmArgs = Client.SVMExtraArgsV1({ computeUnits: 2_000_000, accountIsWritableBitmap: 0, @@ -89,43 +75,17 @@ contract FeeQuoter_processChainFamilySelector is FeeQuoterSetup { }); bytes memory encodedSvmArgs = Client._svmArgsToBytes(svmArgs); - (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector( - SVM_SELECTOR, - false, // no token transfer - encodedSvmArgs - ); + (bytes memory resultBytes, bool outOfOrder) = s_feeQuoter.processChainFamilySelector(SVM_SELECTOR, encodedSvmArgs); // Should succeed with outOfOrder = true assertEq(resultBytes, encodedSvmArgs, "Should return the SVM-encoded bytes"); assertTrue(outOfOrder, "Out-of-order should be true for SVM"); } - // TEST: SVM path → reverts - - function test_processChainFamilySelector_RevertWhen_TokenTransferNoTokenReceiver() public { - // Construct an SVMExtraArgsV1 with tokenReceiver == 0 - Client.SVMExtraArgsV1 memory svmArgs = Client.SVMExtraArgsV1({ - computeUnits: 1_500_000, - accountIsWritableBitmap: 0, - tokenReceiver: bytes32(0), // <-- zero - allowOutOfOrderExecution: true, - accounts: new bytes32[](0) - }); - bytes memory encodedSvmArgs = Client._svmArgsToBytes(svmArgs); - - vm.expectRevert(FeeQuoter.InvalidTokenReceiver.selector); - - s_feeQuoter.processChainFamilySelector( - SVM_SELECTOR, - true, // token transfer - encodedSvmArgs - ); - } - function test_processChainFamilySelector_RevertWhen_InvalidChainFamilySelector() public { // Provide random extraArgs vm.expectRevert(abi.encodeWithSelector(FeeQuoter.InvalidChainFamilySelector.selector, bytes4(0))); - s_feeQuoter.processChainFamilySelector(INVALID_SELECTOR, false, "0x1234"); + s_feeQuoter.processChainFamilySelector(INVALID_SELECTOR, "0x1234"); } } diff --git a/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol b/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol index 3dd711e7998..0b4898b10e5 100644 --- a/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol +++ b/contracts/src/v0.8/ccip/test/helpers/FeeQuoterHelper.sol @@ -91,10 +91,9 @@ contract FeeQuoterHelper is FeeQuoter { function processChainFamilySelector( uint64 chainFamilySelector, - bool isMessageWithTokenTransfer, bytes calldata extraArgs ) external view returns (bytes memory, bool) { - return _processChainFamilySelector(chainFamilySelector, isMessageWithTokenTransfer, extraArgs); + return _processChainFamilySelector(chainFamilySelector, extraArgs); } function validateDestFamilyAddress( diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go index a9e3eb0f4de..23e2c2d9e8f 100644 --- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go +++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go @@ -158,8 +158,8 @@ type KeystoneFeedsPermissionHandlerPermission struct { } var FeeQuoterMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"priceUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"FEE_BASE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyFeeTokensUpdates\",\"inputs\":[{\"name\":\"feeTokensToRemove\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokensToAdd\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"inputs\":[{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertTokenAmount\",\"inputs\":[{\"name\":\"fromToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fromTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"toToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestinationChainGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeTokens\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPremiumMultiplierWeiPerEth\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenAndGasPrices\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokenPrice\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"gasPriceValue\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPriceFeedConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrices\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessageArgs\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"convertedExtraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setReportPermissions\",\"inputs\":[{\"name\":\"permissions\",\"type\":\"tuple[]\",\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrices\",\"inputs\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTokenPriceFeeds\",\"inputs\":[{\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenAdded\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenRemoved\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PriceFeedPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"priceFeedConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReportPermissionSet\",\"inputs\":[{\"name\":\"reportId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"permission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerUnitGasUpdated\",\"inputs\":[{\"name\":\"destChain\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DataFeedValueOutOfUint224Range\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DestinationChainNotEnabled\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeTokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidChainFamilySelector\",\"inputs\":[{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidDestBytesOverhead\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidEVMAddress\",\"inputs\":[{\"name\":\"encodedAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsTag\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeRange\",\"inputs\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMAddress\",\"inputs\":[{\"name\":\"SVMAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidStaticConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageComputeUnitLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageFeeTooHigh\",\"inputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MessageGasLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTooLarge\",\"inputs\":[{\"name\":\"maxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportForwarderUnauthorized\",\"inputs\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}]},{\"type\":\"error\",\"name\":\"SourceTokenDataTooLarge\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StaleGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timePassed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedNumberOfTokens\",\"inputs\":[{\"name\":\"numberOfTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x60e06040523461106a576171a380380380610019816112d6565b928339810190808203610120811261106a5760601361106a5761003a611298565b81516001600160601b038116810361106a57815261005a602083016112fb565b906020810191825261006e6040840161130f565b6040820190815260608401516001600160401b03811161106a5785610094918601611337565b60808501519094906001600160401b03811161106a57866100b6918301611337565b60a08201519096906001600160401b03811161106a5782019080601f8301121561106a5781516100ed6100e882611320565b6112d6565b9260208085848152019260071b8201019083821161106a57602001915b8183106112235750505060c08301516001600160401b03811161106a5783019781601f8a01121561106a578851986101446100e88b611320565b996020808c838152019160051b8301019184831161106a5760208101915b8383106110c1575050505060e08401516001600160401b03811161106a5784019382601f8601121561106a57845161019c6100e882611320565b9560208088848152019260061b8201019085821161106a57602001915b81831061108557505050610100810151906001600160401b03821161106a570182601f8201121561106a578051906101f36100e883611320565b93602061028081878681520194028301019181831161106a57602001925b828410610ea857505050503315610e9757600180546001600160a01b031916331790556020986102408a6112d6565b976000895260003681376102526112b7565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d6113d0565b51168d610287826115bc565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b6113d0565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c83610320600195611544565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5081518a985089906001600160a01b0316158015610e85575b8015610e76575b610e655791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c052610392866112d6565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a6113d0565b5116611451565b6103d2575b0161039f565b818060a01b036103e282896113d0565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b0361043783896113d0565b5116611583565b610449575b01610416565b818060a01b0361045982886113d0565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b835181101561054757806104a3600192866113d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606089858060a01b038451169301518360005260078b5260406000209060ff878060a01b038251169283898060a01b03198254161781558d8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168c8301525115156040820152a20161048d565b5091509160005b8251811015610afd5761056181846113d0565b51856001600160401b0361057584876113d0565b5151169101519080158015610aea575b8015610acc575b8015610a92575b610a7e57600081815260098852604090205460019392919060081b6001600160e01b03191661093657807f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806106fc868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a25b60005260098752826040600020825115158382549162ffff008c83015160081b169066ffffffff000000604084015160181b166affffffff00000000000000606085015160381b16926effffffff0000000000000000000000608086015160581b169260ff60781b60a087015160781b169460ff60801b60c088015160801b169161ffff60881b60e089015160881b169063ffffffff60981b6101008a015160981b169361ffff60b81b6101208b015160b81b169661ffff60c81b6101408c015160c81b169963ffffffff60d81b6101608d015160081c169b61018060ff60f81b910151151560f81b169c8f8060f81b039a63ffffffff60d81b199961ffff60c81b199861ffff60b81b199763ffffffff60981b199661ffff60881b199560ff60801b199460ff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff19161716171617161716171617161716171617161716179063ffffffff60d81b1617178155019061ffff6101a0820151169082549165ffffffff00006101c083015160101b169269ffffffff0000000000006101e084015160301b166a01000000000000000000008860901b0361020085015160501b169263ffffffff60901b61022086015160901b169461024063ffffffff60b01b91015160b01b169563ffffffff60b01b199363ffffffff60901b19926a01000000000000000000008c60901b0319918c8060501b03191617161716171617171790550161054e565b807f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e360405180610a76868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a2610700565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff60e01b61016083015116630a04b54b60e21b8114159081610aba575b50610593565b6307842f7160e21b1415905088610ab4565b5063ffffffff6101e08301511663ffffffff6060840151161061058c565b5063ffffffff6101e08301511615610585565b84828560005b8151811015610b83576001906001600160a01b03610b2182856113d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b5786896113d0565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610b03565b83600184610b90836112d6565b9060008252600092610e60575b909282935b8251851015610d9f57610bb585846113d0565b5180516001600160401b0316939083019190855b83518051821015610d8e57610bdf8287926113d0565b51015184516001600160a01b0390610bf89084906113d0565b5151169063ffffffff815116908781019163ffffffff8351169081811015610d795750506080810163ffffffff815116898110610d62575090899291838c52600a8a5260408c20600160a01b6001900386168d528a5260408c2092825163ffffffff169380549180518d1b67ffffffff0000000016916040860192835160401b69ffff000000000000000016966060810195865160501b6dffffffff00000000000000000000169063ffffffff60701b895160701b169260a001998b60ff60901b8c51151560901b169560ff60901b199363ffffffff60701b19926dffffffff000000000000000000001991600160501b60019003191617161716171617171790556040519586525163ffffffff168c8601525161ffff1660408501525163ffffffff1660608401525163ffffffff16608083015251151560a082015260c07f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b591a3600101610bc9565b6312766e0160e11b8c52600485905260245260448bfd5b6305a7b3d160e11b8c5260045260245260448afd5b505060019096019593509050610ba2565b9150825b8251811015610e21576001906001600160401b03610dc182866113d0565b515116828060a01b0384610dd584886113d0565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610da3565b604051615b52908161165182396080518181816104420152612a3e015260a05181818161047801526129ef015260c05181818161049f01526137c90152f35b610b9d565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b838203610280811261106a57610260610ebf6112b7565b91610ec9876113ad565b8352601f19011261106a576040519161026083016001600160401b0381118482101761106f57604052610efe602087016113a0565b8352610f0c604087016113c1565b6020840152610f1d6060870161130f565b6040840152610f2e6080870161130f565b6060840152610f3f60a0870161130f565b6080840152610f5060c08701611392565b60a0840152610f6160e08701611392565b60c0840152610f7361010087016113c1565b60e0840152610f85610120870161130f565b610100840152610f9861014087016113c1565b610120840152610fab61016087016113c1565b610140840152610180860151916001600160e01b03198316830361106a5783602093610160610280960152610fe36101a089016113a0565b610180820152610ff66101c089016113c1565b6101a08201526110096101e0890161130f565b6101c082015261101c610200890161130f565b6101e082015261102f61022089016113ad565b610200820152611042610240890161130f565b610220820152611055610260890161130f565b61024082015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408387031261106a57602060409161109c6112b7565b6110a5866112fb565b81526110b28387016113ad565b838201528152019201916101b9565b82516001600160401b03811161106a5782016040818803601f19011261106a576110e96112b7565b906110f6602082016113ad565b825260408101516001600160401b03811161106a57602091010187601f8201121561106a5780516111296100e882611320565b91602060e08185858152019302820101908a821161106a57602001915b8183106111655750505091816020938480940152815201920191610162565b828b0360e0811261106a5760c061117a6112b7565b91611184866112fb565b8352601f19011261106a576040519160c08301916001600160401b0383118484101761106f5760e0936020936040526111be84880161130f565b81526111cc6040880161130f565b848201526111dc606088016113c1565b60408201526111ed6080880161130f565b60608201526111fe60a0880161130f565b608082015261120f60c088016113a0565b60a082015283820152815201920191611146565b8284036080811261106a5760606112386112b7565b91611242866112fb565b8352601f19011261106a5760809160209161125b611298565b6112668488016112fb565b815261127460408801611392565b84820152611284606088016113a0565b60408201528382015281520192019161010a565b60405190606082016001600160401b0381118382101761106f57604052565b60408051919082016001600160401b0381118382101761106f57604052565b6040519190601f01601f191682016001600160401b0381118382101761106f57604052565b51906001600160a01b038216820361106a57565b519063ffffffff8216820361106a57565b6001600160401b03811161106f5760051b60200190565b9080601f8301121561106a5781516113516100e882611320565b9260208085848152019260051b82010192831161106a57602001905b82821061137a5750505090565b60208091611387846112fb565b81520191019061136d565b519060ff8216820361106a57565b5190811515820361106a57565b51906001600160401b038216820361106a57565b519061ffff8216820361106a57565b80518210156113e45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156113e45760005260206000200190600090565b8054801561143b57600019019061142982826113fa565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c602052604090205480156115125760001981018181116114fc57600b546000198101919082116114fc578181036114ab575b505050611497600b611412565b600052600c60205260006040812055600190565b6114e46114bc6114cd93600b6113fa565b90549060031b1c928392600b6113fa565b819391549060031b91821b91600019901b19161790565b9055600052600c60205260406000205538808061148a565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8054906801000000000000000082101561106f57816114cd916001611540940181556113fa565b9055565b8060005260036020526040600020541560001461157d57611566816002611519565b600254906000526003602052604060002055600190565b50600090565b80600052600c6020526040600020541560001461157d576115a581600b611519565b600b5490600052600c602052604060002055600190565b60008181526003602052604090205480156115125760001981018181116114fc576002546000198101919082116114fc57808203611616575b5050506116026002611412565b600052600360205260006040812055600190565b6116386116276114cd9360026113fa565b90549060031b1c92839260026113fa565b905560005260036020526040600020553880806115f556fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461020657806301ffc9a714610201578063061877e3146101fc57806306285c69146101f7578063181f5a77146101f25780632451a627146101ed578063325c868e146101e85780633937306f146101e357806341ed29e7146101de578063430d138c146101d957806345ac924d146101d45780634ab35b0b146101cf578063514e8cff146101ca5780636def4ce7146101c5578063770e2dc4146101c057806379ba5097146101bb5780637afac322146101b6578063805f2132146101b157806382b49eb0146101ac57806387b8d879146101a75780638da5cb5b146101a257806391a2749a1461019d578063a69c64c014610198578063bf78e03f14610193578063cdc73d511461018e578063d02641a014610189578063d63d3af214610184578063d8694ccd1461017f578063f2fde38b1461017a578063fbe3f778146101755763ffdb4b371461017057600080fd5b612595565b612498565b6123dc565b611f78565b611f5c565b611f13565b611e9c565b611df6565b611d3d565b611ca9565b611c82565b611a66565b6118e9565b61164e565b611515565b6113fd565b6111de565b61105f565b610e88565b610e50565b610d87565b610c5a565b6109ff565b610743565b610727565b6106a4565b6105fe565b610406565b6103be565b61029a565b61022e565b6001600160a01b0381160361021c57565b600080fd5b359061022c8261020b565b565b3461021c57606060031936011261021c5760206102656004356102508161020b565b602435604435916102608361020b565b612717565b604051908152f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361021c57565b3461021c57602060031936011261021c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361021c577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f2132000000000000000000000000000000000000000000000000000000008114908115610394575b811561036a575b8115610340575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610335565b7f181f5a77000000000000000000000000000000000000000000000000000000008114915061032e565b7f9b645f410000000000000000000000000000000000000000000000000000000081149150610327565b3461021c57602060031936011261021c576001600160a01b036004356103e38161020b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b3461021c57600060031936011261021c5761041f61274b565b50606060405161042e81610506565b63ffffffff6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016918281526001600160a01b0360406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761052257604052565b6104d7565b60a0810190811067ffffffffffffffff82111761052257604052565b6040810190811067ffffffffffffffff82111761052257604052565b60c0810190811067ffffffffffffffff82111761052257604052565b90601f601f19910116810190811067ffffffffffffffff82111761052257604052565b6040519061022c60408361057b565b6040519061022c6102608361057b565b919082519283825260005b8481106105e9575050601f19601f8460006020809697860101520116010190565b806020809284010151828286010152016105c8565b3461021c57600060031936011261021c5761065d6040805190610621818361057b565b601382527f46656551756f74657220312e362e302d646576000000000000000000000000006020830152519182916020835260208301906105bd565b0390f35b602060408183019282815284518094520192019060005b8181106106855750505090565b82516001600160a01b0316845260209384019390920191600101610678565b3461021c57600060031936011261021c5760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b8181106107115761065d856107058187038261057b565b60405191829182610661565b82548452602090930192600192830192016106ee565b3461021c57600060031936011261021c57602060405160248152f35b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c5780600401906040600319823603011261021c57610781613b02565b61078b828061276a565b4263ffffffff1692915060005b8181106108fc575050602401906107af828461276a565b92905060005b8381106107be57005b806107dd6107d86001936107d2868a61276a565b906127ed565b61284d565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff6108d86108ca60208501946108bc61082687516001600160e01b031690565b61084061083161059e565b6001600160e01b039092168252565b63ffffffff8c16602082015261087b610861845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000166001600160e01b0392909216919091179055565b5167ffffffffffffffff1690565b93516001600160e01b031690565b604080516001600160e01b039290921682524260208301529190931692a2016107b5565b806109156109106001936107d2898061276a565b612816565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036109ae6108ca60208501946109a161095d87516001600160e01b031690565b61096861083161059e565b63ffffffff8d16602082015261087b61098884516001600160a01b031690565b6001600160a01b03166000526006602052604060002090565b516001600160a01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610798565b67ffffffffffffffff81116105225760051b60200190565b8015150361021c57565b359061022c826109ea565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590610a3c826109d2565b90610a4a604051928361057b565b828252602460a06020840194028201019036821161021c57602401925b818410610a7957610a7783612872565b005b60a08436031261021c5760405190610a9082610527565b8435610a9b8161020b565b825260208501357fffffffffffffffffffff000000000000000000000000000000000000000000008116810361021c5760208301526040850135907fffff0000000000000000000000000000000000000000000000000000000000008216820361021c5782602092604060a0950152610b1660608801610221565b6060820152610b27608088016109f4565b6080820152815201930192610a67565b6004359067ffffffffffffffff8216820361021c57565b6024359067ffffffffffffffff8216820361021c57565b359067ffffffffffffffff8216820361021c57565b9181601f8401121561021c5782359167ffffffffffffffff831161021c576020838186019501011161021c57565b9181601f8401121561021c5782359167ffffffffffffffff831161021c576020808501948460051b01011161021c57565b929091610bfa928452151560208401526080604084015260808301906105bd565b906060818303910152815180825260208201916020808360051b8301019401926000915b838310610c2d57505050505090565b9091929394602080610c4b83601f19866001960301875289516105bd565b97019301930191939290610c1e565b3461021c5760c060031936011261021c57610c73610b37565b60243590610c808261020b565b60443560643567ffffffffffffffff811161021c57610ca3903690600401610b7a565b60849391933567ffffffffffffffff811161021c57610cc6903690600401610ba8565b9160a4359567ffffffffffffffff871161021c573660238801121561021c5786600401359567ffffffffffffffff871161021c573660248860061b8a01011161021c5761065d986024610d1a9901966129e4565b9060409492945194859485610bd9565b602060408183019282815284518094520192019060005b818110610d4e5750505090565b9091926020604082610d7c600194885163ffffffff602080926001600160e01b038151168552015116910152565b019401929101610d41565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c57610db8903690600401610ba8565b610dc1816109d2565b91610dcf604051938461057b565b818352601f19610dde836109d2565b0160005b818110610e3957505060005b82811015610e2b57600190610e0f610e0a8260051b8501612cfb565b613775565b610e1982876129d0565b52610e2481866129d0565b5001610dee565b6040518061065d8682610d2a565b602090610e44612ce2565b82828801015201610de2565b3461021c57602060031936011261021c576020610e77600435610e728161020b565b613a8a565b6001600160e01b0360405191168152f35b3461021c57602060031936011261021c5767ffffffffffffffff610eaa610b37565b610eb2612ce2565b50166000526005602052604060002060405190610ece82610543565b546001600160e01b038116825260e01c6020820152604051809161065d82604081019263ffffffff602080926001600160e01b038151168552015116910152565b61022c9092919261024080610260830195610f2c84825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015160ff169085015260c08181015160ff169085015260e08181015161ffff16908501526101008181015163ffffffff16908501526101208181015161ffff16908501526101408181015161ffff1690850152610160818101517fffffffff000000000000000000000000000000000000000000000000000000001690850152610180818101511515908501526101a08181015161ffff16908501526101c08181015163ffffffff16908501526101e08181015163ffffffff16908501526102008181015167ffffffffffffffff16908501526102208181015163ffffffff1690850152015163ffffffff16910152565b3461021c57602060031936011261021c5761065d61112261111d611081610b37565b600061024061108e6105ad565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015282610220820152015267ffffffffffffffff166000526009602052604060002090565b612d2a565b60405191829182610f0f565b359063ffffffff8216820361021c57565b359061ffff8216820361021c57565b81601f8201121561021c57803590611165826109d2565b92611173604051948561057b565b82845260208085019360061b8301019181831161021c57602001925b82841061119d575050505090565b60408483031261021c57602060409182516111b781610543565b6111c087610b65565b8152828701356111cf8161020b565b8382015281520193019261118f565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013561121a816109d2565b91611228604051938461057b565b8183526024602084019260051b8201019036821161021c5760248101925b828410611277576024358567ffffffffffffffff821161021c57611271610a7792369060040161114e565b90612e98565b833567ffffffffffffffff811161021c57820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261021c57604051906112c382610543565b6112cf60248201610b65565b8252604481013567ffffffffffffffff811161021c57602491010136601f8201121561021c578035611300816109d2565b9161130e604051938461057b565b818352602060e081850193028201019036821161021c57602001915b8183106113495750505091816020938480940152815201930192611246565b82360360e0811261021c5760c0601f196040519261136684610543565b86356113718161020b565b8452011261021c5760e09160209160405161138b8161055f565b61139684880161112e565b81526113a46040880161112e565b848201526113b46060880161113f565b60408201526113c56080880161112e565b60608201526113d660a0880161112e565b608082015260c08701356113e9816109ea565b60a08201528382015281520192019161132a565b3461021c57600060031936011261021c576000546001600160a01b0381163303611484577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f8301121561021c5781356114c5816109d2565b926114d3604051948561057b565b81845260208085019260051b82010192831161021c57602001905b8282106114fb5750505090565b60208091833561150a8161020b565b8152019101906114ee565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c576115469036906004016114ae565b60243567ffffffffffffffff811161021c576115669036906004016114ae565b9061156f613b46565b60005b81518110156115de578061159361158e6109a1600194866129d0565b615757565b61159e575b01611572565b6001600160a01b036115b36109a183866129d0565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a2611598565b8260005b8151811015610a7757806116036115fe6109a1600194866129d0565b61576b565b61160e575b016115e2565b6001600160a01b036116236109a183866129d0565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2611608565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c5761167f903690600401610b7a565b6024359167ffffffffffffffff831161021c576116d86116d06116b66116ac6116e0963690600401610b7a565b9490953691613147565b90604082015190605e604a84015160601c93015191929190565b919033613faa565b81019061318e565b60005b8151811015610a775761172b61172661170d6116ff84866129d0565b51516001600160a01b031690565b6001600160a01b03166000526007602052604060002090565b61324d565b61173f61173b6040830151151590565b1590565b6118a0579061178a6117576020600194015160ff1690565b611784611778602061176986896129d0565b5101516001600160e01b031690565b6001600160e01b031690565b9061407c565b6117a5604061179984876129d0565b51015163ffffffff1690565b63ffffffff6117d06117c76117c06109886116ff888b6129d0565b5460e01c90565b63ffffffff1690565b91161061189a5761181e6117e9604061179985886129d0565b61180e6117f461059e565b6001600160e01b03851681529163ffffffff166020830152565b61087b6109886116ff86896129d0565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036118546116ff85886129d0565b6118906118666040611799888b6129d0565b60405193849316958390929163ffffffff6020916001600160e01b03604085019616845216910152565b0390a25b016116e3565b50611894565b6118e56118b06116ff84866129d0565b7f06439c6b000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b6000fd5b3461021c57604060031936011261021c5761065d611971611908610b37565b67ffffffffffffffff6024359161191e8361020b565b600060a060405161192e8161055f565b828152826020820152826040820152826060820152826080820152015216600052600a6020526040600020906001600160a01b0316600052602052604060002090565b6119ed6119e4604051926119848461055f565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c1660408501526119cb6119be8263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b60ff81160361021c57565b359061022c82611a50565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590611aa3826109d2565b90611ab1604051928361057b565b82825260246102806020840194028201019036821161021c57602401925b818410611adf57610a77836132dd565b833603610280811261021c57610260601f1960405192611afe84610543565b611b0788610b65565b8452011261021c5761028091602091611b1e6105ad565b611b298489016109f4565b8152611b376040890161113f565b84820152611b476060890161112e565b6040820152611b586080890161112e565b6060820152611b6960a0890161112e565b6080820152611b7a60c08901611a5b565b60a0820152611b8b60e08901611a5b565b60c0820152611b9d610100890161113f565b60e0820152611baf610120890161112e565b610100820152611bc2610140890161113f565b610120820152611bd5610160890161113f565b610140820152611be8610180890161026d565b610160820152611bfb6101a089016109f4565b610180820152611c0e6101c0890161113f565b6101a0820152611c216101e0890161112e565b6101c0820152611c34610200890161112e565b6101e0820152611c476102208901610b65565b610200820152611c5a610240890161112e565b610220820152611c6d610260890161112e565b61024082015283820152815201930192611acf565b3461021c57600060031936011261021c5760206001600160a01b0360015416604051908152f35b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c576040600319823603011261021c57604051611ce681610543565b816004013567ffffffffffffffff811161021c57611d0a90600436918501016114ae565b8152602482013567ffffffffffffffff811161021c57610a77926004611d3392369201016114ae565b6020820152613547565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590611d7a826109d2565b90611d88604051928361057b565b8282526024602083019360061b8201019036821161021c57602401925b818410611db557610a7783613699565b60408436031261021c5760206040918251611dcf81610543565b8635611dda8161020b565b8152611de7838801610b65565b83820152815201930192611da5565b3461021c57602060031936011261021c576001600160a01b03600435611e1b8161020b565b611e2361274b565b5016600052600760205261065d604060002060ff60405191611e4483610506565b546001600160a01b0381168352818160a01c16602084015260a81c16151560408201526040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b3461021c57600060031936011261021c57604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b818110611efd5761065d856107058187038261057b565b8254845260209093019260019283019201611ee6565b3461021c57602060031936011261021c576040611f35600435610e0a8161020b565b611f5a8251809263ffffffff602080926001600160e01b038151168552015116910152565bf35b3461021c57600060031936011261021c57602060405160128152f35b3461021c57604060031936011261021c57611f91610b37565b60243567ffffffffffffffff811161021c57806004019060a0600319823603011261021c57611fd761111d8467ffffffffffffffff166000526009602052604060002090565b611fe461173b8251151590565b6123a4576064820161201a61173b611ffb83612cfb565b6001600160a01b03166000526001600b01602052604060002054151590565b612363579083916044840195612030878561276a565b9590506120716024820191612054608461204a858a613891565b9390500188613891565b908961206a6120638b80613891565b3691613147565b93896149be565b928461207f610e7283612cfb565b98899461209d61209761022085015163ffffffff1690565b82614c37565b9b6000808c1561232957505061210361ffff856121289961210f99989661214396612136966120fa6120ea6101c06120de6101a06121499f015161ffff1690565b97015163ffffffff1690565b916120f48c612cfb565b9461276a565b96909516614d28565b98919897909894612cfb565b6001600160a01b03166000526008602052604060002090565b5467ffffffffffffffff1690565b67ffffffffffffffff1690565b906126cb565b9560009761ffff61216061014089015161ffff1690565b166122ce575b509461214361213661020061223461065d9d6dffffffffffffffffffffffffffff61222c61224c9f9e9b6122276001600160e01b039f9b9c6122449f6122279e63ffffffff6121bb6122279f6121c594613891565b92905016906138e2565b908b60a081016121e86121e26121dc835160ff1690565b60ff1690565b856126cb565b9360e08301916121fa835161ffff1690565b9061ffff8216831161225c575b5050505060800151612227916117c79163ffffffff16613920565b613920565b6138e2565b9116906126cb565b93015167ffffffffffffffff1690565b9116906126de565b6040519081529081906020820190565b6117c7949650612227959361ffff6122bd6122ac612222966122a661229f61229660809960ff6122906122c49b5160ff1690565b166138ef565b965161ffff1690565b61ffff1690565b90613768565b6121436121dc60c08d015160ff1690565b91166138e2565b9593839550612207565b909594989750826122f48b989495986dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff169161230f8489613891565b905061231b9388614f4a565b969793943896939296612166565b969593509650505061214361213661212861210f61235d6123586117c761024061214999015163ffffffff1690565b612684565b94612cfb565b61236f6118e591612cfb565b7f2502348c000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b3461021c57602060031936011261021c576001600160a01b036004356124018161020b565b612409613b46565b1633811461246e57807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c578060040135906124d5826109d2565b906124e3604051928361057b565b8282526024602083019360071b8201019036821161021c57602401925b81841061251057610a778361393a565b8336036080811261021c576060601f196040519261252d84610543565b87356125388161020b565b8452011261021c5760809160209160405161255281610506565b8388013561255f8161020b565b8152604088013561256f81611a50565b848201526060880135612581816109ea565b604082015283820152815201930192612500565b3461021c57604060031936011261021c576004356125b28161020b565b6125ba610b4e565b9067ffffffffffffffff82169182600052600960205260ff6040600020541615612627576125ea61260b92613a8a565b92600052600960205263ffffffff60016040600020015460901c1690614c37565b604080516001600160e01b039384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc1000014901517156126a657565b612655565b90655af3107a4000820291808304655af3107a400014901517156126a657565b818102929181159184041417156126a657565b81156126e8570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b61274161273b61274894936001600160e01b036127348195613a8a565b16906126cb565b92613a8a565b16906126de565b90565b6040519061275882610506565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561021c570180359067ffffffffffffffff821161021c57602001918160061b3603831361021c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156127fd5760061b0190565b6127be565b35906001600160e01b038216820361021c57565b60408136031261021c5761284560206040519261283284610543565b803561283d8161020b565b845201612802565b602082015290565b60408136031261021c5761284560206040519261286984610543565b61283d81610b65565b9061287b613b46565b60005b82518110156129cb5780612894600192856129d0565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a06001600160a01b038351169260608101936001600160a01b0380865116957fffff00000000000000000000000000000000000000000000000000000000000061293260208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c511692614fef565b977fffffffffffffffffffff00000000000000000000000000000000000000000000608087019561299e875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a20161287e565b509050565b80518210156127fd5760209160051b010190565b9895979692949391907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382166001600160a01b03821614600014612cd2575050935b6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016808611612ca1575090612a74918715158a613b84565b979096612ac1612a988367ffffffffffffffff166000526009602052604060002090565b5460081b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90612acb81613dcd565b9760005b828110612ae3575050505050505093929190565b612af6612af18284896127ed565b612cfb565b8388612b10612b06858484613e16565b6040810190613891565b905060208111612c26575b508392612b4a612b44612063612b3a600198612b8597612b8097613e16565b6020810190613891565b89615520565b612b688967ffffffffffffffff16600052600a602052604060002090565b906001600160a01b0316600052602052604060002090565b613283565b60a081015115612bea57612bce612ba66060612bc093015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b03601f19810183528261057b565b612bd8828d6129d0565b52612be3818c6129d0565b5001612acf565b50612bc0612bce612c2184612c138a67ffffffffffffffff166000526009602052604060002090565b015460101c63ffffffff1690565b612ba6565b915050612c5e6117c7612c5184612b688b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b10612c6b57838838612b1b565b7f36f536ca000000000000000000000000000000000000000000000000000000006000526001600160a01b031660045260246000fd5b857f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b91612cdc92612717565b93612a2f565b60405190612cef82610543565b60006020838281520152565b356127488161020b565b90604051612d1281610543565b91546001600160e01b038116835260e01c6020830152565b9061022c612e8a6001612d3b6105ad565b94612e29612e1f8254612d57612d518260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015260ff607882901c1660a08a015260ff608082901c1660c08a015261ffff608882901c1660e08a015263ffffffff609882901c166101008a015261ffff60b882901c166101208a015261ffff60c882901c166101408a01527fffffffff00000000000000000000000000000000000000000000000000000000600882901b166101608a015260f81c90565b1515610180880152565b015461ffff81166101a086015263ffffffff601082901c166101c086015263ffffffff603082901c166101e086015267ffffffffffffffff605082901c1661020086015263ffffffff609082901c1661022086015260b01c63ffffffff1690565b63ffffffff16610240840152565b90612ea1613b46565b6000915b805183101561309357612eb883826129d0565b5190612ecc825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b8551805182101561307e57612ef8826020926129d0565b510151612f096116ff8389516129d0565b8151602083015163ffffffff908116911681811015613045575050608082015163ffffffff1660208110613004575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b56001600160a01b0384612f93858f60019998612b68612f8e9267ffffffffffffffff16600052600a602052604060002090565b613e56565b612ffb60405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a301612ee1565b7f24ecdc02000000000000000000000000000000000000000000000000000000006000526001600160a01b0390911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b50509550925092600191500191929092612ea5565b50905060005b815181101561314357806130c16130b2600193856129d0565b515167ffffffffffffffff1690565b67ffffffffffffffff6001600160a01b036130f060206130e186896129d0565b5101516001600160a01b031690565b600061311482612b688767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613099565b5050565b92919267ffffffffffffffff82116105225760405191613171601f8201601f19166020018461057b565b82948184528183011161021c578281602093846000960137010152565b60208183031261021c5780359067ffffffffffffffff821161021c570181601f8201121561021c578035906131c2826109d2565b926131d0604051948561057b565b8284526020606081860194028301019181831161021c57602001925b8284106131fa575050505090565b60608483031261021c57602060609160405161321581610506565b86356132208161020b565b815261322d838801612802565b8382015261323d6040880161112e565b60408201528152019301926131ec565b9060405161325a81610506565b604060ff8294546001600160a01b0381168452818160a01c16602085015260a81c161515910152565b9061022c6040516132938161055f565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b906132e6613b46565b60005b82518110156129cb576132fc81846129d0565b51602061330c6130b284876129d0565b9101519067ffffffffffffffff811680158015613528575b80156134fa575b801561344d575b61341557916133db826001959461338b613366612a986133e09767ffffffffffffffff166000526009602052604060002090565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b6133e6577f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806133be8782610f0f565b0390a267ffffffffffffffff166000526009602052604060002090565b614189565b016132e9565b7f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3604051806133be8782610f0f565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b507fffffffff0000000000000000000000000000000000000000000000000000000061349d6101608501517fffffffff000000000000000000000000000000000000000000000000000000001690565b167f2812d52c0000000000000000000000000000000000000000000000000000000081141590816134cf575b50613332565b7f1e10bdc40000000000000000000000000000000000000000000000000000000091501415386134c9565b506101e083015163ffffffff1663ffffffff6135206117c7606087015163ffffffff1690565b91161161332b565b5063ffffffff6135406101e085015163ffffffff1690565b1615613324565b61354f613b46565b60208101519160005b83518110156135dc57806135716109a1600193876129d0565b61359361358e6001600160a01b0383165b6001600160a01b031690565b615aba565b61359f575b5001613558565b6040516001600160a01b039190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a138613598565b5091505160005b8151811015613143576135f96109a182846129d0565b906001600160a01b0382161561366f577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6136668361364b6136466135826001976001600160a01b031690565b615a41565b506040516001600160a01b0390911681529081906020820190565b0390a1016135e3565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b6136a1613b46565b60005b815181101561314357806001600160a01b036136c2600193856129d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d61375f67ffffffffffffffff60206136fe86896129d0565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a2016136a4565b919082039182116126a657565b61377d612ce2565b506137a361379e826001600160a01b03166000526006602052604060002090565b612d05565b60208101916137c26137bc6117c7855163ffffffff1690565b42613768565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000161161386a5761172661380e916001600160a01b03166000526007602052604060002090565b61381e61173b6040830151151590565b8015613870575b61386a5761383290614857565b9163ffffffff61385a6117c761384f602087015163ffffffff1690565b935163ffffffff1690565b911610613865575090565b905090565b50905090565b506001600160a01b0361388a82516001600160a01b031690565b1615613825565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561021c570180359067ffffffffffffffff821161021c5760200191813603831361021c57565b919082018092116126a657565b9061ffff8091169116029061ffff82169182036126a657565b63ffffffff60209116019063ffffffff82116126a657565b9063ffffffff8091169116019063ffffffff82116126a657565b90613943613b46565b60005b82518110156129cb578061395c600192856129d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf613a8160206001600160a01b0384511693015183600052600760205260406000206139e16001600160a01b0383511682906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000075ff0000000000000000000000000000000000000000006040870151151560a81b169360a01b169116171790556040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b0390a201613946565b613a9381613775565b9063ffffffff602083015116158015613af0575b613ab95750516001600160e01b031690565b6001600160a01b03907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506001600160e01b0382511615613aa7565b33600052600360205260406000205415613b1857565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6001600160a01b03600154163303613b5a57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b61111d613baa91959493929567ffffffffffffffff166000526009602052604060002090565b936101608501947f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613c1d88517fffffffff000000000000000000000000000000000000000000000000000000001690565b1614613d99577f1e10bdc4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613c8f88517fffffffff000000000000000000000000000000000000000000000000000000001690565b1614613d10576118e5613cc287517fffffffff000000000000000000000000000000000000000000000000000000001690565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff0000000000000000000000000000000000000000000000000000000016600452602490565b60609192939495508063ffffffff613d3f610180613d3786613d4896015163ffffffff1690565b930151151590565b911686866153bb565b015181613d90575b50613d6657613d60913691613147565b90600190565b7f5bed51920000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538613d50565b6101e00151939450613dbe93919291613db8915063ffffffff166117c7565b9161513c565b906127486020613d378461525d565b90613dd7826109d2565b613de4604051918261057b565b828152601f19613df482946109d2565b019060005b828110613e0557505050565b806060602080938501015201613df9565b91908110156127fd5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561021c570190565b815181546020808501516040808701517fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090941663ffffffff958616179190921b67ffffffff00000000161791901b69ffff000000000000000016178255606083015161022c93613f669260a092613f08911685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b613f5f613f1c608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092613fba82828686614fef565b600052600460205260ff6040600020541615613fd65750505050565b6040517f097e17ff0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b0390fd5b604d81116126a657600a0a90565b60ff1660120160ff81116126a65760ff16906024821115614117577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116126a6576140cd6140d39261406e565b906126de565b6001600160e01b0381116140ed576001600160e01b031690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b9060240390602482116126a6576121436141309261406e565b6140d3565b9060ff80911691160160ff81116126a65760ff16906024821115614117577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116126a6576140cd6140d39261406e565b906147a3610240600161022c946141d46141a38651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b61421a6141e6602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b61426661422e604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b6142b661427a606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b61430a6142ca608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b61435c61431b60a087015160ff1690565b82547fffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff1660789190911b6fff00000000000000000000000000000016178255565b6143af61436d60c087015160ff1690565b82547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff1660809190911b70ff0000000000000000000000000000000016178255565b6144056143c160e087015161ffff1690565b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff1660889190911b72ffff000000000000000000000000000000000016178255565b61446261441a61010087015163ffffffff1690565b82547fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff1660989190911b76ffffffff0000000000000000000000000000000000000016178255565b6144bf61447561012087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b61451e6144d261014087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b61459f61454f6101608701517fffffffff000000000000000000000000000000000000000000000000000000001690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660089190911c7effffffff00000000000000000000000000000000000000000000000000000016178255565b6146006145b0610180870151151590565b82547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016178255565b01926146446146156101a083015161ffff1690565b859061ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000825416179055565b6146906146596101c083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff1660109190911b65ffffffff000016178555565b6146e06146a56101e083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1660309190911b69ffffffff00000000000016178555565b61473c6146f961020083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178555565b61479861475161022083015163ffffffff1690565b85547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff1660909190911b75ffffffff00000000000000000000000000000000000016178555565b015163ffffffff1690565b7fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff79ffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b519069ffffffffffffffffffff8216820361021c57565b908160a091031261021c57614818816147ed565b916020820151916040810151916127486080606084015193016147ed565b6040513d6000823e3d90fd5b9081602091031261021c575161274881611a50565b61485f612ce2565b5061487761358261358283516001600160a01b031690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa92831561497f57600092600094614984575b50600083126140ed576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831561497f576127489363ffffffff9361492093600092614949575b506020015160ff165b90614135565b9261493b61492c61059e565b6001600160e01b039095168552565b1663ffffffff166020830152565b61491a919250614970602091823d8411614978575b614968818361057b565b810190614842565b929150614911565b503d61495e565b614836565b9093506149aa91925060a03d60a0116149b7575b6149a2818361057b565b810190614804565b50939250509192386148ba565b503d614998565b91939492906149d76117c7604085015163ffffffff1690565b808211614c07575050602082015161ffff16808511614bd15750610160820193614a2185517fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f2812d52c000000000000000000000000000000000000000000000000000000008103614aeb5750505081614abb91614ae696614a8e6101e0612748989796015163ffffffff1690565b9063ffffffff614ab3610180614aab606088015163ffffffff1690565b960151151590565b94169261577f565b519384925b517fffffffff000000000000000000000000000000000000000000000000000000001690565b615669565b94969195947f1e10bdc40000000000000000000000000000000000000000000000000000000003614b82575090829163ffffffff614b41610180614b396060614b4998015163ffffffff1690565b950151151590565b9316916153bb565b91151580614b76575b613d6657614ae692614b6e6117c7612748945163ffffffff1690565b938492614ac0565b50606082015115614b52565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7fd88dddd600000000000000000000000000000000000000000000000000000000600052600485905261ffff1660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192614c5d84610543565b546001600160e01b038116845260e01c9182602085015263ffffffff82169283614c97575b5050505061274890516001600160e01b031690565b63ffffffff1642908103939084116126a6578311614cb55780614c82565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b60408136031261021c57602060405191614d1183610543565b8035614d1c8161020b565b83520135602082015290565b9694919695929390956000946000986000986000965b808810614d52575050505050505050929190565b9091929394959697999a614d6f614d6a8a848b6127ed565b614cf8565b9a614dbd612b808d614da6614d988967ffffffffffffffff16600052600a602052604060002090565b91516001600160a01b031690565b6001600160a01b0316600052602052604060002090565b91614dce61173b60a0850151151590565b614f175760009c6040840190614de961229f835161ffff1690565b614e9f575b5050606083015163ffffffff16614e0491613920565b9c6080830151614e179063ffffffff1690565b614e2091613920565b9b8251614e309063ffffffff1690565b63ffffffff16614e3f90612684565b60019390808310614e9357506123586117c76020614e6293015163ffffffff1690565b808211614e825750614e73916138e2565b985b0196959493929190614d3e565b9050614e8d916138e2565b98614e75565b915050614e8d916138e2565b90612143614f08939f614ef6614eff9460208f8e61229f95506001600160a01b03614ed185516001600160a01b031690565b91166001600160a01b03821614614f1057614eec9150613a8a565b915b0151906157e7565b925161ffff1690565b620186a0900490565b9b3880614dee565b5091614eee565b999b5060019150614f3e84614f38614f4493614f328b612684565b906138e2565b9b613920565b9c613908565b9a614e75565b91939093806101e00193846101e0116126a65761012081029080820461012014901517156126a6576101e09101018093116126a65761229f610140614fe0612748966dffffffffffffffffffffffffffff61222c614fcb614fb8614fea9a63ffffffff6121439a16906138e2565b61214361229f6101208c015161ffff1690565b614f326117c76101008b015163ffffffff1690565b93015161ffff1690565b6126ab565b604080516001600160a01b039283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff00000000000000000000000000000000000000000000000000000000000090921660808301529061506d8160a08101612bc0565b51902090565b919091357fffffffff00000000000000000000000000000000000000000000000000000000811692600481106150a7575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161021c57831161021c57600401916003190190565b9060041161021c5790600490565b9081602091031261021c575190565b9081604091031261021c5760206040519161512d83610543565b805183520151612845816109ea565b91615145612ce2565b50811561523b575061518661206382806151807fffffffff000000000000000000000000000000000000000000000000000000009587615073565b956150d9565b91167f181dcf100000000000000000000000000000000000000000000000000000000081036151c357508060208061274893518301019101615113565b7f97a657c90000000000000000000000000000000000000000000000000000000014615213577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b8060208061522693518301019101615104565b61522e61059e565b9081526000602082015290565b91505067ffffffffffffffff61524f61059e565b911681526000602082015290565b6020604051917f181dcf100000000000000000000000000000000000000000000000000000000082840152805160248401520151151560448201526044815261274860648261057b565b604051906152b482610527565b60606080836000815260006020820152600060408201526000838201520152565b60208183031261021c5780359067ffffffffffffffff821161021c57019060a08282031261021c576040519161530a83610527565b6153138161112e565b835261532160208201610b65565b60208401526040810135615334816109ea565b60408401526060810135606084015260808101359067ffffffffffffffff821161021c57019080601f8301121561021c578135615370816109d2565b9261537e604051948561057b565b81845260208085019260051b82010192831161021c57602001905b8282106153ab57505050608082015290565b8135815260209182019101615399565b6153c36152a7565b5081156154f6577f1f3b3aba000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000061541f61541985856150f6565b90615073565b16036154cc578161543b92615433926150d9565b8101906152d5565b91806154b6575b61548c5763ffffffff615459835163ffffffff1690565b16116154625790565b7f2e2b0c290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b506154c761173b6040840151151590565b615442565b7f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb00b53dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff0000000000000000000000000000000000000000000000000000000082167f2812d52c0000000000000000000000000000000000000000000000000000000081146155ee577f1e10bdc400000000000000000000000000000000000000000000000000000000146155e1577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000821660045260246000fd5b61022c9150600190615818565b50905060208151036156275761560d6020825183010160208301615104565b6001600160a01b03811190811561565d575b506156275750565b61406a906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615807565b6104009150103861561f565b917fffffffff0000000000000000000000000000000000000000000000000000000083167f2812d52c000000000000000000000000000000000000000000000000000000008114615737577f1e10bdc4000000000000000000000000000000000000000000000000000000001461572a577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b61022c9250151590615818565b5050905060208151036156275761560d6020825183010160208301615104565b6001600160a01b036127489116600b615948565b6001600160a01b036127489116600b615a7c565b9063ffffffff61579c93959495615794612ce2565b50169161513c565b918251116157bd57806157b1575b61548c5790565b506020810151156157aa565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b670de0b6b3a7640000916001600160e01b0361580392166126cb565b0490565b9060206127489281815201906105bd565b906020825103615880576158295750565b60208180518101031261021c576020810151156158435750565b61406a906040519182917fff828faa00000000000000000000000000000000000000000000000000000000835260206004840181815201906105bd565b6040517fff828faa000000000000000000000000000000000000000000000000000000008152602060048201528061406a60248201856105bd565b80548210156127fd5760005260206000200190600090565b916158ed918354906000199060031b92831b921b19161790565b9055565b8054801561591957600019019061590882826158bb565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60018101918060005282602052604060002054928315156000146159fa5760001984018481116126a65783549360001985019485116126a65760009585836159ab9761599c95036159b1575b5050506158f1565b90600052602052604060002090565b55600190565b6159e16159db916159d26159c86159f195886158bb565b90549060031b1c90565b928391876158bb565b906158d3565b8590600052602052604060002090565b55388080615994565b50505050600090565b805490680100000000000000008210156105225781615a2a9160016158ed940181556158bb565b81939154906000199060031b92831b921b19161790565b600081815260036020526040902054615a7657615a5f816002615a03565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615ab35780615a9e83600193615a03565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615ab3576000198201908282116126a6576002549260001984019384116126a65783836159ab9460009603615b1a575b505050615b0960026158f1565b600390600052602052604060002090565b615b096159db91615b326159c8615b3c9560026158bb565b92839160026158bb565b55388080615afc56fea164736f6c634300081a000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"priceUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"FEE_BASE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyFeeTokensUpdates\",\"inputs\":[{\"name\":\"feeTokensToRemove\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokensToAdd\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"inputs\":[{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertTokenAmount\",\"inputs\":[{\"name\":\"fromToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fromTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"toToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestinationChainGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeTokens\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPremiumMultiplierWeiPerEth\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenAndGasPrices\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokenPrice\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"gasPriceValue\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPriceFeedConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrices\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessageArgs\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"convertedExtraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setReportPermissions\",\"inputs\":[{\"name\":\"permissions\",\"type\":\"tuple[]\",\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrices\",\"inputs\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTokenPriceFeeds\",\"inputs\":[{\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenAdded\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenRemoved\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferRequested\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PriceFeedPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"priceFeedConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReportPermissionSet\",\"inputs\":[{\"name\":\"reportId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"permission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerUnitGasUpdated\",\"inputs\":[{\"name\":\"destChain\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DataFeedValueOutOfUint224Range\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DestinationChainNotEnabled\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeTokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidChainFamilySelector\",\"inputs\":[{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidDestBytesOverhead\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidEVMAddress\",\"inputs\":[{\"name\":\"encodedAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsTag\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeRange\",\"inputs\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMAddress\",\"inputs\":[{\"name\":\"SVMAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMExtraArgsWritableBitmap\",\"inputs\":[{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStaticConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageComputeUnitLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageFeeTooHigh\",\"inputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MessageGasLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTooLarge\",\"inputs\":[{\"name\":\"maxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportForwarderUnauthorized\",\"inputs\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}]},{\"type\":\"error\",\"name\":\"SourceTokenDataTooLarge\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StaleGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timePassed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TooManySVMExtraArgsAccounts\",\"inputs\":[{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedNumberOfTokens\",\"inputs\":[{\"name\":\"numberOfTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x60e06040523461106a5761721d80380380610019816112d6565b928339810190808203610120811261106a5760601361106a5761003a611298565b81516001600160601b038116810361106a57815261005a602083016112fb565b906020810191825261006e6040840161130f565b6040820190815260608401516001600160401b03811161106a5785610094918601611337565b60808501519094906001600160401b03811161106a57866100b6918301611337565b60a08201519096906001600160401b03811161106a5782019080601f8301121561106a5781516100ed6100e882611320565b6112d6565b9260208085848152019260071b8201019083821161106a57602001915b8183106112235750505060c08301516001600160401b03811161106a5783019781601f8a01121561106a578851986101446100e88b611320565b996020808c838152019160051b8301019184831161106a5760208101915b8383106110c1575050505060e08401516001600160401b03811161106a5784019382601f8601121561106a57845161019c6100e882611320565b9560208088848152019260061b8201019085821161106a57602001915b81831061108557505050610100810151906001600160401b03821161106a570182601f8201121561106a578051906101f36100e883611320565b93602061028081878681520194028301019181831161106a57602001925b828410610ea857505050503315610e9757600180546001600160a01b031916331790556020986102408a6112d6565b976000895260003681376102526112b7565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d6113d0565b51168d610287826115bc565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b6113d0565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c83610320600195611544565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5081518a985089906001600160a01b0316158015610e85575b8015610e76575b610e655791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c052610392866112d6565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a6113d0565b5116611451565b6103d2575b0161039f565b818060a01b036103e282896113d0565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b0361043783896113d0565b5116611583565b610449575b01610416565b818060a01b0361045982886113d0565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b835181101561054757806104a3600192866113d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606089858060a01b038451169301518360005260078b5260406000209060ff878060a01b038251169283898060a01b03198254161781558d8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168c8301525115156040820152a20161048d565b5091509160005b8251811015610afd5761056181846113d0565b51856001600160401b0361057584876113d0565b5151169101519080158015610aea575b8015610acc575b8015610a92575b610a7e57600081815260098852604090205460019392919060081b6001600160e01b03191661093657807f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806106fc868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a25b60005260098752826040600020825115158382549162ffff008c83015160081b169066ffffffff000000604084015160181b166affffffff00000000000000606085015160381b16926effffffff0000000000000000000000608086015160581b169260ff60781b60a087015160781b169460ff60801b60c088015160801b169161ffff60881b60e089015160881b169063ffffffff60981b6101008a015160981b169361ffff60b81b6101208b015160b81b169661ffff60c81b6101408c015160c81b169963ffffffff60d81b6101608d015160081c169b61018060ff60f81b910151151560f81b169c8f8060f81b039a63ffffffff60d81b199961ffff60c81b199861ffff60b81b199763ffffffff60981b199661ffff60881b199560ff60801b199460ff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff19161716171617161716171617161716171617161716179063ffffffff60d81b1617178155019061ffff6101a0820151169082549165ffffffff00006101c083015160101b169269ffffffff0000000000006101e084015160301b166a01000000000000000000008860901b0361020085015160501b169263ffffffff60901b61022086015160901b169461024063ffffffff60b01b91015160b01b169563ffffffff60b01b199363ffffffff60901b19926a01000000000000000000008c60901b0319918c8060501b03191617161716171617171790550161054e565b807f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e360405180610a76868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a2610700565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff60e01b61016083015116630a04b54b60e21b8114159081610aba575b50610593565b6307842f7160e21b1415905088610ab4565b5063ffffffff6101e08301511663ffffffff6060840151161061058c565b5063ffffffff6101e08301511615610585565b84828560005b8151811015610b83576001906001600160a01b03610b2182856113d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b5786896113d0565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610b03565b83600184610b90836112d6565b9060008252600092610e60575b909282935b8251851015610d9f57610bb585846113d0565b5180516001600160401b0316939083019190855b83518051821015610d8e57610bdf8287926113d0565b51015184516001600160a01b0390610bf89084906113d0565b5151169063ffffffff815116908781019163ffffffff8351169081811015610d795750506080810163ffffffff815116898110610d62575090899291838c52600a8a5260408c20600160a01b6001900386168d528a5260408c2092825163ffffffff169380549180518d1b67ffffffff0000000016916040860192835160401b69ffff000000000000000016966060810195865160501b6dffffffff00000000000000000000169063ffffffff60701b895160701b169260a001998b60ff60901b8c51151560901b169560ff60901b199363ffffffff60701b19926dffffffff000000000000000000001991600160501b60019003191617161716171617171790556040519586525163ffffffff168c8601525161ffff1660408501525163ffffffff1660608401525163ffffffff16608083015251151560a082015260c07f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b591a3600101610bc9565b6312766e0160e11b8c52600485905260245260448bfd5b6305a7b3d160e11b8c5260045260245260448afd5b505060019096019593509050610ba2565b9150825b8251811015610e21576001906001600160401b03610dc182866113d0565b515116828060a01b0384610dd584886113d0565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610da3565b604051615bcc908161165182396080518181816104420152612a3e015260a05181818161047801526129ef015260c05181818161049f01526137c60152f35b610b9d565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b838203610280811261106a57610260610ebf6112b7565b91610ec9876113ad565b8352601f19011261106a576040519161026083016001600160401b0381118482101761106f57604052610efe602087016113a0565b8352610f0c604087016113c1565b6020840152610f1d6060870161130f565b6040840152610f2e6080870161130f565b6060840152610f3f60a0870161130f565b6080840152610f5060c08701611392565b60a0840152610f6160e08701611392565b60c0840152610f7361010087016113c1565b60e0840152610f85610120870161130f565b610100840152610f9861014087016113c1565b610120840152610fab61016087016113c1565b610140840152610180860151916001600160e01b03198316830361106a5783602093610160610280960152610fe36101a089016113a0565b610180820152610ff66101c089016113c1565b6101a08201526110096101e0890161130f565b6101c082015261101c610200890161130f565b6101e082015261102f61022089016113ad565b610200820152611042610240890161130f565b610220820152611055610260890161130f565b61024082015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408387031261106a57602060409161109c6112b7565b6110a5866112fb565b81526110b28387016113ad565b838201528152019201916101b9565b82516001600160401b03811161106a5782016040818803601f19011261106a576110e96112b7565b906110f6602082016113ad565b825260408101516001600160401b03811161106a57602091010187601f8201121561106a5780516111296100e882611320565b91602060e08185858152019302820101908a821161106a57602001915b8183106111655750505091816020938480940152815201920191610162565b828b0360e0811261106a5760c061117a6112b7565b91611184866112fb565b8352601f19011261106a576040519160c08301916001600160401b0383118484101761106f5760e0936020936040526111be84880161130f565b81526111cc6040880161130f565b848201526111dc606088016113c1565b60408201526111ed6080880161130f565b60608201526111fe60a0880161130f565b608082015261120f60c088016113a0565b60a082015283820152815201920191611146565b8284036080811261106a5760606112386112b7565b91611242866112fb565b8352601f19011261106a5760809160209161125b611298565b6112668488016112fb565b815261127460408801611392565b84820152611284606088016113a0565b60408201528382015281520192019161010a565b60405190606082016001600160401b0381118382101761106f57604052565b60408051919082016001600160401b0381118382101761106f57604052565b6040519190601f01601f191682016001600160401b0381118382101761106f57604052565b51906001600160a01b038216820361106a57565b519063ffffffff8216820361106a57565b6001600160401b03811161106f5760051b60200190565b9080601f8301121561106a5781516113516100e882611320565b9260208085848152019260051b82010192831161106a57602001905b82821061137a5750505090565b60208091611387846112fb565b81520191019061136d565b519060ff8216820361106a57565b5190811515820361106a57565b51906001600160401b038216820361106a57565b519061ffff8216820361106a57565b80518210156113e45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156113e45760005260206000200190600090565b8054801561143b57600019019061142982826113fa565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c602052604090205480156115125760001981018181116114fc57600b546000198101919082116114fc578181036114ab575b505050611497600b611412565b600052600c60205260006040812055600190565b6114e46114bc6114cd93600b6113fa565b90549060031b1c928392600b6113fa565b819391549060031b91821b91600019901b19161790565b9055600052600c60205260406000205538808061148a565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8054906801000000000000000082101561106f57816114cd916001611540940181556113fa565b9055565b8060005260036020526040600020541560001461157d57611566816002611519565b600254906000526003602052604060002055600190565b50600090565b80600052600c6020526040600020541560001461157d576115a581600b611519565b600b5490600052600c602052604060002055600190565b60008181526003602052604090205480156115125760001981018181116114fc576002546000198101919082116114fc57808203611616575b5050506116026002611412565b600052600360205260006040812055600190565b6116386116276114cd9360026113fa565b90549060031b1c92839260026113fa565b905560005260036020526040600020553880806115f556fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461020657806301ffc9a714610201578063061877e3146101fc57806306285c69146101f7578063181f5a77146101f25780632451a627146101ed578063325c868e146101e85780633937306f146101e357806341ed29e7146101de578063430d138c146101d957806345ac924d146101d45780634ab35b0b146101cf578063514e8cff146101ca5780636def4ce7146101c5578063770e2dc4146101c057806379ba5097146101bb5780637afac322146101b6578063805f2132146101b157806382b49eb0146101ac57806387b8d879146101a75780638da5cb5b146101a257806391a2749a1461019d578063a69c64c014610198578063bf78e03f14610193578063cdc73d511461018e578063d02641a014610189578063d63d3af214610184578063d8694ccd1461017f578063f2fde38b1461017a578063fbe3f778146101755763ffdb4b371461017057600080fd5b612595565b612498565b6123dc565b611f78565b611f5c565b611f13565b611e9c565b611df6565b611d3d565b611ca9565b611c82565b611a66565b6118e9565b61164e565b611515565b6113fd565b6111de565b61105f565b610e88565b610e50565b610d87565b610c5a565b6109ff565b610743565b610727565b6106a4565b6105fe565b610406565b6103be565b61029a565b61022e565b6001600160a01b0381160361021c57565b600080fd5b359061022c8261020b565b565b3461021c57606060031936011261021c5760206102656004356102508161020b565b602435604435916102608361020b565b612717565b604051908152f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361021c57565b3461021c57602060031936011261021c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361021c577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f2132000000000000000000000000000000000000000000000000000000008114908115610394575b811561036a575b8115610340575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610335565b7f181f5a77000000000000000000000000000000000000000000000000000000008114915061032e565b7f9b645f410000000000000000000000000000000000000000000000000000000081149150610327565b3461021c57602060031936011261021c576001600160a01b036004356103e38161020b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b3461021c57600060031936011261021c5761041f61274b565b50606060405161042e81610506565b63ffffffff6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016918281526001600160a01b0360406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761052257604052565b6104d7565b60a0810190811067ffffffffffffffff82111761052257604052565b6040810190811067ffffffffffffffff82111761052257604052565b60c0810190811067ffffffffffffffff82111761052257604052565b90601f601f19910116810190811067ffffffffffffffff82111761052257604052565b6040519061022c60408361057b565b6040519061022c6102608361057b565b919082519283825260005b8481106105e9575050601f19601f8460006020809697860101520116010190565b806020809284010151828286010152016105c8565b3461021c57600060031936011261021c5761065d6040805190610621818361057b565b601382527f46656551756f74657220312e362e302d646576000000000000000000000000006020830152519182916020835260208301906105bd565b0390f35b602060408183019282815284518094520192019060005b8181106106855750505090565b82516001600160a01b0316845260209384019390920191600101610678565b3461021c57600060031936011261021c5760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b8181106107115761065d856107058187038261057b565b60405191829182610661565b82548452602090930192600192830192016106ee565b3461021c57600060031936011261021c57602060405160248152f35b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c5780600401906040600319823603011261021c57610781613aff565b61078b828061276a565b4263ffffffff1692915060005b8181106108fc575050602401906107af828461276a565b92905060005b8381106107be57005b806107dd6107d86001936107d2868a61276a565b906127ed565b61284d565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff6108d86108ca60208501946108bc61082687516001600160e01b031690565b61084061083161059e565b6001600160e01b039092168252565b63ffffffff8c16602082015261087b610861845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000166001600160e01b0392909216919091179055565b5167ffffffffffffffff1690565b93516001600160e01b031690565b604080516001600160e01b039290921682524260208301529190931692a2016107b5565b806109156109106001936107d2898061276a565b612816565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036109ae6108ca60208501946109a161095d87516001600160e01b031690565b61096861083161059e565b63ffffffff8d16602082015261087b61098884516001600160a01b031690565b6001600160a01b03166000526006602052604060002090565b516001600160a01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610798565b67ffffffffffffffff81116105225760051b60200190565b8015150361021c57565b359061022c826109ea565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590610a3c826109d2565b90610a4a604051928361057b565b828252602460a06020840194028201019036821161021c57602401925b818410610a7957610a7783612872565b005b60a08436031261021c5760405190610a9082610527565b8435610a9b8161020b565b825260208501357fffffffffffffffffffff000000000000000000000000000000000000000000008116810361021c5760208301526040850135907fffff0000000000000000000000000000000000000000000000000000000000008216820361021c5782602092604060a0950152610b1660608801610221565b6060820152610b27608088016109f4565b6080820152815201930192610a67565b6004359067ffffffffffffffff8216820361021c57565b6024359067ffffffffffffffff8216820361021c57565b359067ffffffffffffffff8216820361021c57565b9181601f8401121561021c5782359167ffffffffffffffff831161021c576020838186019501011161021c57565b9181601f8401121561021c5782359167ffffffffffffffff831161021c576020808501948460051b01011161021c57565b929091610bfa928452151560208401526080604084015260808301906105bd565b906060818303910152815180825260208201916020808360051b8301019401926000915b838310610c2d57505050505090565b9091929394602080610c4b83601f19866001960301875289516105bd565b97019301930191939290610c1e565b3461021c5760c060031936011261021c57610c73610b37565b60243590610c808261020b565b60443560643567ffffffffffffffff811161021c57610ca3903690600401610b7a565b60849391933567ffffffffffffffff811161021c57610cc6903690600401610ba8565b9160a4359567ffffffffffffffff871161021c573660238801121561021c5786600401359567ffffffffffffffff871161021c573660248860061b8a01011161021c5761065d986024610d1a9901966129e4565b9060409492945194859485610bd9565b602060408183019282815284518094520192019060005b818110610d4e5750505090565b9091926020604082610d7c600194885163ffffffff602080926001600160e01b038151168552015116910152565b019401929101610d41565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c57610db8903690600401610ba8565b610dc1816109d2565b91610dcf604051938461057b565b818352601f19610dde836109d2565b0160005b818110610e3957505060005b82811015610e2b57600190610e0f610e0a8260051b8501612cf8565b613772565b610e1982876129d0565b52610e2481866129d0565b5001610dee565b6040518061065d8682610d2a565b602090610e44612cdf565b82828801015201610de2565b3461021c57602060031936011261021c576020610e77600435610e728161020b565b613a87565b6001600160e01b0360405191168152f35b3461021c57602060031936011261021c5767ffffffffffffffff610eaa610b37565b610eb2612cdf565b50166000526005602052604060002060405190610ece82610543565b546001600160e01b038116825260e01c6020820152604051809161065d82604081019263ffffffff602080926001600160e01b038151168552015116910152565b61022c9092919261024080610260830195610f2c84825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015160ff169085015260c08181015160ff169085015260e08181015161ffff16908501526101008181015163ffffffff16908501526101208181015161ffff16908501526101408181015161ffff1690850152610160818101517fffffffff000000000000000000000000000000000000000000000000000000001690850152610180818101511515908501526101a08181015161ffff16908501526101c08181015163ffffffff16908501526101e08181015163ffffffff16908501526102008181015167ffffffffffffffff16908501526102208181015163ffffffff1690850152015163ffffffff16910152565b3461021c57602060031936011261021c5761065d61112261111d611081610b37565b600061024061108e6105ad565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015282610220820152015267ffffffffffffffff166000526009602052604060002090565b612d27565b60405191829182610f0f565b359063ffffffff8216820361021c57565b359061ffff8216820361021c57565b81601f8201121561021c57803590611165826109d2565b92611173604051948561057b565b82845260208085019360061b8301019181831161021c57602001925b82841061119d575050505090565b60408483031261021c57602060409182516111b781610543565b6111c087610b65565b8152828701356111cf8161020b565b8382015281520193019261118f565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013561121a816109d2565b91611228604051938461057b565b8183526024602084019260051b8201019036821161021c5760248101925b828410611277576024358567ffffffffffffffff821161021c57611271610a7792369060040161114e565b90612e95565b833567ffffffffffffffff811161021c57820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261021c57604051906112c382610543565b6112cf60248201610b65565b8252604481013567ffffffffffffffff811161021c57602491010136601f8201121561021c578035611300816109d2565b9161130e604051938461057b565b818352602060e081850193028201019036821161021c57602001915b8183106113495750505091816020938480940152815201930192611246565b82360360e0811261021c5760c0601f196040519261136684610543565b86356113718161020b565b8452011261021c5760e09160209160405161138b8161055f565b61139684880161112e565b81526113a46040880161112e565b848201526113b46060880161113f565b60408201526113c56080880161112e565b60608201526113d660a0880161112e565b608082015260c08701356113e9816109ea565b60a08201528382015281520192019161132a565b3461021c57600060031936011261021c576000546001600160a01b0381163303611484577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f8301121561021c5781356114c5816109d2565b926114d3604051948561057b565b81845260208085019260051b82010192831161021c57602001905b8282106114fb5750505090565b60208091833561150a8161020b565b8152019101906114ee565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c576115469036906004016114ae565b60243567ffffffffffffffff811161021c576115669036906004016114ae565b9061156f613b43565b60005b81518110156115de578061159361158e6109a1600194866129d0565b6157d1565b61159e575b01611572565b6001600160a01b036115b36109a183866129d0565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a2611598565b8260005b8151811015610a7757806116036115fe6109a1600194866129d0565b6157e5565b61160e575b016115e2565b6001600160a01b036116236109a183866129d0565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2611608565b3461021c57604060031936011261021c5760043567ffffffffffffffff811161021c5761167f903690600401610b7a565b6024359167ffffffffffffffff831161021c576116d86116d06116b66116ac6116e0963690600401610b7a565b9490953691613144565b90604082015190605e604a84015160601c93015191929190565b919033613f5d565b81019061318b565b60005b8151811015610a775761172b61172661170d6116ff84866129d0565b51516001600160a01b031690565b6001600160a01b03166000526007602052604060002090565b61324a565b61173f61173b6040830151151590565b1590565b6118a0579061178a6117576020600194015160ff1690565b611784611778602061176986896129d0565b5101516001600160e01b031690565b6001600160e01b031690565b9061402f565b6117a5604061179984876129d0565b51015163ffffffff1690565b63ffffffff6117d06117c76117c06109886116ff888b6129d0565b5460e01c90565b63ffffffff1690565b91161061189a5761181e6117e9604061179985886129d0565b61180e6117f461059e565b6001600160e01b03851681529163ffffffff166020830152565b61087b6109886116ff86896129d0565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036118546116ff85886129d0565b6118906118666040611799888b6129d0565b60405193849316958390929163ffffffff6020916001600160e01b03604085019616845216910152565b0390a25b016116e3565b50611894565b6118e56118b06116ff84866129d0565b7f06439c6b000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b6000fd5b3461021c57604060031936011261021c5761065d611971611908610b37565b67ffffffffffffffff6024359161191e8361020b565b600060a060405161192e8161055f565b828152826020820152826040820152826060820152826080820152015216600052600a6020526040600020906001600160a01b0316600052602052604060002090565b6119ed6119e4604051926119848461055f565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c1660408501526119cb6119be8263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b60ff81160361021c57565b359061022c82611a50565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590611aa3826109d2565b90611ab1604051928361057b565b82825260246102806020840194028201019036821161021c57602401925b818410611adf57610a77836132da565b833603610280811261021c57610260601f1960405192611afe84610543565b611b0788610b65565b8452011261021c5761028091602091611b1e6105ad565b611b298489016109f4565b8152611b376040890161113f565b84820152611b476060890161112e565b6040820152611b586080890161112e565b6060820152611b6960a0890161112e565b6080820152611b7a60c08901611a5b565b60a0820152611b8b60e08901611a5b565b60c0820152611b9d610100890161113f565b60e0820152611baf610120890161112e565b610100820152611bc2610140890161113f565b610120820152611bd5610160890161113f565b610140820152611be8610180890161026d565b610160820152611bfb6101a089016109f4565b610180820152611c0e6101c0890161113f565b6101a0820152611c216101e0890161112e565b6101c0820152611c34610200890161112e565b6101e0820152611c476102208901610b65565b610200820152611c5a610240890161112e565b610220820152611c6d610260890161112e565b61024082015283820152815201930192611acf565b3461021c57600060031936011261021c5760206001600160a01b0360015416604051908152f35b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c576040600319823603011261021c57604051611ce681610543565b816004013567ffffffffffffffff811161021c57611d0a90600436918501016114ae565b8152602482013567ffffffffffffffff811161021c57610a77926004611d3392369201016114ae565b6020820152613544565b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c57806004013590611d7a826109d2565b90611d88604051928361057b565b8282526024602083019360061b8201019036821161021c57602401925b818410611db557610a7783613696565b60408436031261021c5760206040918251611dcf81610543565b8635611dda8161020b565b8152611de7838801610b65565b83820152815201930192611da5565b3461021c57602060031936011261021c576001600160a01b03600435611e1b8161020b565b611e2361274b565b5016600052600760205261065d604060002060ff60405191611e4483610506565b546001600160a01b0381168352818160a01c16602084015260a81c16151560408201526040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b3461021c57600060031936011261021c57604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b818110611efd5761065d856107058187038261057b565b8254845260209093019260019283019201611ee6565b3461021c57602060031936011261021c576040611f35600435610e0a8161020b565b611f5a8251809263ffffffff602080926001600160e01b038151168552015116910152565bf35b3461021c57600060031936011261021c57602060405160128152f35b3461021c57604060031936011261021c57611f91610b37565b60243567ffffffffffffffff811161021c57806004019060a0600319823603011261021c57611fd761111d8467ffffffffffffffff166000526009602052604060002090565b611fe461173b8251151590565b6123a4576064820161201a61173b611ffb83612cf8565b6001600160a01b03166000526001600b01602052604060002054151590565b612363579083916044840195612030878561276a565b9590506120716024820191612054608461204a858a61388e565b939050018861388e565b908961206a6120638b8061388e565b3691613144565b9389614971565b928461207f610e7283612cf8565b98899461209d61209761022085015163ffffffff1690565b82614cb1565b9b6000808c1561232957505061210361ffff856121289961210f99989661214396612136966120fa6120ea6101c06120de6101a06121499f015161ffff1690565b97015163ffffffff1690565b916120f48c612cf8565b9461276a565b96909516614da2565b98919897909894612cf8565b6001600160a01b03166000526008602052604060002090565b5467ffffffffffffffff1690565b67ffffffffffffffff1690565b906126cb565b9560009761ffff61216061014089015161ffff1690565b166122ce575b509461214361213661020061223461065d9d6dffffffffffffffffffffffffffff61222c61224c9f9e9b6122276001600160e01b039f9b9c6122449f6122279e63ffffffff6121bb6122279f6121c59461388e565b92905016906138df565b908b60a081016121e86121e26121dc835160ff1690565b60ff1690565b856126cb565b9360e08301916121fa835161ffff1690565b9061ffff8216831161225c575b5050505060800151612227916117c79163ffffffff1661391d565b61391d565b6138df565b9116906126cb565b93015167ffffffffffffffff1690565b9116906126de565b6040519081529081906020820190565b6117c7949650612227959361ffff6122bd6122ac612222966122a661229f61229660809960ff6122906122c49b5160ff1690565b166138ec565b965161ffff1690565b61ffff1690565b90613765565b6121436121dc60c08d015160ff1690565b91166138df565b9593839550612207565b909594989750826122f48b989495986dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff169161230f848961388e565b905061231b9388614fc4565b969793943896939296612166565b969593509650505061214361213661212861210f61235d6123586117c761024061214999015163ffffffff1690565b612684565b94612cf8565b61236f6118e591612cf8565b7f2502348c000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b3461021c57602060031936011261021c576001600160a01b036004356124018161020b565b612409613b43565b1633811461246e57807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461021c57602060031936011261021c5760043567ffffffffffffffff811161021c573660238201121561021c578060040135906124d5826109d2565b906124e3604051928361057b565b8282526024602083019360071b8201019036821161021c57602401925b81841061251057610a7783613937565b8336036080811261021c576060601f196040519261252d84610543565b87356125388161020b565b8452011261021c5760809160209160405161255281610506565b8388013561255f8161020b565b8152604088013561256f81611a50565b848201526060880135612581816109ea565b604082015283820152815201930192612500565b3461021c57604060031936011261021c576004356125b28161020b565b6125ba610b4e565b9067ffffffffffffffff82169182600052600960205260ff6040600020541615612627576125ea61260b92613a87565b92600052600960205263ffffffff60016040600020015460901c1690614cb1565b604080516001600160e01b039384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc1000014901517156126a657565b612655565b90655af3107a4000820291808304655af3107a400014901517156126a657565b818102929181159184041417156126a657565b81156126e8570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b61274161273b61274894936001600160e01b036127348195613a87565b16906126cb565b92613a87565b16906126de565b90565b6040519061275882610506565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561021c570180359067ffffffffffffffff821161021c57602001918160061b3603831361021c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156127fd5760061b0190565b6127be565b35906001600160e01b038216820361021c57565b60408136031261021c5761284560206040519261283284610543565b803561283d8161020b565b845201612802565b602082015290565b60408136031261021c5761284560206040519261286984610543565b61283d81610b65565b9061287b613b43565b60005b82518110156129cb5780612894600192856129d0565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a06001600160a01b038351169260608101936001600160a01b0380865116957fffff00000000000000000000000000000000000000000000000000000000000061293260208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c511692615069565b977fffffffffffffffffffff00000000000000000000000000000000000000000000608087019561299e875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a20161287e565b509050565b80518210156127fd5760209160051b010190565b9895979692949391907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382166001600160a01b03821614600014612ccf575050935b6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016808611612c9e575090612a719189613b81565b979096612abe612a958367ffffffffffffffff166000526009602052604060002090565b5460081b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90612ac881613d80565b9760005b828110612ae0575050505050505093929190565b612af3612aee8284896127ed565b612cf8565b8388612b0d612b03858484613dc9565b604081019061388e565b905060208111612c23575b508392612b47612b41612063612b37600198612b8297612b7d97613dc9565b602081019061388e565b8961559a565b612b658967ffffffffffffffff16600052600a602052604060002090565b906001600160a01b0316600052602052604060002090565b613280565b60a081015115612be757612bcb612ba36060612bbd93015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b03601f19810183528261057b565b612bd5828d6129d0565b52612be0818c6129d0565b5001612acc565b50612bbd612bcb612c1e84612c108a67ffffffffffffffff166000526009602052604060002090565b015460101c63ffffffff1690565b612ba3565b915050612c5b6117c7612c4e84612b658b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b10612c6857838838612b18565b7f36f536ca000000000000000000000000000000000000000000000000000000006000526001600160a01b031660045260246000fd5b857f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b91612cd992612717565b93612a2f565b60405190612cec82610543565b60006020838281520152565b356127488161020b565b90604051612d0f81610543565b91546001600160e01b038116835260e01c6020830152565b9061022c612e876001612d386105ad565b94612e26612e1c8254612d54612d4e8260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015260ff607882901c1660a08a015260ff608082901c1660c08a015261ffff608882901c1660e08a015263ffffffff609882901c166101008a015261ffff60b882901c166101208a015261ffff60c882901c166101408a01527fffffffff00000000000000000000000000000000000000000000000000000000600882901b166101608a015260f81c90565b1515610180880152565b015461ffff81166101a086015263ffffffff601082901c166101c086015263ffffffff603082901c166101e086015267ffffffffffffffff605082901c1661020086015263ffffffff609082901c1661022086015260b01c63ffffffff1690565b63ffffffff16610240840152565b90612e9e613b43565b6000915b805183101561309057612eb583826129d0565b5190612ec9825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b8551805182101561307b57612ef5826020926129d0565b510151612f066116ff8389516129d0565b8151602083015163ffffffff908116911681811015613042575050608082015163ffffffff1660208110613001575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b56001600160a01b0384612f90858f60019998612b65612f8b9267ffffffffffffffff16600052600a602052604060002090565b613e09565b612ff860405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a301612ede565b7f24ecdc02000000000000000000000000000000000000000000000000000000006000526001600160a01b0390911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b50509550925092600191500191929092612ea2565b50905060005b815181101561314057806130be6130af600193856129d0565b515167ffffffffffffffff1690565b67ffffffffffffffff6001600160a01b036130ed60206130de86896129d0565b5101516001600160a01b031690565b600061311182612b658767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613096565b5050565b92919267ffffffffffffffff8211610522576040519161316e601f8201601f19166020018461057b565b82948184528183011161021c578281602093846000960137010152565b60208183031261021c5780359067ffffffffffffffff821161021c570181601f8201121561021c578035906131bf826109d2565b926131cd604051948561057b565b8284526020606081860194028301019181831161021c57602001925b8284106131f7575050505090565b60608483031261021c57602060609160405161321281610506565b863561321d8161020b565b815261322a838801612802565b8382015261323a6040880161112e565b60408201528152019301926131e9565b9060405161325781610506565b604060ff8294546001600160a01b0381168452818160a01c16602085015260a81c161515910152565b9061022c6040516132908161055f565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b906132e3613b43565b60005b82518110156129cb576132f981846129d0565b5160206133096130af84876129d0565b9101519067ffffffffffffffff811680158015613525575b80156134f7575b801561344a575b61341257916133d88260019594613388613363612a956133dd9767ffffffffffffffff166000526009602052604060002090565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b6133e3577f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806133bb8782610f0f565b0390a267ffffffffffffffff166000526009602052604060002090565b61413c565b016132e6565b7f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3604051806133bb8782610f0f565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b507fffffffff0000000000000000000000000000000000000000000000000000000061349a6101608501517fffffffff000000000000000000000000000000000000000000000000000000001690565b167f2812d52c0000000000000000000000000000000000000000000000000000000081141590816134cc575b5061332f565b7f1e10bdc40000000000000000000000000000000000000000000000000000000091501415386134c6565b506101e083015163ffffffff1663ffffffff61351d6117c7606087015163ffffffff1690565b911611613328565b5063ffffffff61353d6101e085015163ffffffff1690565b1615613321565b61354c613b43565b60208101519160005b83518110156135d9578061356e6109a1600193876129d0565b61359061358b6001600160a01b0383165b6001600160a01b031690565b615b34565b61359c575b5001613555565b6040516001600160a01b039190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a138613595565b5091505160005b8151811015613140576135f66109a182846129d0565b906001600160a01b0382161561366c577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6136638361364861364361357f6001976001600160a01b031690565b615abb565b506040516001600160a01b0390911681529081906020820190565b0390a1016135e0565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b61369e613b43565b60005b815181101561314057806001600160a01b036136bf600193856129d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d61375c67ffffffffffffffff60206136fb86896129d0565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a2016136a1565b919082039182116126a657565b61377a612cdf565b506137a061379b826001600160a01b03166000526006602052604060002090565b612d02565b60208101916137bf6137b96117c7855163ffffffff1690565b42613765565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016116138675761172661380b916001600160a01b03166000526007602052604060002090565b61381b61173b6040830151151590565b801561386d575b6138675761382f9061480a565b9163ffffffff6138576117c761384c602087015163ffffffff1690565b935163ffffffff1690565b911610613862575090565b905090565b50905090565b506001600160a01b0361388782516001600160a01b031690565b1615613822565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561021c570180359067ffffffffffffffff821161021c5760200191813603831361021c57565b919082018092116126a657565b9061ffff8091169116029061ffff82169182036126a657565b63ffffffff60209116019063ffffffff82116126a657565b9063ffffffff8091169116019063ffffffff82116126a657565b90613940613b43565b60005b82518110156129cb5780613959600192856129d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf613a7e60206001600160a01b0384511693015183600052600760205260406000206139de6001600160a01b0383511682906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000075ff0000000000000000000000000000000000000000006040870151151560a81b169360a01b169116171790556040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b0390a201613943565b613a9081613772565b9063ffffffff602083015116158015613aed575b613ab65750516001600160e01b031690565b6001600160a01b03907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506001600160e01b0382511615613aa4565b33600052600360205260406000205415613b1557565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6001600160a01b03600154163303613b5757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b61111d613ba59194939467ffffffffffffffff166000526009602052604060002090565b926101608401937f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613c1887517fffffffff000000000000000000000000000000000000000000000000000000001690565b1614613d50577f1e10bdc4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613c8a87517fffffffff000000000000000000000000000000000000000000000000000000001690565b1614613d0b576118e5613cbd86517fffffffff000000000000000000000000000000000000000000000000000000001690565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff0000000000000000000000000000000000000000000000000000000016600452602490565b613d4a9394508063ffffffff613d39610180613d316060613d4296015163ffffffff1690565b930151151590565b91168385615435565b503691613144565b90600190565b613d719394506117c76101e0613d6b92015163ffffffff1690565b916151b6565b906127486020613d31846152d7565b90613d8a826109d2565b613d97604051918261057b565b828152601f19613da782946109d2565b019060005b828110613db857505050565b806060602080938501015201613dac565b91908110156127fd5760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561021c570190565b815181546020808501516040808701517fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090941663ffffffff958616179190921b67ffffffff00000000161791901b69ffff000000000000000016178255606083015161022c93613f199260a092613ebb911685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b613f12613ecf608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092613f6d82828686615069565b600052600460205260ff6040600020541615613f895750505050565b6040517f097e17ff0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b0390fd5b604d81116126a657600a0a90565b60ff1660120160ff81116126a65760ff169060248211156140ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116126a65761408061408692614021565b906126de565b6001600160e01b0381116140a0576001600160e01b031690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b9060240390602482116126a6576121436140e392614021565b614086565b9060ff80911691160160ff81116126a65760ff169060248211156140ca577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116126a65761408061408692614021565b90614756610240600161022c946141876141568651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6141cd614199602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b6142196141e1604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b61426961422d606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b6142bd61427d608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b61430f6142ce60a087015160ff1690565b82547fffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff1660789190911b6fff00000000000000000000000000000016178255565b61436261432060c087015160ff1690565b82547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff1660809190911b70ff0000000000000000000000000000000016178255565b6143b861437460e087015161ffff1690565b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff1660889190911b72ffff000000000000000000000000000000000016178255565b6144156143cd61010087015163ffffffff1690565b82547fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff1660989190911b76ffffffff0000000000000000000000000000000000000016178255565b61447261442861012087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b6144d161448561014087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b6145526145026101608701517fffffffff000000000000000000000000000000000000000000000000000000001690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660089190911c7effffffff00000000000000000000000000000000000000000000000000000016178255565b6145b3614563610180870151151590565b82547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016178255565b01926145f76145c86101a083015161ffff1690565b859061ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000825416179055565b61464361460c6101c083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff1660109190911b65ffffffff000016178555565b6146936146586101e083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1660309190911b69ffffffff00000000000016178555565b6146ef6146ac61020083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178555565b61474b61470461022083015163ffffffff1690565b85547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff1660909190911b75ffffffff00000000000000000000000000000000000016178555565b015163ffffffff1690565b7fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff79ffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b519069ffffffffffffffffffff8216820361021c57565b908160a091031261021c576147cb816147a0565b916020820151916040810151916127486080606084015193016147a0565b6040513d6000823e3d90fd5b9081602091031261021c575161274881611a50565b614812612cdf565b5061482a61357f61357f83516001600160a01b031690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa92831561493257600092600094614937575b50600083126140a0576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa928315614932576127489363ffffffff936148d3936000926148fc575b506020015160ff165b906140e8565b926148ee6148df61059e565b6001600160e01b039095168552565b1663ffffffff166020830152565b6148cd919250614923602091823d841161492b575b61491b818361057b565b8101906147f5565b9291506148c4565b503d614911565b6147e9565b90935061495d91925060a03d60a01161496a575b614955818361057b565b8101906147b7565b509392505091923861486d565b503d61494b565b929194939061498a6117c7604086015163ffffffff1690565b808211614c81575050602083015161ffff16808611614c4b57506101608301946149d486517fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f2812d52c000000000000000000000000000000000000000000000000000000008103614a9e57505050826127489492614a6e92614a416101e0614a999997015163ffffffff1690565b9063ffffffff614a66610180614a5e606088015163ffffffff1690565b960151151590565b9416926157f9565b519384925b517fffffffff000000000000000000000000000000000000000000000000000000001690565b6156e3565b91949392917f1e10bdc40000000000000000000000000000000000000000000000000000000003614bfc575090829163ffffffff614af4610180614aec6060614afc98015163ffffffff1690565b950151151590565b931691615435565b90151580614bf0575b614bc6576080810180515160408111614b94575060208201519051519067ffffffffffffffff9081169081831c16614b5a5750509161274891614b526117c7614a99955163ffffffff1690565b938492614a73565b7fafa933080000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260245260446000fd5b7f8a0d71f700000000000000000000000000000000000000000000000000000000600052600452604060245260446000fd5b7f5bed51920000000000000000000000000000000000000000000000000000000060005260046000fd5b50606081015115614b05565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7fd88dddd600000000000000000000000000000000000000000000000000000000600052600486905261ffff1660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192614cd784610543565b546001600160e01b038116845260e01c9182602085015263ffffffff82169283614d11575b5050505061274890516001600160e01b031690565b63ffffffff1642908103939084116126a6578311614d2f5780614cfc565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b60408136031261021c57602060405191614d8b83610543565b8035614d968161020b565b83520135602082015290565b9694919695929390956000946000986000986000965b808810614dcc575050505050505050929190565b9091929394959697999a614de9614de48a848b6127ed565b614d72565b9a614e37612b7d8d614e20614e128967ffffffffffffffff16600052600a602052604060002090565b91516001600160a01b031690565b6001600160a01b0316600052602052604060002090565b91614e4861173b60a0850151151590565b614f915760009c6040840190614e6361229f835161ffff1690565b614f19575b5050606083015163ffffffff16614e7e9161391d565b9c6080830151614e919063ffffffff1690565b614e9a9161391d565b9b8251614eaa9063ffffffff1690565b63ffffffff16614eb990612684565b60019390808310614f0d57506123586117c76020614edc93015163ffffffff1690565b808211614efc5750614eed916138df565b985b0196959493929190614db8565b9050614f07916138df565b98614eef565b915050614f07916138df565b90612143614f82939f614f70614f799460208f8e61229f95506001600160a01b03614f4b85516001600160a01b031690565b91166001600160a01b03821614614f8a57614f669150613a87565b915b015190615861565b925161ffff1690565b620186a0900490565b9b3880614e68565b5091614f68565b999b5060019150614fb884614fb2614fbe93614fac8b612684565b906138df565b9b61391d565b9c613905565b9a614eef565b91939093806101e00193846101e0116126a65761012081029080820461012014901517156126a6576101e09101018093116126a65761229f61014061505a612748966dffffffffffffffffffffffffffff61222c6150456150326150649a63ffffffff6121439a16906138df565b61214361229f6101208c015161ffff1690565b614fac6117c76101008b015163ffffffff1690565b93015161ffff1690565b6126ab565b604080516001600160a01b039283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff0000000000000000000000000000000000000000000000000000000000009092166080830152906150e78160a08101612bbd565b51902090565b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110615121575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161021c57831161021c57600401916003190190565b9060041161021c5790600490565b9081602091031261021c575190565b9081604091031261021c576020604051916151a783610543565b805183520151612845816109ea565b916151bf612cdf565b5081156152b5575061520061206382806151fa7fffffffff0000000000000000000000000000000000000000000000000000000095876150ed565b95615153565b91167f181dcf1000000000000000000000000000000000000000000000000000000000810361523d5750806020806127489351830101910161518d565b7f97a657c9000000000000000000000000000000000000000000000000000000001461528d577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b806020806152a09351830101910161517e565b6152a861059e565b9081526000602082015290565b91505067ffffffffffffffff6152c961059e565b911681526000602082015290565b6020604051917f181dcf100000000000000000000000000000000000000000000000000000000082840152805160248401520151151560448201526044815261274860648261057b565b6040519061532e82610527565b60606080836000815260006020820152600060408201526000838201520152565b60208183031261021c5780359067ffffffffffffffff821161021c57019060a08282031261021c576040519161538483610527565b61538d8161112e565b835261539b60208201610b65565b602084015260408101356153ae816109ea565b60408401526060810135606084015260808101359067ffffffffffffffff821161021c57019080601f8301121561021c5781356153ea816109d2565b926153f8604051948561057b565b81845260208085019260051b82010192831161021c57602001905b82821061542557505050608082015290565b8135815260209182019101615413565b61543d615321565b508115615570577f1f3b3aba000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006154996154938585615170565b906150ed565b160361554657816154b5926154ad92615153565b81019061534f565b9180615530575b6155065763ffffffff6154d3835163ffffffff1690565b16116154dc5790565b7f2e2b0c290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b5061554161173b6040840151151590565b6154bc565b7f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb00b53dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b907fffffffff0000000000000000000000000000000000000000000000000000000082167f2812d52c000000000000000000000000000000000000000000000000000000008114615668577f1e10bdc4000000000000000000000000000000000000000000000000000000001461565b577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000821660045260246000fd5b61022c9150600190615892565b50905060208151036156a157615687602082518301016020830161517e565b6001600160a01b0381119081156156d7575b506156a15750565b61401d906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615881565b61040091501038615699565b917fffffffff0000000000000000000000000000000000000000000000000000000083167f2812d52c0000000000000000000000000000000000000000000000000000000081146157b1577f1e10bdc400000000000000000000000000000000000000000000000000000000146157a4577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b61022c9250151590615892565b5050905060208151036156a157615687602082518301016020830161517e565b6001600160a01b036127489116600b6159c2565b6001600160a01b036127489116600b615af6565b9063ffffffff6158169395949561580e612cdf565b5016916151b6565b91825111615837578061582b575b6155065790565b50602081015115615824565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b670de0b6b3a7640000916001600160e01b0361587d92166126cb565b0490565b9060206127489281815201906105bd565b9060208251036158fa576158a35750565b60208180518101031261021c576020810151156158bd5750565b61401d906040519182917fff828faa00000000000000000000000000000000000000000000000000000000835260206004840181815201906105bd565b6040517fff828faa000000000000000000000000000000000000000000000000000000008152602060048201528061401d60248201856105bd565b80548210156127fd5760005260206000200190600090565b91615967918354906000199060031b92831b921b19161790565b9055565b805480156159935760001901906159828282615935565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001810191806000528260205260406000205492831515600014615a745760001984018481116126a65783549360001985019485116126a6576000958583615a2597615a169503615a2b575b50505061596b565b90600052602052604060002090565b55600190565b615a5b615a5591615a4c615a42615a6b9588615935565b90549060031b1c90565b92839187615935565b9061594d565b8590600052602052604060002090565b55388080615a0e565b50505050600090565b805490680100000000000000008210156105225781615aa491600161596794018155615935565b81939154906000199060031b92831b921b19161790565b600081815260036020526040902054615af057615ad9816002615a7d565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615b2d5780615b1883600193615a7d565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615b2d576000198201908282116126a6576002549260001984019384116126a6578383615a259460009603615b94575b505050615b83600261596b565b600390600052602052604060002090565b615b83615a5591615bac615a42615bb6956002615935565b9283916002615935565b55388080615b7656fea164736f6c634300081a000a", } var FeeQuoterABI = FeeQuoterMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 21e24c90be0..f5b1020a9ae 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 @@ ccip_encoding_utils: ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.so ccip_home: ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.abi.json ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.bin 39de1fbc907a2b573e9358e716803bf5ac3b0a2e622d5bc0069ab60daf38949b ccip_reader_tester: ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.abi.json ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.bin b8e597d175ec5ff4990d98b4e3b8a8cf06c6ae22977dd6f0e58c0f4107639e8f ether_sender_receiver: ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.abi.json ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.bin 88973abc1bfbca23a23704e20087ef46f2e20581a13477806308c8f2e664844e -fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 3efd18088f1a27b497ec5b0936f54931e0e151033d5cb32649d497525a3964fa +fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 3adabf9cbfb2fca9e29a378db21debd60813213778bf7e3f5d9ae2c8975e84e6 lock_release_token_pool: ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.bin 2e73ee0da6f9a9a5722294289b969e4202476706e5d7cdb623e728831c79c28b log_message_data_receiver: ../../../contracts/solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.abi.json ../../../contracts/solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.bin 6fe60e48711884eae82dd95cabb1c66a5644336719fa1219df1ceceec11e6bce maybe_revert_message_receiver: ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.abi.json ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.bin ee264f67a2356cc4eebe839a5a88367cbcdc27a7520cca56263319e9afe97a1a