Source Code
Overview
MNT Balance
MNT Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 64672926 | 599 days ago | Contract Creation | 0 MNT |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AxelarGasService
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at mantlescan.xyz on 2024-06-18 */ // Source: contracts/gas-service/AxelarGasService.sol pragma solidity 0.8.23; // SPDX-License-Identifier: MIT // File @axelar-network/axelar-gmp-sdk-solidity/contracts/types/[email protected] /** * @title GasEstimationType * @notice This enum represents the gas estimation types for different chains. */ enum GasEstimationType { Default, OptimismEcotone, OptimismBedrock, Arbitrum, Scroll } /** * @title GasInfo * @notice This struct represents the gas pricing information for a specific chain. * @dev Smaller uint types are used for efficient struct packing to save storage costs. */ struct GasInfo { /// @dev Custom gas pricing rule, such as L1 data fee on L2s uint64 gasEstimationType; /// @dev Scalar value needed for specific gas estimation types, expected to be less than 1e10 uint64 l1FeeScalar; /// @dev Axelar base fee for cross-chain message approval on destination, in terms of source native gas token uint128 axelarBaseFee; /// @dev Gas price of destination chain, in terms of the source chain token, i.e dest_gas_price * dest_token_market_price / src_token_market_price uint128 relativeGasPrice; /// @dev Needed for specific gas estimation types. Blob base fee of destination chain, in terms of the source chain token, i.e dest_blob_base_fee * dest_token_market_price / src_token_market_price uint128 relativeBlobBaseFee; /// @dev Axelar express fee for express execution, in terms of source chain token uint128 expressFee; } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] /** * @title IInterchainGasEstimation Interface * @notice This is an interface for the InterchainGasEstimation contract * which allows for estimating gas fees for cross-chain communication on the Axelar network. */ interface IInterchainGasEstimation { error UnsupportedEstimationType(GasEstimationType gasEstimationType); /** * @notice Event emitted when the gas price for a specific chain is updated. * @param chain The name of the chain * @param info The gas info for the chain */ event GasInfoUpdated(string chain, GasInfo info); /** * @notice Returns the gas price for a specific chain. * @param chain The name of the chain * @return gasInfo The gas info for the chain */ function getGasInfo(string calldata chain) external view returns (GasInfo memory); /** * @notice Estimates the gas fee for a cross-chain contract call. * @param destinationChain Axelar registered name of the destination chain * @param destinationAddress Destination contract address being called * @param executionGasLimit The gas limit to be used for the destination contract execution, * e.g. pass in 200k if your app consumes needs upto 200k for this contract call * @param params Additional parameters for the gas estimation * @return gasEstimate The cross-chain gas estimate, in terms of source chain's native gas token that should be forwarded to the gas service. */ function estimateGasFee( string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, uint256 executionGasLimit, bytes calldata params ) external view returns (uint256 gasEstimate); } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/gas-estimation/[email protected] /** * @title InterchainGasEstimation * @notice This is an abstract contract that allows for estimating gas fees for cross-chain communication on the Axelar network. */ abstract contract InterchainGasEstimation is IInterchainGasEstimation { // keccak256('GasEstimate.Slot') - 1 bytes32 internal constant GAS_SERVICE_SLOT = 0x2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a3902; // 68 bytes for the TX RLP encoding overhead uint256 internal constant TX_ENCODING_OVERHEAD = 68; // GMP executeWithToken call parameters // 4 bytes for method selector, 32 bytes for the commandId, 96 bytes for the sourceChain, 128 bytes for the sourceAddress, 96 bytes for token symbol, 32 bytes for amount // Expecting most of the calldata bytes to be zeroes. So multiplying by 8 as a weighted average of 4 and 16 uint256 internal constant GMP_CALLDATA_SIZE = 4 + 32 + 96 + 128 + 96 + 32; // 388 bytes struct GasServiceStorage { mapping(string => GasInfo) gasPrices; } /** * @notice Returns the gas price for a specific chain. * @param chain The name of the chain * @return gasInfo The gas info for the chain */ function getGasInfo(string calldata chain) external view returns (GasInfo memory) { return _storage().gasPrices[chain]; } /** * @notice Sets the gas price for a specific chain. * @dev This function is called by the gas oracle to update the gas price for a specific chain. * @param chain The name of the chain * @param gasInfo The gas info for the chain */ function _setGasInfo(string calldata chain, GasInfo calldata gasInfo) internal { emit GasInfoUpdated(chain, gasInfo); _storage().gasPrices[chain] = gasInfo; } /** * @notice Estimates the gas fee for a contract call on a destination chain. * @param destinationChain Axelar registered name of the destination chain * param destinationAddress Destination contract address being called * @param executionGasLimit The gas limit to be used for the destination contract execution, * e.g. pass in 200k if your app consumes needs upto 200k for this contract call * param params Additional parameters for the gas estimation * @return gasEstimate The cross-chain gas estimate, in terms of source chain's native gas token that should be forwarded to the gas service. */ function estimateGasFee( string calldata destinationChain, string calldata, /* destinationAddress */ bytes calldata payload, uint256 executionGasLimit, bytes calldata /* params */ ) public view returns (uint256 gasEstimate) { GasInfo storage gasInfo = _storage().gasPrices[destinationChain]; GasEstimationType gasEstimationType = GasEstimationType(gasInfo.gasEstimationType); gasEstimate = gasInfo.axelarBaseFee + (executionGasLimit * gasInfo.relativeGasPrice); // if chain is L2, compute L1 data fee using L1 gas price info if (gasEstimationType != GasEstimationType.Default) { GasInfo storage l1GasInfo = _storage().gasPrices['ethereum']; gasEstimate += computeL1DataFee(gasEstimationType, payload, gasInfo, l1GasInfo); } } /** * @notice Computes the additional L1 data fee for an L2 destination chain. * @param gasEstimationType The gas estimation type * @param payload The payload of the contract call * @param l1GasInfo The L1 gas info * @return l1DataFee The L1 to L2 data fee */ function computeL1DataFee( GasEstimationType gasEstimationType, bytes calldata payload, GasInfo storage gasInfo, GasInfo storage l1GasInfo ) internal view returns (uint256) { if (gasEstimationType == GasEstimationType.OptimismEcotone) { return optimismEcotoneL1Fee(payload, gasInfo, l1GasInfo); } if (gasEstimationType == GasEstimationType.OptimismBedrock) { return optimismBedrockL1Fee(payload, gasInfo, l1GasInfo); } if (gasEstimationType == GasEstimationType.Arbitrum) { return arbitrumL1Fee(payload, gasInfo, l1GasInfo); } if (gasEstimationType == GasEstimationType.Scroll) { return scrollL1Fee(payload, gasInfo, l1GasInfo); } revert UnsupportedEstimationType(gasEstimationType); } /** * @notice Computes the L1 to L2 fee for an OP chain with Ecotone gas model. * @param payload The payload of the contract call * @param gasInfo Destination chain gas info * @param l1GasInfo The L1 gas info * @return l1DataFee The L1 to L2 data fee */ function optimismEcotoneL1Fee( bytes calldata payload, GasInfo storage gasInfo, GasInfo storage l1GasInfo ) internal view returns (uint256 l1DataFee) { /* Optimism Ecotone gas model https://docs.optimism.io/stack/transactions/fees#ecotone tx_compressed_size = ((count_zero_bytes(tx_data) * 4 + count_non_zero_bytes(tx_data) * 16)) / 16 weighted_gas_price = 16 * base_fee_scalar*base_fee + blob_base_fee_scalar * blob_base_fee l1_data_fee = tx_compressed_size * weighted_gas_price Reference implementation: https://github.com/ethereum-optimism/optimism/blob/876e16ad04968f0bb641eb76f98eb77e7e1a3e16/packages/contracts-bedrock/src/L2/GasPriceOracle.sol#L138 */ // The new base_fee_scalar is currently set to 0.001368 // We are setting it to un upper bound of 0.0015 to account for possible fluctuations uint256 scalarPrecision = 10**6; // The blob_base_fee_scalar is currently set to 0.810949. Setting it to 0.9 as an upper bound // https://eips.ethereum.org/EIPS/eip-4844 uint256 blobBaseFeeScalar = 9 * 10**5; // 0.9 multiplied by scalarPrecision // Calculating transaction size in bytes that will later be divided by 16 to compress the size uint256 txSize = _l1TxSize(payload); uint256 weightedGasPrice = 16 * gasInfo.l1FeeScalar * l1GasInfo.relativeGasPrice + blobBaseFeeScalar * l1GasInfo.relativeBlobBaseFee; l1DataFee = (weightedGasPrice * txSize) / (16 * scalarPrecision); // 16 for txSize compression and scalar precision conversion } /** * @notice Computes the L1 to L2 fee for an OP chain with Bedrock gas model. * @param payload The payload of the contract call * @param gasInfo Destination chain gas info * @param l1GasInfo The L1 gas info * @return l1DataFee The L1 to L2 data fee */ function optimismBedrockL1Fee( bytes calldata payload, GasInfo storage gasInfo, GasInfo storage l1GasInfo ) internal view returns (uint256 l1DataFee) { // Resembling OP Bedrock gas price model // https://docs.optimism.io/stack/transactions/fees#bedrock // https://docs-v2.mantle.xyz/devs/concepts/tx-fee/ef // Reference https://github.com/mantlenetworkio/mantle-v2/blob/a29f01045191344b0ba89542215e6a02bd5e7fcc/packages/contracts-bedrock/contracts/L2/GasPriceOracle.sol#L98-L105 uint256 overhead = 188; uint256 precision = 1e6; uint256 txSize = _l1TxSize(payload) + overhead; return (l1GasInfo.relativeGasPrice * txSize * gasInfo.l1FeeScalar) / precision; } /** * @notice Computes the L1 to L2 fee for a contract call on the Arbitrum chain. * @param payload The payload of the contract call * param gasInfo Destination chain gas info * @param l1GasInfo The L1 gas info * @return l1DataFee The L1 to L2 data fee */ function arbitrumL1Fee( bytes calldata payload, GasInfo storage, /* gasInfo */ GasInfo storage l1GasInfo ) internal view returns (uint256 l1DataFee) { // https://docs.arbitrum.io/build-decentralized-apps/how-to-estimate-gas // https://docs.arbitrum.io/arbos/l1-pricing // Reference https://github.com/OffchainLabs/nitro/blob/master/arbos/l1pricing/l1pricing.go#L565-L578 uint256 oneInBips = 10000; uint256 txDataNonZeroGasEIP2028 = 16; uint256 estimationPaddingUnits = 16 * txDataNonZeroGasEIP2028; uint256 estimationPaddingBasisPoints = 100; uint256 l1Bytes = TX_ENCODING_OVERHEAD + GMP_CALLDATA_SIZE + payload.length; // Brotli baseline compression rate as 2x uint256 units = (txDataNonZeroGasEIP2028 * l1Bytes) / 2; return (l1GasInfo.relativeGasPrice * (units + estimationPaddingUnits) * (oneInBips + estimationPaddingBasisPoints)) / oneInBips; } /** * @notice Computes the L1 to L2 fee for a contract call on the Scroll chain. * @param payload The payload of the contract call * @param gasInfo Destination chain gas info * @param l1GasInfo The L1 gas info * @return l1DataFee The L1 to L2 data fee */ function scrollL1Fee( bytes calldata payload, GasInfo storage gasInfo, GasInfo storage l1GasInfo ) internal view returns (uint256 l1DataFee) { // https://docs.scroll.io/en/developers/guides/estimating-gas-and-tx-fees/ // Reference https://github.com/scroll-tech/scroll/blob/af2913903b181f3492af1c62b4da4c1c99cc552d/contracts/src/L2/predeploys/L1GasPriceOracle.sol#L63-L86 uint256 overhead = 2500; uint256 precision = 1e9; uint256 txSize = _l1TxSize(payload) + overhead + (4 * 16); return (l1GasInfo.relativeGasPrice * txSize * gasInfo.l1FeeScalar) / precision; } /** * @notice Computes the transaction size for an L1 transaction * @param payload The payload of the contract call * @return txSize The transaction size */ function _l1TxSize(bytes calldata payload) private pure returns (uint256 txSize) { txSize = TX_ENCODING_OVERHEAD * 16; // GMP executeWithToken call parameters // Expecting most of the calldata bytes to be zeroes. So multiplying by 8 as a weighted average of 4 and 16 txSize += GMP_CALLDATA_SIZE * 8; uint256 length = payload.length; for (uint256 i; i < length; ++i) { if (payload[i] == 0) { txSize += 4; // 4 for each zero byte } else { txSize += 16; // 16 for each non-zero byte } } } /** * @notice Get the storage slot for the GasServiceStorage struct */ function _storage() private pure returns (GasServiceStorage storage slot) { assembly { slot.slot := GAS_SERVICE_SLOT } } } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] // General interface for upgradable contracts interface IContractIdentifier { /** * @notice Returns the contract ID. It can be used as a check during upgrades. * @dev Meant to be overridden in derived contracts. * @return bytes32 The contract ID */ function contractId() external pure returns (bytes32); } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] interface IImplementation is IContractIdentifier { error NotProxy(); function setup(bytes calldata data) external; } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] /** * @title IOwnable Interface * @notice IOwnable is an interface that abstracts the implementation of a * contract with ownership control features. It's commonly used in upgradable * contracts and includes the functionality to get current owner, transfer * ownership, and propose and accept ownership. */ interface IOwnable { error NotOwner(); error InvalidOwner(); error InvalidOwnerAddress(); event OwnershipTransferStarted(address indexed newOwner); event OwnershipTransferred(address indexed newOwner); /** * @notice Returns the current owner of the contract. * @return address The address of the current owner */ function owner() external view returns (address); /** * @notice Returns the address of the pending owner of the contract. * @return address The address of the pending owner */ function pendingOwner() external view returns (address); /** * @notice Transfers ownership of the contract to a new address * @param newOwner The address to transfer ownership to */ function transferOwnership(address newOwner) external; /** * @notice Proposes to transfer the contract's ownership to a new address. * The new owner needs to accept the ownership explicitly. * @param newOwner The address to transfer ownership to */ function proposeOwnership(address newOwner) external; /** * @notice Transfers ownership to the pending owner. * @dev Can only be called by the pending owner */ function acceptOwnership() external; } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] // General interface for upgradable contracts interface IUpgradable is IOwnable, IImplementation { error InvalidCodeHash(); error InvalidImplementation(); error SetupFailed(); event Upgraded(address indexed newImplementation); function implementation() external view returns (address); function upgrade( address newImplementation, bytes32 newImplementationCodeHash, bytes calldata params ) external; } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] /** * @title IAxelarGasService Interface * @notice This is an interface for the AxelarGasService contract which manages gas payments * and refunds for cross-chain communication on the Axelar network. * @dev This interface inherits IUpgradable */ interface IAxelarGasService is IInterchainGasEstimation, IUpgradable { error InvalidAddress(); error NotCollector(); error InvalidAmounts(); error InvalidGasUpdates(); error InvalidParams(); error InsufficientGasPayment(uint256 required, uint256 provided); event GasPaidForContractCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, address gasToken, uint256 gasFeeAmount, address refundAddress ); event GasPaidForContractCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForContractCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForContractCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, uint256 gasFeeAmount, address refundAddress ); event GasPaidForExpressCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, address gasToken, uint256 gasFeeAmount, address refundAddress ); event GasPaidForExpressCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForExpressCall( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, uint256 gasFeeAmount, address refundAddress ); event NativeGasPaidForExpressCallWithToken( address indexed sourceAddress, string destinationChain, string destinationAddress, bytes32 indexed payloadHash, string symbol, uint256 amount, uint256 gasFeeAmount, address refundAddress ); event GasAdded(bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress); event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress); event ExpressGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress); event NativeExpressGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress); event Refunded(bytes32 indexed txHash, uint256 indexed logIndex, address payable receiver, address token, uint256 amount); /** * @notice Pay for gas for any type of contract execution on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @dev If estimateOnChain is true, the function will estimate the gas cost and revert if the payment is insufficient. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param executionGasLimit The gas limit for the contract call * @param estimateOnChain Flag to enable on-chain gas estimation * @param refundAddress The address where refunds, if any, should be sent * @param params Additional parameters for gas payment. This can be left empty for normal contract call payments. */ function payGas( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, uint256 executionGasLimit, bool estimateOnChain, address refundAddress, bytes calldata params ) external payable; /** * @notice Pay for gas using ERC20 tokens for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using ERC20 tokens for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using native currency for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable; /** * @notice Pay for gas using native currency for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable; /** * @notice Pay for gas using ERC20 tokens for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using ERC20 tokens for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Pay for gas using native currency for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable; /** * @notice Pay for gas using native currency for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable; /** * @notice Add additional gas payment using ERC20 tokens after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Add additional gas payment using native currency after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable; /** * @notice Add additional gas payment using ERC20 tokens after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addExpressGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external; /** * @notice Add additional gas payment using native currency after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeExpressGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable; /** * @notice Updates the gas price for a specific chain. * @dev This function is called by the gas oracle to update the gas prices for a specific chains. * @param chains Array of chain names * @param gasUpdates Array of gas updates */ function updateGasInfo(string[] calldata chains, GasInfo[] calldata gasUpdates) external; /** * @notice Allows the gasCollector to collect accumulated fees from the contract. * @dev Use address(0) as the token address for native currency. * @param receiver The address to receive the collected fees * @param tokens Array of token addresses to be collected * @param amounts Array of amounts to be collected for each respective token address */ function collectFees( address payable receiver, address[] calldata tokens, uint256[] calldata amounts ) external; /** * @notice Refunds gas payment to the receiver in relation to a specific cross-chain transaction. * @dev Only callable by the gasCollector. * @dev Use address(0) as the token address to refund native currency. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param receiver The address to receive the refund * @param token The token address to be refunded * @param amount The amount to refund */ function refund( bytes32 txHash, uint256 logIndex, address payable receiver, address token, uint256 amount ) external; /** * @notice Returns the address of the designated gas collector. * @return address of the gas collector */ function gasCollector() external returns (address); } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/[email protected] /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { error InvalidAccount(); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/libs/[email protected] error TokenTransferFailed(); /* * @title SafeTokenCall * @dev This library is used for performing safe token transfers. */ library SafeTokenCall { /* * @notice Make a safe call to a token contract. * @param token The token contract to interact with. * @param callData The function call data. * @throws TokenTransferFailed error if transfer of token is not successful. */ function safeCall(IERC20 token, bytes memory callData) internal { (bool success, bytes memory returnData) = address(token).call(callData); bool transferred = success && (returnData.length == uint256(0) || abi.decode(returnData, (bool))); if (!transferred || address(token).code.length == 0) revert TokenTransferFailed(); } } /* * @title SafeTokenTransfer * @dev This library safely transfers tokens from the contract to a recipient. */ library SafeTokenTransfer { /* * @notice Transfer tokens to a recipient. * @param token The token contract. * @param receiver The recipient of the tokens. * @param amount The amount of tokens to transfer. */ function safeTransfer( IERC20 token, address receiver, uint256 amount ) internal { SafeTokenCall.safeCall(token, abi.encodeWithSelector(IERC20.transfer.selector, receiver, amount)); } } /* * @title SafeTokenTransferFrom * @dev This library helps to safely transfer tokens on behalf of a token holder. */ library SafeTokenTransferFrom { /* * @notice Transfer tokens on behalf of a token holder. * @param token The token contract. * @param from The address of the token holder. * @param to The address the tokens are to be sent to. * @param amount The amount of tokens to be transferred. */ function safeTransferFrom( IERC20 token, address from, address to, uint256 amount ) internal { SafeTokenCall.safeCall(token, abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)); } } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/upgradable/[email protected] /** * @title Implementation * @notice This contract serves as a base for other contracts and enforces a proxy-first access restriction. * @dev Derived contracts must implement the setup function. */ abstract contract Implementation is IImplementation { address private immutable implementationAddress; /** * @dev Contract constructor that sets the implementation address to the address of this contract. */ constructor() { implementationAddress = address(this); } /** * @dev Modifier to require the caller to be the proxy contract. * Reverts if the caller is the current contract (i.e., the implementation contract itself). */ modifier onlyProxy() { if (implementationAddress == address(this)) revert NotProxy(); _; } /** * @notice Initializes contract parameters. * This function is intended to be overridden by derived contracts. * The overriding function must have the onlyProxy modifier. * @param params The parameters to be used for initialization */ function setup(bytes calldata params) external virtual; } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/utils/[email protected] /** * @title Ownable * @notice A contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The owner account is set through ownership transfer. This module makes * it possible to transfer the ownership of the contract to a new account in one * step, as well as to an interim pending owner. In the second flow the ownership does not * change until the pending owner accepts the ownership transfer. */ abstract contract Ownable is IOwnable { // keccak256('owner') bytes32 internal constant _OWNER_SLOT = 0x02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0; // keccak256('ownership-transfer') bytes32 internal constant _OWNERSHIP_TRANSFER_SLOT = 0x9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d1; /** * @notice Initializes the contract by transferring ownership to the owner parameter. * @param _owner Address to set as the initial owner of the contract */ constructor(address _owner) { _transferOwnership(_owner); } /** * @notice Modifier that throws an error if called by any account other than the owner. */ modifier onlyOwner() { if (owner() != msg.sender) revert NotOwner(); _; } /** * @notice Returns the current owner of the contract. * @return owner_ The current owner of the contract */ function owner() public view returns (address owner_) { assembly { owner_ := sload(_OWNER_SLOT) } } /** * @notice Returns the pending owner of the contract. * @return owner_ The pending owner of the contract */ function pendingOwner() public view returns (address owner_) { assembly { owner_ := sload(_OWNERSHIP_TRANSFER_SLOT) } } /** * @notice Transfers ownership of the contract to a new account `newOwner`. * @dev Can only be called by the current owner. * @param newOwner The address to transfer ownership to */ function transferOwnership(address newOwner) external virtual onlyOwner { _transferOwnership(newOwner); } /** * @notice Propose to transfer ownership of the contract to a new account `newOwner`. * @dev Can only be called by the current owner. The ownership does not change * until the new owner accepts the ownership transfer. * @param newOwner The address to transfer ownership to */ function proposeOwnership(address newOwner) external virtual onlyOwner { if (newOwner == address(0)) revert InvalidOwnerAddress(); emit OwnershipTransferStarted(newOwner); assembly { sstore(_OWNERSHIP_TRANSFER_SLOT, newOwner) } } /** * @notice Accepts ownership of the contract. * @dev Can only be called by the pending owner */ function acceptOwnership() external virtual { address newOwner = pendingOwner(); if (newOwner != msg.sender) revert InvalidOwner(); _transferOwnership(newOwner); } /** * @notice Internal function to transfer ownership of the contract to a new account `newOwner`. * @dev Called in the constructor to set the initial owner. * @param newOwner The address to transfer ownership to */ function _transferOwnership(address newOwner) internal virtual { if (newOwner == address(0)) revert InvalidOwnerAddress(); emit OwnershipTransferred(newOwner); assembly { sstore(_OWNER_SLOT, newOwner) sstore(_OWNERSHIP_TRANSFER_SLOT, 0) } } } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/upgradable/[email protected] /** * @title Upgradable Contract * @notice This contract provides an interface for upgradable smart contracts and includes the functionality to perform upgrades. */ abstract contract Upgradable is Ownable, Implementation, IUpgradable { // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1) bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @notice Constructor sets the implementation address to the address of the contract itself * @dev This is used in the onlyProxy modifier to prevent certain functions from being called directly * on the implementation contract itself. * @dev The owner is initially set as address(1) because the actual owner is set within the proxy. It is not * set as the zero address because Ownable is designed to throw an error for ownership transfers to the zero address. */ constructor() Ownable(address(1)) {} /** * @notice Returns the address of the current implementation * @return implementation_ Address of the current implementation */ function implementation() public view returns (address implementation_) { assembly { implementation_ := sload(_IMPLEMENTATION_SLOT) } } /** * @notice Upgrades the contract to a new implementation * @param newImplementation The address of the new implementation contract * @param newImplementationCodeHash The codehash of the new implementation contract * @param params Optional setup parameters for the new implementation contract * @dev This function is only callable by the owner. */ function upgrade( address newImplementation, bytes32 newImplementationCodeHash, bytes calldata params ) external override onlyOwner { if (IUpgradable(newImplementation).contractId() != IUpgradable(implementation()).contractId()) revert InvalidImplementation(); if (newImplementationCodeHash != newImplementation.codehash) revert InvalidCodeHash(); assembly { sstore(_IMPLEMENTATION_SLOT, newImplementation) } emit Upgraded(newImplementation); if (params.length > 0) { // slither-disable-next-line controlled-delegatecall (bool success, ) = newImplementation.delegatecall(abi.encodeWithSelector(this.setup.selector, params)); if (!success) revert SetupFailed(); } } /** * @notice Sets up the contract with initial data * @param data Initialization data for the contract * @dev This function is only callable by the proxy contract. */ function setup(bytes calldata data) external override(IImplementation, Implementation) onlyProxy { _setup(data); } /** * @notice Internal function to set up the contract with initial data * @param data Initialization data for the contract * @dev This function should be implemented in derived contracts. */ function _setup(bytes calldata data) internal virtual {} } // File @axelar-network/axelar-gmp-sdk-solidity/contracts/libs/[email protected] error NativeTransferFailed(); /* * @title SafeNativeTransfer * @dev This library is used for performing safe native value transfers in Solidity by utilizing inline assembly. */ library SafeNativeTransfer { /* * @notice Perform a native transfer to a given address. * @param receiver The recipient address to which the amount will be sent. * @param amount The amount of native value to send. * @throws NativeTransferFailed error if transfer is not successful. */ function safeNativeTransfer(address receiver, uint256 amount) internal { bool success; assembly { success := call(gas(), receiver, amount, 0, 0, 0, 0) } if (!success) revert NativeTransferFailed(); } } // File contracts/gas-service/AxelarGasService.sol /** * @title AxelarGasService * @notice This contract manages gas payments and refunds for cross-chain communication on the Axelar network. * @dev The owner address of this contract should be the microservice that pays for gas. * @dev Users pay gas for cross-chain calls, and the gasCollector can collect accumulated fees and/or refund users if needed. */ contract AxelarGasService is InterchainGasEstimation, Upgradable, IAxelarGasService { using SafeTokenTransfer for IERC20; using SafeTokenTransferFrom for IERC20; using SafeNativeTransfer for address payable; address public immutable gasCollector; /** * @notice Constructs the AxelarGasService contract. * @param gasCollector_ The address of the gas collector */ constructor(address gasCollector_) { gasCollector = gasCollector_; } /** * @notice Modifier that ensures the caller is the designated gas collector. */ modifier onlyCollector() { if (msg.sender != gasCollector) revert NotCollector(); _; } /** * @notice Pay for gas for any type of contract execution on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @dev If estimateOnChain is true, the function will estimate the gas cost and revert if the payment is insufficient. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param executionGasLimit The gas limit for the contract call * @param estimateOnChain Flag to enable on-chain gas estimation * @param refundAddress The address where refunds, if any, should be sent * @param params Additional parameters for gas payment */ function payGas( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, uint256 executionGasLimit, bool estimateOnChain, address refundAddress, bytes calldata params ) external payable override { if (params.length > 0) { revert InvalidParams(); } if (estimateOnChain) { uint256 gasEstimate = estimateGasFee(destinationChain, destinationAddress, payload, executionGasLimit, params); if (gasEstimate > msg.value) { revert InsufficientGasPayment(gasEstimate, msg.value); } } emit NativeGasPaidForContractCall(sender, destinationChain, destinationAddress, keccak256(payload), msg.value, refundAddress); } /** * @notice Pay for gas using ERC20 tokens for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit GasPaidForContractCall( sender, destinationChain, destinationAddress, keccak256(payload), gasToken, gasFeeAmount, refundAddress ); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Pay for gas using ERC20 tokens for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string memory symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit GasPaidForContractCallWithToken( sender, destinationChain, destinationAddress, keccak256(payload), symbol, amount, gasToken, gasFeeAmount, refundAddress ); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Pay for gas using native currency for a contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable override { emit NativeGasPaidForContractCall(sender, destinationChain, destinationAddress, keccak256(payload), msg.value, refundAddress); } /** * @notice Pay for gas using native currency for a contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForContractCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable override { emit NativeGasPaidForContractCallWithToken( sender, destinationChain, destinationAddress, keccak256(payload), symbol, amount, msg.value, refundAddress ); } /** * @notice Pay for gas using ERC20 tokens for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit GasPaidForExpressCall(sender, destinationChain, destinationAddress, keccak256(payload), gasToken, gasFeeAmount, refundAddress); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Pay for gas using ERC20 tokens for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to express execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param gasToken The address of the ERC20 token used to pay for gas * @param gasFeeAmount The amount of tokens to pay for gas * @param refundAddress The address where refunds, if any, should be sent */ function payGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string memory symbol, uint256 amount, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit GasPaidForExpressCallWithToken( sender, destinationChain, destinationAddress, keccak256(payload), symbol, amount, gasToken, gasFeeAmount, refundAddress ); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Pay for gas using native currency for an express contract call on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCall( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, address refundAddress ) external payable override { emit NativeGasPaidForExpressCall(sender, destinationChain, destinationAddress, keccak256(payload), msg.value, refundAddress); } /** * @notice Pay for gas using native currency for an express contract call with tokens on a destination chain. * @dev This function is called on the source chain before calling the gateway to execute a remote contract. * @param sender The address making the payment * @param destinationChain The target chain where the contract call with tokens will be made * @param destinationAddress The target address on the destination chain * @param payload Data payload for the contract call with tokens * @param symbol The symbol of the token to be sent with the call * @param amount The amount of tokens to be sent with the call * @param refundAddress The address where refunds, if any, should be sent */ function payNativeGasForExpressCallWithToken( address sender, string calldata destinationChain, string calldata destinationAddress, bytes calldata payload, string calldata symbol, uint256 amount, address refundAddress ) external payable override { emit NativeGasPaidForExpressCallWithToken( sender, destinationChain, destinationAddress, keccak256(payload), symbol, amount, msg.value, refundAddress ); } /** * @notice Add additional gas payment using ERC20 tokens after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit GasAdded(txHash, logIndex, gasToken, gasFeeAmount, refundAddress); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Add additional gas payment using native currency after initiating a cross-chain call. * @dev This function can be called on the source chain after calling the gateway to execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable override { emit NativeGasAdded(txHash, logIndex, msg.value, refundAddress); } /** * @notice Add additional gas payment using ERC20 tokens after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param gasToken The ERC20 token address used to add gas * @param gasFeeAmount The amount of tokens to add as gas * @param refundAddress The address where refunds, if any, should be sent */ function addExpressGas( bytes32 txHash, uint256 logIndex, address gasToken, uint256 gasFeeAmount, address refundAddress ) external override { emit ExpressGasAdded(txHash, logIndex, gasToken, gasFeeAmount, refundAddress); IERC20(gasToken).safeTransferFrom(msg.sender, address(this), gasFeeAmount); } /** * @notice Add additional gas payment using native currency after initiating an express cross-chain call. * @dev This function can be called on the source chain after calling the gateway to express execute a remote contract. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param refundAddress The address where refunds, if any, should be sent */ function addNativeExpressGas( bytes32 txHash, uint256 logIndex, address refundAddress ) external payable override { emit NativeExpressGasAdded(txHash, logIndex, msg.value, refundAddress); } /** * @notice Updates the gas price for a specific chain. * @dev This function is called by the gas oracle to update the gas prices for a specific chains. * @param chains Array of chain names * @param gasUpdates Array of gas updates */ function updateGasInfo(string[] calldata chains, GasInfo[] calldata gasUpdates) external onlyCollector { uint256 chainsLength = chains.length; if (chainsLength != gasUpdates.length) revert InvalidGasUpdates(); for (uint256 i; i < chainsLength; i++) { string calldata chain = chains[i]; GasInfo calldata gasUpdate = gasUpdates[i]; _setGasInfo(chain, gasUpdate); } } /** * @notice Allows the gasCollector to collect accumulated fees from the contract. * @dev Use address(0) as the token address for native currency. * @param receiver The address to receive the collected fees * @param tokens Array of token addresses to be collected * @param amounts Array of amounts to be collected for each respective token address */ function collectFees( address payable receiver, address[] calldata tokens, uint256[] calldata amounts ) external onlyCollector { if (receiver == address(0)) revert InvalidAddress(); uint256 tokensLength = tokens.length; if (tokensLength != amounts.length) revert InvalidAmounts(); for (uint256 i; i < tokensLength; i++) { address token = tokens[i]; uint256 amount = amounts[i]; if (amount == 0) revert InvalidAmounts(); if (token == address(0)) { if (amount <= address(this).balance) receiver.safeNativeTransfer(amount); } else { // slither-disable-next-line calls-loop if (amount <= IERC20(token).balanceOf(address(this))) IERC20(token).safeTransfer(receiver, amount); } } } /** * @dev Deprecated refund function, kept for backward compatibility. */ function refund( address payable receiver, address token, uint256 amount ) external onlyCollector { _refund(bytes32(0), 0, receiver, token, amount); } /** * @notice Refunds gas payment to the receiver in relation to a specific cross-chain transaction. * @dev Only callable by the gasCollector. * @dev Use address(0) as the token address to refund native currency. * @param txHash The transaction hash of the cross-chain call * @param logIndex The log index for the cross-chain call * @param receiver The address to receive the refund * @param token The token address to be refunded * @param amount The amount to refund */ function refund( bytes32 txHash, uint256 logIndex, address payable receiver, address token, uint256 amount ) external onlyCollector { _refund(txHash, logIndex, receiver, token, amount); } /** * @dev Internal function to implement gas refund logic. */ function _refund( bytes32 txHash, uint256 logIndex, address payable receiver, address token, uint256 amount ) private { if (receiver == address(0)) revert InvalidAddress(); emit Refunded(txHash, logIndex, receiver, token, amount); if (token == address(0)) { receiver.safeNativeTransfer(amount); } else { IERC20(token).safeTransfer(receiver, amount); } } /** * @notice Returns a unique identifier for the contract. * @return bytes32 Hash of the contract identifier */ function contractId() external pure returns (bytes32) { return keccak256('axelar-gas-service'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"gasCollector_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"InsufficientGasPayment","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidAmounts","type":"error"},{"inputs":[],"name":"InvalidCodeHash","type":"error"},{"inputs":[],"name":"InvalidGasUpdates","type":"error"},{"inputs":[],"name":"InvalidImplementation","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidOwnerAddress","type":"error"},{"inputs":[],"name":"InvalidParams","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"NotCollector","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"NotProxy","type":"error"},{"inputs":[],"name":"SetupFailed","type":"error"},{"inputs":[],"name":"TokenTransferFailed","type":"error"},{"inputs":[{"internalType":"enum GasEstimationType","name":"gasEstimationType","type":"uint8"}],"name":"UnsupportedEstimationType","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"logIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"ExpressGasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"logIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"GasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"chain","type":"string"},{"components":[{"internalType":"uint64","name":"gasEstimationType","type":"uint64"},{"internalType":"uint64","name":"l1FeeScalar","type":"uint64"},{"internalType":"uint128","name":"axelarBaseFee","type":"uint128"},{"internalType":"uint128","name":"relativeGasPrice","type":"uint128"},{"internalType":"uint128","name":"relativeBlobBaseFee","type":"uint128"},{"internalType":"uint128","name":"expressFee","type":"uint128"}],"indexed":false,"internalType":"struct GasInfo","name":"info","type":"tuple"}],"name":"GasInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"GasPaidForContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"GasPaidForContractCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"GasPaidForExpressCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"gasToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"GasPaidForExpressCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"logIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeExpressGasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"logIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeGasAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeGasPaidForContractCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeGasPaidForContractCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeGasPaidForExpressCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"string","name":"destinationChain","type":"string"},{"indexed":false,"internalType":"string","name":"destinationAddress","type":"string"},{"indexed":true,"internalType":"bytes32","name":"payloadHash","type":"bytes32"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"refundAddress","type":"address"}],"name":"NativeGasPaidForExpressCallWithToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"logIndex","type":"uint256"},{"indexed":false,"internalType":"address payable","name":"receiver","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newImplementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addExpressGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addNativeExpressGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"addNativeGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"collectFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"executionGasLimit","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"estimateGasFee","outputs":[{"internalType":"uint256","name":"gasEstimate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"chain","type":"string"}],"name":"getGasInfo","outputs":[{"components":[{"internalType":"uint64","name":"gasEstimationType","type":"uint64"},{"internalType":"uint64","name":"l1FeeScalar","type":"uint64"},{"internalType":"uint128","name":"axelarBaseFee","type":"uint128"},{"internalType":"uint128","name":"relativeGasPrice","type":"uint128"},{"internalType":"uint128","name":"relativeBlobBaseFee","type":"uint128"},{"internalType":"uint128","name":"expressFee","type":"uint128"}],"internalType":"struct GasInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"uint256","name":"executionGasLimit","type":"uint256"},{"internalType":"bool","name":"estimateOnChain","type":"bool"},{"internalType":"address","name":"refundAddress","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"payGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payGasForContractCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payGasForContractCallWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payGasForExpressCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"gasToken","type":"address"},{"internalType":"uint256","name":"gasFeeAmount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payGasForExpressCallWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payNativeGasForContractCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payNativeGasForContractCallWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payNativeGasForExpressCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"string","name":"destinationChain","type":"string"},{"internalType":"string","name":"destinationAddress","type":"string"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"refundAddress","type":"address"}],"name":"payNativeGasForExpressCallWithToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"proposeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"},{"internalType":"uint256","name":"logIndex","type":"uint256"},{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"chains","type":"string[]"},{"components":[{"internalType":"uint64","name":"gasEstimationType","type":"uint64"},{"internalType":"uint64","name":"l1FeeScalar","type":"uint64"},{"internalType":"uint128","name":"axelarBaseFee","type":"uint128"},{"internalType":"uint128","name":"relativeGasPrice","type":"uint128"},{"internalType":"uint128","name":"relativeBlobBaseFee","type":"uint128"},{"internalType":"uint128","name":"expressFee","type":"uint128"}],"internalType":"struct GasInfo[]","name":"gasUpdates","type":"tuple[]"}],"name":"updateGasInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes32","name":"newImplementationCodeHash","type":"bytes32"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002f5f38038062002f5f8339810160408190526200003491620000fc565b6001620000418162000058565b50306080526001600160a01b031660a0526200012e565b6001600160a01b0381166200008057604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000602082840312156200010f57600080fd5b81516001600160a01b03811681146200012757600080fd5b9392505050565b60805160a051612def62000170600039600081816104240152818161067201528181610afc01528181610ce5015261131f01526000610e190152612def6000f3fe6080604052600436106101c25760003560e01c8063892b5007116100f7578063cd433ada11610095578063edf936f211610064578063edf936f214610594578063f2fde38b146105a7578063f61ed218146105c7578063fd09e3bd146105da57600080fd5b8063cd433ada1461050d578063d3b81f0c14610520578063e30c397814610540578063edb6b3a51461057457600080fd5b8063a3499c73116100d1578063a3499c731461049a578063ab1999ba146104ba578063ba9ddc8d146104da578063c62c2002146104fa57600080fd5b8063892b5007146104125780638da5cb5b146104465780639ded06df1461047a57600080fd5b80634d2384891161016457806379ba50971161013e57806379ba50971461031d5780638291286c1461033257806382ad6f351461036557806386389f021461038557600080fd5b80634d238489146102a25780635c60da1b146102b5578063710bf322146102fd57600080fd5b806317a49f7c116101a057806317a49f7c1461022f5780632e9b74701461024f5780632edd2aa814610262578063365047211461028257600080fd5b80630c93e3bb146101c75780631055eaaf146101dc578063135eaa70146101fc575b600080fd5b6101da6101d5366004611e59565b6105fa565b005b3480156101e857600080fd5b506101da6101f7366004611f5e565b610667565b34801561020857600080fd5b5061021c610217366004611fe1565b610846565b6040519081526020015b60405180910390f35b34801561023b57600080fd5b506101da61024a366004612154565b610980565b6101da61025d366004612272565b610a0c565b34801561026e57600080fd5b506101da61027d366004612365565b610a82565b34801561028e57600080fd5b506101da61029d3660046123bb565b610af1565b6101da6102b036600461240d565b610b46565b3480156102c157600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545b6040516001600160a01b039091168152602001610226565b34801561030957600080fd5b506101da610318366004612446565b610b91565b34801561032957600080fd5b506101da610c60565b34801561033e57600080fd5b507ffaa2f015f2ce5aee225904728de2def86eb8837491efd21f1a04fc20d8e923f661021c565b34801561037157600080fd5b506101da61038036600461246a565b610cda565b34801561039157600080fd5b506103a56103a03660046124ab565b610d35565b6040516102269190600060c08201905067ffffffffffffffff8084511683528060208501511660208401525060408301516001600160801b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a0850152505092915050565b34801561041e57600080fd5b506102e57f000000000000000000000000000000000000000000000000000000000000000081565b34801561045257600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0546102e5565b34801561048657600080fd5b506101da6104953660046124ab565b610e16565b3480156104a657600080fd5b506101da6104b53660046124ed565b610e7c565b3480156104c657600080fd5b506101da6104d5366004612365565b61119c565b3480156104e657600080fd5b506101da6104f5366004612549565b6111eb565b6101da610508366004612272565b611271565b6101da61051b36600461240d565b6112d2565b34801561052c57600080fd5b506101da61053b366004612621565b611314565b34801561054c57600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d1546102e5565b34801561058057600080fd5b506101da61058f366004612154565b611405565b6101da6105a23660046126d4565b611466565b3480156105b357600080fd5b506101da6105c2366004612446565b611574565b6101da6105d5366004611e59565b6115c4565b3480156105e657600080fd5b506101da6105f5366004612549565b61161f565b828260405161060a9291906127f0565b6040518091039020886001600160a01b03167f617332c1832058df6ee45fcbdf471251474c9945a8e5d229287a21a5f67ccf0a89898989348860405161065596959493929190612829565b60405180910390a35050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106af57604051623bb10360e91b815260040160405180910390fd5b6001600160a01b0385166106d65760405163e6c4247b60e01b815260040160405180910390fd5b828181146106f757604051636c2b7e2d60e11b815260040160405180910390fd5b60005b8181101561083d57600086868381811061071657610716612873565b905060200201602081019061072b9190612446565b9050600085858481811061074157610741612873565b9050602002013590508060000361076b57604051636c2b7e2d60e11b815260040160405180910390fd5b6001600160a01b03821661079857478111610793576107936001600160a01b038a168261167c565b610833565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156107f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108199190612889565b8111610833576108336001600160a01b0383168a836116c1565b50506001016106fa565b50505050505050565b6000807f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390260405161087a908d908d906127f0565b908152604051908190036020019020805490915060009067ffffffffffffffff1660048111156108ac576108ac6128a2565b60018301549091506108c7906001600160801b0316876128ce565b82546108e39190600160801b90046001600160801b03166128e5565b925060008160048111156108f9576108f96128a2565b1461097157604080517f657468657265756d00000000000000000000000000000000000000000000000081527f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390260088201529051908190036028019020610963828a8a868561176a565b61096d90856128e5565b9350505b50509998505050505050505050565b86866040516109909291906127f0565b60405180910390208c6001600160a01b03167fda4ed638a7ffe9e814722efdb9ad6058c152c19c8564ceffe52e11dda1ca32238d8d8d8d8b8b8b8b8b6040516109e19998979695949392919061291c565b60405180910390a36109fe6001600160a01b038416333085611844565b505050505050505050505050565b8585604051610a1c9291906127f0565b60405180910390208b6001600160a01b03167f8c092067e86e85e8cfbaf187202ef580cdfd7ec37fbec89191607de73ca800058c8c8c8c8a8a8a348b604051610a6d999897969594939291906129a5565b60405180910390a35050505050505050505050565b604080516001600160a01b03808616825260208201859052831691810191909152849086907ff0b09bf969e7958967e0968e22596f647dd6efa09f4778e0393967b881f4b09f906060015b60405180910390a3610aea6001600160a01b038416333085611844565b5050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b3957604051623bb10360e91b815260040160405180910390fd5b610aea8585858585611895565b604080513481526001600160a01b0383166020820152839185917fb26db521e067acd5c6e345ad92fa1ed06bc7fb2aedd68f35dc7a2e10d636fc9891015b60405180910390a3505050565b33610bba7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610be1576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116610c0857604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907fd9be0e8e07417e00f2521db636cb53e316fd288f5051f16d2aa2bf0c3938a87690600090a27f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000610c8a7f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15490565b90506001600160a01b0381163314610cce576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd781611945565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d2257604051623bb10360e91b815260040160405180910390fd5b610d30600080858585611895565b505050565b6040805160c081018252600080825260208201819052818301819052606082018190526080820181905260a082015290517f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390290610d9590859085906127f0565b90815260408051918290036020908101832060c084018352805467ffffffffffffffff808216865268010000000000000000820416928501929092526001600160801b03600160801b92839004811693850193909352600181015480841660608601529190910482166080840152600201541660a082015290505b92915050565b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031603610e78576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b33610ea57f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610ecc576040516330cd747160e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190612889565b846001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb19190612889565b14610fe8576040517f68155f9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b03163f831461102b576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8490556040516001600160a01b038516907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28015611196576000846001600160a01b0316639ded06df60e01b84846040516024016110b0929190612a0c565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161111b9190612a28565b600060405180830381855af49150503d8060008114611156576040519150601f19603f3d011682016040523d82523d6000602084013e61115b565b606091505b5050905080610aea576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b604080516001600160a01b03808616825260208201859052831691810191909152849086907f2275e75614080f9782f72563c2c1688c901c5339c7f9f436d323f9386fed700a90606001610acd565b84846040516111fb9291906127f0565b60405180910390208a6001600160a01b03167fd171a7eb157e548ca493dd0a16016d125963a369ac5ae3c275ec12c96d5277028b8b8b8b8989896040516112489796959493929190612a44565b60405180910390a36112656001600160a01b038416333085611844565b50505050505050505050565b85856040516112819291906127f0565b60405180910390208b6001600160a01b03167f999d431b58761213cf53af96262b67a069cbd963499fd8effd1e21556217b8418c8c8c8c8a8a8a348b604051610a6d999897969594939291906129a5565b604080513481526001600160a01b0383166020820152839185917ffeb6b00343feee0f29a1a4345f8bf93ca1c73ee922248a4237a4e50d6447604e9101610b84565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461135c57604051623bb10360e91b815260040160405180910390fd5b82818114611396576040517fa5f1efe300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156113fd573660008787848181106113b6576113b6612873565b90506020028101906113c89190612a98565b91509150368686858181106113df576113df612873565b905060c0020190506113f28383836119e8565b505050600101611399565b505050505050565b86866040516114159291906127f0565b60405180910390208c6001600160a01b03167f8875f9764f28fa82d3e7ff1b80bd5c8f665e1f42fcd8c2faebc7c400a4ba1bbd8d8d8d8d8b8b8b8b8b6040516109e19998979695949392919061291c565b801561149e576040517fa86b651200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83156115035760006114b78c8c8c8c8c8c8c8a8a610846565b905034811115611501576040517f5b1fe5fc000000000000000000000000000000000000000000000000000000008152600481018290523460248201526044015b60405180910390fd5b505b86866040516115139291906127f0565b60405180910390208c6001600160a01b03167f617332c1832058df6ee45fcbdf471251474c9945a8e5d229287a21a5f67ccf0a8d8d8d8d348a60405161155e96959493929190612829565b60405180910390a3505050505050505050505050565b3361159d7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610cce576040516330cd747160e01b815260040160405180910390fd5b82826040516115d49291906127f0565b6040518091039020886001600160a01b03167f5cf48f121a0fecaa2c4a64b3eaf482c8c308d5387e161535970f3e9e4363eff689898989348860405161065596959493929190612829565b848460405161162f9291906127f0565b60405180910390208a6001600160a01b03167f99206760f0be19dd093729bd35e5924daff5e217bcedc5223ed067b60008cf8a8b8b8b8b8989896040516112489796959493929190612a44565b600080600080600085875af1905080610d30576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316602482015260448101829052610d309084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a6e565b60006001866004811115611780576117806128a2565b036117985761179185858585611b45565b905061183b565b60028660048111156117ac576117ac6128a2565b036117bd5761179185858585611c08565b60038660048111156117d1576117d16128a2565b036117e25761179185858585611c7e565b60048660048111156117f6576117f66128a2565b036118075761179185858585611d1a565b856040517f10fcd31f0000000000000000000000000000000000000000000000000000000081526004016114f89190612adf565b95945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526111969085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611706565b6001600160a01b0383166118bc5760405163e6c4247b60e01b815260040160405180910390fd5b604080516001600160a01b03808616825284166020820152908101829052849086907fd5df103822011013c8c940930e5180419111c65abadd6525ca7e740d56b4703f9060600160405180910390a36001600160a01b0382166119315761192c6001600160a01b0384168261167c565b610aea565b610aea6001600160a01b03831684836116c1565b6001600160a01b03811661196c57604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b7f11415423beab67062fb0f3f22cb2a478e3b5a02a845dd62ddb7c12d11098ff1b838383604051611a1b93929190612b32565b60405180910390a1807f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a3902604051611a5590869086906127f0565b908152604051908190036020019020610aea8282612bf0565b600080836001600160a01b031683604051611a899190612a28565b6000604051808303816000865af19150503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b50915091506000828015611af7575081511580611af7575081806020019051810190611af79190612d33565b9050801580611b0e57506001600160a01b0385163b155b15610aea576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620f4240620dbba082611b5a8888611d45565b6001860154909150600090611b7f90600160801b90046001600160801b0316846128ce565b600187015488546001600160801b0390911690611bb39068010000000000000000900467ffffffffffffffff166010612d50565b67ffffffffffffffff16611bc79190612d74565b6001600160801b0316611bda91906128e5565b9050611be78460106128ce565b611bf183836128ce565b611bfb9190612d97565b9998505050505050505050565b600060bc620f42408282611c1c8989611d45565b611c2691906128e5565b8654600187015491925083916801000000000000000090910467ffffffffffffffff1690611c5e9084906001600160801b03166128ce565b611c6891906128ce565b611c729190612d97565b98975050505050505050565b6000612710601082611c9082806128ce565b90506064600088611ca461018460446128e5565b611cae91906128e5565b905060006002611cbe83876128ce565b611cc89190612d97565b905085611cd584826128e5565b611cdf86846128e5565b60018b0154611cf791906001600160801b03166128ce565b611d0191906128ce565b611d0b9190612d97565b9b9a5050505050505050505050565b60006109c4633b9aca008282611d308989611d45565b611d3a91906128e5565b611c269060406128e5565b6000611d53604460106128ce565b9050611d6261018460086128ce565b611d6c90826128e5565b90508160005b81811015611de357848482818110611d8c57611d8c612873565b909101357fff00000000000000000000000000000000000000000000000000000000000000166000039050611dcd57611dc66004846128e5565b9250611ddb565b611dd86010846128e5565b92505b600101611d72565b505092915050565b6001600160a01b0381168114610cd757600080fd5b8035611e0b81611deb565b919050565b60008083601f840112611e2257600080fd5b50813567ffffffffffffffff811115611e3a57600080fd5b602083019150836020828501011115611e5257600080fd5b9250929050565b60008060008060008060008060a0898b031215611e7557600080fd5b8835611e8081611deb565b9750602089013567ffffffffffffffff80821115611e9d57600080fd5b611ea98c838d01611e10565b909950975060408b0135915080821115611ec257600080fd5b611ece8c838d01611e10565b909750955060608b0135915080821115611ee757600080fd5b50611ef48b828c01611e10565b9094509250506080890135611f0881611deb565b809150509295985092959890939650565b60008083601f840112611f2b57600080fd5b50813567ffffffffffffffff811115611f4357600080fd5b6020830191508360208260051b8501011115611e5257600080fd5b600080600080600060608688031215611f7657600080fd5b8535611f8181611deb565b9450602086013567ffffffffffffffff80821115611f9e57600080fd5b611faa89838a01611f19565b90965094506040880135915080821115611fc357600080fd5b50611fd088828901611f19565b969995985093965092949392505050565b600080600080600080600080600060a08a8c031215611fff57600080fd5b893567ffffffffffffffff8082111561201757600080fd5b6120238d838e01611e10565b909b50995060208c013591508082111561203c57600080fd5b6120488d838e01611e10565b909950975060408c013591508082111561206157600080fd5b61206d8d838e01611e10565b909750955060608c0135945060808c013591508082111561208d57600080fd5b5061209a8c828d01611e10565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126120d857600080fd5b813567ffffffffffffffff808211156120f3576120f36120b1565b604051601f8301601f19908116603f0116810190828211818310171561211b5761211b6120b1565b8160405283815286602085880101111561213457600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806000806101208d8f03121561217757600080fd5b6121808d611e00565b9b5067ffffffffffffffff60208e0135111561219b57600080fd5b6121ab8e60208f01358f01611e10565b909b50995067ffffffffffffffff60408e013511156121c957600080fd5b6121d98e60408f01358f01611e10565b909950975067ffffffffffffffff60608e013511156121f757600080fd5b6122078e60608f01358f01611e10565b909750955067ffffffffffffffff60808e0135111561222557600080fd5b6122358e60808f01358f016120c7565b945060a08d0135935061224a60c08e01611e00565b925060e08d013591506122606101008e01611e00565b90509295989b509295989b509295989b565b600080600080600080600080600080600060e08c8e03121561229357600080fd5b61229c8c611e00565b9a5067ffffffffffffffff8060208e013511156122b857600080fd5b6122c88e60208f01358f01611e10565b909b50995060408d01358110156122de57600080fd5b6122ee8e60408f01358f01611e10565b909950975060608d013581101561230457600080fd5b6123148e60608f01358f01611e10565b909750955060808d013581101561232a57600080fd5b5061233b8d60808e01358e01611e10565b909450925060a08c0135915061235360c08d01611e00565b90509295989b509295989b9093969950565b600080600080600060a0868803121561237d57600080fd5b8535945060208601359350604086013561239681611deb565b92506060860135915060808601356123ad81611deb565b809150509295509295909350565b600080600080600060a086880312156123d357600080fd5b853594506020860135935060408601356123ec81611deb565b925060608601356123fc81611deb565b949793965091946080013592915050565b60008060006060848603121561242257600080fd5b8335925060208401359150604084013561243b81611deb565b809150509250925092565b60006020828403121561245857600080fd5b813561246381611deb565b9392505050565b60008060006060848603121561247f57600080fd5b833561248a81611deb565b9250602084013561249a81611deb565b929592945050506040919091013590565b600080602083850312156124be57600080fd5b823567ffffffffffffffff8111156124d557600080fd5b6124e185828601611e10565b90969095509350505050565b6000806000806060858703121561250357600080fd5b843561250e81611deb565b935060208501359250604085013567ffffffffffffffff81111561253157600080fd5b61253d87828801611e10565b95989497509550505050565b60008060008060008060008060008060e08b8d03121561256857600080fd5b8a3561257381611deb565b995060208b013567ffffffffffffffff8082111561259057600080fd5b61259c8e838f01611e10565b909b50995060408d01359150808211156125b557600080fd5b6125c18e838f01611e10565b909950975060608d01359150808211156125da57600080fd5b506125e78d828e01611e10565b90965094505060808b01356125fb81611deb565b925060a08b0135915061261060c08c01611e00565b90509295989b9194979a5092959850565b6000806000806040858703121561263757600080fd5b843567ffffffffffffffff8082111561264f57600080fd5b61265b88838901611f19565b9096509450602087013591508082111561267457600080fd5b818701915087601f83011261268857600080fd5b81358181111561269757600080fd5b88602060c0830285010111156126ac57600080fd5b95989497505060200194505050565b8015158114610cd757600080fd5b8035611e0b816126bb565b6000806000806000806000806000806000806101008d8f0312156126f757600080fd5b6127008d611e00565b9b5067ffffffffffffffff60208e0135111561271b57600080fd5b61272b8e60208f01358f01611e10565b909b50995067ffffffffffffffff60408e0135111561274957600080fd5b6127598e60408f01358f01611e10565b909950975067ffffffffffffffff60608e0135111561277757600080fd5b6127878e60608f01358f01611e10565b909750955060808d0135945061279f60a08e016126c9565b93506127ad60c08e01611e00565b925067ffffffffffffffff60e08e013511156127c857600080fd5b6127d88e60e08f01358f01611e10565b81935080925050509295989b509295989b509295989b565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600061283d60808301888a612800565b8281036020840152612850818789612800565b9150508360408301526001600160a01b0383166060830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561289b57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e1057610e106128b8565b80820180821115610e1057610e106128b8565b60005b838110156129135781810151838201526020016128fb565b50506000910152565b60e08152600061293060e083018b8d612800565b8281036020840152612943818a8c612800565b905082810360408401528751808252612963816020840160208c016128f8565b60608401979097526001600160a01b03958616608084015260a083019490945250921660c0909201919091526020601f909201601f1916010195945050505050565b60c0815260006129b960c083018b8d612800565b82810360208401526129cc818a8c612800565b905082810360408401526129e181888a612800565b6060840196909652505060808101929092526001600160a01b031660a0909101529695505050505050565b602081526000612a20602083018486612800565b949350505050565b60008251612a3a8184602087016128f8565b9190910192915050565b60a081526000612a5860a08301898b612800565b8281036020840152612a6b81888a612800565b6001600160a01b039687166040850152606084019590955250509216608090920191909152949350505050565b6000808335601e19843603018112612aaf57600080fd5b83018035915067ffffffffffffffff821115612aca57600080fd5b602001915036819003821315611e5257600080fd5b6020810160058310612b0157634e487b7160e01b600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114610cd757600080fd5b6001600160801b0381168114610cd757600080fd5b60e081526000612b4660e083018587612800565b90508235612b5381612b07565b67ffffffffffffffff808216602085015260208501359150612b7482612b07565b16604083810191909152830135612b8a81612b1d565b6001600160801b03808216606085015260608501359150612baa82612b1d565b808216608085015260808501359150612bc282612b1d565b1660a083810191909152830135612bd881612b1d565b6001600160801b03811660c084015250949350505050565b8135612bfb81612b07565b67ffffffffffffffff8116905081548167ffffffffffffffff1982161783556020840135612c2881612b07565b6fffffffffffffffff00000000000000008160401b16836fffffffffffffffffffffffffffffffff198416171784555050506040820135612c6881612b1d565b81546001600160801b0316608082901b6fffffffffffffffffffffffffffffffff191617825550600181016060830135612ca181612b1d565b81546fffffffffffffffffffffffffffffffff19166001600160801b038216178255506080830135612cd281612b1d565b81546001600160801b0316608082901b6fffffffffffffffffffffffffffffffff1916178255505060a0820135612d0881612b1d565b6002820180546fffffffffffffffffffffffffffffffff19166001600160801b038316179055505050565b600060208284031215612d4557600080fd5b8151612463816126bb565b67ffffffffffffffff818116838216028082169190828114611de357611de36128b8565b6001600160801b03818116838216028082169190828114611de357611de36128b8565b600082612db457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220f861469381b22ffcb51c7e8aac64c42df609fa41fe64a670d8f91918c4789d3a64736f6c634300081700330000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc
Deployed Bytecode
0x6080604052600436106101c25760003560e01c8063892b5007116100f7578063cd433ada11610095578063edf936f211610064578063edf936f214610594578063f2fde38b146105a7578063f61ed218146105c7578063fd09e3bd146105da57600080fd5b8063cd433ada1461050d578063d3b81f0c14610520578063e30c397814610540578063edb6b3a51461057457600080fd5b8063a3499c73116100d1578063a3499c731461049a578063ab1999ba146104ba578063ba9ddc8d146104da578063c62c2002146104fa57600080fd5b8063892b5007146104125780638da5cb5b146104465780639ded06df1461047a57600080fd5b80634d2384891161016457806379ba50971161013e57806379ba50971461031d5780638291286c1461033257806382ad6f351461036557806386389f021461038557600080fd5b80634d238489146102a25780635c60da1b146102b5578063710bf322146102fd57600080fd5b806317a49f7c116101a057806317a49f7c1461022f5780632e9b74701461024f5780632edd2aa814610262578063365047211461028257600080fd5b80630c93e3bb146101c75780631055eaaf146101dc578063135eaa70146101fc575b600080fd5b6101da6101d5366004611e59565b6105fa565b005b3480156101e857600080fd5b506101da6101f7366004611f5e565b610667565b34801561020857600080fd5b5061021c610217366004611fe1565b610846565b6040519081526020015b60405180910390f35b34801561023b57600080fd5b506101da61024a366004612154565b610980565b6101da61025d366004612272565b610a0c565b34801561026e57600080fd5b506101da61027d366004612365565b610a82565b34801561028e57600080fd5b506101da61029d3660046123bb565b610af1565b6101da6102b036600461240d565b610b46565b3480156102c157600080fd5b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc545b6040516001600160a01b039091168152602001610226565b34801561030957600080fd5b506101da610318366004612446565b610b91565b34801561032957600080fd5b506101da610c60565b34801561033e57600080fd5b507ffaa2f015f2ce5aee225904728de2def86eb8837491efd21f1a04fc20d8e923f661021c565b34801561037157600080fd5b506101da61038036600461246a565b610cda565b34801561039157600080fd5b506103a56103a03660046124ab565b610d35565b6040516102269190600060c08201905067ffffffffffffffff8084511683528060208501511660208401525060408301516001600160801b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a0850152505092915050565b34801561041e57600080fd5b506102e57f0000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc81565b34801561045257600080fd5b507f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c0546102e5565b34801561048657600080fd5b506101da6104953660046124ab565b610e16565b3480156104a657600080fd5b506101da6104b53660046124ed565b610e7c565b3480156104c657600080fd5b506101da6104d5366004612365565b61119c565b3480156104e657600080fd5b506101da6104f5366004612549565b6111eb565b6101da610508366004612272565b611271565b6101da61051b36600461240d565b6112d2565b34801561052c57600080fd5b506101da61053b366004612621565b611314565b34801561054c57600080fd5b507f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d1546102e5565b34801561058057600080fd5b506101da61058f366004612154565b611405565b6101da6105a23660046126d4565b611466565b3480156105b357600080fd5b506101da6105c2366004612446565b611574565b6101da6105d5366004611e59565b6115c4565b3480156105e657600080fd5b506101da6105f5366004612549565b61161f565b828260405161060a9291906127f0565b6040518091039020886001600160a01b03167f617332c1832058df6ee45fcbdf471251474c9945a8e5d229287a21a5f67ccf0a89898989348860405161065596959493929190612829565b60405180910390a35050505050505050565b336001600160a01b037f0000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc16146106af57604051623bb10360e91b815260040160405180910390fd5b6001600160a01b0385166106d65760405163e6c4247b60e01b815260040160405180910390fd5b828181146106f757604051636c2b7e2d60e11b815260040160405180910390fd5b60005b8181101561083d57600086868381811061071657610716612873565b905060200201602081019061072b9190612446565b9050600085858481811061074157610741612873565b9050602002013590508060000361076b57604051636c2b7e2d60e11b815260040160405180910390fd5b6001600160a01b03821661079857478111610793576107936001600160a01b038a168261167c565b610833565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156107f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108199190612889565b8111610833576108336001600160a01b0383168a836116c1565b50506001016106fa565b50505050505050565b6000807f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390260405161087a908d908d906127f0565b908152604051908190036020019020805490915060009067ffffffffffffffff1660048111156108ac576108ac6128a2565b60018301549091506108c7906001600160801b0316876128ce565b82546108e39190600160801b90046001600160801b03166128e5565b925060008160048111156108f9576108f96128a2565b1461097157604080517f657468657265756d00000000000000000000000000000000000000000000000081527f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390260088201529051908190036028019020610963828a8a868561176a565b61096d90856128e5565b9350505b50509998505050505050505050565b86866040516109909291906127f0565b60405180910390208c6001600160a01b03167fda4ed638a7ffe9e814722efdb9ad6058c152c19c8564ceffe52e11dda1ca32238d8d8d8d8b8b8b8b8b6040516109e19998979695949392919061291c565b60405180910390a36109fe6001600160a01b038416333085611844565b505050505050505050505050565b8585604051610a1c9291906127f0565b60405180910390208b6001600160a01b03167f8c092067e86e85e8cfbaf187202ef580cdfd7ec37fbec89191607de73ca800058c8c8c8c8a8a8a348b604051610a6d999897969594939291906129a5565b60405180910390a35050505050505050505050565b604080516001600160a01b03808616825260208201859052831691810191909152849086907ff0b09bf969e7958967e0968e22596f647dd6efa09f4778e0393967b881f4b09f906060015b60405180910390a3610aea6001600160a01b038416333085611844565b5050505050565b336001600160a01b037f0000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc1614610b3957604051623bb10360e91b815260040160405180910390fd5b610aea8585858585611895565b604080513481526001600160a01b0383166020820152839185917fb26db521e067acd5c6e345ad92fa1ed06bc7fb2aedd68f35dc7a2e10d636fc9891015b60405180910390a3505050565b33610bba7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610be1576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b038116610c0857604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907fd9be0e8e07417e00f2521db636cb53e316fd288f5051f16d2aa2bf0c3938a87690600090a27f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b6000610c8a7f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d15490565b90506001600160a01b0381163314610cce576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cd781611945565b50565b336001600160a01b037f0000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc1614610d2257604051623bb10360e91b815260040160405180910390fd5b610d30600080858585611895565b505050565b6040805160c081018252600080825260208201819052818301819052606082018190526080820181905260a082015290517f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a390290610d9590859085906127f0565b90815260408051918290036020908101832060c084018352805467ffffffffffffffff808216865268010000000000000000820416928501929092526001600160801b03600160801b92839004811693850193909352600181015480841660608601529190910482166080840152600201541660a082015290505b92915050565b307f000000000000000000000000cb5c784dcf8ff342625dbc53b356ed0cbb0ebb9b6001600160a01b031603610e78576040517fbf10dd3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b33610ea57f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610ecc576040516330cd747160e01b815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190612889565b846001600160a01b0316638291286c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb19190612889565b14610fe8576040517f68155f9a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836001600160a01b03163f831461102b576040517f8f84fb2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8490556040516001600160a01b038516907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a28015611196576000846001600160a01b0316639ded06df60e01b84846040516024016110b0929190612a0c565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161111b9190612a28565b600060405180830381855af49150503d8060008114611156576040519150601f19603f3d011682016040523d82523d6000602084013e61115b565b606091505b5050905080610aea576040517f97905dfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b604080516001600160a01b03808616825260208201859052831691810191909152849086907f2275e75614080f9782f72563c2c1688c901c5339c7f9f436d323f9386fed700a90606001610acd565b84846040516111fb9291906127f0565b60405180910390208a6001600160a01b03167fd171a7eb157e548ca493dd0a16016d125963a369ac5ae3c275ec12c96d5277028b8b8b8b8989896040516112489796959493929190612a44565b60405180910390a36112656001600160a01b038416333085611844565b50505050505050505050565b85856040516112819291906127f0565b60405180910390208b6001600160a01b03167f999d431b58761213cf53af96262b67a069cbd963499fd8effd1e21556217b8418c8c8c8c8a8a8a348b604051610a6d999897969594939291906129a5565b604080513481526001600160a01b0383166020820152839185917ffeb6b00343feee0f29a1a4345f8bf93ca1c73ee922248a4237a4e50d6447604e9101610b84565b336001600160a01b037f0000000000000000000000007ddb2d76b80b0aa19bdea48eb1301182f4ceefbc161461135c57604051623bb10360e91b815260040160405180910390fd5b82818114611396576040517fa5f1efe300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156113fd573660008787848181106113b6576113b6612873565b90506020028101906113c89190612a98565b91509150368686858181106113df576113df612873565b905060c0020190506113f28383836119e8565b505050600101611399565b505050505050565b86866040516114159291906127f0565b60405180910390208c6001600160a01b03167f8875f9764f28fa82d3e7ff1b80bd5c8f665e1f42fcd8c2faebc7c400a4ba1bbd8d8d8d8d8b8b8b8b8b6040516109e19998979695949392919061291c565b801561149e576040517fa86b651200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83156115035760006114b78c8c8c8c8c8c8c8a8a610846565b905034811115611501576040517f5b1fe5fc000000000000000000000000000000000000000000000000000000008152600481018290523460248201526044015b60405180910390fd5b505b86866040516115139291906127f0565b60405180910390208c6001600160a01b03167f617332c1832058df6ee45fcbdf471251474c9945a8e5d229287a21a5f67ccf0a8d8d8d8d348a60405161155e96959493929190612829565b60405180910390a3505050505050505050505050565b3361159d7f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05490565b6001600160a01b031614610cce576040516330cd747160e01b815260040160405180910390fd5b82826040516115d49291906127f0565b6040518091039020886001600160a01b03167f5cf48f121a0fecaa2c4a64b3eaf482c8c308d5387e161535970f3e9e4363eff689898989348860405161065596959493929190612829565b848460405161162f9291906127f0565b60405180910390208a6001600160a01b03167f99206760f0be19dd093729bd35e5924daff5e217bcedc5223ed067b60008cf8a8b8b8b8b8989896040516112489796959493929190612a44565b600080600080600085875af1905080610d30576040517ff4b3b1bc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b038316602482015260448101829052610d309084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611a6e565b60006001866004811115611780576117806128a2565b036117985761179185858585611b45565b905061183b565b60028660048111156117ac576117ac6128a2565b036117bd5761179185858585611c08565b60038660048111156117d1576117d16128a2565b036117e25761179185858585611c7e565b60048660048111156117f6576117f66128a2565b036118075761179185858585611d1a565b856040517f10fcd31f0000000000000000000000000000000000000000000000000000000081526004016114f89190612adf565b95945050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526111969085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611706565b6001600160a01b0383166118bc5760405163e6c4247b60e01b815260040160405180910390fd5b604080516001600160a01b03808616825284166020820152908101829052849086907fd5df103822011013c8c940930e5180419111c65abadd6525ca7e740d56b4703f9060600160405180910390a36001600160a01b0382166119315761192c6001600160a01b0384168261167c565b610aea565b610aea6001600160a01b03831684836116c1565b6001600160a01b03811661196c57604051633649397d60e21b815260040160405180910390fd5b6040516001600160a01b038216907f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390600090a27f02016836a56b71f0d02689e69e326f4f4c1b9057164ef592671cf0d37c8040c05560007f9855384122b55936fbfb8ca5120e63c6537a1ac40caf6ae33502b3c5da8c87d155565b7f11415423beab67062fb0f3f22cb2a478e3b5a02a845dd62ddb7c12d11098ff1b838383604051611a1b93929190612b32565b60405180910390a1807f2fa150da4c9f4c3a28593398c65313dd42f63d0530ec6db4a2b46e6d837a3902604051611a5590869086906127f0565b908152604051908190036020019020610aea8282612bf0565b600080836001600160a01b031683604051611a899190612a28565b6000604051808303816000865af19150503d8060008114611ac6576040519150601f19603f3d011682016040523d82523d6000602084013e611acb565b606091505b50915091506000828015611af7575081511580611af7575081806020019051810190611af79190612d33565b9050801580611b0e57506001600160a01b0385163b155b15610aea576040517f045c4b0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000620f4240620dbba082611b5a8888611d45565b6001860154909150600090611b7f90600160801b90046001600160801b0316846128ce565b600187015488546001600160801b0390911690611bb39068010000000000000000900467ffffffffffffffff166010612d50565b67ffffffffffffffff16611bc79190612d74565b6001600160801b0316611bda91906128e5565b9050611be78460106128ce565b611bf183836128ce565b611bfb9190612d97565b9998505050505050505050565b600060bc620f42408282611c1c8989611d45565b611c2691906128e5565b8654600187015491925083916801000000000000000090910467ffffffffffffffff1690611c5e9084906001600160801b03166128ce565b611c6891906128ce565b611c729190612d97565b98975050505050505050565b6000612710601082611c9082806128ce565b90506064600088611ca461018460446128e5565b611cae91906128e5565b905060006002611cbe83876128ce565b611cc89190612d97565b905085611cd584826128e5565b611cdf86846128e5565b60018b0154611cf791906001600160801b03166128ce565b611d0191906128ce565b611d0b9190612d97565b9b9a5050505050505050505050565b60006109c4633b9aca008282611d308989611d45565b611d3a91906128e5565b611c269060406128e5565b6000611d53604460106128ce565b9050611d6261018460086128ce565b611d6c90826128e5565b90508160005b81811015611de357848482818110611d8c57611d8c612873565b909101357fff00000000000000000000000000000000000000000000000000000000000000166000039050611dcd57611dc66004846128e5565b9250611ddb565b611dd86010846128e5565b92505b600101611d72565b505092915050565b6001600160a01b0381168114610cd757600080fd5b8035611e0b81611deb565b919050565b60008083601f840112611e2257600080fd5b50813567ffffffffffffffff811115611e3a57600080fd5b602083019150836020828501011115611e5257600080fd5b9250929050565b60008060008060008060008060a0898b031215611e7557600080fd5b8835611e8081611deb565b9750602089013567ffffffffffffffff80821115611e9d57600080fd5b611ea98c838d01611e10565b909950975060408b0135915080821115611ec257600080fd5b611ece8c838d01611e10565b909750955060608b0135915080821115611ee757600080fd5b50611ef48b828c01611e10565b9094509250506080890135611f0881611deb565b809150509295985092959890939650565b60008083601f840112611f2b57600080fd5b50813567ffffffffffffffff811115611f4357600080fd5b6020830191508360208260051b8501011115611e5257600080fd5b600080600080600060608688031215611f7657600080fd5b8535611f8181611deb565b9450602086013567ffffffffffffffff80821115611f9e57600080fd5b611faa89838a01611f19565b90965094506040880135915080821115611fc357600080fd5b50611fd088828901611f19565b969995985093965092949392505050565b600080600080600080600080600060a08a8c031215611fff57600080fd5b893567ffffffffffffffff8082111561201757600080fd5b6120238d838e01611e10565b909b50995060208c013591508082111561203c57600080fd5b6120488d838e01611e10565b909950975060408c013591508082111561206157600080fd5b61206d8d838e01611e10565b909750955060608c0135945060808c013591508082111561208d57600080fd5b5061209a8c828d01611e10565b915080935050809150509295985092959850929598565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126120d857600080fd5b813567ffffffffffffffff808211156120f3576120f36120b1565b604051601f8301601f19908116603f0116810190828211818310171561211b5761211b6120b1565b8160405283815286602085880101111561213457600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806000806000806000806000806000806101208d8f03121561217757600080fd5b6121808d611e00565b9b5067ffffffffffffffff60208e0135111561219b57600080fd5b6121ab8e60208f01358f01611e10565b909b50995067ffffffffffffffff60408e013511156121c957600080fd5b6121d98e60408f01358f01611e10565b909950975067ffffffffffffffff60608e013511156121f757600080fd5b6122078e60608f01358f01611e10565b909750955067ffffffffffffffff60808e0135111561222557600080fd5b6122358e60808f01358f016120c7565b945060a08d0135935061224a60c08e01611e00565b925060e08d013591506122606101008e01611e00565b90509295989b509295989b509295989b565b600080600080600080600080600080600060e08c8e03121561229357600080fd5b61229c8c611e00565b9a5067ffffffffffffffff8060208e013511156122b857600080fd5b6122c88e60208f01358f01611e10565b909b50995060408d01358110156122de57600080fd5b6122ee8e60408f01358f01611e10565b909950975060608d013581101561230457600080fd5b6123148e60608f01358f01611e10565b909750955060808d013581101561232a57600080fd5b5061233b8d60808e01358e01611e10565b909450925060a08c0135915061235360c08d01611e00565b90509295989b509295989b9093969950565b600080600080600060a0868803121561237d57600080fd5b8535945060208601359350604086013561239681611deb565b92506060860135915060808601356123ad81611deb565b809150509295509295909350565b600080600080600060a086880312156123d357600080fd5b853594506020860135935060408601356123ec81611deb565b925060608601356123fc81611deb565b949793965091946080013592915050565b60008060006060848603121561242257600080fd5b8335925060208401359150604084013561243b81611deb565b809150509250925092565b60006020828403121561245857600080fd5b813561246381611deb565b9392505050565b60008060006060848603121561247f57600080fd5b833561248a81611deb565b9250602084013561249a81611deb565b929592945050506040919091013590565b600080602083850312156124be57600080fd5b823567ffffffffffffffff8111156124d557600080fd5b6124e185828601611e10565b90969095509350505050565b6000806000806060858703121561250357600080fd5b843561250e81611deb565b935060208501359250604085013567ffffffffffffffff81111561253157600080fd5b61253d87828801611e10565b95989497509550505050565b60008060008060008060008060008060e08b8d03121561256857600080fd5b8a3561257381611deb565b995060208b013567ffffffffffffffff8082111561259057600080fd5b61259c8e838f01611e10565b909b50995060408d01359150808211156125b557600080fd5b6125c18e838f01611e10565b909950975060608d01359150808211156125da57600080fd5b506125e78d828e01611e10565b90965094505060808b01356125fb81611deb565b925060a08b0135915061261060c08c01611e00565b90509295989b9194979a5092959850565b6000806000806040858703121561263757600080fd5b843567ffffffffffffffff8082111561264f57600080fd5b61265b88838901611f19565b9096509450602087013591508082111561267457600080fd5b818701915087601f83011261268857600080fd5b81358181111561269757600080fd5b88602060c0830285010111156126ac57600080fd5b95989497505060200194505050565b8015158114610cd757600080fd5b8035611e0b816126bb565b6000806000806000806000806000806000806101008d8f0312156126f757600080fd5b6127008d611e00565b9b5067ffffffffffffffff60208e0135111561271b57600080fd5b61272b8e60208f01358f01611e10565b909b50995067ffffffffffffffff60408e0135111561274957600080fd5b6127598e60408f01358f01611e10565b909950975067ffffffffffffffff60608e0135111561277757600080fd5b6127878e60608f01358f01611e10565b909750955060808d0135945061279f60a08e016126c9565b93506127ad60c08e01611e00565b925067ffffffffffffffff60e08e013511156127c857600080fd5b6127d88e60e08f01358f01611e10565b81935080925050509295989b509295989b509295989b565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60808152600061283d60808301888a612800565b8281036020840152612850818789612800565b9150508360408301526001600160a01b0383166060830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561289b57600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e1057610e106128b8565b80820180821115610e1057610e106128b8565b60005b838110156129135781810151838201526020016128fb565b50506000910152565b60e08152600061293060e083018b8d612800565b8281036020840152612943818a8c612800565b905082810360408401528751808252612963816020840160208c016128f8565b60608401979097526001600160a01b03958616608084015260a083019490945250921660c0909201919091526020601f909201601f1916010195945050505050565b60c0815260006129b960c083018b8d612800565b82810360208401526129cc818a8c612800565b905082810360408401526129e181888a612800565b6060840196909652505060808101929092526001600160a01b031660a0909101529695505050505050565b602081526000612a20602083018486612800565b949350505050565b60008251612a3a8184602087016128f8565b9190910192915050565b60a081526000612a5860a08301898b612800565b8281036020840152612a6b81888a612800565b6001600160a01b039687166040850152606084019590955250509216608090920191909152949350505050565b6000808335601e19843603018112612aaf57600080fd5b83018035915067ffffffffffffffff821115612aca57600080fd5b602001915036819003821315611e5257600080fd5b6020810160058310612b0157634e487b7160e01b600052602160045260246000fd5b91905290565b67ffffffffffffffff81168114610cd757600080fd5b6001600160801b0381168114610cd757600080fd5b60e081526000612b4660e083018587612800565b90508235612b5381612b07565b67ffffffffffffffff808216602085015260208501359150612b7482612b07565b16604083810191909152830135612b8a81612b1d565b6001600160801b03808216606085015260608501359150612baa82612b1d565b808216608085015260808501359150612bc282612b1d565b1660a083810191909152830135612bd881612b1d565b6001600160801b03811660c084015250949350505050565b8135612bfb81612b07565b67ffffffffffffffff8116905081548167ffffffffffffffff1982161783556020840135612c2881612b07565b6fffffffffffffffff00000000000000008160401b16836fffffffffffffffffffffffffffffffff198416171784555050506040820135612c6881612b1d565b81546001600160801b0316608082901b6fffffffffffffffffffffffffffffffff191617825550600181016060830135612ca181612b1d565b81546fffffffffffffffffffffffffffffffff19166001600160801b038216178255506080830135612cd281612b1d565b81546001600160801b0316608082901b6fffffffffffffffffffffffffffffffff1916178255505060a0820135612d0881612b1d565b6002820180546fffffffffffffffffffffffffffffffff19166001600160801b038316179055505050565b600060208284031215612d4557600080fd5b8151612463816126bb565b67ffffffffffffffff818116838216028082169190828114611de357611de36128b8565b6001600160801b03818116838216028082169190828114611de357611de36128b8565b600082612db457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220f861469381b22ffcb51c7e8aac64c42df609fa41fe64a670d8f91918c4789d3a64736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC
-----Decoded View---------------
Arg [0] : gasCollector_ (address): 0x7DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007DdB2d76b80B0AA19bDEa48EB1301182F4CeefbC
Deployed Bytecode Sourcemap
50103:20331:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56170:392;;;;;;:::i;:::-;;:::i;:::-;;67628:892;;;;;;;;;;-1:-1:-1;67628:892:0;;;;;:::i;:::-;;:::i;6036:866::-;;;;;;;;;;-1:-1:-1;6036:866:0;;;;;:::i;:::-;;:::i;:::-;;;4768:25:1;;;4756:2;4741:18;6036:866:0;;;;;;;;60109:746;;;;;;;;;;-1:-1:-1;60109:746:0;;;;;:::i;:::-;;:::i;62614:597::-;;;;;;:::i;:::-;;:::i;65418:373::-;;;;;;;;;;-1:-1:-1;65418:373:0;;;;;:::i;:::-;;:::i;69354:251::-;;;;;;;;;;-1:-1:-1;69354:251:0;;;;;:::i;:::-;;:::i;66262:235::-;;;;;;:::i;:::-;;:::i;46789:171::-;;;;;;;;;;-1:-1:-1;46921:20:0;46915:27;46789:171;;;-1:-1:-1;;;;;10551:55:1;;;10533:74;;10521:2;10506:18;46789:171:0;10387:226:1;44360:287:0;;;;;;;;;;-1:-1:-1;44360:287:0;;;;;:::i;:::-;;:::i;44777:197::-;;;;;;;;;;;;;:::i;70320:111::-;;;;;;;;;;-1:-1:-1;70392:31:0;70320:111;;68620:196;;;;;;;;;;-1:-1:-1;68620:196:0;;;;;:::i;:::-;;:::i;4774:135::-;;;;;;;;;;-1:-1:-1;4774:135:0;;;;;:::i;:::-;;:::i;:::-;;;;;;12199:4:1;12241:3;12230:9;12226:19;12218:27;;12264:18;12328:2;12319:6;12313:13;12309:22;12298:9;12291:41;12400:2;12392:4;12384:6;12380:17;12374:24;12370:33;12363:4;12352:9;12348:20;12341:63;;12451:4;12443:6;12439:17;12433:24;-1:-1:-1;;;;;12566:2:1;12552:12;12548:21;12541:4;12530:9;12526:20;12519:51;12638:2;12630:4;12622:6;12618:17;12612:24;12608:33;12601:4;12590:9;12586:20;12579:63;12710:2;12702:4;12694:6;12690:17;12684:24;12680:33;12673:4;12662:9;12658:20;12651:63;12782:2;12774:4;12766:6;12762:17;12756:24;12752:33;12745:4;12734:9;12730:20;12723:63;;;12061:731;;;;;50333:37:0;;;;;;;;;;;;;;;43265:135;;;;;;;;;;-1:-1:-1;43370:11:0;43364:18;43265:135;;48390:128;;;;;;;;;;-1:-1:-1;48390:128:0;;;;;:::i;:::-;;:::i;47359:826::-;;;;;;;;;;-1:-1:-1;47359:826:0;;;;;:::i;:::-;;:::i;63789:359::-;;;;;;;;;;-1:-1:-1;63789:359:0;;;;;:::i;:::-;;:::i;58665:528::-;;;;;;;;;;-1:-1:-1;58665:528:0;;;;;:::i;:::-;;:::i;57325:599::-;;;;;;:::i;:::-;;:::i;64602:221::-;;;;;;:::i;:::-;;:::i;66776:450::-;;;;;;;;;;-1:-1:-1;66776:450:0;;;;;:::i;:::-;;:::i;43542:155::-;;;;;;;;;;-1:-1:-1;43654:24:0;43648:31;43542:155;;54834:748;;;;;;;;;;-1:-1:-1;54834:748:0;;;;;:::i;:::-;;:::i;51722:857::-;;;;;;:::i;:::-;;:::i;43919:119::-;;;;;;;;;;-1:-1:-1;43919:119:0;;;;;:::i;:::-;;:::i;61452:390::-;;;;;;:::i;:::-;;:::i;53303:632::-;;;;;;;;;;-1:-1:-1;53303:632:0;;;;;:::i;:::-;;:::i;56170:392::-;56519:7;;56509:18;;;;;;;:::i;:::-;;;;;;;;56463:6;-1:-1:-1;;;;;56434:120:0;;56471:16;;56489:18;;56529:9;56540:13;56434:120;;;;;;;;;;;:::i;:::-;;;;;;;;56170:392;;;;;;;;:::o;67628:892::-;50747:10;-1:-1:-1;;;;;50761:12:0;50747:26;;50743:53;;50782:14;;-1:-1:-1;;;50782:14:0;;;;;;;;;;;50743:53;-1:-1:-1;;;;;67802:22:0;::::1;67798:51;;67833:16;;-1:-1:-1::0;;;67833:16:0::1;;;;;;;;;;;67798:51;67885:6:::0;67913:30;;::::1;67909:59;;67952:16;;-1:-1:-1::0;;;67952:16:0::1;;;;;;;;;;;67909:59;67986:9;67981:532;68001:12;67997:1;:16;67981:532;;;68035:13;68051:6;;68058:1;68051:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;68035:25;;68075:14;68092:7;;68100:1;68092:10;;;;;;;:::i;:::-;;;;;;;68075:27;;68121:6;68131:1;68121:11:::0;68117:40:::1;;68141:16;;-1:-1:-1::0;;;68141:16:0::1;;;;;;;;;;;68117:40;-1:-1:-1::0;;;;;68178:19:0;::::1;68174:328;;68232:21;68222:6;:31;68218:72;;68255:35;-1:-1:-1::0;;;;;68255:27:0;::::1;68283:6:::0;68255:27:::1;:35::i;:::-;68174:328;;;68402:38;::::0;;;;68434:4:::1;68402:38;::::0;::::1;10533:74:1::0;-1:-1:-1;;;;;68402:23:0;::::1;::::0;::::1;::::0;10506:18:1;;68402:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68392:6;:48;68388:98;;68442:44;-1:-1:-1::0;;;;;68442:26:0;::::1;68469:8:::0;68479:6;68442:26:::1;:44::i;:::-;-1:-1:-1::0;;68015:3:0::1;;67981:532;;;;67787:733;67628:892:::0;;;;;:::o;6036:866::-;6289:19;;14466:16;6347:38;;;;6368:16;;;;6347:38;:::i;:::-;;;;;;;;;;;;;;6452:25;;6347:38;;-1:-1:-1;6396:35:0;;6452:25;;6434:44;;;;;;;;:::i;:::-;6550:24;;;;6396:82;;-1:-1:-1;6530:44:0;;-1:-1:-1;;;;;6550:24:0;6530:17;:44;:::i;:::-;6505:21;;:70;;;-1:-1:-1;;;6505:21:0;;-1:-1:-1;;;;;6505:21:0;:70;:::i;:::-;6491:84;-1:-1:-1;6685:25:0;6664:17;:46;;;;;;;;:::i;:::-;;6660:235;;6755:32;;;20828:10:1;20816:23;;14466:16:0;20864:1:1;20855:11;;6755:32:0;;;;;;;;;;;6819:64;6836:17;6855:7;;6864;6755:32;6819:16;:64::i;:::-;6804:79;;;;:::i;:::-;;;6712:183;6660:235;6310:592;;6036:866;;;;;;;;;;;:::o;60109:746::-;60621:7;;60611:18;;;;;;;:::i;:::-;;;;;;;;60526:6;-1:-1:-1;;;;;60481:279:0;;60547:16;;60578:18;;60644:6;60665;60686:8;60709:12;60736:13;60481:279;;;;;;;;;;;;;;:::i;:::-;;;;;;;;60773:74;-1:-1:-1;;;;;60773:33:0;;60807:10;60827:4;60834:12;60773:33;:74::i;:::-;60109:746;;;;;;;;;;;;:::o;62614:597::-;63090:7;;63080:18;;;;;;;:::i;:::-;;;;;;;;62995:6;-1:-1:-1;;;;;62944:259:0;;63016:16;;63047:18;;63113:6;;63134;63155:9;63179:13;62944:259;;;;;;;;;;;;;;:::i;:::-;;;;;;;;62614:597;;;;;;;;;;;:::o;65418:373::-;65624:72;;;-1:-1:-1;;;;;23454:15:1;;;23436:34;;23501:2;23486:18;;23479:34;;;23549:15;;23529:18;;;23522:43;;;;65648:8:0;;65640:6;;65624:72;;23363:2:1;23348:18;65624:72:0;;;;;;;;65709:74;-1:-1:-1;;;;;65709:33:0;;65743:10;65763:4;65770:12;65709:33;:74::i;:::-;65418:373;;;;;:::o;69354:251::-;50747:10;-1:-1:-1;;;;;50761:12:0;50747:26;;50743:53;;50782:14;;-1:-1:-1;;;50782:14:0;;;;;;;;;;;50743:53;69547:50:::1;69555:6;69563:8;69573;69583:5;69590:6;69547:7;:50::i;66262:235::-:0;66424:65;;;66464:9;23750:25:1;;-1:-1:-1;;;;;23811:55:1;;23806:2;23791:18;;23784:83;66454:8:0;;66446:6;;66424:65;;23723:18:1;66424:65:0;;;;;;;;66262:235;;;:::o;44360:287::-;43072:10;43061:7;43370:11;43364:18;;43265:135;43061:7;-1:-1:-1;;;;;43061:21:0;;43057:44;;43091:10;;-1:-1:-1;;;43091:10:0;;;;;;;;;;;43057:44;-1:-1:-1;;;;;44446:22:0;::::1;44442:56;;44477:21;;-1:-1:-1::0;;;44477:21:0::1;;;;;;;;;;;44442:56;44516:34;::::0;-1:-1:-1;;;;;44516:34:0;::::1;::::0;::::1;::::0;;;::::1;44594:24;44587:42:::0;44360:287::o;44777:197::-;44832:16;44851:14;43654:24;43648:31;;43542:155;44851:14;44832:33;-1:-1:-1;;;;;;44880:22:0;;44892:10;44880:22;44876:49;;44911:14;;;;;;;;;;;;;;44876:49;44938:28;44957:8;44938:18;:28::i;:::-;44821:153;44777:197::o;68620:196::-;50747:10;-1:-1:-1;;;;;50761:12:0;50747:26;;50743:53;;50782:14;;-1:-1:-1;;;50782:14:0;;;;;;;;;;;50743:53;68761:47:::1;68777:1;::::0;68784:8;68794:5;68801:6;68761:7:::1;:47::i;:::-;68620:196:::0;;;:::o;4774:135::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:27:0;;14466:16;;4874:27;;4895:5;;;;4874:27;:::i;:::-;;;;;;;;;;;;;;;;;4867:34;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;4867:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:27;-1:-1:-1;4774:135:0;;;;;:::o;48390:128::-;41291:4;41258:21;-1:-1:-1;;;;;41258:38:0;;41254:61;;41305:10;;;;;;;;;;;;;;41254:61;48390:128;;:::o;47359:826::-;43072:10;43061:7;43370:11;43364:18;;43265:135;43061:7;-1:-1:-1;;;;;43061:21:0;;43057:44;;43091:10;;-1:-1:-1;;;43091:10:0;;;;;;;;;;;43057:44;46921:20;46915:27;-1:-1:-1;;;;;47585:40:0::1;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47550:17;-1:-1:-1::0;;;;;47538:41:0::1;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:89;47534:125;;47636:23;;;;;;;;;;;;;;47534:125;47705:17;-1:-1:-1::0;;;;;47705:26:0::1;;47676:25;:55;47672:85;;47740:17;;;;;;;;;;;;;;47672:85;47801:20;47794:47:::0;;;47869:27:::1;::::0;-1:-1:-1;;;;;47869:27:0;::::1;::::0;::::1;::::0;;;::::1;47913:17:::0;;47909:269:::1;;48014:12;48032:17;-1:-1:-1::0;;;;;48032:30:0::1;48086:19;;;48107:6;;48063:51;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;48063:51:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;48032:83;;::::1;::::0;48063:51;48032:83:::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48013:102;;;48137:7;48132:34;;48153:13;;;;;;;;;;;;;;47909:269;47359:826:::0;;;;:::o;63789:359::-;63988:65;;;-1:-1:-1;;;;;23454:15:1;;;23436:34;;23501:2;23486:18;;23479:34;;;23549:15;;23529:18;;;23522:43;;;;64005:8:0;;63997:6;;63988:65;;23363:2:1;23348:18;63988:65:0;23173:398:1;58665:528:0;59050:7;;59040:18;;;;;;;:::i;:::-;;;;;;;;58994:6;-1:-1:-1;;;;;58972:126:0;;59002:16;;59020:18;;59060:8;59070:12;59084:13;58972:126;;;;;;;;;;;;:::i;:::-;;;;;;;;59111:74;-1:-1:-1;;;;;59111:33:0;;59145:10;59165:4;59172:12;59111:33;:74::i;:::-;58665:528;;;;;;;;;;:::o;57325:599::-;57803:7;;57793:18;;;;;;;:::i;:::-;;;;;;;;57708:6;-1:-1:-1;;;;;57656:260:0;;57729:16;;57760:18;;57826:6;;57847;57868:9;57892:13;57656:260;;;;;;;;;;;;;;:::i;64602:221::-;64757:58;;;64790:9;23750:25:1;;-1:-1:-1;;;;;23811:55:1;;23806:2;23791:18;;23784:83;64780:8:0;;64772:6;;64757:58;;23723:18:1;64757:58:0;23576:297:1;66776:450:0;50747:10;-1:-1:-1;;;;;50761:12:0;50747:26;;50743:53;;50782:14;;-1:-1:-1;;;50782:14:0;;;;;;;;;;;50743:53;66913:6;66943:33;;::::1;66939:65;;66985:19;;;;;;;;;;;;;;66939:65;67022:9;67017:202;67037:12;67033:1;:16;67017:202;;;67071:21;;67095:6;;67102:1;67095:9;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;67071:33;;;;67119:26;67148:10;;67159:1;67148:13;;;;;;;:::i;:::-;;;;;;67119:42;;67178:29;67190:5;;67197:9;67178:11;:29::i;:::-;-1:-1:-1::0;;;67051:3:0::1;;67017:202;;;;66879:347;66776:450:::0;;;;:::o;54834:748::-;55348:7;;55338:18;;;;;;;:::i;:::-;;;;;;;;55253:6;-1:-1:-1;;;;;55207:280:0;;55274:16;;55305:18;;55371:6;55392;55413:8;55436:12;55463:13;55207:280;;;;;;;;;;;;;;:::i;51722:857::-;52063:17;;52059:72;;52104:15;;;;;;;;;;;;;;52059:72;52147:15;52143:291;;;52179:19;52201:88;52216:16;;52234:18;;52254:7;;52263:17;52282:6;;52201:14;:88::i;:::-;52179:110;;52324:9;52310:11;:23;52306:117;;;52361:46;;;;;;;;26047:25:1;;;52397:9:0;26088:18:1;;;26081:34;26020:18;;52361:46:0;;;;;;;;52306:117;52164:270;52143:291;52536:7;;52526:18;;;;;;;:::i;:::-;;;;;;;;52480:6;-1:-1:-1;;;;;52451:120:0;;52488:16;;52506:18;;52546:9;52557:13;52451:120;;;;;;;;;;;:::i;:::-;;;;;;;;51722:857;;;;;;;;;;;;:::o;43919:119::-;43072:10;43061:7;43370:11;43364:18;;43265:135;43061:7;-1:-1:-1;;;;;43061:21:0;;43057:44;;43091:10;;-1:-1:-1;;;43091:10:0;;;;;;;;;;;61452:390;61799:7;;61789:18;;;;;;;:::i;:::-;;;;;;;;61743:6;-1:-1:-1;;;;;61715:119:0;;61751:16;;61769:18;;61809:9;61820:13;61715:119;;;;;;;;;;;:::i;53303:632::-;53743:7;;53733:18;;;;;;;:::i;:::-;;;;;;;;53648:6;-1:-1:-1;;;;;53611:229:0;;53669:16;;53700:18;;53766:8;53789:12;53816:13;53611:229;;;;;;;;;;;;:::i;49418:257::-;49500:12;49599:1;49596;49593;49590;49582:6;49572:8;49565:5;49560:41;49549:52;;49629:7;49624:43;;49645:22;;;;;;;;;;;;;;39462:229;39616:66;;-1:-1:-1;;;;;26318:55:1;;39616:66:0;;;26300:74:1;26390:18;;;26383:34;;;39586:97:0;;39609:5;;39639:24;;26273:18:1;;39616:66:0;;;;-1:-1:-1;;39616:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;39586:22;:97::i;7211:866::-;7416:7;7461:33;7440:17;:54;;;;;;;;:::i;:::-;;7436:143;;7518:49;7539:7;;7548;7557:9;7518:20;:49::i;:::-;7511:56;;;;7436:143;7614:33;7593:17;:54;;;;;;;;:::i;:::-;;7589:143;;7671:49;7692:7;;7701;7710:9;7671:20;:49::i;7589:143::-;7767:26;7746:17;:47;;;;;;;;:::i;:::-;;7742:129;;7817:42;7831:7;;7840;7849:9;7817:13;:42::i;7742:129::-;7906:24;7885:17;:45;;;;;;;;:::i;:::-;;7881:125;;7954:40;7966:7;;7975;7984:9;7954:11;:40::i;7881:125::-;8051:17;8025:44;;;;;;;;;;;:::i;7211:866::-;;;;;;;;:::o;40154:254::-;40329:70;;-1:-1:-1;;;;;27118:15:1;;;40329:70:0;;;27100:34:1;27170:15;;27150:18;;;27143:43;27202:18;;;27195:34;;;40299:101:0;;40322:5;;40352:28;;27012:18:1;;40329:70:0;26837:398:1;69693:483:0;-1:-1:-1;;;;;69876:22:0;;69872:51;;69907:16;;-1:-1:-1;;;69907:16:0;;;;;;;;;;;69872:51;69941;;;-1:-1:-1;;;;;27118:15:1;;;27100:34;;27170:15;;27165:2;27150:18;;27143:43;27202:18;;;27195:34;;;69958:8:0;;69950:6;;69941:51;;27027:2:1;27012:18;69941:51:0;;;;;;;-1:-1:-1;;;;;70009:19:0;;70005:164;;70045:35;-1:-1:-1;;;;;70045:27:0;;70073:6;70045:27;:35::i;:::-;70005:164;;;70113:44;-1:-1:-1;;;;;70113:26:0;;70140:8;70150:6;70113:26;:44::i;45227:311::-;-1:-1:-1;;;;;45305:22:0;;45301:56;;45336:21;;-1:-1:-1;;;45336:21:0;;;;;;;;;;;45301:56;45375:30;;-1:-1:-1;;;;;45375:30:0;;;;;;;;45449:11;45442:29;45518:1;45492:24;45485:35;45227:311::o;5186:183::-;5281:30;5296:5;;5303:7;5281:30;;;;;;;;:::i;:::-;;;;;;;;5354:7;14466:16;5324:27;;;;5345:5;;;;5324:27;:::i;:::-;;;;;;;;;;;;;;:37;;:27;:37;:::i;38733:356::-;38809:12;38823:23;38858:5;-1:-1:-1;;;;;38850:19:0;38870:8;38850:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38808:71;;;;38890:16;38909:7;:78;;;;-1:-1:-1;38921:17:0;;:31;;:65;;;38967:10;38956:30;;;;;;;;;;;;:::i;:::-;38890:97;;39005:11;39004:12;:47;;;-1:-1:-1;;;;;;39020:26:0;;;:31;39004:47;39000:81;;;39060:21;;;;;;;;;;;;;;8380:1718;8543:17;9356:5;9557:9;8543:17;9737:18;9747:7;;9737:9;:18::i;:::-;9923:29;;;;9720:35;;-1:-1:-1;9768:24:0;;9890:62;;-1:-1:-1;;;9923:29:0;;-1:-1:-1;;;;;9923:29:0;9890:17;:62;:::i;:::-;9848:26;;;;9813:19;;-1:-1:-1;;;;;9848:26:0;;;;9795:37;;9813:19;;;;;9795:2;:37;:::i;:::-;:79;;;;;;:::i;:::-;-1:-1:-1;;;;;9795:157:0;;;;;:::i;:::-;9768:184;-1:-1:-1;10008:20:0;10013:15;10008:2;:20;:::i;:::-;9978:25;9997:6;9978:16;:25;:::i;:::-;9977:52;;;;:::i;:::-;9965:64;8380:1718;-1:-1:-1;;;;;;;;;8380:1718:0:o;10401:770::-;10564:17;10976:3;11010;10564:17;10976:3;11043:18;11053:7;;11043:9;:18::i;:::-;:29;;;;:::i;:::-;11131:19;;11093:26;;;;11026:46;;-1:-1:-1;11154:9:0;;11131:19;;;;;;;11093:35;;11026:46;;-1:-1:-1;;;;;11093:26:0;:35;:::i;:::-;:57;;;;:::i;:::-;11092:71;;;;:::i;:::-;11085:78;10401:770;-1:-1:-1;;;;;;;;10401:770:0:o;11476:989::-;11638:17;11935:5;11985:2;11638:17;12031:28;11985:2;;12031:28;:::i;:::-;11998:61;-1:-1:-1;12109:3:0;12070:36;12186:7;12143:40;4465:27;4077:2;12143:40;:::i;:::-;:57;;;;:::i;:::-;12125:75;-1:-1:-1;12262:13:0;12316:1;12279:33;12125:75;12279:23;:33;:::i;:::-;12278:39;;;;:::i;:::-;12262:55;-1:-1:-1;12448:9:0;12403:40;12415:28;12448:9;12403:40;:::i;:::-;12368:30;12376:22;12368:5;:30;:::i;:::-;12338:26;;;;:61;;;-1:-1:-1;;;;;12338:26:0;:61;:::i;:::-;:106;;;;:::i;:::-;12337:120;;;;:::i;:::-;12330:127;11476:989;-1:-1:-1;;;;;;;;;;;11476:989:0:o;12769:657::-;12923:17;13219:4;13254:3;12923:17;13219:4;13287:18;13297:7;;13287:9;:18::i;:::-;:29;;;;:::i;:::-;:40;;13320:6;13287:40;:::i;13620:628::-;13685:14;13721:25;4077:2;13744;13721:25;:::i;:::-;13712:34;-1:-1:-1;13933:21:0;4465:27;13953:1;13933:21;:::i;:::-;13923:31;;;;:::i;:::-;;-1:-1:-1;13984:7:0;13967:14;14009:232;14029:6;14025:1;:10;14009:232;;;14061:7;;14069:1;14061:10;;;;;;;:::i;:::-;;;;;;;14075:1;14061:15;;-1:-1:-1;14057:173:0;;14097:11;14107:1;14097:11;;:::i;:::-;;;14057:173;;;14173:12;14183:2;14173:12;;:::i;:::-;;;14057:173;14037:3;;14009:232;;;;13701:547;13620:628;;;;:::o;14:154:1:-;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:134;241:20;;270:31;241:20;270:31;:::i;:::-;173:134;;;:::o;312:348::-;364:8;374:6;428:3;421:4;413:6;409:17;405:27;395:55;;446:1;443;436:12;395:55;-1:-1:-1;469:20:1;;512:18;501:30;;498:50;;;544:1;541;534:12;498:50;581:4;573:6;569:17;557:29;;633:3;626:4;617:6;609;605:19;601:30;598:39;595:59;;;650:1;647;640:12;595:59;312:348;;;;;:::o;665:1287::-;795:6;803;811;819;827;835;843;851;904:3;892:9;883:7;879:23;875:33;872:53;;;921:1;918;911:12;872:53;960:9;947:23;979:31;1004:5;979:31;:::i;:::-;1029:5;-1:-1:-1;1085:2:1;1070:18;;1057:32;1108:18;1138:14;;;1135:34;;;1165:1;1162;1155:12;1135:34;1204:59;1255:7;1246:6;1235:9;1231:22;1204:59;:::i;:::-;1282:8;;-1:-1:-1;1178:85:1;-1:-1:-1;1370:2:1;1355:18;;1342:32;;-1:-1:-1;1386:16:1;;;1383:36;;;1415:1;1412;1405:12;1383:36;1454:61;1507:7;1496:8;1485:9;1481:24;1454:61;:::i;:::-;1534:8;;-1:-1:-1;1428:87:1;-1:-1:-1;1622:2:1;1607:18;;1594:32;;-1:-1:-1;1638:16:1;;;1635:36;;;1667:1;1664;1657:12;1635:36;;1706:61;1759:7;1748:8;1737:9;1733:24;1706:61;:::i;:::-;1786:8;;-1:-1:-1;1680:87:1;-1:-1:-1;;1873:3:1;1858:19;;1845:33;1887;1845;1887;:::i;:::-;1939:7;1929:17;;;665:1287;;;;;;;;;;;:::o;1957:367::-;2020:8;2030:6;2084:3;2077:4;2069:6;2065:17;2061:27;2051:55;;2102:1;2099;2092:12;2051:55;-1:-1:-1;2125:20:1;;2168:18;2157:30;;2154:50;;;2200:1;2197;2190:12;2154:50;2237:4;2229:6;2225:17;2213:29;;2297:3;2290:4;2280:6;2277:1;2273:14;2265:6;2261:27;2257:38;2254:47;2251:67;;;2314:1;2311;2304:12;2329:916;2468:6;2476;2484;2492;2500;2553:2;2541:9;2532:7;2528:23;2524:32;2521:52;;;2569:1;2566;2559:12;2521:52;2608:9;2595:23;2627:31;2652:5;2627:31;:::i;:::-;2677:5;-1:-1:-1;2733:2:1;2718:18;;2705:32;2756:18;2786:14;;;2783:34;;;2813:1;2810;2803:12;2783:34;2852:70;2914:7;2905:6;2894:9;2890:22;2852:70;:::i;:::-;2941:8;;-1:-1:-1;2826:96:1;-1:-1:-1;3029:2:1;3014:18;;3001:32;;-1:-1:-1;3045:16:1;;;3042:36;;;3074:1;3071;3064:12;3042:36;;3113:72;3177:7;3166:8;3155:9;3151:24;3113:72;:::i;:::-;2329:916;;;;-1:-1:-1;2329:916:1;;-1:-1:-1;3204:8:1;;3087:98;2329:916;-1:-1:-1;;;2329:916:1:o;3250:1367::-;3391:6;3399;3407;3415;3423;3431;3439;3447;3455;3508:3;3496:9;3487:7;3483:23;3479:33;3476:53;;;3525:1;3522;3515:12;3476:53;3565:9;3552:23;3594:18;3635:2;3627:6;3624:14;3621:34;;;3651:1;3648;3641:12;3621:34;3690:59;3741:7;3732:6;3721:9;3717:22;3690:59;:::i;:::-;3768:8;;-1:-1:-1;3664:85:1;-1:-1:-1;3856:2:1;3841:18;;3828:32;;-1:-1:-1;3872:16:1;;;3869:36;;;3901:1;3898;3891:12;3869:36;3940:61;3993:7;3982:8;3971:9;3967:24;3940:61;:::i;:::-;4020:8;;-1:-1:-1;3914:87:1;-1:-1:-1;4108:2:1;4093:18;;4080:32;;-1:-1:-1;4124:16:1;;;4121:36;;;4153:1;4150;4143:12;4121:36;4192:61;4245:7;4234:8;4223:9;4219:24;4192:61;:::i;:::-;4272:8;;-1:-1:-1;4166:87:1;-1:-1:-1;4354:2:1;4339:18;;4326:32;;-1:-1:-1;4411:3:1;4396:19;;4383:33;;-1:-1:-1;4428:16:1;;;4425:36;;;4457:1;4454;4447:12;4425:36;;4496:61;4549:7;4538:8;4527:9;4523:24;4496:61;:::i;:::-;4470:87;;4576:8;4566:18;;;4603:8;4593:18;;;3250:1367;;;;;;;;;;;:::o;4804:184::-;-1:-1:-1;;;4853:1:1;4846:88;4953:4;4950:1;4943:15;4977:4;4974:1;4967:15;4993:719;5036:5;5089:3;5082:4;5074:6;5070:17;5066:27;5056:55;;5107:1;5104;5097:12;5056:55;5143:6;5130:20;5169:18;5206:2;5202;5199:10;5196:36;;;5212:18;;:::i;:::-;5287:2;5281:9;5255:2;5341:13;;-1:-1:-1;;5337:22:1;;;5361:2;5333:31;5329:40;5317:53;;;5385:18;;;5405:22;;;5382:46;5379:72;;;5431:18;;:::i;:::-;5471:10;5467:2;5460:22;5506:2;5498:6;5491:18;5552:3;5545:4;5540:2;5532:6;5528:15;5524:26;5521:35;5518:55;;;5569:1;5566;5559:12;5518:55;5633:2;5626:4;5618:6;5614:17;5607:4;5599:6;5595:17;5582:54;5680:1;5673:4;5668:2;5660:6;5656:15;5652:26;5645:37;5700:6;5691:15;;;;;;4993:719;;;;:::o;5717:1575::-;5893:6;5901;5909;5917;5925;5933;5941;5949;5957;5965;5973:7;5982;6036:3;6024:9;6015:7;6011:23;6007:33;6004:53;;;6053:1;6050;6043:12;6004:53;6076:29;6095:9;6076:29;:::i;:::-;6066:39;;6154:18;6148:2;6137:9;6133:18;6120:32;6117:56;6114:76;;;6186:1;6183;6176:12;6114:76;6225:85;6302:7;6295:2;6284:9;6280:18;6267:32;6256:9;6252:48;6225:85;:::i;:::-;6329:8;;-1:-1:-1;6356:8:1;-1:-1:-1;6413:18:1;6407:2;6392:18;;6379:32;6376:56;6373:76;;;6445:1;6442;6435:12;6373:76;6484:85;6561:7;6554:2;6543:9;6539:18;6526:32;6515:9;6511:48;6484:85;:::i;:::-;6588:8;;-1:-1:-1;6615:8:1;-1:-1:-1;6672:18:1;6666:2;6651:18;;6638:32;6635:56;6632:76;;;6704:1;6701;6694:12;6632:76;6743:85;6820:7;6813:2;6802:9;6798:18;6785:32;6774:9;6770:48;6743:85;:::i;:::-;6847:8;;-1:-1:-1;6874:8:1;-1:-1:-1;6932:18:1;6925:3;6910:19;;6897:33;6894:57;6891:77;;;6964:1;6961;6954:12;6891:77;6987;7056:7;7048:3;7037:9;7033:19;7020:33;7009:9;7005:49;6987:77;:::i;:::-;6977:87;;7111:3;7100:9;7096:19;7083:33;7073:43;;7135:39;7169:3;7158:9;7154:19;7135:39;:::i;:::-;7125:49;;7222:3;7211:9;7207:19;7194:33;7183:44;;7247:39;7281:3;7270:9;7266:19;7247:39;:::i;:::-;7236:50;;5717:1575;;;;;;;;;;;;;;:::o;7297:1491::-;7457:6;7465;7473;7481;7489;7497;7505;7513;7521;7529;7537:7;7591:3;7579:9;7570:7;7566:23;7562:33;7559:53;;;7608:1;7605;7598:12;7559:53;7631:29;7650:9;7631:29;:::i;:::-;7621:39;;7679:18;7746:2;7740;7729:9;7725:18;7712:32;7709:40;7706:60;;;7762:1;7759;7752:12;7706:60;7801:85;7878:7;7871:2;7860:9;7856:18;7843:32;7832:9;7828:48;7801:85;:::i;:::-;7905:8;;-1:-1:-1;7932:8:1;-1:-1:-1;7983:2:1;7968:18;;7955:32;7952:40;-1:-1:-1;7949:60:1;;;8005:1;8002;7995:12;7949:60;8044:85;8121:7;8114:2;8103:9;8099:18;8086:32;8075:9;8071:48;8044:85;:::i;:::-;8148:8;;-1:-1:-1;8175:8:1;-1:-1:-1;8226:2:1;8211:18;;8198:32;8195:40;-1:-1:-1;8192:60:1;;;8248:1;8245;8238:12;8192:60;8287:85;8364:7;8357:2;8346:9;8342:18;8329:32;8318:9;8314:48;8287:85;:::i;:::-;8391:8;;-1:-1:-1;8418:8:1;-1:-1:-1;8469:3:1;8454:19;;8441:33;8438:41;-1:-1:-1;8435:61:1;;;8492:1;8489;8482:12;8435:61;;8531:86;8609:7;8601:3;8590:9;8586:19;8573:33;8562:9;8558:49;8531:86;:::i;:::-;8636:8;;-1:-1:-1;8663:8:1;-1:-1:-1;8718:3:1;8703:19;;8690:33;;-1:-1:-1;8743:39:1;8777:3;8762:19;;8743:39;:::i;:::-;8732:50;;7297:1491;;;;;;;;;;;;;;:::o;8793:594::-;8888:6;8896;8904;8912;8920;8973:3;8961:9;8952:7;8948:23;8944:33;8941:53;;;8990:1;8987;8980:12;8941:53;9026:9;9013:23;9003:33;;9083:2;9072:9;9068:18;9055:32;9045:42;;9137:2;9126:9;9122:18;9109:32;9150:31;9175:5;9150:31;:::i;:::-;9200:5;-1:-1:-1;9252:2:1;9237:18;;9224:32;;-1:-1:-1;9308:3:1;9293:19;;9280:33;9322;9280;9322;:::i;:::-;9374:7;9364:17;;;8793:594;;;;;;;;:::o;9392:602::-;9495:6;9503;9511;9519;9527;9580:3;9568:9;9559:7;9555:23;9551:33;9548:53;;;9597:1;9594;9587:12;9548:53;9633:9;9620:23;9610:33;;9690:2;9679:9;9675:18;9662:32;9652:42;;9744:2;9733:9;9729:18;9716:32;9757:31;9782:5;9757:31;:::i;:::-;9807:5;-1:-1:-1;9864:2:1;9849:18;;9836:32;9877:33;9836:32;9877:33;:::i;:::-;9392:602;;;;-1:-1:-1;9392:602:1;;9983:3;9968:19;9955:33;;9392:602;-1:-1:-1;;9392:602:1:o;9999:383::-;10076:6;10084;10092;10145:2;10133:9;10124:7;10120:23;10116:32;10113:52;;;10161:1;10158;10151:12;10113:52;10197:9;10184:23;10174:33;;10254:2;10243:9;10239:18;10226:32;10216:42;;10308:2;10297:9;10293:18;10280:32;10321:31;10346:5;10321:31;:::i;:::-;10371:5;10361:15;;;9999:383;;;;;:::o;10618:247::-;10677:6;10730:2;10718:9;10709:7;10705:23;10701:32;10698:52;;;10746:1;10743;10736:12;10698:52;10785:9;10772:23;10804:31;10829:5;10804:31;:::i;:::-;10854:5;10618:247;-1:-1:-1;;;10618:247:1:o;11052:464::-;11137:6;11145;11153;11206:2;11194:9;11185:7;11181:23;11177:32;11174:52;;;11222:1;11219;11212:12;11174:52;11261:9;11248:23;11280:31;11305:5;11280:31;:::i;:::-;11330:5;-1:-1:-1;11387:2:1;11372:18;;11359:32;11400:33;11359:32;11400:33;:::i;:::-;11052:464;;11452:7;;-1:-1:-1;;;11506:2:1;11491:18;;;;11478:32;;11052:464::o;11521:411::-;11592:6;11600;11653:2;11641:9;11632:7;11628:23;11624:32;11621:52;;;11669:1;11666;11659:12;11621:52;11709:9;11696:23;11742:18;11734:6;11731:30;11728:50;;;11774:1;11771;11764:12;11728:50;11813:59;11864:7;11855:6;11844:9;11840:22;11813:59;:::i;:::-;11891:8;;11787:85;;-1:-1:-1;11521:411:1;-1:-1:-1;;;;11521:411:1:o;13212:613::-;13300:6;13308;13316;13324;13377:2;13365:9;13356:7;13352:23;13348:32;13345:52;;;13393:1;13390;13383:12;13345:52;13432:9;13419:23;13451:31;13476:5;13451:31;:::i;:::-;13501:5;-1:-1:-1;13553:2:1;13538:18;;13525:32;;-1:-1:-1;13608:2:1;13593:18;;13580:32;13635:18;13624:30;;13621:50;;;13667:1;13664;13657:12;13621:50;13706:59;13757:7;13748:6;13737:9;13733:22;13706:59;:::i;:::-;13212:613;;;;-1:-1:-1;13784:8:1;-1:-1:-1;;;;13212:613:1:o;13830:1431::-;13978:6;13986;13994;14002;14010;14018;14026;14034;14042;14050;14103:3;14091:9;14082:7;14078:23;14074:33;14071:53;;;14120:1;14117;14110:12;14071:53;14159:9;14146:23;14178:31;14203:5;14178:31;:::i;:::-;14228:5;-1:-1:-1;14284:2:1;14269:18;;14256:32;14307:18;14337:14;;;14334:34;;;14364:1;14361;14354:12;14334:34;14403:59;14454:7;14445:6;14434:9;14430:22;14403:59;:::i;:::-;14481:8;;-1:-1:-1;14377:85:1;-1:-1:-1;14569:2:1;14554:18;;14541:32;;-1:-1:-1;14585:16:1;;;14582:36;;;14614:1;14611;14604:12;14582:36;14653:61;14706:7;14695:8;14684:9;14680:24;14653:61;:::i;:::-;14733:8;;-1:-1:-1;14627:87:1;-1:-1:-1;14821:2:1;14806:18;;14793:32;;-1:-1:-1;14837:16:1;;;14834:36;;;14866:1;14863;14856:12;14834:36;;14905:61;14958:7;14947:8;14936:9;14932:24;14905:61;:::i;:::-;14985:8;;-1:-1:-1;14879:87:1;-1:-1:-1;;15072:3:1;15057:19;;15044:33;15086;15044;15086;:::i;:::-;15138:7;-1:-1:-1;15192:3:1;15177:19;;15164:33;;-1:-1:-1;15216:39:1;15250:3;15235:19;;15216:39;:::i;:::-;15206:49;;13830:1431;;;;;;;;;;;;;:::o;15266:970::-;15425:6;15433;15441;15449;15502:2;15490:9;15481:7;15477:23;15473:32;15470:52;;;15518:1;15515;15508:12;15470:52;15558:9;15545:23;15587:18;15628:2;15620:6;15617:14;15614:34;;;15644:1;15641;15634:12;15614:34;15683:70;15745:7;15736:6;15725:9;15721:22;15683:70;:::i;:::-;15772:8;;-1:-1:-1;15657:96:1;-1:-1:-1;15860:2:1;15845:18;;15832:32;;-1:-1:-1;15876:16:1;;;15873:36;;;15905:1;15902;15895:12;15873:36;15943:8;15932:9;15928:24;15918:34;;15990:7;15983:4;15979:2;15975:13;15971:27;15961:55;;16012:1;16009;16002:12;15961:55;16052:2;16039:16;16078:2;16070:6;16067:14;16064:34;;;16094:1;16091;16084:12;16064:34;16150:7;16145:2;16137:4;16129:6;16125:17;16121:2;16117:26;16113:35;16110:48;16107:68;;;16171:1;16168;16161:12;16107:68;15266:970;;;;-1:-1:-1;;16202:2:1;16194:11;;-1:-1:-1;;;15266:970:1:o;16241:118::-;16327:5;16320:13;16313:21;16306:5;16303:32;16293:60;;16349:1;16346;16339:12;16364:128;16429:20;;16458:28;16429:20;16458:28;:::i;16497:1592::-;16662:6;16670;16678;16686;16694;16702;16710;16718;16726;16734;16742:7;16751;16805:3;16793:9;16784:7;16780:23;16776:33;16773:53;;;16822:1;16819;16812:12;16773:53;16845:29;16864:9;16845:29;:::i;:::-;16835:39;;16923:18;16917:2;16906:9;16902:18;16889:32;16886:56;16883:76;;;16955:1;16952;16945:12;16883:76;16994:85;17071:7;17064:2;17053:9;17049:18;17036:32;17025:9;17021:48;16994:85;:::i;:::-;17098:8;;-1:-1:-1;17125:8:1;-1:-1:-1;17182:18:1;17176:2;17161:18;;17148:32;17145:56;17142:76;;;17214:1;17211;17204:12;17142:76;17253:85;17330:7;17323:2;17312:9;17308:18;17295:32;17284:9;17280:48;17253:85;:::i;:::-;17357:8;;-1:-1:-1;17384:8:1;-1:-1:-1;17441:18:1;17435:2;17420:18;;17407:32;17404:56;17401:76;;;17473:1;17470;17463:12;17401:76;17512:85;17589:7;17582:2;17571:9;17567:18;17554:32;17543:9;17539:48;17512:85;:::i;:::-;17616:8;;-1:-1:-1;17643:8:1;-1:-1:-1;17698:3:1;17683:19;;17670:33;;-1:-1:-1;17722:36:1;17753:3;17738:19;;17722:36;:::i;:::-;17712:46;;17777:39;17811:3;17800:9;17796:19;17777:39;:::i;:::-;17767:49;;17866:18;17859:3;17848:9;17844:19;17831:33;17828:57;17825:77;;;17898:1;17895;17888:12;17825:77;17939:86;18017:7;18009:3;17998:9;17994:19;17981:33;17970:9;17966:49;17939:86;:::i;:::-;18045:9;18034:20;;18074:9;18063:20;;;;16497:1592;;;;;;;;;;;;;;:::o;18094:271::-;18277:6;18269;18264:3;18251:33;18233:3;18303:16;;18328:13;;;18303:16;18094:271;-1:-1:-1;18094:271:1:o;18370:267::-;18459:6;18454:3;18447:19;18511:6;18504:5;18497:4;18492:3;18488:14;18475:43;-1:-1:-1;18563:1:1;18538:16;;;18556:4;18534:27;;;18527:38;;;;18619:2;18598:15;;;-1:-1:-1;;18594:29:1;18585:39;;;18581:50;;18370:267::o;18642:630::-;18915:3;18904:9;18897:22;18878:4;18942:63;19000:3;18989:9;18985:19;18977:6;18969;18942:63;:::i;:::-;19053:9;19045:6;19041:22;19036:2;19025:9;19021:18;19014:50;19081;19124:6;19116;19108;19081:50;:::i;:::-;19073:58;;;19167:6;19162:2;19151:9;19147:18;19140:34;-1:-1:-1;;;;;19214:6:1;19210:55;19205:2;19194:9;19190:18;19183:83;18642:630;;;;;;;;;:::o;19277:184::-;-1:-1:-1;;;19326:1:1;19319:88;19426:4;19423:1;19416:15;19450:4;19447:1;19440:15;19466:184;19536:6;19589:2;19577:9;19568:7;19564:23;19560:32;19557:52;;;19605:1;19602;19595:12;19557:52;-1:-1:-1;19628:16:1;;19466:184;-1:-1:-1;19466:184:1:o;19933:::-;-1:-1:-1;;;19982:1:1;19975:88;20082:4;20079:1;20072:15;20106:4;20103:1;20096:15;20122:184;-1:-1:-1;;;20171:1:1;20164:88;20271:4;20268:1;20261:15;20295:4;20292:1;20285:15;20311:168;20384:9;;;20415;;20432:15;;;20426:22;;20412:37;20402:71;;20453:18;;:::i;20484:125::-;20549:9;;;20570:10;;;20567:36;;;20583:18;;:::i;20877:250::-;20962:1;20972:113;20986:6;20983:1;20980:13;20972:113;;;21062:11;;;21056:18;21043:11;;;21036:39;21008:2;21001:10;20972:113;;;-1:-1:-1;;21119:1:1;21101:16;;21094:27;20877:250::o;21132:1138::-;21509:3;21498:9;21491:22;21472:4;21536:63;21594:3;21583:9;21579:19;21571:6;21563;21536:63;:::i;:::-;21647:9;21639:6;21635:22;21630:2;21619:9;21615:18;21608:50;21681;21724:6;21716;21708;21681:50;:::i;:::-;21667:64;;21779:9;21771:6;21767:22;21762:2;21751:9;21747:18;21740:50;21819:6;21813:13;21850:6;21842;21835:22;21866:76;21935:6;21930:2;21922:6;21918:15;21913:2;21905:6;21901:15;21866:76;:::i;:::-;22041:2;22026:18;;22019:34;;;;-1:-1:-1;;;;;22151:15:1;;;22145:3;22130:19;;22123:44;22198:3;22183:19;;22176:35;;;;-1:-1:-1;22248:15:1;;22242:3;22227:19;;;22220:44;;;;22007:2;22000;21979:15;;;-1:-1:-1;;21975:29:1;21963:42;21959:51;;;-1:-1:-1;;;;;21132:1138:1:o;22275:893::-;22634:3;22623:9;22616:22;22597:4;22661:63;22719:3;22708:9;22704:19;22696:6;22688;22661:63;:::i;:::-;22772:9;22764:6;22760:22;22755:2;22744:9;22740:18;22733:50;22806;22849:6;22841;22833;22806:50;:::i;:::-;22792:64;;22904:9;22896:6;22892:22;22887:2;22876:9;22872:18;22865:50;22932;22975:6;22967;22959;22932:50;:::i;:::-;23013:2;22998:18;;22991:34;;;;-1:-1:-1;;23056:3:1;23041:19;;23034:35;;;;-1:-1:-1;;;;;23106:55:1;23100:3;23085:19;;;23078:84;22924:58;22275:893;-1:-1:-1;;;;;;22275:893:1:o;24067:245::-;24224:2;24213:9;24206:21;24187:4;24244:62;24302:2;24291:9;24287:18;24279:6;24271;24244:62;:::i;:::-;24236:70;24067:245;-1:-1:-1;;;;24067:245:1:o;24317:287::-;24446:3;24484:6;24478:13;24500:66;24559:6;24554:3;24547:4;24539:6;24535:17;24500:66;:::i;:::-;24582:16;;;;;24317:287;-1:-1:-1;;24317:287:1:o;24609:732::-;24910:3;24899:9;24892:22;24873:4;24937:63;24995:3;24984:9;24980:19;24972:6;24964;24937:63;:::i;:::-;25048:9;25040:6;25036:22;25031:2;25020:9;25016:18;25009:50;25076;25119:6;25111;25103;25076:50;:::i;:::-;-1:-1:-1;;;;;25223:15:1;;;25218:2;25203:18;;25196:43;25270:2;25255:18;;25248:34;;;;-1:-1:-1;;25319:15:1;;25313:3;25298:19;;;25291:44;;;;25068:58;24609:732;-1:-1:-1;;;;24609:732:1:o;25346:522::-;25424:4;25430:6;25490:11;25477:25;25584:2;25580:7;25569:8;25553:14;25549:29;25545:43;25525:18;25521:68;25511:96;;25603:1;25600;25593:12;25511:96;25630:33;;25682:20;;;-1:-1:-1;25725:18:1;25714:30;;25711:50;;;25757:1;25754;25747:12;25711:50;25790:4;25778:17;;-1:-1:-1;25821:14:1;25817:27;;;25807:38;;25804:58;;;25858:1;25855;25848:12;26428:404;26579:2;26564:18;;26612:1;26601:13;;26591:201;;-1:-1:-1;;;26645:1:1;26638:88;26749:4;26746:1;26739:15;26777:4;26774:1;26767:15;26591:201;26801:25;;;26428:404;:::o;27659:129::-;27744:18;27737:5;27733:30;27726:5;27723:41;27713:69;;27778:1;27775;27768:12;27793:146;-1:-1:-1;;;;;27872:5:1;27868:46;27861:5;27858:57;27848:85;;27929:1;27926;27919:12;27944:1294;28179:3;28168:9;28161:22;28142:4;28200:63;28258:3;28247:9;28243:19;28235:6;28227;28200:63;:::i;:::-;28192:71;;28298:6;28285:20;28314:30;28338:5;28314:30;:::i;:::-;28363:18;28428:2;28421:5;28417:14;28412:2;28401:9;28397:18;28390:42;28481:2;28473:6;28469:15;28456:29;28441:44;;28494:32;28518:7;28494:32;:::i;:::-;28562:16;28557:2;28542:18;;;28535:44;;;;28616:15;;28603:29;28641:33;28603:29;28641:33;:::i;:::-;-1:-1:-1;;;;;28776:2:1;28767:7;28763:16;28758:2;28747:9;28743:18;28736:44;28829:2;28821:6;28817:15;28804:29;28789:44;;28842:33;28867:7;28842:33;:::i;:::-;28925:2;28916:7;28912:16;28906:3;28895:9;28891:19;28884:45;28978:3;28970:6;28966:16;28953:30;28938:45;;28992:33;29017:7;28992:33;:::i;:::-;29062:16;29056:3;29041:19;;;29034:45;;;;29116:16;;29103:30;29142:33;29103:30;29142:33;:::i;:::-;-1:-1:-1;;;;;12003:46:1;;29227:3;29212:19;;11991:59;29184:48;27944:1294;;;;;;:::o;29766:1345::-;29927:5;29914:19;29942:32;29966:7;29942:32;:::i;:::-;30006:18;29997:7;29993:32;29983:42;;30050:4;30044:11;30114:2;30092:18;30088:23;30084:2;30080:32;30077:40;30071:4;30064:54;30166:2;30159:5;30155:14;30142:28;30179:32;30203:7;30179:32;:::i;:::-;30343:34;30333:7;30329:2;30325:16;30321:57;30316:2;-1:-1:-1;;30243:2:1;30239:75;30236:83;30233:146;30227:4;30220:160;;;;30428:2;30421:5;30417:14;30404:28;30441:33;30466:7;30441:33;:::i;:::-;29339:11;;-1:-1:-1;;;;;29375:43:1;29428:3;29424:15;;;-1:-1:-1;;29420:88:1;29372:137;29359:151;;30483:64;30584:1;30578:4;30574:12;30634:2;30627:5;30623:14;30610:28;30647:33;30672:7;30647:33;:::i;:::-;29625:11;;-1:-1:-1;;29621:84:1;-1:-1:-1;;;;;29707:46:1;;29618:136;29605:150;;30689:68;30805:3;30798:5;30794:15;30781:29;30819:33;30844:7;30819:33;:::i;:::-;29339:11;;-1:-1:-1;;;;;29375:43:1;29428:3;29424:15;;;-1:-1:-1;;29420:88:1;29372:137;29359:151;;30861:70;;30979:3;30972:5;30968:15;30955:29;30993:33;31018:7;30993:33;:::i;:::-;31093:1;31083:12;;29625:11;;-1:-1:-1;;29621:84:1;-1:-1:-1;;;;;29707:46:1;;29618:136;29605:150;;68620:196:0;;;:::o;31116:245:1:-;31183:6;31236:2;31224:9;31215:7;31211:23;31207:32;31204:52;;;31252:1;31249;31242:12;31204:52;31284:9;31278:16;31303:28;31325:5;31303:28;:::i;31366:257::-;31437:18;31487:10;;;31499;;;31483:27;31530:20;;;;31437:18;31569:24;;;31559:58;;31597:18;;:::i;31628:274::-;-1:-1:-1;;;;;31766:10:1;;;31778;;;31762:27;31809:20;;;;31700:34;31848:24;;;31838:58;;31876:18;;:::i;31907:274::-;31947:1;31973;31963:189;;-1:-1:-1;;;32005:1:1;31998:88;32109:4;32106:1;32099:15;32137:4;32134:1;32127:15;31963:189;-1:-1:-1;32166:9:1;;31907:274::o
Swarm Source
ipfs://f861469381b22ffcb51c7e8aac64c42df609fa41fe64a670d8f91918c4789d3a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MNT
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.