From cfdeeda8fe81a1a482bc7645ff89e0859ecfece8 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Wed, 27 Sep 2023 08:44:25 +0200 Subject: [PATCH 1/3] pretty struct packing comments (#162) --- .../src/v0.8/ccip/AggregateRateLimiter.sol | 3 +- contracts/src/v0.8/ccip/CommitStore.sol | 14 +-- contracts/src/v0.8/ccip/PriceRegistry.sol | 8 +- contracts/src/v0.8/ccip/Router.sol | 8 +- .../src/v0.8/ccip/libraries/RateLimiter.sol | 14 +-- .../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 26 +++--- .../src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol | 88 +++++++++---------- contracts/src/v0.8/ccip/pools/TokenPool.sol | 8 +- .../v0.8/ccip/pools/USDC/USDCTokenPool.sol | 16 ++-- 9 files changed, 93 insertions(+), 92 deletions(-) diff --git a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol index 7d22df5282..fef7a64f15 100644 --- a/contracts/src/v0.8/ccip/AggregateRateLimiter.sol +++ b/contracts/src/v0.8/ccip/AggregateRateLimiter.sol @@ -16,6 +16,7 @@ contract AggregateRateLimiter is OwnerIsCreator { using USDPriceWith18Decimals for uint224; error PriceNotFoundForToken(address token); + event AdminSet(address newAdmin); // The address of the token limit admin that has the same permissions as the owner. @@ -67,7 +68,7 @@ contract AggregateRateLimiter is OwnerIsCreator { } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Gets the token limit admin address. diff --git a/contracts/src/v0.8/ccip/CommitStore.sol b/contracts/src/v0.8/ccip/CommitStore.sol index 9f1cc77196..bff308f2bf 100644 --- a/contracts/src/v0.8/ccip/CommitStore.sol +++ b/contracts/src/v0.8/ccip/CommitStore.sol @@ -27,8 +27,8 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { /// @notice Static commit store config struct StaticConfig { - uint64 chainSelector; // -------┐ Destination chainSelector - uint64 sourceChainSelector; // -┘ Source chainSelector + uint64 chainSelector; // ───────╮ Destination chainSelector + uint64 sourceChainSelector; // ─╯ Source chainSelector address onRamp; // OnRamp address on the source chain address armProxy; // ARM proxy address } @@ -40,8 +40,8 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { /// @notice a sequenceNumber interval struct Interval { - uint64 min; // ---┐ Minimum sequence number, inclusive - uint64 max; // ---┘ Maximum sequence number, inclusive + uint64 min; // ───╮ Minimum sequence number, inclusive + uint64 max; // ───╯ Maximum sequence number, inclusive } /// @notice Report that is committed by the observing DON at the committing phase @@ -98,7 +98,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Verification | + // │ Verification │ // ================================================================ /// @notice Returns the next expected sequence number. @@ -218,7 +218,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static commit store config. @@ -264,7 +264,7 @@ contract CommitStore is ICommitStore, TypeAndVersionInterface, OCR2Base { } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @notice Single function to check the status of the commitStore. diff --git a/contracts/src/v0.8/ccip/PriceRegistry.sol b/contracts/src/v0.8/ccip/PriceRegistry.sol index 755141caca..ec7089fc0d 100644 --- a/contracts/src/v0.8/ccip/PriceRegistry.sol +++ b/contracts/src/v0.8/ccip/PriceRegistry.sol @@ -66,7 +66,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Price calculations | + // │ Price calculations │ // ================================================================ // @inheritdoc IPriceRegistry @@ -147,7 +147,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Fee tokens | + // │ Fee tokens │ // ================================================================ /// @notice Get the list of fee tokens. @@ -185,7 +185,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Price updates | + // │ Price updates │ // ================================================================ // @inheritdoc IPriceRegistry @@ -211,7 +211,7 @@ contract PriceRegistry is IPriceRegistry, OwnerIsCreator, TypeAndVersionInterfac } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Get the list of price updaters. diff --git a/contracts/src/v0.8/ccip/Router.sol b/contracts/src/v0.8/ccip/Router.sol index 6b15e521c5..3cdb5f8d15 100644 --- a/contracts/src/v0.8/ccip/Router.sol +++ b/contracts/src/v0.8/ccip/Router.sol @@ -71,7 +71,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Message sending | + // │ Message sending │ // ================================================================ /// @inheritdoc IRouterClient @@ -145,7 +145,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Message execution | + // │ Message execution │ // ================================================================ /// @inheritdoc IRouter @@ -218,7 +218,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Gets the wrapped representation of the native fee coin. @@ -316,7 +316,7 @@ contract Router is IRouter, IRouterClient, TypeAndVersionInterface, OwnerIsCreat } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice only lets permissioned offRamps execute diff --git a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol index 578fb60830..81b6999d1c 100644 --- a/contracts/src/v0.8/ccip/libraries/RateLimiter.sol +++ b/contracts/src/v0.8/ccip/libraries/RateLimiter.sol @@ -20,17 +20,17 @@ library RateLimiter { event ConfigChanged(Config config); struct TokenBucket { - uint128 tokens; // ------┐ Current number of tokens that are in the bucket. - uint32 lastUpdated; // | Timestamp in seconds of the last token refill, good for 100+ years. - bool isEnabled; // ------┘ Indication whether the rate limiting is enabled or not - uint128 capacity; // ----┐ Maximum number of tokens that can be in the bucket. - uint128 rate; // --------┘ Number of tokens per second that the bucket is refilled. + uint128 tokens; // ──────╮ Current number of tokens that are in the bucket. + uint32 lastUpdated; // │ Timestamp in seconds of the last token refill, good for 100+ years. + bool isEnabled; // ──────╯ Indication whether the rate limiting is enabled or not + uint128 capacity; // ────╮ Maximum number of tokens that can be in the bucket. + uint128 rate; // ────────╯ Number of tokens per second that the bucket is refilled. } struct Config { bool isEnabled; // Indication whether the rate limiting should be enabled - uint128 capacity; // ----┐ Specifies the capacity of the rate limiter - uint128 rate; // -------┘ Specifies the rate of the rate limiter + uint128 capacity; // ────╮ Specifies the capacity of the rate limiter + uint128 rate; // ───────╯ Specifies the rate of the rate limiter } /// @notice _consume removes the given tokens from the pool, lowering the diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol index 6adfe76aa7..b1c5cd2482 100644 --- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol @@ -76,10 +76,10 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion /// @notice Static offRamp config struct StaticConfig { - address commitStore; // --------┐ CommitStore address on the destination chain - uint64 chainSelector; // -------┘ Destination chainSelector - uint64 sourceChainSelector; // -┐ Source chainSelector - address onRamp; // -------------┘ OnRamp address on the source chain + address commitStore; // ────────╮ CommitStore address on the destination chain + uint64 chainSelector; // ───────╯ Destination chainSelector + uint64 sourceChainSelector; // ─╮ Source chainSelector + address onRamp; // ─────────────╯ OnRamp address on the source chain address prevOffRamp; // Address of previous-version OffRamp address armProxy; // ARM proxy address } @@ -87,11 +87,11 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion /// @notice Dynamic offRamp config /// @dev since OffRampConfig is part of OffRampConfigChanged event, if changing it, we should update the ABI on Atlas struct DynamicConfig { - uint32 permissionLessExecutionThresholdSeconds; // -┐ Waiting time before manual execution is enabled - address router; // ---------------------------------┘ Router address - address priceRegistry; // -----┐ Price registry address - uint16 maxTokensLength; // | Maximum number of ERC20 token transfers that can be included per message - uint32 maxDataSize; // --------┘ Maximum payload data size + uint32 permissionLessExecutionThresholdSeconds; // ─╮ Waiting time before manual execution is enabled + address router; // ─────────────────────────────────╯ Router address + address priceRegistry; // ─────╮ Price registry address + uint16 maxTokensLength; // │ Maximum number of ERC20 token transfers that can be included per message + uint32 maxDataSize; // ────────╯ Maximum payload data size } // STATIC CONFIG @@ -168,7 +168,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Messaging | + // │ Messaging │ // ================================================================ // The size of the execution state in bits @@ -431,7 +431,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static config. @@ -476,7 +476,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Tokens and pools | + // │ Tokens and pools │ // ================================================================ /// @notice Get all supported source tokens @@ -616,7 +616,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, TypeAndVersion } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @notice Reverts as this contract should not access CCIP messages diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index 3602eb988c..3fef0f2cda 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -66,71 +66,71 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, /// @dev Struct that contains the static configuration struct StaticConfig { - address linkToken; // --------┐ Link token address - uint64 chainSelector; // -----┘ Source chainSelector - uint64 destChainSelector; // -┐ Destination chainSelector - uint64 defaultTxGasLimit; // | Default gas limit for a tx - uint96 maxNopFeesJuels; // ---┘ Max nop fee balance onramp can have + address linkToken; // ────────╮ Link token address + uint64 chainSelector; // ─────╯ Source chainSelector + uint64 destChainSelector; // ─╮ Destination chainSelector + uint64 defaultTxGasLimit; // │ Default gas limit for a tx + uint96 maxNopFeesJuels; // ───╯ Max nop fee balance onramp can have address prevOnRamp; // Address of previous-version OnRamp address armProxy; // Address of ARM proxy } /// @dev Struct to contains the dynamic configuration struct DynamicConfig { - address router; // -------------------------┐ Router address - uint16 maxTokensLength; // | Maximum number of ERC20 token transfers per message - uint32 destGasOverhead; // | Extra gas charged on top of the gasLimit - uint16 destGasPerPayloadByte; // | Destination chain gas charged per byte of `data` payload - uint32 destDataAvailabilityOverheadGas; // | Extra data availability gas charged on top of message data - uint16 destGasPerDataAvailabilityByte; // --┘ Amount of gas to charge per byte of data that needs availability - uint16 destDataAvailabilityMultiplier; // --┐ Multiplier for data availability gas, multples of 1e-4, or 0.0001 - address priceRegistry; // | Price registry address - uint32 maxDataSize; // | Maximum payload data size, max 4GB - uint32 maxGasLimit; // ---------------------┘ Maximum gas limit for messages targeting EVMs, max 4 Billion gas + address router; // ─────────────────────────╮ Router address + uint16 maxTokensLength; // │ Maximum number of ERC20 token transfers per message + uint32 destGasOverhead; // │ Extra gas charged on top of the gasLimit + uint16 destGasPerPayloadByte; // │ Destination chain gas charged per byte of `data` payload + uint32 destDataAvailabilityOverheadGas; // │ Extra data availability gas charged on top of message data + uint16 destGasPerDataAvailabilityByte; // ──╯ Amount of gas to charge per byte of data that needs availability + uint16 destDataAvailabilityMultiplier; // ──╮ Multiplier for data availability gas, multples of 1e-4, or 0.0001 + address priceRegistry; // │ Price registry address + uint32 maxDataSize; // │ Maximum payload data size, max 4GB + uint32 maxGasLimit; // ─────────────────────╯ Maximum gas limit for messages targeting EVMs, max 4 Billion gas } /// @dev Struct to hold the execution fee configuration for a fee token struct FeeTokenConfig { - uint32 networkFeeUSD; // -----------┐ Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // | Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; // | Maximum fee to charge for token transfers, multiples of 0.01 USD - uint64 gasMultiplier; // | Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost. - uint64 premiumMultiplier; // | Multiplier for fee-token-specific premiums - bool enabled; // -------------------┘ Whether this fee token is enabled + uint32 networkFeeUSD; // ───────────╮ Flat network fee to charge for messages, multiples of 0.01 USD + uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD + uint32 maxTokenTransferFeeUSD; // │ Maximum fee to charge for token transfers, multiples of 0.01 USD + uint64 gasMultiplier; // │ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost. + uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums + bool enabled; // ───────────────────╯ Whether this fee token is enabled } /// @dev Struct to hold the fee configuration for a fee token, same as the FeeTokenConfig but with /// token included so that an array of these can be passed in to setFeeTokenConfig to set the mapping struct FeeTokenConfigArgs { - address token; // ------------------┐ Token address - uint32 networkFeeUSD; // | Flat network fee to charge for messages, multiples of 0.01 USD - uint32 minTokenTransferFeeUSD; // | Minimum fee to charge for token transfers, multiples of 0.01 USD - uint32 maxTokenTransferFeeUSD; //---┘ Maximum fee to charge for token transfers, multiples of 0.01 USD - uint64 gasMultiplier; // ---┐ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost - uint64 premiumMultiplier; // | Multiplier for fee-token-specific premiums - bool enabled; // -------------------┘ Whether this fee token is enabled + address token; // ──────────────────╮ Token address + uint32 networkFeeUSD; // │ Flat network fee to charge for messages, multiples of 0.01 USD + uint32 minTokenTransferFeeUSD; // │ Minimum fee to charge for token transfers, multiples of 0.01 USD + uint32 maxTokenTransferFeeUSD; //───╯ Maximum fee to charge for token transfers, multiples of 0.01 USD + uint64 gasMultiplier; // ───╮ Price multiplier for gas costs, 1e18 based so 11e17 = 10% extra cost + uint64 premiumMultiplier; // │ Multiplier for fee-token-specific premiums + bool enabled; // ───────────────────╯ Whether this fee token is enabled } /// @dev Struct to hold the transfer fee configuration for token transfers struct TokenTransferFeeConfig { - uint16 ratio; // -------------------┐ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 - uint32 destGasOverhead; // | Gas charged to execute the token transfer on the destination chain - uint32 destBytesOverhead; // -------┘ Extra data availability bytes on top of transfer data, e.g. USDC offchain data + uint16 ratio; // ───────────────────╮ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of transfer data, e.g. USDC offchain data } /// @dev Same as TokenTransferFeeConfig /// token included so that an array of these can be passed in to setTokenTransferFeeConfig struct TokenTransferFeeConfigArgs { - address token; // ------------------┐ Token address - uint16 ratio; // | Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 - uint32 destGasOverhead; // | Gas charged to execute the token transfer on the destination chain - uint32 destBytesOverhead; // -------┘ Extra data availability bytes on top of transfer data, e.g. USDC offchain data + address token; // ──────────────────╮ Token address + uint16 ratio; // │ Ratio of token transfer value to charge as fee, multiples of 0.1bps, or 1e-5 + uint32 destGasOverhead; // │ Gas charged to execute the token transfer on the destination chain + uint32 destBytesOverhead; // ───────╯ Extra data availability bytes on top of transfer data, e.g. USDC offchain data } /// @dev Nop address and weight, used to set the nops and their weights struct NopAndWeight { - address nop; // -----┐ Address of the node operator - uint16 weight; // ---┘ Weight for nop rewards + address nop; // ────╮ Address of the node operator + uint16 weight; // ──╯ Weight for nop rewards } // STATIC CONFIG @@ -231,7 +231,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Messaging | + // │ Messaging │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -359,7 +359,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Returns the static onRamp config. @@ -411,7 +411,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Tokens and pools | + // │ Tokens and pools │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -467,7 +467,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Fees | + // │ Fees │ // ================================================================ /// @inheritdoc IEVM2AnyOnRamp @@ -686,7 +686,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | NOP payments | + // │ NOP payments │ // ================================================================ /// @notice Get the total amount of fees to be paid to the Nops (in LINK) @@ -796,7 +796,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Link monitoring | + // │ Link monitoring │ // ================================================================ /// @notice Calculate remaining LINK balance after paying nops @@ -812,7 +812,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, } // ================================================================ - // | Access and ARM | + // │ Access and ARM │ // ================================================================ /// @dev Require that the sender is the owner or the fee admin or a nop diff --git a/contracts/src/v0.8/ccip/pools/TokenPool.sol b/contracts/src/v0.8/ccip/pools/TokenPool.sol index ccb13b5589..5163749661 100644 --- a/contracts/src/v0.8/ccip/pools/TokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/TokenPool.sol @@ -99,7 +99,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Ramp permissions | + // │ Ramp permissions │ // ================================================================ /// @notice Checks whether something is a permissioned onRamp on this contract. @@ -189,7 +189,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Rate limiting | + // │ Rate limiting │ // ================================================================ /// @notice Consumes outbound rate limiting capacity in this pool @@ -231,7 +231,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Access | + // │ Access │ // ================================================================ /// @notice Checks whether the msg.sender is a permissioned onRamp on this contract @@ -249,7 +249,7 @@ abstract contract TokenPool is IPool, OwnerIsCreator, IERC165 { } // ================================================================ - // | Allowlist | + // │ Allowlist │ // ================================================================ modifier checkAllowList(address sender) { diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol index 832e7f2f50..01e8207e38 100644 --- a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol @@ -33,15 +33,15 @@ contract USDCTokenPool is TokenPool { // A domain is a USDC representation of a chain. struct DomainUpdate { bytes32 allowedCaller; // Address allowed to mint on the domain - uint32 domainIdentifier; // --┐ Unique domain ID - uint64 destChainSelector; // | The destination chain for this domain - bool enabled; // -------------┘ Whether the domain is enabled + uint32 domainIdentifier; // ──╮ Unique domain ID + uint64 destChainSelector; // │ The destination chain for this domain + bool enabled; // ─────────────╯ Whether the domain is enabled } // Contains the contracts for sending and receiving USDC tokens struct USDCConfig { - uint32 version; // ----------┐ CCTP internal version - address tokenMessenger; // --┘ Contract to burn tokens + uint32 version; // ──────────╮ CCTP internal version + address tokenMessenger; // ──╯ Contract to burn tokens address messageTransmitter; // Contract to mint tokens } @@ -62,8 +62,8 @@ contract USDCTokenPool is TokenPool { // A domain is a USDC representation of a chain. struct Domain { bytes32 allowedCaller; // Address allowed to mint on the domain - uint32 domainIdentifier; // -┐ Unique domain ID - bool enabled; // ------------┘ Whether the domain is enabled + uint32 domainIdentifier; // ─╮ Unique domain ID + bool enabled; // ────────────╯ Whether the domain is enabled } // A mapping of CCIP chain identifiers to destination domains @@ -203,7 +203,7 @@ contract USDCTokenPool is TokenPool { } // ================================================================ - // | Config | + // │ Config │ // ================================================================ /// @notice Gets the current config From 51912f55bf0f1dcd60615e54d9027769e5b0516d Mon Sep 17 00:00:00 2001 From: Jason McI Date: Wed, 27 Sep 2023 00:34:11 -0700 Subject: [PATCH 2/3] Ccip 1060 create test image manual (#160) --- .github/workflows/integration-tests-publish.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml index e54ef0a944..62d5ffa286 100644 --- a/.github/workflows/integration-tests-publish.yml +++ b/.github/workflows/integration-tests-publish.yml @@ -5,6 +5,7 @@ on: push: branches: - ccip-develop + workflow_dispatch: env: ECR_TAG: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip-tests:develop From 1f14684dcb9d34b37d3ac3aea21cfe1e64d2ec36 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Wed, 27 Sep 2023 13:36:17 +0200 Subject: [PATCH 3/3] add zero token amount check & golf (#161) --- contracts/GNUmakefile | 5 + contracts/gas-snapshots/ccip.gas-snapshot | 91 ++++++++++--------- .../src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol | 23 +++-- .../v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol | 10 ++ .../evm_2_evm_onramp/evm_2_evm_onramp.go | 4 +- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile index 6b4cb573ed..e82aab1d9f 100644 --- a/contracts/GNUmakefile +++ b/contracts/GNUmakefile @@ -18,6 +18,11 @@ ALL_FOUNDRY_PRODUCTS = llo-feeds functions shared ccip snapshot: ## Make a snapshot for a specific product. export FOUNDRY_PROFILE=$(FOUNDRY_PROFILE) && forge snapshot --nmt "testFuzz_\w{1,}?" --snap gas-snapshots/$(FOUNDRY_PROFILE).gas-snapshot +.PHONY: snapshot-diff +snapshot-diff: ## Make a snapshot for a specific product. + export FOUNDRY_PROFILE=$(FOUNDRY_PROFILE) && forge snapshot --nmt "testFuzz_\w{1,}?" --diff gas-snapshots/$(FOUNDRY_PROFILE).gas-snapshot + + .PHONY: snapshot-all snapshot-all: ## Make a snapshot for all products. for foundry_profile in $(ALL_FOUNDRY_PRODUCTS) ; do \ diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 158564681b..8b1caf2c28 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -56,7 +56,7 @@ BurnMintERC677_burn:testPoolBurnRevertNotHealthyReverts() (gas: 58150) BurnMintERC677_burn:testPoolBurnSuccess() (gas: 197641) BurnMintERC677_mint:testPoolMintNotHealthyReverts() (gas: 55384) BurnMintERC677_mint:testPoolMintSuccess() (gas: 93675) -CCIPClientExample_sanity:testExamples() (gas: 2216216) +CCIPClientExample_sanity:testExamples() (gas: 2213780) CommitStore_constructor:testConstructorSuccess() (gas: 3307574) CommitStore_isUnpausedAndARMHealthy:testARMSuccess() (gas: 71312) CommitStore_report:testInvalidIntervalMinLargerThanMaxReverts() (gas: 26019) @@ -86,7 +86,7 @@ CommitStore_verify:testPausedReverts() (gas: 18438) CommitStore_verify:testTooManyLeavesReverts() (gas: 36830) DefensiveExampleTest:testHappyPathSuccess() (gas: 174828) DefensiveExampleTest:testRecovery() (gas: 399728) -E2E:testE2E_3MessagesSuccess_gas() (gas: 863336) +E2E:testE2E_3MessagesSuccess_gas() (gas: 863423) EVM2EVMOffRamp__releaseOrMintTokens:testRateLimitErrorsReverts() (gas: 428056) EVM2EVMOffRamp__releaseOrMintTokens:testTokenHandlingErrorReverts() (gas: 100322) EVM2EVMOffRamp__releaseOrMintTokens:testUnsupportedTokenReverts() (gas: 18159) @@ -165,32 +165,33 @@ EVM2EVMOnRamp_applyPoolUpdates:testOnlyCallableByOwnerReverts() (gas: 23154) EVM2EVMOnRamp_applyPoolUpdates:testPoolAlreadyExistsReverts() (gas: 351576) EVM2EVMOnRamp_applyPoolUpdates:testPoolDoesNotExistReverts() (gas: 277882) EVM2EVMOnRamp_applyPoolUpdates:testRemoveTokenPoolMismatchReverts() (gas: 616024) -EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5751237) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 129700) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 130012) -EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 140431) +EVM2EVMOnRamp_constructor:testConstructorSuccess() (gas: 5774116) +EVM2EVMOnRamp_forwardFromRouter:testCannotSendZeroTokensReverts() (gas: 31534) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccess() (gas: 126628) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessCustomExtraArgs() (gas: 126940) +EVM2EVMOnRamp_forwardFromRouter:testForwardFromRouterSuccessLegacyExtraArgs() (gas: 137359) EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressEncodePackedReverts() (gas: 23964) EVM2EVMOnRamp_forwardFromRouter:testInvalidAddressReverts() (gas: 24263) -EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23242) -EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 76555) -EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 34884) -EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26896) -EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105433) -EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20187) -EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49590) -EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26792) -EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34382) -EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 173601) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 107444) -EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 126675) -EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28108) -EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42943) -EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 108788) -EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 154470) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 148038) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 191992) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 117859) -EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 95276) +EVM2EVMOnRamp_forwardFromRouter:testInvalidExtraArgsTagReverts() (gas: 23265) +EVM2EVMOnRamp_forwardFromRouter:testMaxCapacityExceededReverts() (gas: 77006) +EVM2EVMOnRamp_forwardFromRouter:testMaxFeeBalanceReachedReverts() (gas: 32218) +EVM2EVMOnRamp_forwardFromRouter:testMessageGasLimitTooHighReverts() (gas: 26907) +EVM2EVMOnRamp_forwardFromRouter:testMessageTooLargeReverts() (gas: 105488) +EVM2EVMOnRamp_forwardFromRouter:testOriginalSenderReverts() (gas: 20165) +EVM2EVMOnRamp_forwardFromRouter:testPausedReverts() (gas: 49568) +EVM2EVMOnRamp_forwardFromRouter:testPermissionsReverts() (gas: 26836) +EVM2EVMOnRamp_forwardFromRouter:testPriceNotFoundForTokenReverts() (gas: 34938) +EVM2EVMOnRamp_forwardFromRouter:testShouldIncrementSeqNumAndNonceSuccess() (gas: 168385) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreLinkFees() (gas: 104372) +EVM2EVMOnRamp_forwardFromRouter:testShouldStoreNonLinkFees() (gas: 123580) +EVM2EVMOnRamp_forwardFromRouter:testTooManyTokensReverts() (gas: 28119) +EVM2EVMOnRamp_forwardFromRouter:testUnhealthyReverts() (gas: 42966) +EVM2EVMOnRamp_forwardFromRouter:testUnsupportedTokenReverts() (gas: 108831) +EVM2EVMOnRamp_forwardFromRouter:testZeroAddressReceiverReverts() (gas: 154448) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceNewSenderStartsAtZeroSuccess() (gas: 141893) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2NonceStartsAtV1NonceSuccess() (gas: 184775) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2SenderNoncesReadsPreviousRampSuccess() (gas: 112643) +EVM2EVMOnRamp_forwardFromRouter_upgrade:testV2Success() (gas: 92203) EVM2EVMOnRamp_getDataAvailabilityCostUSD:testEmptyMessageCalculatesDataAvailabilityCostSuccess() (gas: 15075) EVM2EVMOnRamp_getDataAvailabilityCostUSD:testSimpleMessageCalculatesDataAvailabilityCostSuccess() (gas: 15388) EVM2EVMOnRamp_getExpectedNextSequenceNumber:testGetExpectedNextSequenceNumberSuccess() (gas: 7860) @@ -224,7 +225,7 @@ EVM2EVMOnRamp_payNops:testNoFeesToPayReverts() (gas: 131481) EVM2EVMOnRamp_payNops:testNoNopsToPayReverts() (gas: 136500) EVM2EVMOnRamp_payNops:testNopPayNopsSuccess() (gas: 149589) EVM2EVMOnRamp_payNops:testOwnerPayNopsSuccess() (gas: 144225) -EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 302426) +EVM2EVMOnRamp_payNops:testPayNopsSuccessAfterSetNops() (gas: 299354) EVM2EVMOnRamp_payNops:testWrongPermissionsReverts() (gas: 19467) EVM2EVMOnRamp_setDynamicConfig:testSetConfigInvalidConfigReverts() (gas: 37031) EVM2EVMOnRamp_setDynamicConfig:testSetConfigOnlyOwnerReverts() (gas: 25795) @@ -233,10 +234,10 @@ EVM2EVMOnRamp_setFeeTokenConfig:testOnlyCallableByOwnerOrAdminReverts() (gas: 17 EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20586) EVM2EVMOnRamp_setFeeTokenConfig:testSetFeeTokenConfigSuccess() (gas: 13950) EVM2EVMOnRamp_setNops:testAdminCanSetNopsSuccess() (gas: 65220) -EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 437782) +EVM2EVMOnRamp_setNops:testIncludesPaymentSuccess() (gas: 434710) EVM2EVMOnRamp_setNops:testLinkTokenCannotBeNopReverts() (gas: 57250) EVM2EVMOnRamp_setNops:testNonOwnerOrAdminReverts() (gas: 18777) -EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 88807) +EVM2EVMOnRamp_setNops:testNotEnoughFundsForPayoutReverts() (gas: 85735) EVM2EVMOnRamp_setNops:testSetNopsRemovesOldNopsCompletelySuccess() (gas: 63408) EVM2EVMOnRamp_setNops:testSetNopsSuccess() (gas: 170843) EVM2EVMOnRamp_setNops:testTooManyNopsReverts() (gas: 190362) @@ -245,9 +246,9 @@ EVM2EVMOnRamp_setTokenTransferFeeConfig:testOnlyCallableByOwnerOrAdminReverts() EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigByAdminSuccess() (gas: 20647) EVM2EVMOnRamp_setTokenTransferFeeConfig:testSetFeeTokenConfigSuccess() (gas: 50282) EVM2EVMOnRamp_withdrawNonLinkFees:testInvalidTokenReverts() (gas: 15094) -EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 87310) +EVM2EVMOnRamp_withdrawNonLinkFees:testLinkBalanceNotSettledReverts() (gas: 84238) EVM2EVMOnRamp_withdrawNonLinkFees:testNonOwnerOrAdminReverts() (gas: 19453) -EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 247054) +EVM2EVMOnRamp_withdrawNonLinkFees:testSettlingBalanceSuccess() (gas: 244596) EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawNonLinkFeesSuccess() (gas: 50104) EVM2EVMOnRamp_withdrawNonLinkFees:testWithdrawToZeroAddressReverts() (gas: 12913) LockReleaseTokenPool_addLiquidity:testLiquidityNotAcceptedReverts() (gas: 2509153) @@ -288,10 +289,10 @@ OCR2Base_transmit:testTransmit2SignersSuccess_gas() (gas: 51741) OCR2Base_transmit:testUnAuthorizedTransmitterReverts() (gas: 23441) OCR2Base_transmit:testUnauthorizedSignerReverts() (gas: 43661) OCR2Base_transmit:testWrongNumberOfSignaturesReverts() (gas: 20507) -OnRampTokenPoolReentrancy:testSuccess() (gas: 332357) -PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 149169) +OnRampTokenPoolReentrancy:testSuccess() (gas: 332065) +PingPong_ccipReceive:testCcipReceiveSuccess() (gas: 146097) PingPong_plumbing:testPausingSuccess() (gas: 14471) -PingPong_startPingPong:testStartPingPongSuccess() (gas: 174247) +PingPong_startPingPong:testStartPingPongSuccess() (gas: 171175) PriceRegistry_applyFeeTokensUpdates:testApplyFeeTokensUpdatesSuccess() (gas: 77674) PriceRegistry_applyFeeTokensUpdates:testOnlyCallableByOwnerReverts() (gas: 16598) PriceRegistry_applyPriceUpdatersUpdates:testApplyPriceUpdaterUpdatesSuccess() (gas: 80774) @@ -331,21 +332,21 @@ Router_applyRampUpdates:testOffRampDisable() (gas: 192139) Router_applyRampUpdates:testOffRampMismatchReverts() (gas: 108518) Router_applyRampUpdates:testOnRampDisable() (gas: 52147) Router_applyRampUpdates:testOnlyOwnerReverts() (gas: 12224) -Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 113310) -Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188462) -Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 125362) -Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200514) +Router_ccipSend:testCCIPSendLinkFeeNoTokenSuccess_gas() (gas: 110238) +Router_ccipSend:testCCIPSendLinkFeeOneTokenSuccess_gas() (gas: 188316) +Router_ccipSend:testCCIPSendNativeFeeNoTokenSuccess_gas() (gas: 122289) +Router_ccipSend:testCCIPSendNativeFeeOneTokenSuccess_gas() (gas: 200368) Router_ccipSend:testFeeTokenAmountTooLowReverts() (gas: 61367) Router_ccipSend:testInvalidMsgValue() (gas: 31860) Router_ccipSend:testNativeFeeTokenInsufficientValue() (gas: 64237) -Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 164996) -Router_ccipSend:testNativeFeeTokenSuccess() (gas: 164337) +Router_ccipSend:testNativeFeeTokenOverpaySuccess() (gas: 161923) +Router_ccipSend:testNativeFeeTokenSuccess() (gas: 161264) Router_ccipSend:testNativeFeeTokenZeroValue() (gas: 51217) -Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 236538) +Router_ccipSend:testNonLinkFeeTokenSuccess() (gas: 233465) Router_ccipSend:testUnsupportedDestinationChainReverts() (gas: 24624) Router_ccipSend:testWhenNotHealthyReverts() (gas: 44650) -Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 166436) -Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 232273) +Router_ccipSend:testWrappedNativeFeeTokenSuccess() (gas: 163363) +Router_ccipSend:testZeroFeeAndGasPriceSuccess() (gas: 229200) Router_constructor:testConstructorSuccess() (gas: 9929) Router_getFee:testGetFeeSupportedChainSuccess() (gas: 38866) Router_getFee:testUnsupportedDestinationChainReverts() (gas: 17079) @@ -380,9 +381,9 @@ TokenPool_setOnRampRateLimiterConfig:testOnlyOwnerReverts() (gas: 17999) TokenProxy_ccipSend:testCcipSendGasShouldBeZeroReverts() (gas: 17053) TokenProxy_ccipSend:testCcipSendInsufficientAllowanceReverts() (gas: 127348) TokenProxy_ccipSend:testCcipSendInvalidTokenReverts() (gas: 15839) -TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229473) +TokenProxy_ccipSend:testCcipSendNativeSuccess() (gas: 229327) TokenProxy_ccipSend:testCcipSendNoDataAllowedReverts() (gas: 16167) -TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249348) +TokenProxy_ccipSend:testCcipSendSuccess() (gas: 249231) TokenProxy_constructor:testConstructor() (gas: 10651) TokenProxy_getFee:testGetFeeGasShouldBeZeroReverts() (gas: 16734) TokenProxy_getFee:testGetFeeInvalidTokenReverts() (gas: 12616) diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol index 3fef0f2cda..7385e7c055 100644 --- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol @@ -20,7 +20,7 @@ import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/token/ import {EnumerableMap} from "../../vendor/openzeppelin-solidity/v4.8.0/contracts/utils/structs/EnumerableMap.sol"; /// @notice The onRamp is a contract that handles lane-specific fee logic, NOP payments and -/// bridegable token support. +/// bridgeable token support. /// @dev The EVM2EVMOnRamp, CommitStore and EVM2EVMOffRamp form an xchain upgradeable unit. Any change to one of them /// results an onchain upgrade of all 3. contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, TypeAndVersionInterface { @@ -54,6 +54,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, error LinkBalanceNotSettled(); error InvalidNopAddress(address nop); error NotAFeeToken(address token); + error CannotSendZeroTokens(); event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig); event NopPaid(address indexed nop, uint256 amount); @@ -83,7 +84,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, uint16 destGasPerPayloadByte; // │ Destination chain gas charged per byte of `data` payload uint32 destDataAvailabilityOverheadGas; // │ Extra data availability gas charged on top of message data uint16 destGasPerDataAvailabilityByte; // ──╯ Amount of gas to charge per byte of data that needs availability - uint16 destDataAvailabilityMultiplier; // ──╮ Multiplier for data availability gas, multples of 1e-4, or 0.0001 + uint16 destDataAvailabilityMultiplier; // ──╮ Multiplier for data availability gas, multiples of 1e-4, or 0.0001 address priceRegistry; // │ Price registry address uint32 maxDataSize; // │ Maximum payload data size, max 4GB uint32 maxGasLimit; // ─────────────────────╯ Maximum gas limit for messages targeting EVMs, max 4 Billion gas @@ -270,10 +271,18 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, uint256 gasLimit = _fromBytes(message.extraArgs).gasLimit; // Validate the message with various checks - _validateMessage(message.data.length, gasLimit, message.tokenAmounts.length); - // Rate limit on aggregated token value - _rateLimitValue(message.tokenAmounts, IPriceRegistry(s_dynamicConfig.priceRegistry)); + uint256 numberOfTokens = message.tokenAmounts.length; + _validateMessage(message.data.length, gasLimit, numberOfTokens); + + // Only check token value if there are tokens + if (numberOfTokens > 0) { + for (uint256 i = 0; i < numberOfTokens; ++i) { + if (message.tokenAmounts[i].amount == 0) revert CannotSendZeroTokens(); + } + // Rate limit on aggregated token value + _rateLimitValue(message.tokenAmounts, IPriceRegistry(s_dynamicConfig.priceRegistry)); + } // Convert feeToken to link if not already in link if (message.feeToken == i_linkToken) { @@ -306,13 +315,13 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter, feeTokenAmount: feeTokenAmount, data: message.data, tokenAmounts: message.tokenAmounts, - sourceTokenData: new bytes[](message.tokenAmounts.length), // will be filled in later + sourceTokenData: new bytes[](numberOfTokens), // will be filled in later messageId: "" }); // Lock the tokens as last step. TokenPools may not always be trusted. // There should be no state changes after external call to TokenPools. - for (uint256 i = 0; i < message.tokenAmounts.length; ++i) { + for (uint256 i = 0; i < numberOfTokens; ++i) { Client.EVMTokenAmount memory tokenAndAmount = message.tokenAmounts[i]; newMessage.sourceTokenData[i] = getPoolBySourceToken(IERC20(tokenAndAmount.token)).lockOrBurn( originalSender, diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol index d1e4e3fc19..838c0e3cf9 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol @@ -432,6 +432,15 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { s_onRamp.forwardFromRouter(message, 0, STRANGER); } + function testCannotSendZeroTokensReverts() public { + Client.EVM2AnyMessage memory message = _generateEmptyMessage(); + message.tokenAmounts = new Client.EVMTokenAmount[](1); + message.tokenAmounts[0].amount = 0; + message.tokenAmounts[0].token = s_sourceTokens[0]; + vm.expectRevert(EVM2EVMOnRamp.CannotSendZeroTokens.selector); + s_onRamp.forwardFromRouter(message, 0, STRANGER); + } + function testUnsupportedTokenReverts() public { address wrongToken = address(1); @@ -479,6 +488,7 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup { address fakeToken = address(1); message.tokenAmounts = new Client.EVMTokenAmount[](1); message.tokenAmounts[0].token = fakeToken; + message.tokenAmounts[0].amount = 1; vm.expectRevert(abi.encodeWithSelector(AggregateRateLimiter.PriceNotFoundForToken.selector, fakeToken)); diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go index 6d1ad41d79..7ebccb47d4 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go +++ b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go @@ -139,8 +139,8 @@ type RateLimiterTokenBucket struct { } var EVM2EVMOnRampMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x6101806040523480156200001257600080fd5b506040516200834c3803806200834c833981016040819052620000359162001e1d565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c082620007e0565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b5050505050505062002408565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062001ff2565b60405180910390a150565b60005b8151811015620007ae57600082828151811062000669576200066962002072565b6020908102919091018101516040805160c080820183528385015163ffffffff908116835283850151811683870190815260608087015183168587019081526080808901516001600160401b0390811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a529690982094518554925198519151965194511515600160e01b0260ff60e01b19958916600160a01b0295909516600160a01b600160e81b0319979098166c0100000000000000000000000002600160601b600160a01b0319928516680100000000000000000292909216600160401b600160a01b0319998516640100000000026001600160401b0319909416919094161791909117969096161794909417919091169190911791909117905550620007a6816200209e565b905062000648565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516200063a9190620020ba565b60005b8151811015620008b357600082828151811062000804576200080462002072565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e909752939095209151825491519451841666010000000000000263ffffffff60301b1995909416620100000265ffffffffffff19909216951694909417939093179190911617905550620008ab816200209e565b9050620007e3565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516200063a919062002172565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021e1565b60079062001025565b509050620009a860078262001043565b505080620009b690620021f7565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002072565b6020026020010151600001519050600085838151811062000a085762000a0862002072565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002211565b935050508062000a9e906200209e565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002231565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002072565b6020026020010151600001519050600084838151811062000b585762000b5862002072565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c43906200209e565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002072565b6020026020010151600001519050600083838151811062000c955762000c9562002072565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f91906200229e565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e05906200209e565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022be565b62000f5b9190620022d8565b905062000f698187620022fb565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe4906200209e565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117291906200231e565b6200117e919062002338565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200235b565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002072565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021e1565b8554909150600090620014b290600190620021e1565b90508181146200151e576000866000018281548110620014d657620014d662002072565b9060005260206000200154905080876000018481548110620014fc57620014fc62002072565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001532576200153262002379565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023b5565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023d3565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b604051608081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200183957620018396200175d565b604052919050565b6001600160a01b03811681146200185757600080fd5b50565b8051620018678162001841565b919050565b80516001600160401b03811681146200186757600080fd5b600060e082840312156200189757600080fd5b620018a162001773565b90508151620018b08162001841565b8152620018c0602083016200186c565b6020820152620018d3604083016200186c565b6040820152620018e6606083016200186c565b606082015260808201516001600160601b03811681146200190657600080fd5b60808201526200191960a083016200185a565b60a08201526200192c60c083016200185a565b60c082015292915050565b805161ffff811681146200186757600080fd5b805163ffffffff811681146200186757600080fd5b600061014082840312156200197357600080fd5b6200197d6200179e565b90506200198a826200185a565b81526200199a6020830162001937565b6020820152620019ad604083016200194a565b6040820152620019c06060830162001937565b6060820152620019d3608083016200194a565b6080820152620019e660a0830162001937565b60a0820152620019f960c0830162001937565b60c082015262001a0c60e083016200185a565b60e082015261010062001a218184016200194a565b9082015261012062001a358382016200194a565b9082015292915050565b60006001600160401b0382111562001a5b5762001a5b6200175d565b5060051b60200190565b600082601f83011262001a7757600080fd5b8151602062001a9062001a8a8362001a3f565b6200180e565b82815260069290921b8401810191818101908684111562001ab057600080fd5b8286015b8481101562001b0a576040818903121562001acf5760008081fd5b62001ad9620017c4565b815162001ae68162001841565b81528185015162001af78162001841565b8186015283529183019160400162001ab4565b509695505050505050565b805180151581146200186757600080fd5b80516001600160801b03811681146200186757600080fd5b60006060828403121562001b5157600080fd5b604051606081016001600160401b038111828210171562001b765762001b766200175d565b60405290508062001b878362001b15565b815262001b976020840162001b26565b602082015262001baa6040840162001b26565b60408201525092915050565b600082601f83011262001bc857600080fd5b8151602062001bdb62001a8a8362001a3f565b82815260e0928302850182019282820191908785111562001bfb57600080fd5b8387015b8581101562001cb05781818a03121562001c195760008081fd5b62001c2362001773565b815162001c308162001841565b815262001c3f8287016200194a565b86820152604062001c528184016200194a565b90820152606062001c658382016200194a565b90820152608062001c788382016200186c565b9082015260a062001c8b8382016200186c565b9082015260c062001c9e83820162001b15565b90820152845292840192810162001bff565b5090979650505050505050565b600082601f83011262001ccf57600080fd5b8151602062001ce262001a8a8362001a3f565b82815260079290921b8401810191818101908684111562001d0257600080fd5b8286015b8481101562001b0a576080818903121562001d215760008081fd5b62001d2b620017e9565b815162001d388162001841565b815262001d4782860162001937565b85820152604062001d5a8184016200194a565b90820152606062001d6d8382016200194a565b9082015283529183019160800162001d06565b600082601f83011262001d9257600080fd5b8151602062001da562001a8a8362001a3f565b82815260069290921b8401810191818101908684111562001dc557600080fd5b8286015b8481101562001b0a576040818903121562001de45760008081fd5b62001dee620017c4565b815162001dfb8162001841565b815262001e0a82860162001937565b8186015283529183019160400162001dc9565b6000806000806000806000610300888a03121562001e3a57600080fd5b62001e46898962001884565b965062001e578960e08a016200195f565b6102208901519096506001600160401b038082111562001e7657600080fd5b62001e848b838c0162001a65565b965062001e968b6102408c0162001b3e565b95506102a08a015191508082111562001eae57600080fd5b62001ebc8b838c0162001bb6565b94506102c08a015191508082111562001ed457600080fd5b62001ee28b838c0162001cbd565b93506102e08a015191508082111562001efa57600080fd5b5062001f098a828b0162001d80565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f3b602084018261ffff169052565b50604081015162001f54604084018263ffffffff169052565b50606081015162001f6b606084018261ffff169052565b50608081015162001f84608084018263ffffffff169052565b5060a081015162001f9b60a084018261ffff169052565b5060c081015162001fb260c084018261ffff169052565b5060e081015162001fce60e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f18565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020b357620020b362002088565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015163ffffffff9081168887015286820151811687870152606080830151909116908601526080808201516001600160401b03169086015260a08082015162002144878301826001600160401b03169052565b505060c09081015115159085015260e09093019290850190600101620020d7565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff908116878701526060918201511690850152608090930192908501906001016200218f565b818103818111156200101f576200101f62002088565b60008162002209576200220962002088565b506000190190565b63ffffffff81811683821601908082111562001579576200157962002088565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200229057845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200225c565b509098975050505050505050565b600060208284031215620022b157600080fd5b81516200105a8162001841565b80820281158282048414176200101f576200101f62002088565b600082620022f657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001579576200157962002088565b6000602082840312156200233157600080fd5b5051919050565b818103600083128015838313168383128216171562001579576200157962002088565b6000602082840312156200236e57600080fd5b6200105a8262001b15565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023ac57818101518382015260200162002392565b50506000910152565b60008251620023c98184602087016200238f565b9190910192915050565b6020815260008251806020840152620023f48160408501602087016200238f565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615e3d6200250f600039600081816103340152818161151d0152613e010152600081816103050152818161143f015281816114a7015281816119f801528181611a600152613dd201526000818161027101528181610bc201528181611e120152613d3e01526000818161024101528181611b2b0152613d0e01526000818161021201528181610f91015281816117a3015281816118a401528181612342015281816130cd0152818161345a0152613cdf0152600081816102d1015281816119700152613d9e0152600081816102a1015281816126890152613d6e01526000611eda0152615e3d6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806375294130116100f9578063b06d41bc11610097578063d3c7c2c711610071578063d3c7c2c71461092c578063e687b40a14610941578063eff7cc4814610954578063f2fde38b1461095c57600080fd5b8063b06d41bc146108fb578063c92b283214610911578063d09dc3391461092457600080fd5b8063856c8247116100d3578063856c8247146107575780638da5cb5b1461076a5780639a113c361461077b578063a7d3e02f146108e857600080fd5b8063752941301461072957806376f6ae761461073c57806379ba50971461074f57600080fd5b8063546719cd11610166578063599f643111610140578063599f64311461056f5780635d86f14114610594578063704b6c02146105a75780637437ff9f146105ba57600080fd5b8063546719cd146104d8578063549e946f1461053c57806354b714681461054f57600080fd5b8063352e4bc8116101a2578063352e4bc81461046e57806338724a95146104835780633a87ac53146104a45780634120fccd146104b757600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a7714610425575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b604051610371919061492a565b60405180910390f35b6103f16103883660046149cb565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600e825292829020825193840183525461ffff8116845263ffffffff62010000820481169285019290925266010000000000009004169082015290565b60408051825161ffff16815260208084015163ffffffff908116918301919091529282015190921690820152606001610371565b6104616040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614a56565b61048161047c366004614bf5565b61096f565b005b610496610491366004614d2b565b6109d8565b604051908152602001610371565b6104816104b2366004614dfc565b610e38565b6104bf610e4e565b60405167ffffffffffffffff9091168152602001610371565b6104e0610e82565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61048161054a366004614e60565b610f32565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b61057c6105a23660046149cb565b6110e7565b6104816105b53660046149cb565b611146565b61071c6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614f74565b610481610737366004614f95565b611210565b61048161074a366004615082565b611276565b61048161132e565b6104bf6107653660046149cb565b611411565b6000546001600160a01b031661057c565b61087e6107893660046149cb565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b03166000908152600d6020908152604091829020825160c081018452905463ffffffff808216835264010000000082048116938301939093526801000000000000000081049092169281019290925267ffffffffffffffff6c0100000000000000000000000082048116606084015274010000000000000000000000000000000000000000820416608083015260ff7c010000000000000000000000000000000000000000000000000000000090910416151560a082015290565b6040516103719190600060c08201905063ffffffff80845116835280602085015116602084015280604085015116604084015250606083015167ffffffffffffffff8082166060850152806080860151166080850152505060a0830151151560a083015292915050565b6104966108f63660046150f7565b611519565b610903611f4b565b6040516103719291906151a5565b61048161091f3660046151e7565b61204f565b6104966120b7565b6109346120c1565b6040516103719190615255565b61048161094f3660046152a2565b612172565b610481612183565b61048161096a3660046149cb565b61241a565b6000546001600160a01b0316331480159061099557506002546001600160a01b03163314155b156109cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d58161242b565b50565b6000806109f06109eb608085018561536a565b61265a565b9050610a1b610a02602085018561536a565b8351909150610a1460408701876153cf565b905061274e565b6000600d81610a3060808701606088016149cb565b6001600160a01b031681526020808201929092526040908101600020815160c081018352905463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316918101919091526c01000000000000000000000000820467ffffffffffffffff90811660608301527401000000000000000000000000000000000000000083041660808201527c010000000000000000000000000000000000000000000000000000000090910460ff16151560a08201819052909150610b4d57610b0a60808501606086016149cb565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610b7b6080890160608a016149cb565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a9190615463565b9092509050806000808080610c4260408c018c6153cf565b90501115610c7d57610c71610c5d60808c0160608d016149cb565b87610c6b60408e018e6153cf565b8b612877565b91945092509050610c99565b8651610c969063ffffffff16662386f26fc100006154c5565b92505b6080870151610cb29067ffffffffffffffff16846154c5565b606088015160055491945060009167ffffffffffffffff9091169063ffffffff8516907a010000000000000000000000000000000000000000000000000000900461ffff16610d0460208f018f61536a565b610d0f9291506154c5565b6005548c51610d3e91760100000000000000000000000000000000000000000000900463ffffffff16906154dc565b610d4891906154dc565b610d5291906154dc565b610d5c91906154c5565b610d76906dffffffffffffffffffffffffffff87166154c5565b60065490915060009062010000900461ffff1615610dea576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610de6818e8060200190610dcc919061536a565b90508f8060400190610dde91906153cf565b905087612b30565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610e1484886154dc565b610e1e91906154dc565b610e2891906154ef565b9c9b505050505050505050505050565b610e40612c02565b610e4a8282612c78565b5050565b601054600090610e7d90700100000000000000000000000000000000900467ffffffffffffffff16600161552a565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e7d90612fd8565b6000546001600160a01b03163314801590610f5857506002546001600160a01b03163314155b15610f8f576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd657506001600160a01b038116155b1561100d576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061101761308a565b121561104f576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e4a9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d6919061554b565b6001600160a01b038516919061314a565b60006110f4600a836131ca565b611135576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b611140600a836131df565b92915050565b6000546001600160a01b0316331480159061116c57506002546001600160a01b03163314155b156111a3576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061123657506002546001600160a01b03163314155b1561126d576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d5816131f4565b6000546001600160a01b0316331480159061129c57506002546001600160a01b03163314155b156112d3576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4a8282808060200260200160405190810160405280939291908181526020016000905b828210156113245761131560408302860136819003810190615564565b815260200190600101906112f8565b5050505050613321565b6001546001600160a01b031633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b44565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561146a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611140576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906155a3565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d91906155c0565b156115d4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611614576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314611658576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611662848061536a565b90506020146116a957611675848061536a565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610b44929190615626565b60006116b5858061536a565b8101906116c2919061563a565b90506001600160a01b038111806116d95750600a81105b156116e857611675858061536a565b60006116fa6109eb608088018861536a565b51905061171d61170d602088018861536a565b905082610a1460408a018a6153cf565b61179961172d60408801886153cf565b808060200260200160405190810160405280939291908181526020016000905b828210156117795761176a60408302860136819003810190615653565b8152602001906001019061174d565b505060065464010000000090046001600160a01b03169250613594915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166117d360808801606089016149cb565b6001600160a01b03160361183757601080548691906000906118049084906bffffffffffffffffffffffff1661568d565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555061195e565b60065464010000000090046001600160a01b03166241e5be61185f6080890160608a016149cb565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa1580156118eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190f919061554b565b6010805460009061192f9084906bffffffffffffffffffffffff1661568d565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116911611156119cb576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384166000908152600f602052604090205467ffffffffffffffff16158015611a2357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611b1b576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611acb91906155a3565b6001600160a01b0385166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001866001600160a01b03168152602001846001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611b98906156b2565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301869052600060408085018290526001600160a01b038b168252600f90925290812080546060909401939092611bf791166156b2565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611c2c60808a0160608b016149cb565b6001600160a01b03168152602001878152602001888060200190611c50919061536a565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611c9760408a018a6153cf565b808060200260200160405190810160405280939291908181526020016000905b82821015611ce357611cd460408302860136819003810190615653565b81526020019060010190611cb7565b5050509183525050602001611cfb60408a018a6153cf565b905067ffffffffffffffff811115611d1557611d15614a69565b604051908082528060200260200182016040528015611d4857816020015b6060815260200190600190039081611d335790505b508152600060209091018190529091505b611d6660408901896153cf565b9050811015611ed3576000611d7e60408a018a6153cf565b83818110611d8e57611d8e6156d9565b905060400201803603810190611da49190615653565b9050611db381600001516110e7565b6001600160a01b0316639687544588611dcc8c8061536a565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611e3a959493927f000000000000000000000000000000000000000000000000000000000000000091600401615708565b6000604051808303816000875af1158015611e59573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e9f9190810190615760565b8361016001518381518110611eb657611eb66156d9565b60200260200101819052505080611ecc90615812565b9050611d59565b50611efe817f000000000000000000000000000000000000000000000000000000000000000061374f565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611f349083906158e3565b60405180910390a161018001519695505050505050565b6060600080611f5a60076138c8565b90508067ffffffffffffffff811115611f7557611f75614a69565b604051908082528060200260200182016040528015611fba57816020015b6040805180820190915260008082526020820152815260200190600190039081611f935790505b50925060005b8181101561202c57600080611fd66007846138d3565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061200e5761200e6156d9565b602002602001018190525050508061202590615812565b9050611fc0565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b0316331480159061207557506002546001600160a01b03163314155b156120ac576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d56003826138f1565b6000610e7d61308a565b606060006120cf600a613ac9565b67ffffffffffffffff8111156120e7576120e7614a69565b604051908082528060200260200182016040528015612110578160200160208202803683370190505b50905060005b815181101561216c5761212a600a82613ad4565b5082828151811061213d5761213d6156d9565b60200260200101816001600160a01b03166001600160a01b0316815250508061216590615812565b9050612116565b50919050565b61217a612c02565b6109d581613ae3565b6000546001600160a01b031633148015906121a957506002546001600160a01b03163314155b80156121bd57506121bb600733613e3b565b155b156121f4576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff166000819003612248576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612293576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061229d61308a565b12156122d5576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006122e260076138c8565b905060005b818110156123d7576000806122fd6007846138d3565b909250905060008761231d836bffffffffffffffffffffffff8a166154c5565b61232791906154ef565b90506123338187615a36565b95506123776001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff841661314a565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806123d090615812565b90506122e7565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612422612c02565b6109d581613e50565b60005b815181101561262a57600082828151811061244b5761244b6156d9565b6020908102919091018101516040805160c080820183528385015163ffffffff9081168352838501518116838701908152606080870151831685870190815260808089015167ffffffffffffffff90811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a5296909820945185549251985191519651945115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9589167401000000000000000000000000000000000000000002959095167fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff979098166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff9285166801000000000000000002929092167fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff998516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090941691909416179190911796909616179490941791909116919091179190911790555061262381615812565b905061242e565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516112059190615a5b565b60408051602081019091526000815260008290036126b05750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152611140565b7f97a657c9000000000000000000000000000000000000000000000000000000006126db8385615b05565b7fffffffff000000000000000000000000000000000000000000000000000000001614612734576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127418260048186615b4d565b8101906115129190615b77565b6006547801000000000000000000000000000000000000000000000000900463ffffffff16808411156127b7576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b44565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16831115612819576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff16821115612871576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808084815b81811015612abb57600088888381811061289a5761289a6156d9565b9050604002018036038101906128b09190615653565b80516001600160a01b03166000908152600e60209081526040918290208251606081018452905461ffff8116825263ffffffff620100008204811693830193909352660100000000000090048216928101929092528251929350909161291a91600a91906131ca16565b61295e5781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b805160009061ffff1615612a775760008d6001600160a01b031684600001516001600160a01b031614612a225760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa1580156129f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1b9190615bb9565b9050612a25565b508b5b82516020850151620186a09161ffff1690612a5f907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851690613f2b565b612a6991906154c5565b612a7391906154ef565b9150505b612a8181896154dc565b9750816020015187612a939190615bd4565b9650816040015186612aa59190615bd4565b955050505080612ab490615812565b905061287e565b506000856020015163ffffffff16662386f26fc10000612adb91906154c5565b905080851015612aee579350612b259050565b6000866040015163ffffffff16662386f26fc10000612b0d91906154c5565b905080861115612b21579450612b25915050565b5050505b955095509592505050565b60008063ffffffff8316612b456080866154c5565b612b51876102206154dc565b612b5b91906154dc565b612b6591906154dc565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612ba79061ffff16846154c5565b612bb191906154dc565b60065490915062010000900461ffff16612bdb6dffffffffffffffffffffffffffff8916836154c5565b612be591906154c5565b612bf590655af3107a40006154c5565b925050505b949350505050565b6000546001600160a01b03163314612c76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b44565b565b60005b8251811015612dd9576000838281518110612c9857612c986156d9565b60200260200101516000015190506000848381518110612cba57612cba6156d9565b6020026020010151602001519050612cdc82600a6131ca90919063ffffffff16565b612d1d576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6001600160a01b038116612d32600a846131df565b6001600160a01b031614612d72576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612d7d600a83613f68565b15612dc657604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612dd290615812565b9050612c7b565b5060005b8151811015612fd3576000828281518110612dfa57612dfa6156d9565b60200260200101516000015190506000838381518110612e1c57612e1c6156d9565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612e5257506001600160a01b038116155b15612e89576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ec7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eeb9190615bf1565b6001600160a01b0316826001600160a01b031614612f35576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f41600a8383613f7d565b15612f8e57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1612fc0565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080612fcc90615812565b9050612ddd565b505050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261306682606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261304a9190615c0e565b85608001516fffffffffffffffffffffffffffffffff16613f93565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561311c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613140919061554b565b610e7d9190615c21565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612fd3908490613fbb565b6000611512836001600160a01b0384166140ba565b6000611512836001600160a01b0384166140c6565b60005b81518110156132f1576000828281518110613214576132146156d9565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e90975293909520915182549151945184166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff9590941662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092169516949094179390931791909116179055506132ea81615812565b90506131f7565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516112059190615c41565b8051604081111561335e576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16158015906133ac575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b156133b9576133b9612183565b60006133c560076138c8565b90505b80156134075760006133e66133de600184615c0e565b6007906138d3565b5090506133f46007826140d2565b50508061340090615cae565b90506133c8565b506000805b82811015613515576000848281518110613428576134286156d9565b6020026020010151600001519050600085838151811061344a5761344a6156d9565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061349f57506001600160a01b038216155b156134e1576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6134f160078361ffff84166140e7565b5061350061ffff821685615bd4565b935050508061350e90615812565b905061340c565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906135879083908690615ce3565b60405180910390a1505050565b81516000805b82811015613741576000846001600160a01b031663d02641a08784815181106135c5576135c56156d9565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561362c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136509190615d02565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036136d55785828151811061368b5761368b6156d9565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b6137238683815181106136ea576136ea6156d9565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613f2b90919063ffffffff16565b61372d90846154dc565b9250508061373a90615812565b905061359a565b5061287160038260006140fd565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016137e59897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b604051602081830303815290604052805190602001208561012001518051906020012086610140015160405160200161381e9190615d35565b6040516020818303038152906040528051906020012087610160015160405160200161384a9190615d48565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b60006111408261444c565b60008080806138e28686614457565b909450925050505b9250929050565b815460009061391a90700100000000000000000000000000000000900463ffffffff1642615c0e565b905080156139bc5760018301548354613962916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416613f93565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546139e2916fffffffffffffffffffffffffffffffff9081169116614482565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906135879084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b6000611140826138c8565b60008080806138e286866138d3565b60e08101516001600160a01b0316613b27576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525082604051611205929190615d5b565b6000611512836001600160a01b038416614498565b336001600160a01b03821603613ec2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b44565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613f5e837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166154c5565b61151291906154ef565b6000611512836001600160a01b0384166144a4565b6000612bfa846001600160a01b038516846144b0565b6000613fb285613fa384866154c5565b613fad90876154dc565b614482565b95945050505050565b6000614010826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166144c69092919063ffffffff16565b805190915015612fd3578080602001905181019061402e91906155c0565b612fd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b44565b60006115128383614498565b600061151283836144d5565b6000611512836001600160a01b03841661455f565b6000612bfa846001600160a01b0385168461457c565b825474010000000000000000000000000000000000000000900460ff161580614124575081155b1561412e57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061417490700100000000000000000000000000000000900463ffffffff1642615c0e565b9050801561423457818311156141b6576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546141f09083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16613f93565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156142d1576001600160a01b038416614286576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610b44565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610b44565b848310156143ca5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906143159082615c0e565b61431f878a615c0e565b61432991906154dc565b61433391906154ef565b90506001600160a01b03861661437f576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610b44565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610b44565b6143d48584615c0e565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600061114082614599565b6000808061446585856145a3565b600081815260029690960160205260409095205494959350505050565b60008183106144915781611512565b5090919050565b600061151283836145af565b6000611512838361455f565b6000612bfa84846001600160a01b03851661457c565b6060612bfa84846000856145c7565b6000818152600283016020526040812054801515806144f957506144f98484614498565b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b44565b6000818152600283016020526040812081905561151283836146c8565b60008281526002840160205260408120829055612bfa84846146d4565b6000611140825490565b600061151283836146e0565b60008181526001830160205260408120541515611512565b606082471015614659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b44565b600080866001600160a01b031685876040516146759190615de5565b60006040518083038185875af1925050503d80600081146146b2576040519150601f19603f3d011682016040523d82523d6000602084013e6146b7565b606091505b5091509150612bf58783838761470a565b6000611512838361479d565b60006115128383614897565b60008260000182815481106146f7576146f76156d9565b9060005260206000200154905092915050565b6060831561479357825160000361478c576001600160a01b0385163b61478c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b44565b5081612bfa565b612bfa83836148e6565b600081815260018301602052604081205480156148865760006147c1600183615c0e565b85549091506000906147d590600190615c0e565b905081811461483a5760008660000182815481106147f5576147f56156d9565b9060005260206000200154905080876000018481548110614818576148186156d9565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061484b5761484b615e01565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611140565b6000915050611140565b5092915050565b60008181526001830160205260408120546148de57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611140565b506000611140565b8151156148f65781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449190614a56565b60e0810161114082846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146109d557600080fd5b80356149c6816149a6565b919050565b6000602082840312156149dd57600080fd5b8135611512816149a6565b60005b83811015614a035781810151838201526020016149eb565b50506000910152565b60008151808452614a248160208601602086016149e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115126020830184614a0c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614abb57614abb614a69565b60405290565b6040805190810167ffffffffffffffff81118282101715614abb57614abb614a69565b6040516080810167ffffffffffffffff81118282101715614abb57614abb614a69565b604051610140810167ffffffffffffffff81118282101715614abb57614abb614a69565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614b7257614b72614a69565b604052919050565b600067ffffffffffffffff821115614b9457614b94614a69565b5060051b60200190565b63ffffffff811681146109d557600080fd5b80356149c681614b9e565b67ffffffffffffffff811681146109d557600080fd5b80356149c681614bbb565b80151581146109d557600080fd5b80356149c681614bdc565b60006020808385031215614c0857600080fd5b823567ffffffffffffffff811115614c1f57600080fd5b8301601f81018513614c3057600080fd5b8035614c43614c3e82614b7a565b614b2b565b81815260e09182028301840191848201919088841115614c6257600080fd5b938501935b83851015614d0d5780858a031215614c7f5760008081fd5b614c87614a98565b8535614c92816149a6565b815285870135614ca181614b9e565b81880152604086810135614cb481614b9e565b90820152606086810135614cc781614b9e565b908201526080614cd8878201614bd1565b9082015260a0614ce9878201614bd1565b9082015260c0614cfa878201614bea565b9082015283529384019391850191614c67565b50979650505050505050565b600060a0828403121561216c57600080fd5b600060208284031215614d3d57600080fd5b813567ffffffffffffffff811115614d5457600080fd5b612bfa84828501614d19565b600082601f830112614d7157600080fd5b81356020614d81614c3e83614b7a565b82815260069290921b84018101918181019086841115614da057600080fd5b8286015b84811015614df15760408189031215614dbd5760008081fd5b614dc5614ac1565b8135614dd0816149a6565b815281850135614ddf816149a6565b81860152835291830191604001614da4565b509695505050505050565b60008060408385031215614e0f57600080fd5b823567ffffffffffffffff80821115614e2757600080fd5b614e3386838701614d60565b93506020850135915080821115614e4957600080fd5b50614e5685828601614d60565b9150509250929050565b60008060408385031215614e7357600080fd5b8235614e7e816149a6565b91506020830135614e8e816149a6565b809150509250929050565b80516001600160a01b031682526020810151614ebb602084018261ffff169052565b506040810151614ed3604084018263ffffffff169052565b506060810151614ee9606084018261ffff169052565b506080810151614f01608084018263ffffffff169052565b5060a0810151614f1760a084018261ffff169052565b5060c0810151614f2d60c084018261ffff169052565b5060e0810151614f4860e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff811684830152612871565b61014081016111408284614e99565b803561ffff811681146149c657600080fd5b60006020808385031215614fa857600080fd5b823567ffffffffffffffff811115614fbf57600080fd5b8301601f81018513614fd057600080fd5b8035614fde614c3e82614b7a565b81815260079190911b82018301908381019087831115614ffd57600080fd5b928401925b82841015615077576080848903121561501b5760008081fd5b615023614ae4565b843561502e816149a6565b815261503b858701614f83565b8682015260408086013561504e81614b9e565b9082015260608581013561506181614b9e565b9082015282526080939093019290840190615002565b979650505050505050565b6000806020838503121561509557600080fd5b823567ffffffffffffffff808211156150ad57600080fd5b818501915085601f8301126150c157600080fd5b8135818111156150d057600080fd5b8660208260061b85010111156150e557600080fd5b60209290920196919550909350505050565b60008060006060848603121561510c57600080fd5b833567ffffffffffffffff81111561512357600080fd5b61512f86828701614d19565b935050602084013591506040840135615147816149a6565b809150509250925092565b600081518084526020808501945080840160005b8381101561519a57815180516001600160a01b0316885283015161ffff168388015260409096019590820190600101615166565b509495945050505050565b6040815260006151b86040830185615152565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff811681146149c657600080fd5b6000606082840312156151f957600080fd5b6040516060810181811067ffffffffffffffff8211171561521c5761521c614a69565b604052823561522a81614bdc565b8152615238602084016151c7565b6020820152615249604084016151c7565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156152965783516001600160a01b031683529284019291840191600101615271565b50909695505050505050565b600061014082840312156152b557600080fd5b6152bd614b07565b6152c6836149bb565b81526152d460208401614f83565b60208201526152e560408401614bb0565b60408201526152f660608401614f83565b606082015261530760808401614bb0565b608082015261531860a08401614f83565b60a082015261532960c08401614f83565b60c082015261533a60e084016149bb565b60e082015261010061534d818501614bb0565b9082015261012061535f848201614bb0565b908201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261539f57600080fd5b83018035915067ffffffffffffffff8211156153ba57600080fd5b6020019150368190038213156138ea57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261540457600080fd5b83018035915067ffffffffffffffff82111561541f57600080fd5b6020019150600681901b36038213156138ea57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146149c657600080fd5b6000806040838503121561547657600080fd5b61547f83615437565b915061548d60208401615437565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761114057611140615496565b8082018082111561114057611140615496565b600082615525577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561489057614890615496565b60006020828403121561555d57600080fd5b5051919050565b60006040828403121561557657600080fd5b61557e614ac1565b8235615589816149a6565b815261559760208401614f83565b60208201529392505050565b6000602082840312156155b557600080fd5b815161151281614bbb565b6000602082840312156155d257600080fd5b815161151281614bdc565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612bfa6020830184866155dd565b60006020828403121561564c57600080fd5b5035919050565b60006040828403121561566557600080fd5b61566d614ac1565b8235615678816149a6565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561489057614890615496565b600067ffffffffffffffff8083168181036156cf576156cf615496565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6001600160a01b038716815260a06020820152600061572b60a0830187896155dd565b85604084015267ffffffffffffffff8516606084015282810360808401526157538185614a0c565b9998505050505050505050565b60006020828403121561577257600080fd5b815167ffffffffffffffff8082111561578a57600080fd5b818401915084601f83011261579e57600080fd5b8151818111156157b0576157b0614a69565b6157e160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b2b565b91508082528560208285010111156157f857600080fd5b6158098160208401602086016149e8565b50949350505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361584357615843615496565b5060010190565b600081518084526020808501945080840160005b8381101561519a57815180516001600160a01b03168852830151838801526040909601959082019060010161585e565b600081518084526020808501808196508360051b8101915082860160005b858110156158d65782840389526158c4848351614a0c565b988501989350908401906001016158ac565b5091979650505050505050565b602081526158fe60208201835167ffffffffffffffff169052565b6000602083015161591a60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a083015161596360c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615996818501836001600160a01b03169052565b840151610120848101919091528401516101a0610140808601829052919250906159c46101c0860184614a0c565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a03858461584a565b945080880151925050610180818786030181880152615a22858461588e565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561489057614890615496565b602080825282518282018190526000919060409081850190868401855b828110156158d657815180516001600160a01b031685528681015163ffffffff90811688870152868201518116878701526060808301519091169086015260808082015167ffffffffffffffff169086015260a080820151615ae58288018267ffffffffffffffff169052565b505060c09081015115159085015260e09093019290850190600101615a78565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615b455780818660040360031b1b83161692505b505092915050565b60008085851115615b5d57600080fd5b83861115615b6a57600080fd5b5050820193919092039150565b600060208284031215615b8957600080fd5b6040516020810181811067ffffffffffffffff82111715615bac57615bac614a69565b6040529135825250919050565b600060208284031215615bcb57600080fd5b61151282615437565b63ffffffff81811683821601908082111561489057614890615496565b600060208284031215615c0357600080fd5b8151611512816149a6565b8181038181111561114057611140615496565b818103600083128015838313168383128216171561489057614890615496565b602080825282518282018190526000919060409081850190868401855b828110156158d657815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff90811687870152606091820151169085015260809093019290850190600101615c5e565b600081615cbd57615cbd615496565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612bfa6040830184615152565b600060408284031215615d1457600080fd5b615d1c614ac1565b615d2583615437565b8152602083015161559781614b9e565b602081526000611512602083018461584a565b602081526000611512602083018461588e565b6102208101615dd882856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61151260e0830184614e99565b60008251615df78184602087016149e8565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"tokensAndPools\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadARMSignal\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenPoolConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PoolAlreadyAdded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PoolDoesNotExist\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenPoolMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"name\":\"PoolRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"pool\",\"type\":\"address\"}],\"internalType\":\"structInternal.PoolUpdate[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"applyPoolUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPool\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"armProxy\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxTokensLength\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"minTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferFeeUSD\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplier\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"ratio\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101806040523480156200001257600080fd5b50604051620083be380380620083be833981016040819052620000359162001e1d565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c08162000323565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555086516001600160a01b0316158062000169575060208701516001600160401b0316155b8062000180575060408701516001600160401b0316155b8062000197575060608701516001600160401b0316155b80620001ae575060c08701516001600160a01b0316155b15620001cd576040516306b7c75960e31b815260040160405180910390fd5b6020808801516040808a015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815289516001600160a01b0390811660e052928a01516001600160401b0390811661010052918a015182166101205260608a015190911660a0908152908901516001600160601b031660c0908152908901518216610140528801511661016052620002aa86620003ce565b620002b58362000645565b620002c082620007e0565b620002cb81620008e5565b6040805160008082526020820190925262000316916200030e565b6040805180820190915260008082526020820152815260200190600190039081620002e65790505b508662000b0f565b5050505050505062002408565b336001600160a01b038216036200037d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003fa576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e0016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b0316815250826040516200063a92919062001ff2565b60405180910390a150565b60005b8151811015620007ae57600082828151811062000669576200066962002072565b6020908102919091018101516040805160c080820183528385015163ffffffff908116835283850151811683870190815260608087015183168587019081526080808901516001600160401b0390811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a529690982094518554925198519151965194511515600160e01b0260ff60e01b19958916600160a01b0295909516600160a01b600160e81b0319979098166c0100000000000000000000000002600160601b600160a01b0319928516680100000000000000000292909216600160401b600160a01b0319998516640100000000026001600160401b0319909416919094161791909117969096161794909417919091169190911791909117905550620007a6816200209e565b905062000648565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516200063a9190620020ba565b60005b8151811015620008b357600082828151811062000804576200080462002072565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e909752939095209151825491519451841666010000000000000263ffffffff60301b1995909416620100000265ffffffffffff19909216951694909417939093179190911617905550620008ab816200209e565b9050620007e3565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516200063a919062002172565b805160408111156200090a57604051635ad0867d60e11b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159062000954575060105463ffffffff6c010000000000000000000000008204166001600160601b0390911610155b1562000964576200096462000e12565b600062000972600762001012565b90505b8015620009be576000620009986200098f600184620021e1565b60079062001025565b509050620009a860078262001043565b505080620009b690620021f7565b905062000975565b506000805b8281101562000aa6576000848281518110620009e357620009e362002072565b6020026020010151600001519050600085838151811062000a085762000a0862002072565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000a4057506001600160a01b038216155b1562000a6b57604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000a7d60078361ffff841662001061565b5062000a8e61ffff82168562002211565b935050508062000a9e906200209e565b9050620009c3565b506010805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000b02908390869062002231565b60405180910390a1505050565b60005b825181101562000c4b57600083828151811062000b335762000b3362002072565b6020026020010151600001519050600084838151811062000b585762000b5862002072565b6020908102919091018101510151905062000b75600a8362001081565b62000b9f576040516373913ebd60e01b81526001600160a01b038316600482015260240162000084565b6001600160a01b03811662000bb6600a8462001098565b6001600160a01b03161462000bde57604051630d98f73360e31b815260040160405180910390fd5b62000beb600a83620010af565b1562000c3557604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b50508062000c43906200209e565b905062000b12565b5060005b815181101562000e0d57600082828151811062000c705762000c7062002072565b6020026020010151600001519050600083838151811062000c955762000c9562002072565b602002602001015160200151905060006001600160a01b0316826001600160a01b0316148062000ccc57506001600160a01b038116155b1562000cea5760405162d8548360e71b815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000d29573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d4f91906200229e565b6001600160a01b0316826001600160a01b03161462000d8157604051630d98f73360e31b815260040160405180910390fd5b62000d8f600a8383620010c6565b1562000dde57604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a162000df7565b604051633caf458560e01b815260040160405180910390fd5b50508062000e05906200209e565b905062000c4f565b505050565b6000546001600160a01b0316331480159062000e3957506002546001600160a01b03163314155b801562000e50575062000e4e600733620010de565b155b1562000e6f5760405163032bb72b60e31b815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff16600081900362000eab5760405163990e30bf60e01b815260040160405180910390fd5b6010546001600160601b03168181101562000ed9576040516311a1ee3b60e31b815260040160405180910390fd5b600062000ee5620010f5565b121562000f0557604051631e9acf1760e31b815260040160405180910390fd5b80600062000f14600762001012565b905060005b8181101562000fec5760008062000f3260078462001025565b909250905060008762000f4f836001600160601b038a16620022be565b62000f5b9190620022d8565b905062000f698187620022fb565b60e05190965062000f8e906001600160a01b0316846001600160601b03841662001183565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a25050508062000fe4906200209e565b905062000f19565b5050601080546001600160601b0319166001600160601b03929092169190911790555050565b60006200101f82620011db565b92915050565b6000808080620010368686620011e8565b9097909650945050505050565b60006200105a836001600160a01b03841662001215565b9392505050565b600062001079846001600160a01b0385168462001234565b949350505050565b60006200105a836001600160a01b03841662001253565b60006200105a836001600160a01b03841662001261565b60006200105a836001600160a01b0384166200126f565b600062001079846001600160a01b038516846200127d565b60006200105a836001600160a01b03841662001295565b60105460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200117291906200231e565b6200117e919062002338565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000e0d918591620012a316565b60006200101f8262001374565b60008080620011f885856200137f565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556200105a83836200138d565b600082815260028401602052604081208290556200107984846200139b565b60006200105a838362001295565b60006200105a8383620013a9565b60006200105a838362001215565b60006200107984846001600160a01b03851662001234565b60006200105a83836200141e565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620012f2906001600160a01b03851690849062001437565b80519091501562000e0d57808060200190518101906200131391906200235b565b62000e0d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b60006200101f825490565b60006200105a838362001448565b60006200105a838362001475565b60006200105a838362001580565b600081815260028301602052604081205480151580620013d05750620013d0848462001295565b6200105a5760405162461bcd60e51b815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b65790000604482015260640162000084565b600081815260018301602052604081205415156200105a565b6060620010798484600085620015d2565b600082600001828154811062001462576200146262002072565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200156e5760006200149c600183620021e1565b8554909150600090620014b290600190620021e1565b90508181146200151e576000866000018281548110620014d657620014d662002072565b9060005260206000200154905080876000018481548110620014fc57620014fc62002072565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001532576200153262002379565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200101f565b60009150506200101f565b5092915050565b6000818152600183016020526040812054620015c9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200101f565b5060006200101f565b606082471015620016355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620016539190620023b5565b60006040518083038185875af1925050503d806000811462001692576040519150601f19603f3d011682016040523d82523d6000602084013e62001697565b606091505b509092509050620016ab87838387620016b6565b979650505050505050565b606083156200172a57825160000362001722576001600160a01b0385163b620017225760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162001079565b620010798383815115620017415781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620023d3565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b03811182821017156200179857620017986200175d565b60405290565b60405161014081016001600160401b03811182821017156200179857620017986200175d565b604080519081016001600160401b03811182821017156200179857620017986200175d565b604051608081016001600160401b03811182821017156200179857620017986200175d565b604051601f8201601f191681016001600160401b03811182821017156200183957620018396200175d565b604052919050565b6001600160a01b03811681146200185757600080fd5b50565b8051620018678162001841565b919050565b80516001600160401b03811681146200186757600080fd5b600060e082840312156200189757600080fd5b620018a162001773565b90508151620018b08162001841565b8152620018c0602083016200186c565b6020820152620018d3604083016200186c565b6040820152620018e6606083016200186c565b606082015260808201516001600160601b03811681146200190657600080fd5b60808201526200191960a083016200185a565b60a08201526200192c60c083016200185a565b60c082015292915050565b805161ffff811681146200186757600080fd5b805163ffffffff811681146200186757600080fd5b600061014082840312156200197357600080fd5b6200197d6200179e565b90506200198a826200185a565b81526200199a6020830162001937565b6020820152620019ad604083016200194a565b6040820152620019c06060830162001937565b6060820152620019d3608083016200194a565b6080820152620019e660a0830162001937565b60a0820152620019f960c0830162001937565b60c082015262001a0c60e083016200185a565b60e082015261010062001a218184016200194a565b9082015261012062001a358382016200194a565b9082015292915050565b60006001600160401b0382111562001a5b5762001a5b6200175d565b5060051b60200190565b600082601f83011262001a7757600080fd5b8151602062001a9062001a8a8362001a3f565b6200180e565b82815260069290921b8401810191818101908684111562001ab057600080fd5b8286015b8481101562001b0a576040818903121562001acf5760008081fd5b62001ad9620017c4565b815162001ae68162001841565b81528185015162001af78162001841565b8186015283529183019160400162001ab4565b509695505050505050565b805180151581146200186757600080fd5b80516001600160801b03811681146200186757600080fd5b60006060828403121562001b5157600080fd5b604051606081016001600160401b038111828210171562001b765762001b766200175d565b60405290508062001b878362001b15565b815262001b976020840162001b26565b602082015262001baa6040840162001b26565b60408201525092915050565b600082601f83011262001bc857600080fd5b8151602062001bdb62001a8a8362001a3f565b82815260e0928302850182019282820191908785111562001bfb57600080fd5b8387015b8581101562001cb05781818a03121562001c195760008081fd5b62001c2362001773565b815162001c308162001841565b815262001c3f8287016200194a565b86820152604062001c528184016200194a565b90820152606062001c658382016200194a565b90820152608062001c788382016200186c565b9082015260a062001c8b8382016200186c565b9082015260c062001c9e83820162001b15565b90820152845292840192810162001bff565b5090979650505050505050565b600082601f83011262001ccf57600080fd5b8151602062001ce262001a8a8362001a3f565b82815260079290921b8401810191818101908684111562001d0257600080fd5b8286015b8481101562001b0a576080818903121562001d215760008081fd5b62001d2b620017e9565b815162001d388162001841565b815262001d4782860162001937565b85820152604062001d5a8184016200194a565b90820152606062001d6d8382016200194a565b9082015283529183019160800162001d06565b600082601f83011262001d9257600080fd5b8151602062001da562001a8a8362001a3f565b82815260069290921b8401810191818101908684111562001dc557600080fd5b8286015b8481101562001b0a576040818903121562001de45760008081fd5b62001dee620017c4565b815162001dfb8162001841565b815262001e0a82860162001937565b8186015283529183019160400162001dc9565b6000806000806000806000610300888a03121562001e3a57600080fd5b62001e46898962001884565b965062001e578960e08a016200195f565b6102208901519096506001600160401b038082111562001e7657600080fd5b62001e848b838c0162001a65565b965062001e968b6102408c0162001b3e565b95506102a08a015191508082111562001eae57600080fd5b62001ebc8b838c0162001bb6565b94506102c08a015191508082111562001ed457600080fd5b62001ee28b838c0162001cbd565b93506102e08a015191508082111562001efa57600080fd5b5062001f098a828b0162001d80565b91505092959891949750929550565b80516001600160a01b03168252602081015162001f3b602084018261ffff169052565b50604081015162001f54604084018263ffffffff169052565b50606081015162001f6b606084018261ffff169052565b50608081015162001f84608084018263ffffffff169052565b5060a081015162001f9b60a084018261ffff169052565b5060c081015162001fb260c084018261ffff169052565b5060e081015162001fce60e08401826001600160a01b03169052565b506101008181015163ffffffff908116918401919091526101209182015116910152565b82516001600160a01b0390811682526020808501516001600160401b0390811691840191909152604080860151821690840152606080860151909116908301526080808501516001600160601b03169083015260a08085015182169083015260c0808501519091169082015261022081016200105a60e083018462001f18565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201620020b357620020b362002088565b5060010190565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015163ffffffff9081168887015286820151811687870152606080830151909116908601526080808201516001600160401b03169086015260a08082015162002144878301826001600160401b03169052565b505060c09081015115159085015260e09093019290850190600101620020d7565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156200216557815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff908116878701526060918201511690850152608090930192908501906001016200218f565b818103818111156200101f576200101f62002088565b60008162002209576200220962002088565b506000190190565b63ffffffff81811683821601908082111562001579576200157962002088565b6000604080830163ffffffff8616845260208281860152818651808452606087019150828801935060005b818110156200229057845180516001600160a01b0316845284015161ffff168484015293830193918501916001016200225c565b509098975050505050505050565b600060208284031215620022b157600080fd5b81516200105a8162001841565b80820281158282048414176200101f576200101f62002088565b600082620022f657634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001579576200157962002088565b6000602082840312156200233157600080fd5b5051919050565b818103600083128015838313168383128216171562001579576200157962002088565b6000602082840312156200236e57600080fd5b6200105a8262001b15565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620023ac57818101518382015260200162002392565b50506000910152565b60008251620023c98184602087016200238f565b9190910192915050565b6020815260008251806020840152620023f48160408501602087016200238f565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516101405161016051615eaf6200250f600039600081816103340152818161151d0152613e730152600081816103050152818161143f015281816114a701528181611a8601528181611aee0152613e4401526000818161027101528181610bc201528181611e830152613db001526000818161024101528181611bb90152613d8001526000818161021201528181610f910152818161183101528181611932015281816123b40152818161313f015281816134cc0152613d510152600081816102d1015281816119fe0152613e100152600081816102a1015281816126fb0152613de001526000611f4b0152615eaf6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806375294130116100f9578063b06d41bc11610097578063d3c7c2c711610071578063d3c7c2c71461092c578063e687b40a14610941578063eff7cc4814610954578063f2fde38b1461095c57600080fd5b8063b06d41bc146108fb578063c92b283214610911578063d09dc3391461092457600080fd5b8063856c8247116100d3578063856c8247146107575780638da5cb5b1461076a5780639a113c361461077b578063a7d3e02f146108e857600080fd5b8063752941301461072957806376f6ae761461073c57806379ba50971461074f57600080fd5b8063546719cd11610166578063599f643111610140578063599f64311461056f5780635d86f14114610594578063704b6c02146105a75780637437ff9f146105ba57600080fd5b8063546719cd146104d8578063549e946f1461053c57806354b714681461054f57600080fd5b8063352e4bc8116101a2578063352e4bc81461046e57806338724a95146104835780633a87ac53146104a45780634120fccd146104b757600080fd5b806306285c69146101c95780631772047e1461037a578063181f5a7714610425575b600080fd5b6103646040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b604051610371919061499c565b60405180910390f35b6103f1610388366004614a3d565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03949094168452600e825292829020825193840183525461ffff8116845263ffffffff62010000820481169285019290925266010000000000009004169082015290565b60408051825161ffff16815260208084015163ffffffff908116918301919091529282015190921690820152606001610371565b6104616040518060400160405280601381526020017f45564d3245564d4f6e52616d7020312e322e300000000000000000000000000081525081565b6040516103719190614ac8565b61048161047c366004614c67565b61096f565b005b610496610491366004614d9d565b6109d8565b604051908152602001610371565b6104816104b2366004614e6e565b610e38565b6104bf610e4e565b60405167ffffffffffffffff9091168152602001610371565b6104e0610e82565b604051610371919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b61048161054a366004614ed2565b610f32565b6010546040516bffffffffffffffffffffffff9091168152602001610371565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610371565b61057c6105a2366004614a3d565b6110e7565b6104816105b5366004614a3d565b611146565b61071c6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101919091525060408051610140810182526005546001600160a01b03808216835261ffff7401000000000000000000000000000000000000000083048116602085015263ffffffff76010000000000000000000000000000000000000000000084048116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000810490911660c0850152640100000000810490911660e08401527801000000000000000000000000000000000000000000000000810484166101008401520490911661012082015290565b6040516103719190614fe6565b610481610737366004615007565b611210565b61048161074a3660046150f4565b611276565b61048161132e565b6104bf610765366004614a3d565b611411565b6000546001600160a01b031661057c565b61087e610789366004614a3d565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506001600160a01b03166000908152600d6020908152604091829020825160c081018452905463ffffffff808216835264010000000082048116938301939093526801000000000000000081049092169281019290925267ffffffffffffffff6c0100000000000000000000000082048116606084015274010000000000000000000000000000000000000000820416608083015260ff7c010000000000000000000000000000000000000000000000000000000090910416151560a082015290565b6040516103719190600060c08201905063ffffffff80845116835280602085015116602084015280604085015116604084015250606083015167ffffffffffffffff8082166060850152806080860151166080850152505060a0830151151560a083015292915050565b6104966108f6366004615169565b611519565b610903611fbd565b604051610371929190615217565b61048161091f366004615259565b6120c1565b610496612129565b610934612133565b60405161037191906152c7565b61048161094f366004615314565b6121e4565b6104816121f5565b61048161096a366004614a3d565b61248c565b6000546001600160a01b0316331480159061099557506002546001600160a01b03163314155b156109cc576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d58161249d565b50565b6000806109f06109eb60808501856153dc565b6126cc565b9050610a1b610a0260208501856153dc565b8351909150610a146040870187615441565b90506127c0565b6000600d81610a306080870160608801614a3d565b6001600160a01b031681526020808201929092526040908101600020815160c081018352905463ffffffff80821683526401000000008204811694830194909452680100000000000000008104909316918101919091526c01000000000000000000000000820467ffffffffffffffff90811660608301527401000000000000000000000000000000000000000083041660808201527c010000000000000000000000000000000000000000000000000000000090910460ff16151560a08201819052909150610b4d57610b0a6080850160608601614a3d565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024015b60405180910390fd5b600654600090819064010000000090046001600160a01b031663ffdb4b37610b7b6080890160608a01614a3d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526044016040805180830381865afa158015610c06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c2a91906154d5565b9092509050806000808080610c4260408c018c615441565b90501115610c7d57610c71610c5d60808c0160608d01614a3d565b87610c6b60408e018e615441565b8b6128e9565b91945092509050610c99565b8651610c969063ffffffff16662386f26fc10000615537565b92505b6080870151610cb29067ffffffffffffffff1684615537565b606088015160055491945060009167ffffffffffffffff9091169063ffffffff8516907a010000000000000000000000000000000000000000000000000000900461ffff16610d0460208f018f6153dc565b610d0f929150615537565b6005548c51610d3e91760100000000000000000000000000000000000000000000900463ffffffff169061554e565b610d48919061554e565b610d52919061554e565b610d5c9190615537565b610d76906dffffffffffffffffffffffffffff8716615537565b60065490915060009062010000900461ffff1615610dea576000607060ff16887bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16901c9050610de6818e8060200190610dcc91906153dc565b90508f8060400190610dde9190615441565b905087612ba2565b9150505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff881681610e14848861554e565b610e1e919061554e565b610e289190615561565b9c9b505050505050505050505050565b610e40612c74565b610e4a8282612cea565b5050565b601054600090610e7d90700100000000000000000000000000000000900467ffffffffffffffff16600161559c565b905090565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610e7d9061304a565b6000546001600160a01b03163314801590610f5857506002546001600160a01b03163314155b15610f8f576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd657506001600160a01b038116155b1561100d576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110176130fc565b121561104f576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152610e4a9082906001600160a01b038516906370a0823190602401602060405180830381865afa1580156110b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d691906155bd565b6001600160a01b03851691906131bc565b60006110f4600a8361323c565b611135576040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b611140600a83613251565b92915050565b6000546001600160a01b0316331480159061116c57506002546001600160a01b03163314155b156111a3576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b6000546001600160a01b0316331480159061123657506002546001600160a01b03163314155b1561126d576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d581613266565b6000546001600160a01b0316331480159061129c57506002546001600160a01b03163314155b156112d3576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4a8282808060200260200160405190810160405280939291908181526020016000905b8282101561132457611315604083028601368190038101906155d6565b815260200190600101906112f8565b5050505050613393565b6001546001600160a01b031633146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610b44565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168015801561146a57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611140576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115129190615615565b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663397796f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190615632565b156115d4576040517fc148371500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038216611614576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b03163314611658576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61166284806153dc565b90506020146116a95761167584806153dc565b6040517f370d875f000000000000000000000000000000000000000000000000000000008152600401610b44929190615698565b60006116b585806153dc565b8101906116c291906156ac565b90506001600160a01b038111806116d95750600a81105b156116e85761167585806153dc565b60006116fa6109eb60808801886153dc565b519050600061170c6040880188615441565b9150611729905061172060208901896153dc565b905083836127c0565b80156118275760005b818110156117aa576117476040890189615441565b82818110611757576117576156c5565b9050604002016020013560000361179a576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117a3816156f4565b9050611732565b506118276117bb6040890189615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611807576117f86040830286013681900381019061572c565b815260200190600101906117db565b505060065464010000000090046001600160a01b03169250613606915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166118616080890160608a01614a3d565b6001600160a01b0316036118c557601080548791906000906118929084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506119ec565b60065464010000000090046001600160a01b03166241e5be6118ed60808a0160608b01614a3d565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018a90527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611979573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061199d91906155bd565b601080546000906119bd9084906bffffffffffffffffffffffff16615766565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b6010546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611a59576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166000908152600f602052604090205467ffffffffffffffff16158015611ab157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615155b15611ba9576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611b35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b599190615615565b6001600160a01b0386166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b6000604051806101a001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168152602001876001600160a01b03168152602001856001600160a01b0316815260200160108081819054906101000a900467ffffffffffffffff16611c269061578b565b825467ffffffffffffffff9182166101009390930a838102908302199091161790925582526020808301879052600060408085018290526001600160a01b038c168252600f90925290812080546060909401939092611c85911661578b565b825467ffffffffffffffff9182166101009390930a83810292021916179091558152602001611cba60808b0160608c01614a3d565b6001600160a01b03168152602001888152602001898060200190611cde91906153dc565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611d2560408b018b615441565b808060200260200160405190810160405280939291908181526020016000905b82821015611d7157611d626040830286013681900381019061572c565b81526020019060010190611d45565b505050505081526020018367ffffffffffffffff811115611d9457611d94614adb565b604051908082528060200260200182016040528015611dc757816020015b6060815260200190600190039081611db25790505b508152600060209091018190529091505b82811015611f44576000611def60408b018b615441565b83818110611dff57611dff6156c5565b905060400201803603810190611e15919061572c565b9050611e2481600001516110e7565b6001600160a01b0316639687544589611e3d8d806153dc565b60208087015160408051928301815260008352517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b168152611eab959493927f0000000000000000000000000000000000000000000000000000000000000000916004016157b2565b6000604051808303816000875af1158015611eca573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611f10919081019061580a565b8361016001518381518110611f2757611f276156c5565b60200260200101819052505080611f3d906156f4565b9050611dd8565b50611f6f817f00000000000000000000000000000000000000000000000000000000000000006137c1565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90611fa5908390615955565b60405180910390a16101800151979650505050505050565b6060600080611fcc600761393a565b90508067ffffffffffffffff811115611fe757611fe7614adb565b60405190808252806020026020018201604052801561202c57816020015b60408051808201909152600080825260208201528152602001906001900390816120055790505b50925060005b8181101561209e57600080612048600784613945565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110612080576120806156c5565b6020026020010181905250505080612097906156f4565b9050612032565b505060105491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906120e757506002546001600160a01b03163314155b1561211e576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109d5600382613963565b6000610e7d6130fc565b60606000612141600a613b3b565b67ffffffffffffffff81111561215957612159614adb565b604051908082528060200260200182016040528015612182578160200160208202803683370190505b50905060005b81518110156121de5761219c600a82613b46565b508282815181106121af576121af6156c5565b60200260200101816001600160a01b03166001600160a01b031681525050806121d7906156f4565b9050612188565b50919050565b6121ec612c74565b6109d581613b55565b6000546001600160a01b0316331480159061221b57506002546001600160a01b03163314155b801561222f575061222d600733613ead565b155b15612266576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff1660008190036122ba576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546bffffffffffffffffffffffff1681811015612305576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061230f6130fc565b1215612347576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000612354600761393a565b905060005b818110156124495760008061236f600784613945565b909250905060008761238f836bffffffffffffffffffffffff8a16615537565b6123999190615561565b90506123a58187615aa8565b95506123e96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff84166131bc565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080612442906156f4565b9050612359565b5050601080547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612494612c74565b6109d581613ec2565b60005b815181101561269c5760008282815181106124bd576124bd6156c5565b6020908102919091018101516040805160c080820183528385015163ffffffff9081168352838501518116838701908152606080870151831685870190815260808089015167ffffffffffffffff90811693880193845260a0808b01518216928901928352968a0151151596880196875298516001600160a01b03166000908152600d909a5296909820945185549251985191519651945115157c0100000000000000000000000000000000000000000000000000000000027fffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9589167401000000000000000000000000000000000000000002959095167fffffff000000000000000000ffffffffffffffffffffffffffffffffffffffff979098166c01000000000000000000000000027fffffffffffffffffffffffff0000000000000000ffffffffffffffffffffffff9285166801000000000000000002929092167fffffffffffffffffffffffff000000000000000000000000ffffffffffffffff998516640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909416919094161791909117969096161794909417919091169190911791909117905550612695816156f4565b90506124a0565b507f2386f61ab5cafc3fed44f9f614f721ab53479ef64067fd16c1a2491b63ddf1a8816040516112059190615acd565b60408051602081019091526000815260008290036127225750604080516020810190915267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152611140565b7f97a657c90000000000000000000000000000000000000000000000000000000061274d8385615b77565b7fffffffff0000000000000000000000000000000000000000000000000000000016146127a6576040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127b38260048186615bbf565b8101906115129190615be9565b6006547801000000000000000000000000000000000000000000000000900463ffffffff1680841115612829576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101859052604401610b44565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683111561288b576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900461ffff168211156128e3576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6000808084815b81811015612b2d57600088888381811061290c5761290c6156c5565b905060400201803603810190612922919061572c565b80516001600160a01b03166000908152600e60209081526040918290208251606081018452905461ffff8116825263ffffffff620100008204811693830193909352660100000000000090048216928101929092528251929350909161298c91600a919061323c16565b6129d05781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b805160009061ffff1615612ae95760008d6001600160a01b031684600001516001600160a01b031614612a945760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8d9190615c2b565b9050612a97565b508b5b82516020850151620186a09161ffff1690612ad1907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff851690613f9d565b612adb9190615537565b612ae59190615561565b9150505b612af3818961554e565b9750816020015187612b059190615c46565b9650816040015186612b179190615c46565b955050505080612b26906156f4565b90506128f0565b506000856020015163ffffffff16662386f26fc10000612b4d9190615537565b905080851015612b60579350612b979050565b6000866040015163ffffffff16662386f26fc10000612b7f9190615537565b905080861115612b93579450612b97915050565b5050505b955095509592505050565b60008063ffffffff8316612bb7608086615537565b612bc38761022061554e565b612bcd919061554e565b612bd7919061554e565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612c199061ffff1684615537565b612c23919061554e565b60065490915062010000900461ffff16612c4d6dffffffffffffffffffffffffffff891683615537565b612c579190615537565b612c6790655af3107a4000615537565b925050505b949350505050565b6000546001600160a01b03163314612ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b44565b565b60005b8251811015612e4b576000838281518110612d0a57612d0a6156c5565b60200260200101516000015190506000848381518110612d2c57612d2c6156c5565b6020026020010151602001519050612d4e82600a61323c90919063ffffffff16565b612d8f576040517f73913ebd0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b6001600160a01b038116612da4600a84613251565b6001600160a01b031614612de4576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612def600a83613fda565b15612e3857604080516001600160a01b038085168252831660208201527f987eb3c2f78454541205f72f34839b434c306c9eaf4922efd7c0c3060fdb2e4c910160405180910390a15b505080612e44906156f4565b9050612ced565b5060005b8151811015613045576000828281518110612e6c57612e6c6156c5565b60200260200101516000015190506000838381518110612e8e57612e8e6156c5565b602002602001015160200151905060006001600160a01b0316826001600160a01b03161480612ec457506001600160a01b038116155b15612efb576040517f6c2a418000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001600160a01b03166321df0da76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5d9190615c63565b6001600160a01b0316826001600160a01b031614612fa7576040517f6cc7b99800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fb3600a8383613fef565b1561300057604080516001600160a01b038085168252831660208201527f95f865c2808f8b2a85eea2611db7843150ee7835ef1403f9755918a97d76933c910160405180910390a1613032565b6040517f3caf458500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50508061303e906156f4565b9050612e4f565b505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526130d882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426130bc9190615c80565b85608001516fffffffffffffffffffffffffffffffff16614005565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6010546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561318e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b291906155bd565b610e7d9190615c93565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261304590849061402d565b6000611512836001600160a01b03841661412c565b6000611512836001600160a01b038416614138565b60005b8151811015613363576000828281518110613286576132866156c5565b60209081029190910181015160408051606080820183528385015161ffff90811683528385015163ffffffff90811684880190815292860151811684860190815295516001600160a01b03166000908152600e90975293909520915182549151945184166601000000000000027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff9590941662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000090921695169490941793909317919091161790555061335c816156f4565b9050613269565b507f3df02211160f78e9bbed13e8bf0752035362a05f0651a5e25007acfb659c3620816040516112059190615cb3565b805160408111156133d0576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6010546c01000000000000000000000000900463ffffffff161580159061341e575060105463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff90911610155b1561342b5761342b6121f5565b6000613437600761393a565b90505b8015613479576000613458613450600184615c80565b600790613945565b509050613466600782614144565b50508061347290615d20565b905061343a565b506000805b8281101561358757600084828151811061349a5761349a6156c5565b602002602001015160000151905060008583815181106134bc576134bc6156c5565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061351157506001600160a01b038216155b15613553576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610b44565b61356360078361ffff8416614159565b5061357261ffff821685615c46565b9350505080613580906156f4565b905061347e565b50601080547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd24906135f99083908690615d55565b60405180910390a1505050565b81516000805b828110156137b3576000846001600160a01b031663d02641a0878481518110613637576136376156c5565b6020908102919091010151516040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024016040805180830381865afa15801561369e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136c29190615d74565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613747578582815181106136fd576136fd6156c5565b6020908102919091010151516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610b44565b61379586838151811061375c5761375c6156c5565b602002602001015160200151827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16613f9d90919063ffffffff16565b61379f908461554e565b925050806137ac906156f4565b905061360c565b506128e3600382600061416f565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b61010001516040516020016138579897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b60405160208183030381529060405280519060200120856101200151805190602001208661014001516040516020016138909190615da7565b604051602081830303815290604052805190602001208761016001516040516020016138bc9190615dba565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b6000611140826144be565b600080808061395486866144c9565b909450925050505b9250929050565b815460009061398c90700100000000000000000000000000000000900463ffffffff1642615c80565b90508015613a2e57600183015483546139d4916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416614005565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354613a54916fffffffffffffffffffffffffffffffff90811691166144f4565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906135f99084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60006111408261393a565b60008080806139548686613945565b60e08101516001600160a01b0316613b99576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055509050507f2a57f7c2027cf032c78b77d4d8d2fbd20ad22e5d5e5b5fb23ac7d7820d44adc66040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525082604051611205929190615dcd565b6000611512836001600160a01b03841661450a565b336001600160a01b03821603613f34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b44565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a7640000613fd0837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615537565b6115129190615561565b6000611512836001600160a01b038416614516565b6000612c6c846001600160a01b03851684614522565b6000614024856140158486615537565b61401f908761554e565b6144f4565b95945050505050565b6000614082826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166145389092919063ffffffff16565b80519091501561304557808060200190518101906140a09190615632565b613045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b44565b6000611512838361450a565b60006115128383614547565b6000611512836001600160a01b0384166145d1565b6000612c6c846001600160a01b038516846145ee565b825474010000000000000000000000000000000000000000900460ff161580614196575081155b156141a057505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906141e690700100000000000000000000000000000000900463ffffffff1642615c80565b905080156142a65781831115614228576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546142629083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16614005565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015614343576001600160a01b0384166142f8576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610b44565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610b44565b8483101561443c5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906143879082615c80565b614391878a615c80565b61439b919061554e565b6143a59190615561565b90506001600160a01b0386166143f1576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610b44565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610b44565b6144468584615c80565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b60006111408261460b565b600080806144d78585614615565b600081815260029690960160205260409095205494959350505050565b60008183106145035781611512565b5090919050565b60006115128383614621565b600061151283836145d1565b6000612c6c84846001600160a01b0385166145ee565b6060612c6c8484600085614639565b60008181526002830160205260408120548015158061456b575061456b848461450a565b611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f456e756d657261626c654d61703a206e6f6e6578697374656e74206b657900006044820152606401610b44565b60008181526002830160205260408120819055611512838361473a565b60008281526002840160205260408120829055612c6c8484614746565b6000611140825490565b60006115128383614752565b60008181526001830160205260408120541515611512565b6060824710156146cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b44565b600080866001600160a01b031685876040516146e79190615e57565b60006040518083038185875af1925050503d8060008114614724576040519150601f19603f3d011682016040523d82523d6000602084013e614729565b606091505b5091509150612c678783838761477c565b6000611512838361480f565b60006115128383614909565b6000826000018281548110614769576147696156c5565b9060005260206000200154905092915050565b606083156148055782516000036147fe576001600160a01b0385163b6147fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b44565b5081612c6c565b612c6c8383614958565b600081815260018301602052604081205480156148f8576000614833600183615c80565b855490915060009061484790600190615c80565b90508181146148ac576000866000018281548110614867576148676156c5565b906000526020600020015490508087600001848154811061488a5761488a6156c5565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806148bd576148bd615e73565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611140565b6000915050611140565b5092915050565b600081815260018301602052604081205461495057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611140565b506000611140565b8151156149685781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b449190614ac8565b60e0810161114082846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b6001600160a01b03811681146109d557600080fd5b8035614a3881614a18565b919050565b600060208284031215614a4f57600080fd5b813561151281614a18565b60005b83811015614a75578181015183820152602001614a5d565b50506000910152565b60008151808452614a96816020860160208601614a5a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006115126020830184614a7e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b60405290565b6040805190810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b6040516080810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051610140810167ffffffffffffffff81118282101715614b2d57614b2d614adb565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614be457614be4614adb565b604052919050565b600067ffffffffffffffff821115614c0657614c06614adb565b5060051b60200190565b63ffffffff811681146109d557600080fd5b8035614a3881614c10565b67ffffffffffffffff811681146109d557600080fd5b8035614a3881614c2d565b80151581146109d557600080fd5b8035614a3881614c4e565b60006020808385031215614c7a57600080fd5b823567ffffffffffffffff811115614c9157600080fd5b8301601f81018513614ca257600080fd5b8035614cb5614cb082614bec565b614b9d565b81815260e09182028301840191848201919088841115614cd457600080fd5b938501935b83851015614d7f5780858a031215614cf15760008081fd5b614cf9614b0a565b8535614d0481614a18565b815285870135614d1381614c10565b81880152604086810135614d2681614c10565b90820152606086810135614d3981614c10565b908201526080614d4a878201614c43565b9082015260a0614d5b878201614c43565b9082015260c0614d6c878201614c5c565b9082015283529384019391850191614cd9565b50979650505050505050565b600060a082840312156121de57600080fd5b600060208284031215614daf57600080fd5b813567ffffffffffffffff811115614dc657600080fd5b612c6c84828501614d8b565b600082601f830112614de357600080fd5b81356020614df3614cb083614bec565b82815260069290921b84018101918181019086841115614e1257600080fd5b8286015b84811015614e635760408189031215614e2f5760008081fd5b614e37614b33565b8135614e4281614a18565b815281850135614e5181614a18565b81860152835291830191604001614e16565b509695505050505050565b60008060408385031215614e8157600080fd5b823567ffffffffffffffff80821115614e9957600080fd5b614ea586838701614dd2565b93506020850135915080821115614ebb57600080fd5b50614ec885828601614dd2565b9150509250929050565b60008060408385031215614ee557600080fd5b8235614ef081614a18565b91506020830135614f0081614a18565b809150509250929050565b80516001600160a01b031682526020810151614f2d602084018261ffff169052565b506040810151614f45604084018263ffffffff169052565b506060810151614f5b606084018261ffff169052565b506080810151614f73608084018263ffffffff169052565b5060a0810151614f8960a084018261ffff169052565b5060c0810151614f9f60c084018261ffff169052565b5060e0810151614fba60e08401826001600160a01b03169052565b506101008181015163ffffffff81168483015250506101208181015163ffffffff8116848301526128e3565b61014081016111408284614f0b565b803561ffff81168114614a3857600080fd5b6000602080838503121561501a57600080fd5b823567ffffffffffffffff81111561503157600080fd5b8301601f8101851361504257600080fd5b8035615050614cb082614bec565b81815260079190911b8201830190838101908783111561506f57600080fd5b928401925b828410156150e9576080848903121561508d5760008081fd5b615095614b56565b84356150a081614a18565b81526150ad858701614ff5565b868201526040808601356150c081614c10565b908201526060858101356150d381614c10565b9082015282526080939093019290840190615074565b979650505050505050565b6000806020838503121561510757600080fd5b823567ffffffffffffffff8082111561511f57600080fd5b818501915085601f83011261513357600080fd5b81358181111561514257600080fd5b8660208260061b850101111561515757600080fd5b60209290920196919550909350505050565b60008060006060848603121561517e57600080fd5b833567ffffffffffffffff81111561519557600080fd5b6151a186828701614d8b565b9350506020840135915060408401356151b981614a18565b809150509250925092565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015161ffff1683880152604090960195908201906001016151d8565b509495945050505050565b60408152600061522a60408301856151c4565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614a3857600080fd5b60006060828403121561526b57600080fd5b6040516060810181811067ffffffffffffffff8211171561528e5761528e614adb565b604052823561529c81614c4e565b81526152aa60208401615239565b60208201526152bb60408401615239565b60408201529392505050565b6020808252825182820181905260009190848201906040850190845b818110156153085783516001600160a01b0316835292840192918401916001016152e3565b50909695505050505050565b6000610140828403121561532757600080fd5b61532f614b79565b61533883614a2d565b815261534660208401614ff5565b602082015261535760408401614c22565b604082015261536860608401614ff5565b606082015261537960808401614c22565b608082015261538a60a08401614ff5565b60a082015261539b60c08401614ff5565b60c08201526153ac60e08401614a2d565b60e08201526101006153bf818501614c22565b908201526101206153d1848201614c22565b908201529392505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261541157600080fd5b83018035915067ffffffffffffffff82111561542c57600080fd5b60200191503681900382131561395c57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261547657600080fd5b83018035915067ffffffffffffffff82111561549157600080fd5b6020019150600681901b360382131561395c57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614a3857600080fd5b600080604083850312156154e857600080fd5b6154f1836154a9565b91506154ff602084016154a9565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761114057611140615508565b8082018082111561114057611140615508565b600082615597577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b67ffffffffffffffff81811683821601908082111561490257614902615508565b6000602082840312156155cf57600080fd5b5051919050565b6000604082840312156155e857600080fd5b6155f0614b33565b82356155fb81614a18565b815261560960208401614ff5565b60208201529392505050565b60006020828403121561562757600080fd5b815161151281614c2d565b60006020828403121561564457600080fd5b815161151281614c4e565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000612c6c60208301848661564f565b6000602082840312156156be57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361572557615725615508565b5060010190565b60006040828403121561573e57600080fd5b615746614b33565b823561575181614a18565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff81811683821601908082111561490257614902615508565b600067ffffffffffffffff8083168181036157a8576157a8615508565b6001019392505050565b6001600160a01b038716815260a0602082015260006157d560a08301878961564f565b85604084015267ffffffffffffffff8516606084015282810360808401526157fd8185614a7e565b9998505050505050505050565b60006020828403121561581c57600080fd5b815167ffffffffffffffff8082111561583457600080fd5b818401915084601f83011261584857600080fd5b81518181111561585a5761585a614adb565b61588b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614b9d565b91508082528560208285010111156158a257600080fd5b6158b3816020840160208601614a5a565b50949350505050565b600081518084526020808501945080840160005b8381101561520c57815180516001600160a01b0316885283015183880152604090960195908201906001016158d0565b600081518084526020808501808196508360051b8101915082860160005b85811015615948578284038952615936848351614a7e565b9885019893509084019060010161591e565b5091979650505050505050565b6020815261597060208201835167ffffffffffffffff169052565b6000602083015161598c60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a08301516159d560c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615a08818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615a366101c0860184614a7e565b92508086015190507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0610160818786030181880152615a7585846158bc565b945080880151925050610180818786030181880152615a948584615900565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff82811682821603908082111561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015163ffffffff90811688870152868201518116878701526060808301519091169086015260808082015167ffffffffffffffff169086015260a080820151615b578288018267ffffffffffffffff169052565b505060c09081015115159085015260e09093019290850190600101615aea565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615bb75780818660040360031b1b83161692505b505092915050565b60008085851115615bcf57600080fd5b83861115615bdc57600080fd5b5050820193919092039150565b600060208284031215615bfb57600080fd5b6040516020810181811067ffffffffffffffff82111715615c1e57615c1e614adb565b6040529135825250919050565b600060208284031215615c3d57600080fd5b611512826154a9565b63ffffffff81811683821601908082111561490257614902615508565b600060208284031215615c7557600080fd5b815161151281614a18565b8181038181111561114057611140615508565b818103600083128015838313168383128216171561490257614902615508565b602080825282518282018190526000919060409081850190868401855b8281101561594857815180516001600160a01b031685528681015161ffff16878601528581015163ffffffff90811687870152606091820151169085015260809093019290850190600101615cd0565b600081615d2f57615d2f615508565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612c6c60408301846151c4565b600060408284031215615d8657600080fd5b615d8e614b33565b615d97836154a9565b8152602083015161560981614c10565b60208152600061151260208301846158bc565b6020815260006115126020830184615900565b6102208101615e4a82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b61151260e0830184614f0b565b60008251615e69818460208701614a5a565b9190910192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a", } var EVM2EVMOnRampABI = EVM2EVMOnRampMetaData.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 f6e7a02841..3397089b9e 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -7,7 +7,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.19/CommitStoreHelper.abi ../.. custom_token_pool: ../../../contracts/solc/v0.8.19/CustomTokenPool.abi ../../../contracts/solc/v0.8.19/CustomTokenPool.bin 79ab937aa4493bf31fb0e57affd00555aad75205c90268e89674c28ea9e5e48f evm_2_evm_offramp: ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRamp.bin 8a0bd8a428ae8d071d326a2d4e1f7a2d35da08fef7307b6e1f15e108eb23770e evm_2_evm_offramp_helper: ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.abi ../../../contracts/solc/v0.8.19/EVM2EVMOffRampHelper.bin 9e06fb409bcc9b1728c1a327d404640796c2834e7798728224b8ad4e5745c4a7 -evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 9623760aeacc020a7c5b1ebf67147db69a361b1344b23ad540df49c4b668c408 +evm_2_evm_onramp: ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.19/EVM2EVMOnRamp.bin 1c21fbc9b49521a9a783c40b0674297bfcb18a64100dae10173682e38ea199fc lock_release_token_pool: ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.19/LockReleaseTokenPool.bin 7f7a28f55f9fb63669cd8038a7f99e31431acd6d15ddeeb6a77188eb0bf85d58 maybe_revert_message_receiver: ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.19/MaybeRevertMessageReceiver.bin aaa90eac8cc555ee4b0fbe57d1fb8d72d6689b29510b238177c97ab9b7979ac5 mock_arm_contract: ../../../contracts/solc/v0.8.19/MockARM.abi ../../../contracts/solc/v0.8.19/MockARM.bin efcf4cb260a2b6a6e189639f62bb50ab650a135715c1fcd42c92dfa9d04aa0e3