POL Price: $0.378037 (+2.66%)
 

Overview

POL Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 POL

POL Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
0x60806040407862442023-03-26 10:01:08558 days ago1679824868IN
 Create: cryptopay
0 POL0.1232841580.45020915

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
cryptopay

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 6 : cryptopay.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "IERC20.sol";
import "IExchange.sol";
import "IConnext.sol";

contract cryptopay {
    // define DEX address (UniswapV2-like exchange and functions)
    // will be used to swap tokens to USDC before bridging through Connext
    // (Connext only supports crosschain USDC transfers)
    address public DEX_ADDRESS;

    // define token addresses
    address public WETH_ADDRESS;
    address public USDC_ADDRESS;

    // UniswapV2 style interface DEX object, used to execute swaps
    IExchange public DEX;
    // Connext bridge contract
    IConnext public connext;

    // domainIds identify which chain to bridge tokens to through Connext
    // mapping allows for easy domainId fetching, e.g. give it "gnosis" and it will return connext's gnosis domainId
    mapping(string => uint32) chainNameToDomainId;
    // maps chainName to web3pay contract address on specific chain
    // contract addresses must be updated through setContractAddress() function after all contracts have been deployed
    mapping(string => address) chainNameToContractAddress;

    address owner;

    // e.g. if network is optimism, 'thisChainName' will be 'optimism'
    string thisChainName;

    constructor(
        address connextAddress,
        address dexAddress,
        address wethAddress,
        address usdcAddress,
        string memory _thisChainName
    ) {
        DEX_ADDRESS = dexAddress;
        WETH_ADDRESS = wethAddress;
        USDC_ADDRESS = usdcAddress;

        // define chainName => domainId mappings
        chainNameToDomainId["gnosis"] = 6778479;
        chainNameToDomainId["polygon"] = 1886350457;

        thisChainName = _thisChainName;

        // define DEX object
        DEX = IExchange(DEX_ADDRESS);
        // define connext object
        connext = IConnext(connextAddress);
        owner = msg.sender;
    }

    // once web3pay contracts are deployed on all 3 chains, get addresses for all contracts and update them here
    function updateContractAddresses(
        address gnosisCA,
        address polygonCA
    ) external {
        require(msg.sender == owner);
        chainNameToContractAddress["gnosis"] = gnosisCA;
        chainNameToContractAddress["polygon"] = polygonCA;
    }

    event USDCTransferToMerchantInitiated(
        address indexed _merchantAddress,
        string indexed _toChainName,
        address indexed _sender,
        uint256 _amountUSDC
    );
    event USDCTransferToMerchantConfirmed(
        address indexed _merchantAddress,
        string indexed _toChainName,
        address indexed _sender,
        uint256 _amountUSDC
    );

    /**
     * @dev function transfers USDC to merchant on any chain through Connext
     * @dev payment may be completed in ether or any ERC20 token as long as it has a liquidity pool on a predetermined exchange
     * @param toChainName name of chain where tokens will be transferred to
     * @param usdcAmount amount of USDC to transfer to merchant
     * @param merchantAddress address where to send USDC
     * @param inEther determines whether payment is being completed in ERC20 or ether. If true, tokenAddress will be ignored
     * @param tokenAddress address of ERC20 token in which payment is being completed
     * @param tokenAmount amount of ether or ERC20 with which payment is being completed in
     * @param relayFee amount of ether to send to connext to sucesfully complete cross chain transfer
     * */
    function sendUSDCToMerchant(
        string memory toChainName,
        uint256 usdcAmount,
        address merchantAddress,
        bool inEther,
        //**payment may be completed in any token with a liquidity pool on predetermined exchange  */
        //**if a non-USDC token is sent, it will be swapped to USDC */
        //**if payment is being completed in ether, tokenAddress will be ignored  */
        address tokenAddress,
        uint256 tokenAmount,
        uint256 relayFee
    ) external payable {
        if (inEther == false) {
            // if payment is being completed in ERC20, transfer tokens to contract from user
            require(
                IERC20(tokenAddress).allowance(msg.sender, address(this)) >=
                    tokenAmount,
                "User needs to increase allowance"
            );
            IERC20(tokenAddress).transferFrom(
                msg.sender,
                address(this),
                tokenAmount
            );
        }
        if (tokenAddress == USDC_ADDRESS) {
            // if token is USDC, bridge USDC outright without executing swap
            require(
                IERC20(USDC_ADDRESS).balanceOf(address(this)) >= usdcAmount,
                "Not enough USDC in contract"
            );
            bridgeUSDCToMerchant(
                toChainName,
                merchantAddress,
                usdcAmount,
                msg.sender,
                relayFee
            );
            emit USDCTransferToMerchantInitiated(
                merchantAddress,
                toChainName,
                msg.sender,
                usdcAmount
            );
        } else {
            // if token is not USDC, execute swap and then execute transfer
            swapTokensForUSDC(inEther, tokenAddress, tokenAmount);
            require(
                IERC20(USDC_ADDRESS).balanceOf(address(this)) >= usdcAmount,
                "Not enough USDC in contract"
            );
            bridgeUSDCToMerchant(
                toChainName,
                merchantAddress,
                usdcAmount,
                msg.sender,
                relayFee
            );
            emit USDCTransferToMerchantInitiated(
                merchantAddress,
                toChainName,
                msg.sender,
                usdcAmount
            );
        }
    }

    /**
     * @dev swaps tokens to USDC
     * @param inEther determines if token is ether or ERC20. If true, tokenAddress is ignored
     * @param tokenAddress address of token which will be swapped to USDC
     * @param tokenInAmount amount of tokens to swap to USDC
     */
    function swapTokensForUSDC(
        /** identifies whether to swap ether => USDC or ERC20 => USDC */ bool inEther,
        /** set to blank if inEther is true */ address tokenAddress,
        uint256 tokenInAmount
    ) internal {
        require(tokenAddress != USDC_ADDRESS, "Cannot swap USDC => USDC");
        // if token is ether, swap ether to usdc
        if (inEther) {
            // define path
            address[] memory path;
            path[0] = WETH_ADDRESS;
            path[1] = USDC_ADDRESS;
            // swap tokens
            DEX.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: tokenInAmount
            }(
                // amount of USDC to be received after trade
                DEX.getAmountsOut(tokenInAmount, path)[1],
                path,
                // tokens will be sent to contract address
                address(this),
                block.timestamp + 60
            );
        } else {
            // approve tokens to DEX
            IERC20(tokenAddress).approve(DEX_ADDRESS, tokenInAmount);
            // if token is weth (or WXDAI, WMATIC, depends on chain) swap weth for usdc
            if (tokenAddress == WETH_ADDRESS) {
                address[] memory path;
                path[0] = WETH_ADDRESS;
                path[1] = USDC_ADDRESS;
                // execute swap
                DEX.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    tokenInAmount,
                    // get amount of USDC to be received after trade
                    DEX.getAmountsOut(tokenInAmount, path)[1],
                    path,
                    address(this),
                    block.timestamp + 60
                );
                // if token is not ether or weth, create ERC20 => WETH => USDC path and swap tokens
            } else {
                // define path
                address[] memory path;
                path[0] = tokenAddress;
                path[1] = WETH_ADDRESS;
                path[2] = USDC_ADDRESS;
                // execute swap
                DEX.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    tokenInAmount,
                    DEX.getAmountsOut(tokenInAmount, path)[2],
                    path,
                    address(this),
                    block.timestamp + 60
                );
            }
        }
    }

    /**
     * @dev Transfers 'amountUSDC' USDC to 'merchantAddress' on 'chainName' through connext
     * @param toChainName name of chain on which USDC will be transferred to merchant. If 'toChainName' == 'thisChainName', this means that the current chain is the same chain on which merchant is accepting payment which means bridging is unnecessary
     * @param merchantAddress address where USDC will be transferred
     * @param amountUSDC amount of USDC to transfer
     * @param senderAddress address of sender of USDC
     * @param relayFee amount of ether to pay so that Connext sucesfully completes transfer
     */

    function bridgeUSDCToMerchant(
        string memory toChainName,
        address merchantAddress,
        uint256 amountUSDC,
        address senderAddress,
        uint256 relayFee
    ) internal {
        // if tokens are being bridged to the current chain, transfer usdc without bridging
        if (
            keccak256(abi.encode(thisChainName)) ==
            keccak256(abi.encode(toChainName))
        ) {
            IERC20(USDC_ADDRESS).transfer(merchantAddress, amountUSDC);
            emit USDCTransferToMerchantConfirmed(
                merchantAddress,
                toChainName,
                msg.sender,
                amountUSDC
            );
        } else {
            // bridge tokens
            connext.xcall{value: relayFee}(
                chainNameToDomainId[toChainName],
                chainNameToContractAddress[toChainName],
                USDC_ADDRESS,
                msg.sender,
                amountUSDC,
                300,
                abi.encode(merchantAddress, amountUSDC, senderAddress)
            );
        }
    }

    // estimates tokens needed to swap to USDC and sucesfully execute crosschain connext transfer. accounts for 3% connext transfer slippage fee
    function estimateTokensNeeded(
        uint256 usdcAmount,
        address[] memory path
    ) public view returns (uint256) {
        uint256 tokenAmountIn = DEX.getAmountsIn(
            (usdcAmount * 103093) / 100000,
            path
        )[0];
        return (tokenAmountIn * 10005) / 10000;
    }

    function xReceive(
        bytes32 _transferId,
        uint256 _amount,
        address _asset,
        address _originSender,
        uint32 _origin,
        bytes memory _callData
    ) external returns (bytes memory) {
        (
            address merchantAddress,
            uint256 amountUSDC,
            address senderAddress
        ) = abi.decode(_callData, (address, uint256, address));
        IERC20(USDC_ADDRESS).transfer(merchantAddress, amountUSDC);
        emit USDCTransferToMerchantConfirmed(
            merchantAddress,
            thisChainName,
            senderAddress,
            amountUSDC
        );
    }
}

File 2 of 6 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 3 of 6 : IExchange.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// standard UniswapV2 style DEX
interface IExchange {
    function getAmountsIn(
        uint256 amountOut,
        address[] memory path
    ) external view returns (uint256[] memory amounts);

    function getAmountsOut(
        uint256 amountIn,
        address[] memory path
    ) external view returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] memory path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] memory path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        address to,
        uint256 deadline
    ) external;
}

File 4 of 6 : IConnext.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import {ExecuteArgs, TransferInfo, DestinationTransferStatus} from "LibConnextStorage.sol";
import {TokenId} from "TokenId.sol";

interface IConnext {
    // ============ BRIDGE ==============

    function xcall(
        uint32 _destination,
        address _to,
        address _asset,
        address _delegate,
        uint256 _amount,
        uint256 _slippage,
        bytes calldata _callData
    ) external payable returns (bytes32);

    function xcallIntoLocal(
        uint32 _destination,
        address _to,
        address _asset,
        address _delegate,
        uint256 _amount,
        uint256 _slippage,
        bytes calldata _callData
    ) external payable returns (bytes32);

    function execute(
        ExecuteArgs calldata _args
    ) external returns (bytes32 transferId);

    function forceUpdateSlippage(
        TransferInfo calldata _params,
        uint256 _slippage
    ) external;

    function forceReceiveLocal(TransferInfo calldata _params) external;

    function bumpTransfer(bytes32 _transferId) external payable;

    function routedTransfers(
        bytes32 _transferId
    ) external view returns (address[] memory);

    function transferStatus(
        bytes32 _transferId
    ) external view returns (DestinationTransferStatus);

    function remote(uint32 _domain) external view returns (address);

    function domain() external view returns (uint256);

    function nonce() external view returns (uint256);

    function approvedSequencers(
        address _sequencer
    ) external view returns (bool);

    function xAppConnectionManager() external view returns (address);

    // ============ ROUTERS ==============

    function LIQUIDITY_FEE_NUMERATOR() external view returns (uint256);

    function LIQUIDITY_FEE_DENOMINATOR() external view returns (uint256);

    function getRouterApproval(address _router) external view returns (bool);

    function getRouterRecipient(
        address _router
    ) external view returns (address);

    function getRouterOwner(address _router) external view returns (address);

    function getProposedRouterOwner(
        address _router
    ) external view returns (address);

    function getProposedRouterOwnerTimestamp(
        address _router
    ) external view returns (uint256);

    function maxRoutersPerTransfer() external view returns (uint256);

    function routerBalances(
        address _router,
        address _asset
    ) external view returns (uint256);

    function getRouterApprovalForPortal(
        address _router
    ) external view returns (bool);

    function initializeRouter(address _owner, address _recipient) external;

    function setRouterRecipient(address _router, address _recipient) external;

    function proposeRouterOwner(address _router, address _proposed) external;

    function acceptProposedRouterOwner(address _router) external;

    function addRouterLiquidityFor(
        uint256 _amount,
        address _local,
        address _router
    ) external payable;

    function addRouterLiquidity(
        uint256 _amount,
        address _local
    ) external payable;

    function removeRouterLiquidityFor(
        TokenId memory _canonical,
        uint256 _amount,
        address payable _to,
        address _router
    ) external;

    function removeRouterLiquidity(
        TokenId memory _canonical,
        uint256 _amount,
        address payable _to
    ) external;
}

File 5 of 6 : LibConnextStorage.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

/**
 * @notice Enum representing status of destination transfer
 * @dev Status is only assigned on the destination domain, will always be "none" for the
 * origin domains
 * @return uint - Index of value in enum
 */
enum DestinationTransferStatus {
    None, // 0
    Reconciled, // 1
    Executed, // 2
    Completed // 3 - executed + reconciled
}

/**
 * @notice These are the parameters that will remain constant between the
 * two chains. They are supplied on `xcall` and should be asserted on `execute`
 * @property to - The account that receives funds, in the event of a crosschain call,
 * will receive funds if the call fails.
 *
 * @param originDomain - The originating domain (i.e. where `xcall` is called)
 * @param destinationDomain - The final domain (i.e. where `execute` / `reconcile` are called)\
 * @param canonicalDomain - The canonical domain of the asset you are bridging
 * @param to - The address you are sending funds (and potentially data) to
 * @param delegate - An address who can execute txs on behalf of `to`, in addition to allowing relayers
 * @param receiveLocal - If true, will use the local asset on the destination instead of adopted.
 * @param callData - The data to execute on the receiving chain. If no crosschain call is needed, then leave empty.
 * @param slippage - Slippage user is willing to accept from original amount in expressed in BPS (i.e. if
 * a user takes 1% slippage, this is expressed as 1_000)
 * @param originSender - The msg.sender of the xcall
 * @param bridgedAmt - The amount sent over the bridge (after potential AMM on xcall)
 * @param normalizedIn - The amount sent to `xcall`, normalized to 18 decimals
 * @param nonce - The nonce on the origin domain used to ensure the transferIds are unique
 * @param canonicalId - The unique identifier of the canonical token corresponding to bridge assets
 */
struct TransferInfo {
    uint32 originDomain;
    uint32 destinationDomain;
    uint32 canonicalDomain;
    address to;
    address delegate;
    bool receiveLocal;
    bytes callData;
    uint256 slippage;
    address originSender;
    uint256 bridgedAmt;
    uint256 normalizedIn;
    uint256 nonce;
    bytes32 canonicalId;
}

/**
 * @notice
 * @param params - The TransferInfo. These are consistent across sending and receiving chains.
 * @param routers - The routers who you are sending the funds on behalf of.
 * @param routerSignatures - Signatures belonging to the routers indicating permission to use funds
 * for the signed transfer ID.
 * @param sequencer - The sequencer who assigned the router path to this transfer.
 * @param sequencerSignature - Signature produced by the sequencer for path assignment accountability
 * for the path that was signed.
 */
struct ExecuteArgs {
    TransferInfo params;
    address[] routers;
    bytes[] routerSignatures;
    address sequencer;
    bytes sequencerSignature;
}

File 6 of 6 : TokenId.sol
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity ^0.8.0;

// ============= Structs =============

// Tokens are identified by a TokenId:
// domain - 4 byte chain ID of the chain from which the token originates
// id - 32 byte identifier of the token address on the origin chain, in that chain's address format
struct TokenId {
    uint32 domain;
    bytes32 id;
}

Settings
{
  "evmVersion": "istanbul",
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "libraries": {
    "cryptopay.sol": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"connextAddress","type":"address"},{"internalType":"address","name":"dexAddress","type":"address"},{"internalType":"address","name":"wethAddress","type":"address"},{"internalType":"address","name":"usdcAddress","type":"address"},{"internalType":"string","name":"_thisChainName","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_merchantAddress","type":"address"},{"indexed":true,"internalType":"string","name":"_toChainName","type":"string"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountUSDC","type":"uint256"}],"name":"USDCTransferToMerchantConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_merchantAddress","type":"address"},{"indexed":true,"internalType":"string","name":"_toChainName","type":"string"},{"indexed":true,"internalType":"address","name":"_sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountUSDC","type":"uint256"}],"name":"USDCTransferToMerchantInitiated","type":"event"},{"inputs":[],"name":"DEX","outputs":[{"internalType":"contract IExchange","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEX_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"connext","outputs":[{"internalType":"contract IConnext","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"usdcAmount","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"estimateTokensNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"toChainName","type":"string"},{"internalType":"uint256","name":"usdcAmount","type":"uint256"},{"internalType":"address","name":"merchantAddress","type":"address"},{"internalType":"bool","name":"inEther","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"relayFee","type":"uint256"}],"name":"sendUSDCToMerchant","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"gnosisCA","type":"address"},{"internalType":"address","name":"polygonCA","type":"address"}],"name":"updateContractAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_transferId","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_asset","type":"address"},{"internalType":"address","name":"_originSender","type":"address"},{"internalType":"uint32","name":"_origin","type":"uint32"},{"internalType":"bytes","name":"_callData","type":"bytes"}],"name":"xReceive","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001ac138038062001ac1833981016040819052620000349162000162565b600080546001600160a01b038681166001600160a01b0319928316179092556001805486841690831617905560028054928516929091169190911790556040805165676e6f73697360d01b81526005600682018190528251918290036026018220805462676e6f63ffffffff1991821617909155663837b63cb3b7b760c91b835260078301919091529151908190036027019020805463706f6c7992169190911790556008620000e5828262000311565b5050600054600380546001600160a01b03199081166001600160a01b03938416179091556004805496909216958116959095179055505060078054909216331790915550620003dd565b80516001600160a01b03811681146200014757600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a086880312156200017b57600080fd5b62000186866200012f565b94506020620001978188016200012f565b9450620001a7604088016200012f565b9350620001b7606088016200012f565b60808801519093506001600160401b0380821115620001d557600080fd5b818901915089601f830112620001ea57600080fd5b815181811115620001ff57620001ff6200014c565b604051601f8201601f19908116603f011681019083821181831017156200022a576200022a6200014c565b816040528281528c868487010111156200024357600080fd5b600093505b8284101562000267578484018601518185018701529285019262000248565b60008684830101528096505050505050509295509295909350565b600181811c908216806200029757607f821691505b602082108103620002b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200030c57600081815260208120601f850160051c81016020861015620002e75750805b601f850160051c820191505b818110156200030857828155600101620002f3565b5050505b505050565b81516001600160401b038111156200032d576200032d6200014c565b62000345816200033e845462000282565b84620002be565b602080601f8311600181146200037d5760008415620003645750858301515b600019600386901b1c1916600185901b17855562000308565b600085815260208120601f198616915b82811015620003ae578886015182559484019460019091019084016200038d565b5085821015620003cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6116d480620003ed6000396000f3fe6080604052600436106100865760003560e01c806380935aa91161005957806380935aa91461012b578063a7cb399d1461014b578063bb09d9b71461016b578063de4b05481461018b578063fd614f41146101ab57600080fd5b8063040141e51461008b5780631ff6dc5b146100c857806337e2d0d9146100ea5780633d690a3514610118575b600080fd5b34801561009757600080fd5b506001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d457600080fd5b506100e86100e3366004610f2a565b6101d8565b005b3480156100f657600080fd5b5061010a610105366004610fce565b610269565b6040519081526020016100bf565b6100e86101263660046110df565b61033e565b34801561013757600080fd5b506003546100ab906001600160a01b031681565b34801561015757600080fd5b506000546100ab906001600160a01b031681565b34801561017757600080fd5b506002546100ab906001600160a01b031681565b34801561019757600080fd5b506004546100ab906001600160a01b031681565b3480156101b757600080fd5b506101cb6101c6366004611186565b6106f8565b6040516100bf919061127a565b6007546001600160a01b031633146101ef57600080fd5b81600660405161020b9065676e6f73697360d01b815260060190565b9081526040805191829003602001822080546001600160a01b039485166001600160a01b031991821617909155663837b63cb3b7b760c91b835260066007840152905191829003602701909120805493909216921691909117905550565b60035460009081906001600160a01b0316631f00ca74620186a061029087620192b56112aa565b61029a91906112c1565b856040518363ffffffff1660e01b81526004016102b8929190611327565b600060405180830381865afa1580156102d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102fd9190810190611348565b60008151811061030f5761030f6113d9565b602002602001015190506127108161271561032a91906112aa565b61033491906112c1565b9150505b92915050565b83151560000361048457604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015610394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b891906113ef565b101561040b5760405162461bcd60e51b815260206004820181905260248201527f55736572206e6565647320746f20696e63726561736520616c6c6f77616e636560448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064016020604051808303816000875af115801561045e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104829190611408565b505b6002546001600160a01b03908116908416036105c1576002546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050691906113ef565b10156105545760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768205553444320696e20636f6e747261637400000000006044820152606401610402565b6105618786883385610806565b6040513390610571908990611425565b6040518091039020866001600160a01b03167f2e15ce660666bc326ef5f4ae646953c81f86895a56fbb2f0d7ceb0d4a836bb29896040516105b491815260200190565b60405180910390a46106ef565b6105cc848484610a43565b6002546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa158015610614573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063891906113ef565b10156106865760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768205553444320696e20636f6e747261637400000000006044820152606401610402565b6106938786883385610806565b60405133906106a3908990611425565b6040518091039020866001600160a01b03167f2e15ce660666bc326ef5f4ae646953c81f86895a56fbb2f0d7ceb0d4a836bb29896040516106e691815260200190565b60405180910390a45b50505050505050565b60606000806000848060200190518101906107139190611441565b60025460405163a9059cbb60e01b81526001600160a01b03808616600483015260248201859052949750929550909350919091169063a9059cbb906044016020604051808303816000875af1158015610770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107949190611408565b50806001600160a01b031660086040516107ae91906114be565b6040518091039020846001600160a01b03167fe0fe148f01d667248c68d236a9e286515cc7f70c66b7eb0f94c2fe1243a7a465856040516107f191815260200190565b60405180910390a45050509695505050505050565b84604051602001610817919061127a565b60405160208183030381529060405280519060200120600860405160200161083f9190611534565b60405160208183030381529060405280519060200120036109325760025460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529091169063a9059cbb906044016020604051808303816000875af11580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611408565b5060405133906108e2908790611425565b6040518091039020856001600160a01b03167fe0fe148f01d667248c68d236a9e286515cc7f70c66b7eb0f94c2fe1243a7a4658660405161092591815260200190565b60405180910390a4610a3c565b6004546040516001600160a01b0390911690638aac16ba90839060059061095a908a90611425565b9081526040519081900360200181205463ffffffff169060069061097f908b90611425565b9081526040805160209281900383018120546002546001600160a01b038d8116958401959095529282018b905289841660608301528316929091169033908a9061012c906080016040516020818303038152906040526040518963ffffffff1660e01b81526004016109f797969594939291906115bf565b60206040518083038185885af1158015610a15573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a3a91906113ef565b505b5050505050565b6002546001600160a01b0390811690831603610aa15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737761702055534443203d3e205553444300000000000000006044820152606401610402565b8215610c0a576001546060805190916001600160a01b0316908290600090610acb57610acb6113d9565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610afc57610afc6113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b815291169063b6f9de95908490839063d06ca61f90610b459084908890600401611327565b600060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b8a9190810190611348565b600181518110610b9c57610b9c6113d9565b6020026020010151843042603c610bb3919061161a565b6040518663ffffffff1660e01b8152600401610bd2949392919061162d565b6000604051808303818588803b158015610beb57600080fd5b505af1158015610bff573d6000803e3d6000fd5b505050505050505050565b60005460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190611408565b506001546001600160a01b0390811690831603610dfc576001546060805190916001600160a01b0316908290600090610cbc57610cbc6113d9565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610ced57610ced6113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152911690635c11d795908490839063d06ca61f90610d369084908890600401611327565b600060405180830381865afa158015610d53573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7b9190810190611348565b600181518110610d8d57610d8d6113d9565b6020026020010151843042603c610da4919061161a565b6040518663ffffffff1660e01b8152600401610dc4959493929190611662565b600060405180830381600087803b158015610dde57600080fd5b505af1158015610df2573d6000803e3d6000fd5b5050505050505050565b60608281600081518110610e1257610e126113d9565b6001600160a01b0392831660209182029290920101526001805483519216918391908110610e4257610e426113d9565b6001600160a01b0392831660209182029290920101526002805483519216918391908110610e7257610e726113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152911690635c11d795908490839063d06ca61f90610ebb9084908890600401611327565b600060405180830381865afa158015610ed8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f009190810190611348565b600281518110610d8d57610d8d6113d9565b6001600160a01b0381168114610f2757600080fd5b50565b60008060408385031215610f3d57600080fd5b8235610f4881610f12565b91506020830135610f5881610f12565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610fa257610fa2610f63565b604052919050565b600067ffffffffffffffff821115610fc457610fc4610f63565b5060051b60200190565b60008060408385031215610fe157600080fd5b8235915060208084013567ffffffffffffffff81111561100057600080fd5b8401601f8101861361101157600080fd5b803561102461101f82610faa565b610f79565b81815260059190911b8201830190838101908883111561104357600080fd5b928401925b8284101561106a57833561105b81610f12565b82529284019290840190611048565b80955050505050509250929050565b600067ffffffffffffffff83111561109357611093610f63565b6110a6601f8401601f1916602001610f79565b90508281528383830111156110ba57600080fd5b828260208301376000602084830101529392505050565b8015158114610f2757600080fd5b600080600080600080600060e0888a0312156110fa57600080fd5b873567ffffffffffffffff81111561111157600080fd5b8801601f81018a1361112257600080fd5b6111318a823560208401611079565b97505060208801359550604088013561114981610f12565b94506060880135611159816110d1565b9350608088013561116981610f12565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060c0878903121561119f57600080fd5b863595506020870135945060408701356111b881610f12565b935060608701356111c881610f12565b9250608087013563ffffffff811681146111e157600080fd5b915060a087013567ffffffffffffffff8111156111fd57600080fd5b8701601f8101891361120e57600080fd5b61121d89823560208401611079565b9150509295509295509295565b60005b8381101561124557818101518382015260200161122d565b50506000910152565b6000815180845261126681602086016020860161122a565b601f01601f19169290920160200192915050565b60208152600061128d602083018461124e565b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761033857610338611294565b6000826112de57634e487b7160e01b600052601260045260246000fd5b500490565b600081518084526020808501945080840160005b8381101561131c5781516001600160a01b0316875295820195908201906001016112f7565b509495945050505050565b82815260406020820152600061134060408301846112e3565b949350505050565b6000602080838503121561135b57600080fd5b825167ffffffffffffffff81111561137257600080fd5b8301601f8101851361138357600080fd5b805161139161101f82610faa565b81815260059190911b820183019083810190878311156113b057600080fd5b928401925b828410156113ce578351825292840192908401906113b5565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561140157600080fd5b5051919050565b60006020828403121561141a57600080fd5b815161128d816110d1565b6000825161143781846020870161122a565b9190910192915050565b60008060006060848603121561145657600080fd5b835161146181610f12565b60208501516040860151919450925061147981610f12565b809150509250925092565b600181811c9082168061149857607f821691505b6020821081036114b857634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546114cc81611484565b600182811680156114e457600181146114f957611528565b60ff1984168752821515830287019450611528565b8760005260208060002060005b8581101561151f5781548a820152908401908201611506565b50505082870194505b50929695505050505050565b600060208083526000845461154881611484565b808487015260406001808416600081146115695760018114611583576115b1565b60ff1985168984015283151560051b8901830195506115b1565b896000528660002060005b858110156115a95781548b820186015290830190880161158e565b8a0184019650505b509398975050505050505050565b63ffffffff881681526001600160a01b0387811660208301528681166040830152851660608201526080810184905260a0810183905260e060c0820181905260009061160d9083018461124e565b9998505050505050505050565b8082018082111561033857610338611294565b84815260806020820152600061164660808301866112e3565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061168160a08301866112e3565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c0e62ea6e9d4ee3a1e72ee8acb2258f7f33e9597049784c6e34322925290658d64736f6c6343000811003300000000000000000000000011984dc4465481512eb5b777e44061c158cf22590000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000007706f6c79676f6e00000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106100865760003560e01c806380935aa91161005957806380935aa91461012b578063a7cb399d1461014b578063bb09d9b71461016b578063de4b05481461018b578063fd614f41146101ab57600080fd5b8063040141e51461008b5780631ff6dc5b146100c857806337e2d0d9146100ea5780633d690a3514610118575b600080fd5b34801561009757600080fd5b506001546100ab906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100d457600080fd5b506100e86100e3366004610f2a565b6101d8565b005b3480156100f657600080fd5b5061010a610105366004610fce565b610269565b6040519081526020016100bf565b6100e86101263660046110df565b61033e565b34801561013757600080fd5b506003546100ab906001600160a01b031681565b34801561015757600080fd5b506000546100ab906001600160a01b031681565b34801561017757600080fd5b506002546100ab906001600160a01b031681565b34801561019757600080fd5b506004546100ab906001600160a01b031681565b3480156101b757600080fd5b506101cb6101c6366004611186565b6106f8565b6040516100bf919061127a565b6007546001600160a01b031633146101ef57600080fd5b81600660405161020b9065676e6f73697360d01b815260060190565b9081526040805191829003602001822080546001600160a01b039485166001600160a01b031991821617909155663837b63cb3b7b760c91b835260066007840152905191829003602701909120805493909216921691909117905550565b60035460009081906001600160a01b0316631f00ca74620186a061029087620192b56112aa565b61029a91906112c1565b856040518363ffffffff1660e01b81526004016102b8929190611327565b600060405180830381865afa1580156102d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526102fd9190810190611348565b60008151811061030f5761030f6113d9565b602002602001015190506127108161271561032a91906112aa565b61033491906112c1565b9150505b92915050565b83151560000361048457604051636eb1769f60e11b815233600482015230602482015282906001600160a01b0385169063dd62ed3e90604401602060405180830381865afa158015610394573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b891906113ef565b101561040b5760405162461bcd60e51b815260206004820181905260248201527f55736572206e6565647320746f20696e63726561736520616c6c6f77616e636560448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064016020604051808303816000875af115801561045e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104829190611408565b505b6002546001600160a01b03908116908416036105c1576002546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa1580156104e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061050691906113ef565b10156105545760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768205553444320696e20636f6e747261637400000000006044820152606401610402565b6105618786883385610806565b6040513390610571908990611425565b6040518091039020866001600160a01b03167f2e15ce660666bc326ef5f4ae646953c81f86895a56fbb2f0d7ceb0d4a836bb29896040516105b491815260200190565b60405180910390a46106ef565b6105cc848484610a43565b6002546040516370a0823160e01b815230600482015287916001600160a01b0316906370a0823190602401602060405180830381865afa158015610614573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063891906113ef565b10156106865760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f756768205553444320696e20636f6e747261637400000000006044820152606401610402565b6106938786883385610806565b60405133906106a3908990611425565b6040518091039020866001600160a01b03167f2e15ce660666bc326ef5f4ae646953c81f86895a56fbb2f0d7ceb0d4a836bb29896040516106e691815260200190565b60405180910390a45b50505050505050565b60606000806000848060200190518101906107139190611441565b60025460405163a9059cbb60e01b81526001600160a01b03808616600483015260248201859052949750929550909350919091169063a9059cbb906044016020604051808303816000875af1158015610770573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107949190611408565b50806001600160a01b031660086040516107ae91906114be565b6040518091039020846001600160a01b03167fe0fe148f01d667248c68d236a9e286515cc7f70c66b7eb0f94c2fe1243a7a465856040516107f191815260200190565b60405180910390a45050509695505050505050565b84604051602001610817919061127a565b60405160208183030381529060405280519060200120600860405160200161083f9190611534565b60405160208183030381529060405280519060200120036109325760025460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529091169063a9059cbb906044016020604051808303816000875af11580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d19190611408565b5060405133906108e2908790611425565b6040518091039020856001600160a01b03167fe0fe148f01d667248c68d236a9e286515cc7f70c66b7eb0f94c2fe1243a7a4658660405161092591815260200190565b60405180910390a4610a3c565b6004546040516001600160a01b0390911690638aac16ba90839060059061095a908a90611425565b9081526040519081900360200181205463ffffffff169060069061097f908b90611425565b9081526040805160209281900383018120546002546001600160a01b038d8116958401959095529282018b905289841660608301528316929091169033908a9061012c906080016040516020818303038152906040526040518963ffffffff1660e01b81526004016109f797969594939291906115bf565b60206040518083038185885af1158015610a15573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610a3a91906113ef565b505b5050505050565b6002546001600160a01b0390811690831603610aa15760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420737761702055534443203d3e205553444300000000000000006044820152606401610402565b8215610c0a576001546060805190916001600160a01b0316908290600090610acb57610acb6113d9565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610afc57610afc6113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b815291169063b6f9de95908490839063d06ca61f90610b459084908890600401611327565b600060405180830381865afa158015610b62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b8a9190810190611348565b600181518110610b9c57610b9c6113d9565b6020026020010151843042603c610bb3919061161a565b6040518663ffffffff1660e01b8152600401610bd2949392919061162d565b6000604051808303818588803b158015610beb57600080fd5b505af1158015610bff573d6000803e3d6000fd5b505050505050505050565b60005460405163095ea7b360e01b81526001600160a01b039182166004820152602481018390529083169063095ea7b3906044016020604051808303816000875af1158015610c5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c819190611408565b506001546001600160a01b0390811690831603610dfc576001546060805190916001600160a01b0316908290600090610cbc57610cbc6113d9565b6001600160a01b039283166020918202929092010152600254825191169082906001908110610ced57610ced6113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152911690635c11d795908490839063d06ca61f90610d369084908890600401611327565b600060405180830381865afa158015610d53573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d7b9190810190611348565b600181518110610d8d57610d8d6113d9565b6020026020010151843042603c610da4919061161a565b6040518663ffffffff1660e01b8152600401610dc4959493929190611662565b600060405180830381600087803b158015610dde57600080fd5b505af1158015610df2573d6000803e3d6000fd5b5050505050505050565b60608281600081518110610e1257610e126113d9565b6001600160a01b0392831660209182029290920101526001805483519216918391908110610e4257610e426113d9565b6001600160a01b0392831660209182029290920101526002805483519216918391908110610e7257610e726113d9565b6001600160a01b03928316602091820292909201015260035460405163d06ca61f60e01b8152911690635c11d795908490839063d06ca61f90610ebb9084908890600401611327565b600060405180830381865afa158015610ed8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f009190810190611348565b600281518110610d8d57610d8d6113d9565b6001600160a01b0381168114610f2757600080fd5b50565b60008060408385031215610f3d57600080fd5b8235610f4881610f12565b91506020830135610f5881610f12565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610fa257610fa2610f63565b604052919050565b600067ffffffffffffffff821115610fc457610fc4610f63565b5060051b60200190565b60008060408385031215610fe157600080fd5b8235915060208084013567ffffffffffffffff81111561100057600080fd5b8401601f8101861361101157600080fd5b803561102461101f82610faa565b610f79565b81815260059190911b8201830190838101908883111561104357600080fd5b928401925b8284101561106a57833561105b81610f12565b82529284019290840190611048565b80955050505050509250929050565b600067ffffffffffffffff83111561109357611093610f63565b6110a6601f8401601f1916602001610f79565b90508281528383830111156110ba57600080fd5b828260208301376000602084830101529392505050565b8015158114610f2757600080fd5b600080600080600080600060e0888a0312156110fa57600080fd5b873567ffffffffffffffff81111561111157600080fd5b8801601f81018a1361112257600080fd5b6111318a823560208401611079565b97505060208801359550604088013561114981610f12565b94506060880135611159816110d1565b9350608088013561116981610f12565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060c0878903121561119f57600080fd5b863595506020870135945060408701356111b881610f12565b935060608701356111c881610f12565b9250608087013563ffffffff811681146111e157600080fd5b915060a087013567ffffffffffffffff8111156111fd57600080fd5b8701601f8101891361120e57600080fd5b61121d89823560208401611079565b9150509295509295509295565b60005b8381101561124557818101518382015260200161122d565b50506000910152565b6000815180845261126681602086016020860161122a565b601f01601f19169290920160200192915050565b60208152600061128d602083018461124e565b9392505050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761033857610338611294565b6000826112de57634e487b7160e01b600052601260045260246000fd5b500490565b600081518084526020808501945080840160005b8381101561131c5781516001600160a01b0316875295820195908201906001016112f7565b509495945050505050565b82815260406020820152600061134060408301846112e3565b949350505050565b6000602080838503121561135b57600080fd5b825167ffffffffffffffff81111561137257600080fd5b8301601f8101851361138357600080fd5b805161139161101f82610faa565b81815260059190911b820183019083810190878311156113b057600080fd5b928401925b828410156113ce578351825292840192908401906113b5565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561140157600080fd5b5051919050565b60006020828403121561141a57600080fd5b815161128d816110d1565b6000825161143781846020870161122a565b9190910192915050565b60008060006060848603121561145657600080fd5b835161146181610f12565b60208501516040860151919450925061147981610f12565b809150509250925092565b600181811c9082168061149857607f821691505b6020821081036114b857634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546114cc81611484565b600182811680156114e457600181146114f957611528565b60ff1984168752821515830287019450611528565b8760005260208060002060005b8581101561151f5781548a820152908401908201611506565b50505082870194505b50929695505050505050565b600060208083526000845461154881611484565b808487015260406001808416600081146115695760018114611583576115b1565b60ff1985168984015283151560051b8901830195506115b1565b896000528660002060005b858110156115a95781548b820186015290830190880161158e565b8a0184019650505b509398975050505050505050565b63ffffffff881681526001600160a01b0387811660208301528681166040830152851660608201526080810184905260a0810183905260e060c0820181905260009061160d9083018461124e565b9998505050505050505050565b8082018082111561033857610338611294565b84815260806020820152600061164660808301866112e3565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a06040820152600061168160a08301866112e3565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220c0e62ea6e9d4ee3a1e72ee8acb2258f7f33e9597049784c6e34322925290658d64736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000011984dc4465481512eb5b777e44061c158cf22590000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975060000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf12700000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa8417400000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000007706f6c79676f6e00000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : connextAddress (address): 0x11984dc4465481512eb5b777E44061C158CF2259
Arg [1] : dexAddress (address): 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
Arg [2] : wethAddress (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Arg [3] : usdcAddress (address): 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174
Arg [4] : _thisChainName (string): polygon

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000011984dc4465481512eb5b777e44061c158cf2259
Arg [1] : 0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Arg [2] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [3] : 0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 706f6c79676f6e00000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.