ETH Price: $2,325.40 (+2.74%)

Contract

0x7DdB266Fd3427802C8849a82B1f2a052d204a883
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Close Order161897092022-12-15 11:11:231187 days ago1671102683IN
0x7DdB266F...2d204a883
0 ETH0.0011511913.83380241
Open Order161821452022-12-14 9:49:591188 days ago1671011399IN
0x7DdB266F...2d204a883
0 ETH0.0041108115.17846072

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040161820942022-12-14 9:39:351188 days ago1671010775  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TwapOrder

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2022-12-14
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

interface IQueryableErc20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address addr) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function decimals() external view returns (uint8);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

/**
 * @title Represents a resource that requires initialization.
 */
contract CustomInitializable {
    bool private _wasInitialized;

    /**
     * @notice Throws if the resource was not initialized yet.
     */
    modifier ifInitialized () {
        require(_wasInitialized, "Not initialized yet");
        _;
    }

    /**
     * @notice Throws if the resource was initialized already.
     */
    modifier ifNotInitialized () {
        require(!_wasInitialized, "Already initialized");
        _;
    }

    /**
     * @notice Marks the resource as initialized.
     */
    function _initializationCompleted () internal ifNotInitialized {
        _wasInitialized = true;
    }
}


/**
 * @title Represents an ownable resource.
 */
contract CustomOwnable {
    // The current owner of this resource.
    address internal _owner;

    /**
     * @notice This event is triggered when the current owner transfers ownership of the contract.
     * @param previousOwner The previous owner
     * @param newOwner The new owner
     */
    event OnOwnershipTransferred (address previousOwner, address newOwner);

    /**
     * @notice This modifier indicates that the function can only be called by the owner.
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == msg.sender, "Only owner");
        _;
    }

    /**
     * @notice Transfers ownership to the address specified.
     * @param addr Specifies the address of the new owner.
     * @dev Throws if called by any account other than the owner.
     */
    function transferOwnership (address addr) external virtual onlyOwner {
        require(addr != address(0), "non-zero address required");
        emit OnOwnershipTransferred(_owner, addr);
        _owner = addr;
    }

    /**
     * @notice Gets the owner of this contract.
     * @return Returns the address of the owner.
     */
    function owner () external virtual view returns (address) {
        return _owner;
    }
}

/**
 * @title The interface of a fully compliant EIP20
 * @dev The interface is defined by https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 */
interface IERC20Strict is IQueryableErc20 {
    function transfer(address to, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
}

interface ITwapHook {
    function newSyntheticPairDeployed (address sellingTokenAddress, address buyingTokenAddress, address newContractAddress) external;
    function newOrderCreated (address sellingTokenAddress, address buyingTokenAddress, uint256 newDeadline, uint256 targetQty) external;
}

interface ITwapQuery {
  function getOrderMetrics () external view returns (uint256 pStartedOn, uint256 pDeadline, uint256 pSpent, uint256 pFilled, uint256 pTradeSize, address srcToken, address dstToken, uint8 pState, bool pAlive);
}

interface IParaSwapAugustus {
  function getTokenTransferProxy() external view returns (address);
}

contract TwapOrder is ITwapQuery, CustomOwnable, CustomInitializable, ReentrancyGuard {    
    address private constant AUGUSTUS_SWAPPER_ADDR = 0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57;

    uint8 private constant STATE_ACTIVE = 1;
    uint8 private constant STATE_FINISHED = 2;
    uint8 private constant STATE_CANCELLED = 3;

    uint256 internal _startedOn;
    uint256 internal _deadline;
    uint256 internal _spent;
    uint256 internal _filled;
    uint256 internal _tradeSize;
    uint256 internal _priceLimit;
    address public sellingTokenAddress;
    address public buyingTokenAddress;
    address public traderAddress;
    address public depositorAddress;
    address public hookAddress;

    uint8 internal _currentState;
    bool internal _orderAlive;

    event OnTraderChanged (address newAddr);
    event OnDepositorChanged (address newAddr);
    event OnCompletion ();
    event OnCancel ();
    event OnClose ();
    event OnOpen ();
    event OnSwap (address fromToken, uint256 fromAmount, address toToken, uint256 toAmount);


    constructor () {
        _owner = msg.sender;
    }

    modifier onlyTrader() {
        require(traderAddress == msg.sender, "Only trader");
        _;
    }

    modifier onlyDepositor() {
        require(depositorAddress == msg.sender, "Only depositor");
        _;
    }

    modifier ifCanCloseOrder () {
        require(_orderAlive, "Current order is not live");
        require(
            (_currentState == STATE_FINISHED || _currentState == STATE_CANCELLED) || 
            (_currentState == STATE_ACTIVE && block.timestamp > _deadline) // solhint-disable-line not-rely-on-time
        , "Cannot close order yet");
        _;
    }

    function initialize (address traderAddr, address depositorAddr, IERC20Strict sellingToken, IERC20Strict buyingToken, ITwapHook hook) external onlyOwner ifNotInitialized {
        require(address(sellingToken) != address(buyingToken), "Invalid pair");
        require(address(hook) != address(0), "Invalid hook");

        traderAddress = traderAddr;
        depositorAddress = depositorAddr;
        sellingTokenAddress = address(sellingToken);
        buyingTokenAddress = address(buyingToken);
        hookAddress = address(hook);

        _initializationCompleted();
    }

    function switchTrader (address traderAddr) external onlyOwner ifInitialized {
        require(traderAddr != address(0), "Invalid trader");
        require(traderAddr != traderAddress, "Trader already set");
        require(!_orderAlive, "Current order still alive");

        traderAddress = traderAddr;
        emit OnTraderChanged(traderAddr);
    }

    function switchDepositor (address depositorAddr) external onlyOwner ifInitialized {
        require(depositorAddr != address(0), "Invalid depositor");
        require(depositorAddr != depositorAddress, "Depositor already set");
        require(!_orderAlive, "Current order still alive");

        depositorAddress = depositorAddr;
        emit OnDepositorChanged(depositorAddr);
    }

    function openOrder (uint256 newDeadline, uint256 targetQty, uint256 maxPriceLimit) external onlyDepositor ifInitialized {
        require(newDeadline > block.timestamp, "Invalid deadline"); // solhint-disable-line not-rely-on-time
        require(targetQty > 0, "Invalid trade size");
        require(maxPriceLimit > 0, "Invalid price limit");
        require(!_orderAlive, "Current order still alive");

        _startedOn = block.timestamp; // solhint-disable-line not-rely-on-time
        _deadline = newDeadline;
        _tradeSize = targetQty;
        _priceLimit = maxPriceLimit;
        _filled = 0;
        _spent = 0;
        _orderAlive = true;
        _currentState = STATE_ACTIVE;

        ITwapHook(hookAddress).newOrderCreated(sellingTokenAddress, buyingTokenAddress, newDeadline, targetQty);

        _approveProxy();
        emit OnOpen();
    }

    function deposit (uint256 depositAmount) external onlyDepositor ifInitialized {
        require(IERC20Strict(sellingTokenAddress).transferFrom(msg.sender, address(this), depositAmount), "Deposit failed");
    }

    function swap (uint256 sellQty, uint256 buyQty, bytes memory payload) external nonReentrant onlyTrader ifInitialized {
        require(_currentState == STATE_ACTIVE, "Invalid state");
        require(_deadline > block.timestamp, "Deadline expired"); // solhint-disable-line not-rely-on-time
        require(sellQty <= _priceLimit, "Price limit reached");
 
        IERC20Strict sellingToken = IERC20Strict(sellingTokenAddress);
        uint256 sellingTokenBefore = sellingToken.balanceOf(address(this));
        require(sellingTokenBefore > 0, "Insufficient balance");

        IERC20Strict buyingToken = IERC20Strict(buyingTokenAddress);
        uint256 buyingTokenBefore = buyingToken.balanceOf(address(this));

        // Swap
        (bool success,) = AUGUSTUS_SWAPPER_ADDR.call(payload); // solhint-disable-line avoid-low-level-calls
        require(success, "Swap failed");

        uint256 sellingTokenAfter = sellingToken.balanceOf(address(this));
        uint256 buyingTokenAfter = buyingToken.balanceOf(address(this));
        require(buyingTokenAfter > buyingTokenBefore, "Invalid swap: Buy");
        require(sellingTokenBefore > sellingTokenAfter, "Invalid swap: Sell");

        // The number of tokens received after running the swap
        uint256 tokensReceived = buyingTokenAfter - buyingTokenBefore;
        require(tokensReceived >= buyQty, "Invalid amount received");
        _filled += tokensReceived;

        // The number of tokens sold during this swap
        uint256 tokensSold = sellingTokenBefore - sellingTokenAfter;
        require(tokensSold <= sellQty, "Invalid amount spent");
        _spent += tokensSold;

        emit OnSwap(sellingTokenAddress, tokensSold, buyingTokenAddress, tokensReceived);

        if (buyingTokenAfter >= _tradeSize) {
            _currentState = STATE_FINISHED;
            emit OnCompletion();
        }
    }

    function cancelOrder () external nonReentrant onlyDepositor ifInitialized {
        require(_currentState == STATE_ACTIVE, "Invalid state");

        _currentState = STATE_CANCELLED;
        emit OnCancel();

        _closeOrder();
    }

    function closeOrder () external nonReentrant onlyDepositor ifInitialized {
        _closeOrder();
    }

    function _closeOrder () private ifCanCloseOrder {
        _orderAlive = false;

        IERC20Strict sellingToken = IERC20Strict(sellingTokenAddress);
        IERC20Strict buyingToken = IERC20Strict(buyingTokenAddress);
        uint256 sellingTokenBalance = sellingToken.balanceOf(address(this));
        uint256 buyingTokenBalance = buyingToken.balanceOf(address(this));

        if (sellingTokenBalance > 0) require(sellingToken.transfer(depositorAddress, sellingTokenBalance), "Transfer failed: sell");
        if (buyingTokenBalance > 0) require(buyingToken.transfer(depositorAddress, buyingTokenBalance), "Transfer failed: buy");
        _revokeProxy();

        emit OnClose();
    }

    function _approveProxy () private {
        IERC20Strict token = IERC20Strict(sellingTokenAddress);
        uint256 currentBalance = token.balanceOf(address(this));
        address proxyAddr = IParaSwapAugustus(AUGUSTUS_SWAPPER_ADDR).getTokenTransferProxy();
        if (token.allowance(address(this), proxyAddr) < currentBalance) {
            require(token.approve(proxyAddr, currentBalance), "Token approval failed");
        }
    }

    function _revokeProxy () private {
        IERC20Strict token = IERC20Strict(sellingTokenAddress);
        address proxyAddr = IParaSwapAugustus(AUGUSTUS_SWAPPER_ADDR).getTokenTransferProxy();
        if (token.allowance(address(this), proxyAddr) > 0) {
            require(token.approve(proxyAddr, 0), "Token approval failed");
        }
    }

    function getOrderMetrics () external view override returns (uint256 pStartedOn, uint256 pDeadline, uint256 pSpent, uint256 pFilled, uint256 pTradeSize, address srcToken, address dstToken, uint8 pState, bool pAlive) {
        pDeadline = _deadline;
        pSpent = _spent;
        pFilled = _filled;
        pStartedOn = _startedOn;
        pTradeSize = _tradeSize;
        srcToken = sellingTokenAddress;
        dstToken = buyingTokenAddress;
        pState = _currentState;
        pAlive = _orderAlive;
    }
}

interface ITwapDeployer {
    function deployTwap (IERC20Strict sellingToken, IERC20Strict buyingToken, address twapOwnerAddr, address traderAddr, address depositorAddr) external;
}

contract TwapDeployer is ITwapDeployer, CustomOwnable, CustomInitializable {
    address public authorizedDeployer;
    address public hookAddress;
    
    constructor () {
        _owner = msg.sender;
    }

    modifier onlyAuthorizedDeployer() {
        require(authorizedDeployer == msg.sender, "Deployer Unauthorized");
        _;
    }

    function initialize (ITwapHook hook, address authorizedDeployerAddr) external onlyOwner ifNotInitialized {
        require(address(hook) != address(0), "Invalid hook");
        require(authorizedDeployerAddr != address(0), "Invalid deployer");
        
        hookAddress = address(hook);
        authorizedDeployer = authorizedDeployerAddr;
        _initializationCompleted();
    }

    function deployTwap (IERC20Strict sellingToken, IERC20Strict buyingToken, address twapOwnerAddr, address traderAddr, address depositorAddr) external override ifInitialized onlyAuthorizedDeployer {
        TwapOrder instance = new TwapOrder();
        instance.initialize(traderAddr, depositorAddr, sellingToken, buyingToken, ITwapHook(hookAddress));
        instance.transferOwnership(twapOwnerAddr);

        ITwapHook(hookAddress).newSyntheticPairDeployed(address(sellingToken), address(buyingToken), address(instance));
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"OnCancel","type":"event"},{"anonymous":false,"inputs":[],"name":"OnClose","type":"event"},{"anonymous":false,"inputs":[],"name":"OnCompletion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddr","type":"address"}],"name":"OnDepositorChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"OnOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OnOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"fromToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"toToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"OnSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAddr","type":"address"}],"name":"OnTraderChanged","type":"event"},{"inputs":[],"name":"buyingTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOrderMetrics","outputs":[{"internalType":"uint256","name":"pStartedOn","type":"uint256"},{"internalType":"uint256","name":"pDeadline","type":"uint256"},{"internalType":"uint256","name":"pSpent","type":"uint256"},{"internalType":"uint256","name":"pFilled","type":"uint256"},{"internalType":"uint256","name":"pTradeSize","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"dstToken","type":"address"},{"internalType":"uint8","name":"pState","type":"uint8"},{"internalType":"bool","name":"pAlive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hookAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"traderAddr","type":"address"},{"internalType":"address","name":"depositorAddr","type":"address"},{"internalType":"contract IERC20Strict","name":"sellingToken","type":"address"},{"internalType":"contract IERC20Strict","name":"buyingToken","type":"address"},{"internalType":"contract ITwapHook","name":"hook","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDeadline","type":"uint256"},{"internalType":"uint256","name":"targetQty","type":"uint256"},{"internalType":"uint256","name":"maxPriceLimit","type":"uint256"}],"name":"openOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellingTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellQty","type":"uint256"},{"internalType":"uint256","name":"buyQty","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"depositorAddr","type":"address"}],"name":"switchDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"traderAddr","type":"address"}],"name":"switchTrader","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"traderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b5060018055600080546001600160a01b03191633179055611f6e806100366000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063d7c6fe4511610066578063d7c6fe45146101f0578063e9bd42ac14610203578063ec06e80d14610216578063f2fde38b1461029457600080fd5b80638da5cb5b146101a6578063af83425a146101b7578063b6b55f25146101ca578063cad2cba1146101dd57600080fd5b806332a3cf96116100d357806332a3cf96146101655780633fab693f146101785780636a8165481461018b578063892e83041461019357600080fd5b80631459457a14610105578063254114731461011a5780632d8dcef11461014a57806331905d2814610152575b600080fd5b610118610113366004611bfe565b6102a7565b005b600a5461012d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610118610425565b60085461012d906001600160a01b031681565b600c5461012d906001600160a01b031681565b600b5461012d906001600160a01b031681565b6101186104ae565b6101186101a1366004611cbe565b6105b9565b6000546001600160a01b031661012d565b6101186101c5366004611bbf565b610c36565b6101186101d8366004611c8e565b610da8565b60095461012d906001600160a01b031681565b6101186101fe366004611d7d565b610ec5565b610118610211366004611bbf565b6110f2565b600354600454600554600254600654600854600954600c5460408051958652602086019890985296840195909552606083019390935260808201526001600160a01b0391821660a0820152911660c082015260ff600160a01b8304811660e0830152600160a81b909204909116151561010082015261012001610141565b6101186102a2366004611bbf565b611257565b6000546001600160a01b031633146102da5760405162461bcd60e51b81526004016102d190611de1565b60405180910390fd5b600054600160a01b900460ff161561032a5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016102d1565b816001600160a01b0316836001600160a01b0316141561037b5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103830b4b960a11b60448201526064016102d1565b6001600160a01b0381166103c05760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420686f6f6b60a01b60448201526064016102d1565b600a80546001600160a01b03199081166001600160a01b0388811691909117909255600b80548216878416179055600880548216868416179055600980548216858416179055600c805490911691831691909117905561041e611340565b5050505050565b600260015414156104485760405162461bcd60e51b81526004016102d190611e2d565b6002600155600b546001600160a01b031633146104775760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff166104a05760405162461bcd60e51b81526004016102d190611e64565b6104a86113a5565b60018055565b600260015414156104d15760405162461bcd60e51b81526004016102d190611e2d565b6002600155600b546001600160a01b031633146105005760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff166105295760405162461bcd60e51b81526004016102d190611e64565b600c54600160a01b900460ff166001146105755760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461746560981b60448201526064016102d1565b600c805460ff60a01b1916600360a01b1790556040517fe3b6cd2f9892ca2f546d2377283b0e5d6597f14b3f463814faafba0f9a2f8efd90600090a16104a86113a5565b600260015414156105dc5760405162461bcd60e51b81526004016102d190611e2d565b6002600155600a546001600160a01b031633146106295760405162461bcd60e51b815260206004820152600b60248201526a27b7363c903a3930b232b960a91b60448201526064016102d1565b600054600160a01b900460ff166106525760405162461bcd60e51b81526004016102d190611e64565b600c54600160a01b900460ff1660011461069e5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461746560981b60448201526064016102d1565b42600354116106e25760405162461bcd60e51b815260206004820152601060248201526f111958591b1a5b9948195e1c1a5c995960821b60448201526064016102d1565b60075483111561072a5760405162461bcd60e51b8152602060048201526013602482015272141c9a58d9481b1a5b5a5d081c995858da1959606a1b60448201526064016102d1565b6008546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561077257600080fd5b505afa158015610786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa9190611ca6565b9050600081116107f35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102d1565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561083b57600080fd5b505afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108739190611ca6565b9050600073def171fe48cf0115b1d80b88dc8eab59176fee576001600160a01b0316866040516108a39190611da8565b6000604051808303816000865af19150503d80600081146108e0576040519150601f19603f3d011682016040523d82523d6000602084013e6108e5565b606091505b50509050806109245760405162461bcd60e51b815260206004820152600b60248201526a14ddd85c0819985a5b195960aa1b60448201526064016102d1565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099e9190611ca6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038616906370a082319060240160206040518083038186803b1580156109e357600080fd5b505afa1580156109f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1b9190611ca6565b9050838111610a605760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420737761703a2042757960781b60448201526064016102d1565b818611610aa45760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081cddd85c0e8814d95b1b60721b60448201526064016102d1565b6000610ab08583611ee0565b905089811015610b025760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420616d6f756e7420726563656976656400000000000000000060448201526064016102d1565b8060056000828254610b149190611ec8565b9091555060009050610b268489611ee0565b90508b811115610b6f5760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a5908185b5bdd5b9d081cdc195b9d60621b60448201526064016102d1565b8060046000828254610b819190611ec8565b9091555050600854600954604080516001600160a01b03938416815260208101859052929091168282015260608201849052517f7b233ad45c8a937cf938d2bf9cff79a91863df216e21cf05ef00b0d3ef775e8b9181900360800190a16006548310610c2457600c805460ff60a01b1916600160a11b1790556040517fc6bd8a54a47719851e2d0c7af0275847e55002e9aa4011e0f200eb516147bcc290600090a15b50506001805550505050505050505050565b6000546001600160a01b03163314610c605760405162461bcd60e51b81526004016102d190611de1565b600054600160a01b900460ff16610c895760405162461bcd60e51b81526004016102d190611e64565b6001600160a01b038116610cd35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103232b837b9b4ba37b960791b60448201526064016102d1565b600b546001600160a01b0382811691161415610d295760405162461bcd60e51b815260206004820152601560248201527411195c1bdcda5d1bdc88185b1c9958591e481cd95d605a1b60448201526064016102d1565b600c54600160a81b900460ff1615610d535760405162461bcd60e51b81526004016102d190611e91565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527ff4a8d3a7ff68c7e146b21723ad2c83c9a0e56fb23f9b724b40b246a85dcc432f906020015b60405180910390a150565b600b546001600160a01b03163314610dd25760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff16610dfb5760405162461bcd60e51b81526004016102d190611e64565b6008546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190611c6e565b610ec25760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d0819985a5b195960921b60448201526064016102d1565b50565b600b546001600160a01b03163314610eef5760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff16610f185760405162461bcd60e51b81526004016102d190611e64565b428311610f5a5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420646561646c696e6560801b60448201526064016102d1565b60008211610f9f5760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642074726164652073697a6560701b60448201526064016102d1565b60008111610fe55760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081c1c9a58d9481b1a5b5a5d606a1b60448201526064016102d1565b600c54600160a81b900460ff161561100f5760405162461bcd60e51b81526004016102d190611e91565b42600255600383905560068290556007819055600060058190556004908155600c805461ffff60a01b19811661010160a01b179091556008546009546040516302abe24760e31b81526001600160a01b0392831694810194909452811660248401526044830186905260648301859052169063155f123890608401600060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b505050506110c4611776565b6040517fee22791e4e292d1e09f9ab3d67dd775115e4cdddb044599e9b73c7b85235ac9190600090a1505050565b6000546001600160a01b0316331461111c5760405162461bcd60e51b81526004016102d190611de1565b600054600160a01b900460ff166111455760405162461bcd60e51b81526004016102d190611e64565b6001600160a01b03811661118c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a3930b232b960911b60448201526064016102d1565b600a546001600160a01b03828116911614156111df5760405162461bcd60e51b8152602060048201526012602482015271151c9859195c88185b1c9958591e481cd95d60721b60448201526064016102d1565b600c54600160a81b900460ff16156112095760405162461bcd60e51b81526004016102d190611e91565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd5871f49beddf166c4195606394350e87d297c580591f3a12be15b037d65173c90602001610d9d565b6000546001600160a01b031633146112815760405162461bcd60e51b81526004016102d190611de1565b6001600160a01b0381166112d75760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616464726573732072657175697265640000000000000060448201526064016102d1565b600054604080516001600160a01b03928316815291831660208301527ff77c6eb92f5003da08a86ab833733c2f7f05480f4cc11bf57bf9fecb10873ad7910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff16156113905760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016102d1565b6000805460ff60a01b1916600160a01b179055565b600c54600160a81b900460ff166113fe5760405162461bcd60e51b815260206004820152601960248201527f43757272656e74206f72646572206973206e6f74206c6976650000000000000060448201526064016102d1565b600c54600160a01b900460ff16600214806114255750600c54600160a01b900460ff166003145b806114485750600c54600160a01b900460ff166001148015611448575060035442115b61148d5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd0818db1bdcd9481bdc99195c881e595d60521b60448201526064016102d1565b600c805460ff60a81b191690556008546009546040516370a0823160e01b81523060048201526001600160a01b03928316929091169060009083906370a082319060240160206040518083038186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190611ca6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561156657600080fd5b505afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190611ca6565b9050811561167057600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529085169063a9059cbb90604401602060405180830381600087803b1580156115f457600080fd5b505af1158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190611c6e565b6116705760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c8819985a5b19590e881cd95b1b605a1b60448201526064016102d1565b801561173f57600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529084169063a9059cbb90604401602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190611c6e565b61173f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572206661696c65643a2062757960601b60448201526064016102d1565b6117476119d4565b6040517f3e76d02bc1cb8240113b770474afecf42a936e6a79b908d1dde8c053375599f890600090a150505050565b6008546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f69190611ca6565b9050600073def171fe48cf0115b1d80b88dc8eab59176fee576001600160a01b031663d2c4b5986040518163ffffffff1660e01b815260040160206040518083038186803b15801561184757600080fd5b505afa15801561185b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187f9190611be2565b604051636eb1769f60e11b81523060048201526001600160a01b038083166024830152919250839185169063dd62ed3e9060440160206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190611ca6565b10156119cf5760405163095ea7b360e01b81526001600160a01b0382811660048301526024820184905284169063095ea7b390604401602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190611c6e565b6119cf5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185c1c1c9bdd985b0819985a5b1959605a1b60448201526064016102d1565b505050565b60085460408051631a5896b360e31b815290516001600160a01b039092169160009173def171fe48cf0115b1d80b88dc8eab59176fee579163d2c4b59891600480820192602092909190829003018186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a9190611be2565b604051636eb1769f60e11b81523060048201526001600160a01b03808316602483015291925060009184169063dd62ed3e9060440160206040518083038186803b158015611ab757600080fd5b505afa158015611acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aef9190611ca6565b1115611bbb5760405163095ea7b360e01b81526001600160a01b0382811660048301526000602483015283169063095ea7b390604401602060405180830381600087803b158015611b3f57600080fd5b505af1158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190611c6e565b611bbb5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185c1c1c9bdd985b0819985a5b1959605a1b60448201526064016102d1565b5050565b600060208284031215611bd0578081fd5b8135611bdb81611f23565b9392505050565b600060208284031215611bf3578081fd5b8151611bdb81611f23565b600080600080600060a08688031215611c15578081fd5b8535611c2081611f23565b94506020860135611c3081611f23565b93506040860135611c4081611f23565b92506060860135611c5081611f23565b91506080860135611c6081611f23565b809150509295509295909350565b600060208284031215611c7f578081fd5b81518015158114611bdb578182fd5b600060208284031215611c9f578081fd5b5035919050565b600060208284031215611cb7578081fd5b5051919050565b600080600060608486031215611cd2578283fd5b8335925060208401359150604084013567ffffffffffffffff80821115611cf7578283fd5b818601915086601f830112611d0a578283fd5b813581811115611d1c57611d1c611f0d565b604051601f8201601f19908116603f01168101908382118183101715611d4457611d44611f0d565b81604052828152896020848701011115611d5c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600080600060608486031215611d91578283fd5b505081359360208301359350604090920135919050565b60008251815b81811015611dc85760208186018101518583015201611dae565b81811115611dd65782828501525b509190910192915050565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b6020808252600e908201526d27b7363c903232b837b9b4ba37b960911b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260139082015272139bdd081a5b9a5d1a585b1a5e9959081e595d606a1b604082015260600190565b60208082526019908201527f43757272656e74206f72646572207374696c6c20616c69766500000000000000604082015260600190565b60008219821115611edb57611edb611ef7565b500190565b600082821015611ef257611ef2611ef7565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ec257600080fdfea264697066735822122098bc791eb59803e9233140cd83ccee9429aeb1d38a4a8256d1e7ebef299d7ec564736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063d7c6fe4511610066578063d7c6fe45146101f0578063e9bd42ac14610203578063ec06e80d14610216578063f2fde38b1461029457600080fd5b80638da5cb5b146101a6578063af83425a146101b7578063b6b55f25146101ca578063cad2cba1146101dd57600080fd5b806332a3cf96116100d357806332a3cf96146101655780633fab693f146101785780636a8165481461018b578063892e83041461019357600080fd5b80631459457a14610105578063254114731461011a5780632d8dcef11461014a57806331905d2814610152575b600080fd5b610118610113366004611bfe565b6102a7565b005b600a5461012d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b610118610425565b60085461012d906001600160a01b031681565b600c5461012d906001600160a01b031681565b600b5461012d906001600160a01b031681565b6101186104ae565b6101186101a1366004611cbe565b6105b9565b6000546001600160a01b031661012d565b6101186101c5366004611bbf565b610c36565b6101186101d8366004611c8e565b610da8565b60095461012d906001600160a01b031681565b6101186101fe366004611d7d565b610ec5565b610118610211366004611bbf565b6110f2565b600354600454600554600254600654600854600954600c5460408051958652602086019890985296840195909552606083019390935260808201526001600160a01b0391821660a0820152911660c082015260ff600160a01b8304811660e0830152600160a81b909204909116151561010082015261012001610141565b6101186102a2366004611bbf565b611257565b6000546001600160a01b031633146102da5760405162461bcd60e51b81526004016102d190611de1565b60405180910390fd5b600054600160a01b900460ff161561032a5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016102d1565b816001600160a01b0316836001600160a01b0316141561037b5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103830b4b960a11b60448201526064016102d1565b6001600160a01b0381166103c05760405162461bcd60e51b815260206004820152600c60248201526b496e76616c696420686f6f6b60a01b60448201526064016102d1565b600a80546001600160a01b03199081166001600160a01b0388811691909117909255600b80548216878416179055600880548216868416179055600980548216858416179055600c805490911691831691909117905561041e611340565b5050505050565b600260015414156104485760405162461bcd60e51b81526004016102d190611e2d565b6002600155600b546001600160a01b031633146104775760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff166104a05760405162461bcd60e51b81526004016102d190611e64565b6104a86113a5565b60018055565b600260015414156104d15760405162461bcd60e51b81526004016102d190611e2d565b6002600155600b546001600160a01b031633146105005760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff166105295760405162461bcd60e51b81526004016102d190611e64565b600c54600160a01b900460ff166001146105755760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461746560981b60448201526064016102d1565b600c805460ff60a01b1916600360a01b1790556040517fe3b6cd2f9892ca2f546d2377283b0e5d6597f14b3f463814faafba0f9a2f8efd90600090a16104a86113a5565b600260015414156105dc5760405162461bcd60e51b81526004016102d190611e2d565b6002600155600a546001600160a01b031633146106295760405162461bcd60e51b815260206004820152600b60248201526a27b7363c903a3930b232b960a91b60448201526064016102d1565b600054600160a01b900460ff166106525760405162461bcd60e51b81526004016102d190611e64565b600c54600160a01b900460ff1660011461069e5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c696420737461746560981b60448201526064016102d1565b42600354116106e25760405162461bcd60e51b815260206004820152601060248201526f111958591b1a5b9948195e1c1a5c995960821b60448201526064016102d1565b60075483111561072a5760405162461bcd60e51b8152602060048201526013602482015272141c9a58d9481b1a5b5a5d081c995858da1959606a1b60448201526064016102d1565b6008546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561077257600080fd5b505afa158015610786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107aa9190611ca6565b9050600081116107f35760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102d1565b6009546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b15801561083b57600080fd5b505afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108739190611ca6565b9050600073def171fe48cf0115b1d80b88dc8eab59176fee576001600160a01b0316866040516108a39190611da8565b6000604051808303816000865af19150503d80600081146108e0576040519150601f19603f3d011682016040523d82523d6000602084013e6108e5565b606091505b50509050806109245760405162461bcd60e51b815260206004820152600b60248201526a14ddd85c0819985a5b195960aa1b60448201526064016102d1565b6040516370a0823160e01b81523060048201526000906001600160a01b038716906370a082319060240160206040518083038186803b15801561096657600080fd5b505afa15801561097a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061099e9190611ca6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038616906370a082319060240160206040518083038186803b1580156109e357600080fd5b505afa1580156109f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1b9190611ca6565b9050838111610a605760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420737761703a2042757960781b60448201526064016102d1565b818611610aa45760405162461bcd60e51b8152602060048201526012602482015271125b9d985b1a59081cddd85c0e8814d95b1b60721b60448201526064016102d1565b6000610ab08583611ee0565b905089811015610b025760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420616d6f756e7420726563656976656400000000000000000060448201526064016102d1565b8060056000828254610b149190611ec8565b9091555060009050610b268489611ee0565b90508b811115610b6f5760405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a5908185b5bdd5b9d081cdc195b9d60621b60448201526064016102d1565b8060046000828254610b819190611ec8565b9091555050600854600954604080516001600160a01b03938416815260208101859052929091168282015260608201849052517f7b233ad45c8a937cf938d2bf9cff79a91863df216e21cf05ef00b0d3ef775e8b9181900360800190a16006548310610c2457600c805460ff60a01b1916600160a11b1790556040517fc6bd8a54a47719851e2d0c7af0275847e55002e9aa4011e0f200eb516147bcc290600090a15b50506001805550505050505050505050565b6000546001600160a01b03163314610c605760405162461bcd60e51b81526004016102d190611de1565b600054600160a01b900460ff16610c895760405162461bcd60e51b81526004016102d190611e64565b6001600160a01b038116610cd35760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103232b837b9b4ba37b960791b60448201526064016102d1565b600b546001600160a01b0382811691161415610d295760405162461bcd60e51b815260206004820152601560248201527411195c1bdcda5d1bdc88185b1c9958591e481cd95d605a1b60448201526064016102d1565b600c54600160a81b900460ff1615610d535760405162461bcd60e51b81526004016102d190611e91565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527ff4a8d3a7ff68c7e146b21723ad2c83c9a0e56fb23f9b724b40b246a85dcc432f906020015b60405180910390a150565b600b546001600160a01b03163314610dd25760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff16610dfb5760405162461bcd60e51b81526004016102d190611e64565b6008546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610e4d57600080fd5b505af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e859190611c6e565b610ec25760405162461bcd60e51b815260206004820152600e60248201526d11195c1bdcda5d0819985a5b195960921b60448201526064016102d1565b50565b600b546001600160a01b03163314610eef5760405162461bcd60e51b81526004016102d190611e05565b600054600160a01b900460ff16610f185760405162461bcd60e51b81526004016102d190611e64565b428311610f5a5760405162461bcd60e51b815260206004820152601060248201526f496e76616c696420646561646c696e6560801b60448201526064016102d1565b60008211610f9f5760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642074726164652073697a6560701b60448201526064016102d1565b60008111610fe55760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081c1c9a58d9481b1a5b5a5d606a1b60448201526064016102d1565b600c54600160a81b900460ff161561100f5760405162461bcd60e51b81526004016102d190611e91565b42600255600383905560068290556007819055600060058190556004908155600c805461ffff60a01b19811661010160a01b179091556008546009546040516302abe24760e31b81526001600160a01b0392831694810194909452811660248401526044830186905260648301859052169063155f123890608401600060405180830381600087803b1580156110a457600080fd5b505af11580156110b8573d6000803e3d6000fd5b505050506110c4611776565b6040517fee22791e4e292d1e09f9ab3d67dd775115e4cdddb044599e9b73c7b85235ac9190600090a1505050565b6000546001600160a01b0316331461111c5760405162461bcd60e51b81526004016102d190611de1565b600054600160a01b900460ff166111455760405162461bcd60e51b81526004016102d190611e64565b6001600160a01b03811661118c5760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a3930b232b960911b60448201526064016102d1565b600a546001600160a01b03828116911614156111df5760405162461bcd60e51b8152602060048201526012602482015271151c9859195c88185b1c9958591e481cd95d60721b60448201526064016102d1565b600c54600160a81b900460ff16156112095760405162461bcd60e51b81526004016102d190611e91565b600a80546001600160a01b0319166001600160a01b0383169081179091556040519081527fd5871f49beddf166c4195606394350e87d297c580591f3a12be15b037d65173c90602001610d9d565b6000546001600160a01b031633146112815760405162461bcd60e51b81526004016102d190611de1565b6001600160a01b0381166112d75760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616464726573732072657175697265640000000000000060448201526064016102d1565b600054604080516001600160a01b03928316815291831660208301527ff77c6eb92f5003da08a86ab833733c2f7f05480f4cc11bf57bf9fecb10873ad7910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b600054600160a01b900460ff16156113905760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016102d1565b6000805460ff60a01b1916600160a01b179055565b600c54600160a81b900460ff166113fe5760405162461bcd60e51b815260206004820152601960248201527f43757272656e74206f72646572206973206e6f74206c6976650000000000000060448201526064016102d1565b600c54600160a01b900460ff16600214806114255750600c54600160a01b900460ff166003145b806114485750600c54600160a01b900460ff166001148015611448575060035442115b61148d5760405162461bcd60e51b815260206004820152601660248201527510d85b9b9bdd0818db1bdcd9481bdc99195c881e595d60521b60448201526064016102d1565b600c805460ff60a81b191690556008546009546040516370a0823160e01b81523060048201526001600160a01b03928316929091169060009083906370a082319060240160206040518083038186803b1580156114e957600080fd5b505afa1580156114fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115219190611ca6565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b15801561156657600080fd5b505afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190611ca6565b9050811561167057600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529085169063a9059cbb90604401602060405180830381600087803b1580156115f457600080fd5b505af1158015611608573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162c9190611c6e565b6116705760405162461bcd60e51b8152602060048201526015602482015274151c985b9cd9995c8819985a5b19590e881cd95b1b605a1b60448201526064016102d1565b801561173f57600b5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529084169063a9059cbb90604401602060405180830381600087803b1580156116c457600080fd5b505af11580156116d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116fc9190611c6e565b61173f5760405162461bcd60e51b81526020600482015260146024820152735472616e73666572206661696c65643a2062757960601b60448201526064016102d1565b6117476119d4565b6040517f3e76d02bc1cb8240113b770474afecf42a936e6a79b908d1dde8c053375599f890600090a150505050565b6008546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a082319060240160206040518083038186803b1580156117be57600080fd5b505afa1580156117d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f69190611ca6565b9050600073def171fe48cf0115b1d80b88dc8eab59176fee576001600160a01b031663d2c4b5986040518163ffffffff1660e01b815260040160206040518083038186803b15801561184757600080fd5b505afa15801561185b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187f9190611be2565b604051636eb1769f60e11b81523060048201526001600160a01b038083166024830152919250839185169063dd62ed3e9060440160206040518083038186803b1580156118cb57600080fd5b505afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190611ca6565b10156119cf5760405163095ea7b360e01b81526001600160a01b0382811660048301526024820184905284169063095ea7b390604401602060405180830381600087803b15801561195357600080fd5b505af1158015611967573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198b9190611c6e565b6119cf5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185c1c1c9bdd985b0819985a5b1959605a1b60448201526064016102d1565b505050565b60085460408051631a5896b360e31b815290516001600160a01b039092169160009173def171fe48cf0115b1d80b88dc8eab59176fee579163d2c4b59891600480820192602092909190829003018186803b158015611a3257600080fd5b505afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a9190611be2565b604051636eb1769f60e11b81523060048201526001600160a01b03808316602483015291925060009184169063dd62ed3e9060440160206040518083038186803b158015611ab757600080fd5b505afa158015611acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aef9190611ca6565b1115611bbb5760405163095ea7b360e01b81526001600160a01b0382811660048301526000602483015283169063095ea7b390604401602060405180830381600087803b158015611b3f57600080fd5b505af1158015611b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b779190611c6e565b611bbb5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b88185c1c1c9bdd985b0819985a5b1959605a1b60448201526064016102d1565b5050565b600060208284031215611bd0578081fd5b8135611bdb81611f23565b9392505050565b600060208284031215611bf3578081fd5b8151611bdb81611f23565b600080600080600060a08688031215611c15578081fd5b8535611c2081611f23565b94506020860135611c3081611f23565b93506040860135611c4081611f23565b92506060860135611c5081611f23565b91506080860135611c6081611f23565b809150509295509295909350565b600060208284031215611c7f578081fd5b81518015158114611bdb578182fd5b600060208284031215611c9f578081fd5b5035919050565b600060208284031215611cb7578081fd5b5051919050565b600080600060608486031215611cd2578283fd5b8335925060208401359150604084013567ffffffffffffffff80821115611cf7578283fd5b818601915086601f830112611d0a578283fd5b813581811115611d1c57611d1c611f0d565b604051601f8201601f19908116603f01168101908382118183101715611d4457611d44611f0d565b81604052828152896020848701011115611d5c578586fd5b82602086016020830137856020848301015280955050505050509250925092565b600080600060608486031215611d91578283fd5b505081359360208301359350604090920135919050565b60008251815b81811015611dc85760208186018101518583015201611dae565b81811115611dd65782828501525b509190910192915050565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b6020808252600e908201526d27b7363c903232b837b9b4ba37b960911b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260139082015272139bdd081a5b9a5d1a585b1a5e9959081e595d606a1b604082015260600190565b60208082526019908201527f43757272656e74206f72646572207374696c6c20616c69766500000000000000604082015260600190565b60008219821115611edb57611edb611ef7565b500190565b600082821015611ef257611ef2611ef7565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610ec257600080fdfea264697066735822122098bc791eb59803e9233140cd83ccee9429aeb1d38a4a8256d1e7ebef299d7ec564736f6c63430008040033

Deployed Bytecode Sourcemap

6321:8551:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8078:586;;;;;;:::i;:::-;;:::i;:::-;;6941:28;;;;;-1:-1:-1;;;;;6941:28:0;;;;;;-1:-1:-1;;;;;4160:32:1;;;;4142:51;;4130:2;4115:18;6941:28:0;;;;;;;;12715:105;;;:::i;6860:34::-;;;;;-1:-1:-1;;;;;6860:34:0;;;7014:26;;;;;-1:-1:-1;;;;;7014:26:0;;;6976:31;;;;;-1:-1:-1;;;;;6976:31:0;;;12463:244;;;:::i;10545:1910::-;;;;;;:::i;:::-;;:::i;5123:90::-;5172:7;5199:6;-1:-1:-1;;;;;5199:6:0;5123:90;;9038:391;;;;;;:::i;:::-;;:::i;10325:212::-;;;;;;:::i;:::-;;:::i;6901:33::-;;;;;-1:-1:-1;;;;;6901:33:0;;;9437:880;;;;;;:::i;:::-;;:::i;8672:358::-;;;;;;:::i;:::-;;:::i;14347:522::-;14585:9;;14614:6;;14641:7;;14672:10;;14706;;14738:19;;14779:18;;14817:13;;14347:522;;;17833:25:1;;;17889:2;17874:18;;17867:34;;;;17917:18;;;17910:34;;;;17975:2;17960:18;;17953:34;;;;18018:3;18003:19;;17996:35;-1:-1:-1;;;;;14738:19:0;;;-1:-1:-1;18085:19:1;;18078:44;14779:18:0;;18153:3:1;18138:19;;18131:44;14817:13:0;-1:-1:-1;;;14817:13:0;;;;18206:3:1;18191:19;;18184:46;-1:-1:-1;;;14850:11:0;;;;;;18274:14:1;18267:22;18261:3;18246:19;;18239:51;17820:3;17805:19;14347:522:0;17787:509:1;4778:220:0;;;;;;:::i;:::-;;:::i;8078:586::-;4508:6;;-1:-1:-1;;;;;4508:6:0;4518:10;4508:20;4500:43;;;;-1:-1:-1;;;4500:43:0;;7597:2:1;4500:43:0;;;7579:21:1;7636:2;7616:18;;;7609:30;-1:-1:-1;;;7655:18:1;;;7648:40;7705:18;;4500:43:0;;;;;;;;;3601:15:::1;::::0;-1:-1:-1;;;3601:15:0;::::1;;;3600:16;3592:48;;;::::0;-1:-1:-1;;;3592:48:0;;14522:2:1;3592:48:0::1;::::0;::::1;14504:21:1::0;14561:2;14541:18;;;14534:30;-1:-1:-1;;;14580:18:1;;;14573:49;14639:18;;3592:48:0::1;14494:169:1::0;3592:48:0::1;-1:-1:-1::0;;;;;8266:45:0;;::::2;::::0;;::::2;;;8258:70;;;::::0;-1:-1:-1;;;8258:70:0;;8627:2:1;8258:70:0::2;::::0;::::2;8609:21:1::0;8666:2;8646:18;;;8639:30;-1:-1:-1;;;8685:18:1;;;8678:42;8737:18;;8258:70:0::2;8599:162:1::0;8258:70:0::2;-1:-1:-1::0;;;;;8347:27:0;::::2;8339:52;;;::::0;-1:-1:-1;;;8339:52:0;;10357:2:1;8339:52:0::2;::::0;::::2;10339:21:1::0;10396:2;10376:18;;;10369:30;-1:-1:-1;;;10415:18:1;;;10408:42;10467:18;;8339:52:0::2;10329:162:1::0;8339:52:0::2;8404:13;:26:::0;;-1:-1:-1;;;;;;8404:26:0;;::::2;-1:-1:-1::0;;;;;8404:26:0;;::::2;::::0;;;::::2;::::0;;;8441:16:::2;:32:::0;;;::::2;::::0;;::::2;;::::0;;8484:19:::2;:43:::0;;;::::2;::::0;;::::2;;::::0;;8538:18:::2;:41:::0;;;::::2;::::0;;::::2;;::::0;;8590:11:::2;:27:::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;8630:26:::2;:24;:26::i;:::-;8078:586:::0;;;;;:::o;12715:105::-;2185:1;2781:7;;:19;;2773:63;;;;-1:-1:-1;;;2773:63:0;;;;;;;:::i;:::-;2185:1;2914:7;:18;7625:16:::1;::::0;-1:-1:-1;;;;;7625:16:0::1;7645:10;7625:30;7617:57;;;::::0;-1:-1:-1;;;7617:57:0;;15574:2:1;7617:57:0::1;::::0;::::1;15556:21:1::0;15613:2;15593:18;;;15586:30;-1:-1:-1;;;15632:18:1;;;15625:44;15686:18;;7617:57:0::1;15546:164:1::0;7617:57:0::1;3403:15:::2;::::0;-1:-1:-1;;;3403:15:0;::::2;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::2;::::0;::::2;;;:::i;:::-;12799:13:::3;:11;:13::i;:::-;2141:1:::0;3093:22;;12715:105::o;12463:244::-;2185:1;2781:7;;:19;;2773:63;;;;-1:-1:-1;;;2773:63:0;;;;;;;:::i;:::-;2185:1;2914:7;:18;7625:16:::1;::::0;-1:-1:-1;;;;;7625:16:0::1;7645:10;7625:30;7617:57;;;::::0;-1:-1:-1;;;7617:57:0;;15574:2:1;7617:57:0::1;::::0;::::1;15556:21:1::0;15613:2;15593:18;;;15586:30;-1:-1:-1;;;15632:18:1;;;15625:44;15686:18;;7617:57:0::1;15546:164:1::0;7617:57:0::1;3403:15:::2;::::0;-1:-1:-1;;;3403:15:0;::::2;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::2;::::0;::::2;;;:::i;:::-;12556:13:::3;::::0;:29:::3;-1:-1:-1::0;;;12556:13:0;;::::3;;-1:-1:-1::0;12556:29:0::3;12548:55;;;::::0;-1:-1:-1;;;12548:55:0;;12435:2:1;12548:55:0::3;::::0;::::3;12417:21:1::0;12474:2;12454:18;;;12447:30;-1:-1:-1;;;12493:18:1;;;12486:43;12546:18;;12548:55:0::3;12407:163:1::0;12548:55:0::3;12616:13;:31:::0;;-1:-1:-1;;;;12616:31:0::3;-1:-1:-1::0;;;12616:31:0::3;::::0;;12663:10:::3;::::0;::::3;::::0;-1:-1:-1;;12663:10:0::3;12686:13;:11;:13::i;10545:1910::-:0;2185:1;2781:7;;:19;;2773:63;;;;-1:-1:-1;;;2773:63:0;;;;;;;:::i;:::-;2185:1;2914:7;:18;7510:13:::1;::::0;-1:-1:-1;;;;;7510:13:0::1;7527:10;7510:27;7502:51;;;::::0;-1:-1:-1;;;7502:51:0;;8968:2:1;7502:51:0::1;::::0;::::1;8950:21:1::0;9007:2;8987:18;;;8980:30;-1:-1:-1;;;9026:18:1;;;9019:41;9077:18;;7502:51:0::1;8940:161:1::0;7502:51:0::1;3403:15:::2;::::0;-1:-1:-1;;;3403:15:0;::::2;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::2;::::0;::::2;;;:::i;:::-;10681:13:::3;::::0;:29:::3;-1:-1:-1::0;;;10681:13:0;;::::3;;-1:-1:-1::0;10681:29:0::3;10673:55;;;::::0;-1:-1:-1;;;10673:55:0;;12435:2:1;10673:55:0::3;::::0;::::3;12417:21:1::0;12474:2;12454:18;;;12447:30;-1:-1:-1;;;12493:18:1;;;12486:43;12546:18;;10673:55:0::3;12407:163:1::0;10673:55:0::3;10759:15;10747:9;;:27;10739:56;;;::::0;-1:-1:-1;;;10739:56:0;;11045:2:1;10739:56:0::3;::::0;::::3;11027:21:1::0;11084:2;11064:18;;;11057:30;-1:-1:-1;;;11103:18:1;;;11096:46;11159:18;;10739:56:0::3;11017:166:1::0;10739:56:0::3;10866:11;;10855:7;:22;;10847:54;;;::::0;-1:-1:-1;;;10847:54:0;;7936:2:1;10847:54:0::3;::::0;::::3;7918:21:1::0;7975:2;7955:18;;;7948:30;-1:-1:-1;;;7994:18:1;;;7987:49;8053:18;;10847:54:0::3;7908:169:1::0;10847:54:0::3;10956:19;::::0;11016:37:::3;::::0;-1:-1:-1;;;11016:37:0;;11047:4:::3;11016:37;::::0;::::3;4142:51:1::0;-1:-1:-1;;;;;10956:19:0;;::::3;::::0;10915:25:::3;::::0;10956:19;;11016:22:::3;::::0;4115:18:1;;11016:37:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10987:66;;11093:1;11072:18;:22;11064:55;;;::::0;-1:-1:-1;;;11064:55:0;;10008:2:1;11064:55:0::3;::::0;::::3;9990:21:1::0;10047:2;10027:18;;;10020:30;-1:-1:-1;;;10066:18:1;;;10059:50;10126:18;;11064:55:0::3;9980:170:1::0;11064:55:0::3;11172:18;::::0;11230:36:::3;::::0;-1:-1:-1;;;11230:36:0;;11260:4:::3;11230:36;::::0;::::3;4142:51:1::0;-1:-1:-1;;;;;11172:18:0;;::::3;::::0;11132:24:::3;::::0;11172:18;;11230:21:::3;::::0;4115:18:1;;11230:36:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11314:35;::::0;11202:64;;-1:-1:-1;11297:12:0::3;::::0;6467:42:::3;::::0;11314:35:::3;::::0;11341:7;;11314:35:::3;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11296:53;;;11414:7;11406:31;;;::::0;-1:-1:-1;;;11406:31:0;;7257:2:1;11406:31:0::3;::::0;::::3;7239:21:1::0;7296:2;7276:18;;;7269:30;-1:-1:-1;;;7315:18:1;;;7308:41;7366:18;;11406:31:0::3;7229:161:1::0;11406:31:0::3;11478:37;::::0;-1:-1:-1;;;11478:37:0;;11509:4:::3;11478:37;::::0;::::3;4142:51:1::0;11450:25:0::3;::::0;-1:-1:-1;;;;;11478:22:0;::::3;::::0;::::3;::::0;4115:18:1;;11478:37:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11553:36;::::0;-1:-1:-1;;;11553:36:0;;11583:4:::3;11553:36;::::0;::::3;4142:51:1::0;11450:65:0;;-1:-1:-1;11526:24:0::3;::::0;-1:-1:-1;;;;;11553:21:0;::::3;::::0;::::3;::::0;4115:18:1;;11553:36:0::3;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11526:63;;11627:17;11608:16;:36;11600:66;;;::::0;-1:-1:-1;;;11600:66:0;;13124:2:1;11600:66:0::3;::::0;::::3;13106:21:1::0;13163:2;13143:18;;;13136:30;-1:-1:-1;;;13182:18:1;;;13175:47;13239:18;;11600:66:0::3;13096:167:1::0;11600:66:0::3;11706:17;11685:18;:38;11677:69;;;::::0;-1:-1:-1;;;11677:69:0;;16973:2:1;11677:69:0::3;::::0;::::3;16955:21:1::0;17012:2;16992:18;;;16985:30;-1:-1:-1;;;17031:18:1;;;17024:48;17089:18;;11677:69:0::3;16945:168:1::0;11677:69:0::3;11824:22;11849:36;11868:17:::0;11849:16;:36:::3;:::i;:::-;11824:61;;11922:6;11904:14;:24;;11896:60;;;::::0;-1:-1:-1;;;11896:60:0;;13470:2:1;11896:60:0::3;::::0;::::3;13452:21:1::0;13509:2;13489:18;;;13482:30;13548:25;13528:18;;;13521:53;13591:18;;11896:60:0::3;13442:173:1::0;11896:60:0::3;11978:14;11967:7;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;12060:18:0::3;::::0;-1:-1:-1;12081:38:0::3;12102:17:::0;12081:18;:38:::3;:::i;:::-;12060:59;;12152:7;12138:10;:21;;12130:54;;;::::0;-1:-1:-1;;;12130:54:0;;6565:2:1;12130:54:0::3;::::0;::::3;6547:21:1::0;6604:2;6584:18;;;6577:30;-1:-1:-1;;;6623:18:1;;;6616:50;6683:18;;12130:54:0::3;6537:170:1::0;12130:54:0::3;12205:10;12195:6;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12240:19:0::3;::::0;12273:18:::3;::::0;12233:75:::3;::::0;;-1:-1:-1;;;;;12240:19:0;;::::3;6180:34:1::0;;6245:2;6230:18;;6223:34;;;12273:18:0;;;::::3;6273::1::0;;;6266:43;6340:2;6325:18;;6318:34;;;12233:75:0;::::3;::::0;;;;6129:3:1;12233:75:0;;::::3;12345:10;;12325:16;:30;12321:127;;12372:13;:30:::0;;-1:-1:-1;;;;12372:30:0::3;-1:-1:-1::0;;;12372:30:0::3;::::0;;12422:14:::3;::::0;::::3;::::0;-1:-1:-1;;12422:14:0::3;12321:127;-1:-1:-1::0;;2141:1:0;3093:22;;-1:-1:-1;;;;;;;;;;10545:1910:0:o;9038:391::-;4508:6;;-1:-1:-1;;;;;4508:6:0;4518:10;4508:20;4500:43;;;;-1:-1:-1;;;4500:43:0;;7597:2:1;4500:43:0;;;7579:21:1;7636:2;7616:18;;;7609:30;-1:-1:-1;;;7655:18:1;;;7648:40;7705:18;;4500:43:0;7569:160:1;4500:43:0;3403:15:::1;::::0;-1:-1:-1;;;3403:15:0;::::1;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;9139:27:0;::::2;9131:57;;;::::0;-1:-1:-1;;;9131:57:0;;14176:2:1;9131:57:0::2;::::0;::::2;14158:21:1::0;14215:2;14195:18;;;14188:30;-1:-1:-1;;;14234:18:1;;;14227:47;14291:18;;9131:57:0::2;14148:167:1::0;9131:57:0::2;9224:16;::::0;-1:-1:-1;;;;;9207:33:0;;::::2;9224:16:::0;::::2;9207:33;;9199:67;;;::::0;-1:-1:-1;;;9199:67:0;;9308:2:1;9199:67:0::2;::::0;::::2;9290:21:1::0;9347:2;9327:18;;;9320:30;-1:-1:-1;;;9366:18:1;;;9359:51;9427:18;;9199:67:0::2;9280:171:1::0;9199:67:0::2;9286:11;::::0;-1:-1:-1;;;9286:11:0;::::2;;;9285:12;9277:50;;;::::0;-1:-1:-1;;;9277:50:0;;::::2;::::0;::::2;;;:::i;:::-;9340:16;:32:::0;;-1:-1:-1;;;;;;9340:32:0::2;-1:-1:-1::0;;;;;9340:32:0;::::2;::::0;;::::2;::::0;;;9388:33:::2;::::0;4142:51:1;;;9388:33:0::2;::::0;4130:2:1;4115:18;9388:33:0::2;;;;;;;;9038:391:::0;:::o;10325:212::-;7625:16;;-1:-1:-1;;;;;7625:16:0;7645:10;7625:30;7617:57;;;;-1:-1:-1;;;7617:57:0;;15574:2:1;7617:57:0;;;15556:21:1;15613:2;15593:18;;;15586:30;-1:-1:-1;;;15632:18:1;;;15625:44;15686:18;;7617:57:0;15546:164:1;7617:57:0;3403:15:::1;::::0;-1:-1:-1;;;3403:15:0;::::1;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::1;::::0;::::1;;;:::i;:::-;10435:19:::2;::::0;10422:88:::2;::::0;-1:-1:-1;;;10422:88:0;;10469:10:::2;10422:88;::::0;::::2;4753:34:1::0;10489:4:0::2;4803:18:1::0;;;4796:43;4855:18;;;4848:34;;;-1:-1:-1;;;;;10435:19:0;;::::2;::::0;10422:46:::2;::::0;4688:18:1;;10422:88:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10414:115;;;::::0;-1:-1:-1;;;10414:115:0;;8284:2:1;10414:115:0::2;::::0;::::2;8266:21:1::0;8323:2;8303:18;;;8296:30;-1:-1:-1;;;8342:18:1;;;8335:44;8396:18;;10414:115:0::2;8256:164:1::0;10414:115:0::2;10325:212:::0;:::o;9437:880::-;7625:16;;-1:-1:-1;;;;;7625:16:0;7645:10;7625:30;7617:57;;;;-1:-1:-1;;;7617:57:0;;15574:2:1;7617:57:0;;;15556:21:1;15613:2;15593:18;;;15586:30;-1:-1:-1;;;15632:18:1;;;15625:44;15686:18;;7617:57:0;15546:164:1;7617:57:0;3403:15:::1;::::0;-1:-1:-1;;;3403:15:0;::::1;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::1;::::0;::::1;;;:::i;:::-;9590:15:::2;9576:11;:29;9568:58;;;::::0;-1:-1:-1;;;9568:58:0;;12090:2:1;9568:58:0::2;::::0;::::2;12072:21:1::0;12129:2;12109:18;;;12102:30;-1:-1:-1;;;12148:18:1;;;12141:46;12204:18;;9568:58:0::2;12062:166:1::0;9568:58:0::2;9698:1;9686:9;:13;9678:44;;;::::0;-1:-1:-1;;;9678:44:0;;12777:2:1;9678:44:0::2;::::0;::::2;12759:21:1::0;12816:2;12796:18;;;12789:30;-1:-1:-1;;;12835:18:1;;;12828:48;12893:18;;9678:44:0::2;12749:168:1::0;9678:44:0::2;9757:1;9741:13;:17;9733:49;;;::::0;-1:-1:-1;;;9733:49:0;;15917:2:1;9733:49:0::2;::::0;::::2;15899:21:1::0;15956:2;15936:18;;;15929:30;-1:-1:-1;;;15975:18:1;;;15968:49;16034:18;;9733:49:0::2;15889:169:1::0;9733:49:0::2;9802:11;::::0;-1:-1:-1;;;9802:11:0;::::2;;;9801:12;9793:50;;;::::0;-1:-1:-1;;;9793:50:0;;::::2;::::0;::::2;;;:::i;:::-;9869:15;9856:10;:28:::0;9936:9:::2;:23:::0;;;9970:10:::2;:22:::0;;;10003:11:::2;:27:::0;;;-1:-1:-1;10041:7:0::2;:11:::0;;;10063:6:::2;:10:::0;;;10084:11:::2;:18:::0;;-1:-1:-1;;;;;;;10113:28:0;;;;;;10193:19:::2;::::0;10214:18:::2;::::0;10154:103:::2;::::0;;-1:-1:-1;;;10154:103:0;;-1:-1:-1;;;;;10193:19:0;;::::2;10154:103:::0;;::::2;5162:34:1::0;;;;10214:18:0;;::::2;5212::1::0;;;5205:43;5264:18;;;5257:34;;;5307:18;;;5300:34;;;10154:103:0;10164:11;;;10154:38:::2;::::0;5096:19:1;;;;;10154:103:0;;;;;;-1:-1:-1;10164:11:0;10154:103;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;10270:15;:13;:15::i;:::-;10301:8;::::0;::::2;::::0;;;::::2;9437:880:::0;;;:::o;8672:358::-;4508:6;;-1:-1:-1;;;;;4508:6:0;4518:10;4508:20;4500:43;;;;-1:-1:-1;;;4500:43:0;;7597:2:1;4500:43:0;;;7579:21:1;7636:2;7616:18;;;7609:30;-1:-1:-1;;;7655:18:1;;;7648:40;7705:18;;4500:43:0;7569:160:1;4500:43:0;3403:15:::1;::::0;-1:-1:-1;;;3403:15:0;::::1;;;3395:47;;;::::0;-1:-1:-1;;;3395:47:0;;::::1;::::0;::::1;;;:::i;:::-;-1:-1:-1::0;;;;;8767:24:0;::::2;8759:51;;;::::0;-1:-1:-1;;;8759:51:0;;6914:2:1;8759:51:0::2;::::0;::::2;6896:21:1::0;6953:2;6933:18;;;6926:30;-1:-1:-1;;;6972:18:1;;;6965:44;7026:18;;8759:51:0::2;6886:164:1::0;8759:51:0::2;8843:13;::::0;-1:-1:-1;;;;;8829:27:0;;::::2;8843:13:::0;::::2;8829:27;;8821:58;;;::::0;-1:-1:-1;;;8821:58:0;;10698:2:1;8821:58:0::2;::::0;::::2;10680:21:1::0;10737:2;10717:18;;;10710:30;-1:-1:-1;;;10756:18:1;;;10749:48;10814:18;;8821:58:0::2;10670:168:1::0;8821:58:0::2;8899:11;::::0;-1:-1:-1;;;8899:11:0;::::2;;;8898:12;8890:50;;;::::0;-1:-1:-1;;;8890:50:0;;::::2;::::0;::::2;;;:::i;:::-;8953:13;:26:::0;;-1:-1:-1;;;;;;8953:26:0::2;-1:-1:-1::0;;;;;8953:26:0;::::2;::::0;;::::2;::::0;;;8995:27:::2;::::0;4142:51:1;;;8995:27:0::2;::::0;4130:2:1;4115:18;8995:27:0::2;4097:102:1::0;4778:220:0;4508:6;;-1:-1:-1;;;;;4508:6:0;4518:10;4508:20;4500:43;;;;-1:-1:-1;;;4500:43:0;;7597:2:1;4500:43:0;;;7579:21:1;7636:2;7616:18;;;7609:30;-1:-1:-1;;;7655:18:1;;;7648:40;7705:18;;4500:43:0;7569:160:1;4500:43:0;-1:-1:-1;;;;;4866:18:0;::::1;4858:56;;;::::0;-1:-1:-1;;;4858:56:0;;13822:2:1;4858:56:0::1;::::0;::::1;13804:21:1::0;13861:2;13841:18;;;13834:30;13900:27;13880:18;;;13873:55;13945:18;;4858:56:0::1;13794:175:1::0;4858:56:0::1;4953:6;::::0;4930:36:::1;::::0;;-1:-1:-1;;;;;4953:6:0;;::::1;4416:34:1::0;;4486:15;;;4481:2;4466:18;;4459:43;4930:36:0;;::::1;::::0;;;;;;;;::::1;4977:6;:13:::0;;-1:-1:-1;;;;;;4977:13:0::1;-1:-1:-1::0;;;;;4977:13:0;;;::::1;::::0;;;::::1;::::0;;4778:220::o;3737:104::-;3601:15;;-1:-1:-1;;;3601:15:0;;;;3600:16;3592:48;;;;-1:-1:-1;;;3592:48:0;;14522:2:1;3592:48:0;;;14504:21:1;14561:2;14541:18;;;14534:30;-1:-1:-1;;;14580:18:1;;;14573:49;14639:18;;3592:48:0;14494:169:1;3592:48:0;3811:15:::1;:22:::0;;-1:-1:-1;;;;3811:22:0::1;-1:-1:-1::0;;;3811:22:0::1;::::0;;3737:104::o;12828:702::-;7749:11;;-1:-1:-1;;;7749:11:0;;;;7741:49;;;;-1:-1:-1;;;7741:49:0;;14870:2:1;7741:49:0;;;14852:21:1;14909:2;14889:18;;;14882:30;14948:27;14928:18;;;14921:55;14993:18;;7741:49:0;14842:175:1;7741:49:0;7824:13;;-1:-1:-1;;;7824:13:0;;:31;:13;6604:1;7824:31;;:67;;-1:-1:-1;7859:13:0;;-1:-1:-1;;;7859:13:0;;:32;:13;6653:1;7859:32;7824:67;7823:149;;;-1:-1:-1;7911:13:0;;:29;-1:-1:-1;;;7911:13:0;;;;-1:-1:-1;7911:29:0;:60;;;;;7962:9;;7944:15;:27;7911:60;7801:249;;;;-1:-1:-1;;;7801:249:0;;11390:2:1;7801:249:0;;;11372:21:1;11429:2;11409:18;;;11402:30;-1:-1:-1;;;11448:18:1;;;11441:52;11510:18;;7801:249:0;11362:172:1;7801:249:0;12887:11:::1;:19:::0;;-1:-1:-1;;;;12887:19:0::1;::::0;;12960::::1;::::0;13031:18:::1;::::0;13091:37:::1;::::0;-1:-1:-1;;;13091:37:0;;13122:4:::1;13091:37;::::0;::::1;4142:51:1::0;-1:-1:-1;;;;;12960:19:0;;::::1;::::0;13031:18;;::::1;::::0;-1:-1:-1;;12960:19:0;;13091:22:::1;::::0;4115:18:1;;13091:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13168:36;::::0;-1:-1:-1;;;13168:36:0;;13198:4:::1;13168:36;::::0;::::1;4142:51:1::0;13061:67:0;;-1:-1:-1;13139:26:0::1;::::0;-1:-1:-1;;;;;13168:21:0;::::1;::::0;::::1;::::0;4115:18:1;;13168:36:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13139:65:::0;-1:-1:-1;13221:23:0;;13217:123:::1;;13276:16;::::0;13254:60:::1;::::0;-1:-1:-1;;;13254:60:0;;-1:-1:-1;;;;;13276:16:0;;::::1;13254:60;::::0;::::1;5527:51:1::0;5594:18;;;5587:34;;;13254:21:0;;::::1;::::0;::::1;::::0;5500:18:1;;13254:60:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13246:94;;;::::0;-1:-1:-1;;;13246:94:0;;9658:2:1;13246:94:0::1;::::0;::::1;9640:21:1::0;9697:2;9677:18;;;9670:30;-1:-1:-1;;;9716:18:1;;;9709:51;9777:18;;13246:94:0::1;9630:171:1::0;13246:94:0::1;13355:22:::0;;13351:119:::1;;13408:16;::::0;13387:58:::1;::::0;-1:-1:-1;;;13387:58:0;;-1:-1:-1;;;;;13408:16:0;;::::1;13387:58;::::0;::::1;5527:51:1::0;5594:18;;;5587:34;;;13387:20:0;;::::1;::::0;::::1;::::0;5500:18:1;;13387:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13379:91;;;::::0;-1:-1:-1;;;13379:91:0;;11741:2:1;13379:91:0::1;::::0;::::1;11723:21:1::0;11780:2;11760:18;;;11753:30;-1:-1:-1;;;11799:18:1;;;11792:50;11859:18;;13379:91:0::1;11713:170:1::0;13379:91:0::1;13481:14;:12;:14::i;:::-;13513:9;::::0;::::1;::::0;;;::::1;8061:1;;;;12828:702::o:0;13538:443::-;13617:19;;13673:30;;-1:-1:-1;;;13673:30:0;;13697:4;13673:30;;;4142:51:1;-1:-1:-1;;;;;13617:19:0;;;;13583:18;;13617:19;;13673:15;;4115:18:1;;13673:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13648:55;;13714:17;6467:42;-1:-1:-1;;;;;13734:62:0;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13813:41;;-1:-1:-1;;;13813:41:0;;13837:4;13813:41;;;4416:34:1;-1:-1:-1;;;;;4486:15:1;;;4466:18;;;4459:43;13714:84:0;;-1:-1:-1;13857:14:0;;13813:15;;;;;4351:18:1;;13813:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;13809:165;;;13896:40;;-1:-1:-1;;;13896:40:0;;-1:-1:-1;;;;;5545:32:1;;;13896:40:0;;;5527:51:1;5594:18;;;5587:34;;;13896:13:0;;;;;5500:18:1;;13896:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13888:74;;;;-1:-1:-1;;;13888:74:0;;15224:2:1;13888:74:0;;;15206:21:1;15263:2;15243:18;;;15236:30;-1:-1:-1;;;15282:18:1;;;15275:51;15343:18;;13888:74:0;15196:171:1;13888:74:0;13538:443;;;:::o;13989:350::-;14067:19;;14118:64;;;-1:-1:-1;;;14118:64:0;;;;-1:-1:-1;;;;;14067:19:0;;;;14033:18;;6467:42;;14118:62;;:64;;;;;;;;;;;;;;;6467:42;14118:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14197:41;;-1:-1:-1;;;14197:41:0;;14221:4;14197:41;;;4416:34:1;-1:-1:-1;;;;;4486:15:1;;;4466:18;;;4459:43;14098:84:0;;-1:-1:-1;14241:1:0;;14197:15;;;;;4351:18:1;;14197:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;14193:139;;;14267:27;;-1:-1:-1;;;14267:27:0;;-1:-1:-1;;;;;5545:32:1;;;14267:27:0;;;5527:51:1;14292:1:0;5594:18:1;;;5587:34;14267:13:0;;;;;5500:18:1;;14267:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14259:61;;;;-1:-1:-1;;;14259:61:0;;15224:2:1;14259:61:0;;;15206:21:1;15263:2;15243:18;;;15236:30;-1:-1:-1;;;15282:18:1;;;15275:51;15343:18;;14259:61:0;15196:171:1;14259:61:0;13989:350;;:::o;14:257:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;:::-;260:5;84:187;-1:-1:-1;;;84:187:1:o;276:261::-;346:6;399:2;387:9;378:7;374:23;370:32;367:2;;;420:6;412;405:22;367:2;457:9;451:16;476:31;501:5;476:31;:::i;542:880::-;694:6;702;710;718;726;779:3;767:9;758:7;754:23;750:33;747:2;;;801:6;793;786:22;747:2;845:9;832:23;864:31;889:5;864:31;:::i;:::-;914:5;-1:-1:-1;971:2:1;956:18;;943:32;984:33;943:32;984:33;:::i;:::-;1036:7;-1:-1:-1;1095:2:1;1080:18;;1067:32;1108:33;1067:32;1108:33;:::i;:::-;1160:7;-1:-1:-1;1219:2:1;1204:18;;1191:32;1232:33;1191:32;1232:33;:::i;:::-;1284:7;-1:-1:-1;1343:3:1;1328:19;;1315:33;1357;1315;1357;:::i;:::-;1409:7;1399:17;;;737:685;;;;;;;;:::o;1427:297::-;1494:6;1547:2;1535:9;1526:7;1522:23;1518:32;1515:2;;;1568:6;1560;1553:22;1515:2;1605:9;1599:16;1658:5;1651:13;1644:21;1637:5;1634:32;1624:2;;1685:6;1677;1670:22;1729:190;1788:6;1841:2;1829:9;1820:7;1816:23;1812:32;1809:2;;;1862:6;1854;1847:22;1809:2;-1:-1:-1;1890:23:1;;1799:120;-1:-1:-1;1799:120:1:o;1924:194::-;1994:6;2047:2;2035:9;2026:7;2022:23;2018:32;2015:2;;;2068:6;2060;2053:22;2015:2;-1:-1:-1;2096:16:1;;2005:113;-1:-1:-1;2005:113:1:o;2123:1102::-;2209:6;2217;2225;2278:2;2266:9;2257:7;2253:23;2249:32;2246:2;;;2299:6;2291;2284:22;2246:2;2340:9;2327:23;2317:33;;2397:2;2386:9;2382:18;2369:32;2359:42;;2452:2;2441:9;2437:18;2424:32;2475:18;2516:2;2508:6;2505:14;2502:2;;;2537:6;2529;2522:22;2502:2;2580:6;2569:9;2565:22;2555:32;;2625:7;2618:4;2614:2;2610:13;2606:27;2596:2;;2652:6;2644;2637:22;2596:2;2693;2680:16;2715:2;2711;2708:10;2705:2;;;2721:18;;:::i;:::-;2796:2;2790:9;2764:2;2850:13;;-1:-1:-1;;2846:22:1;;;2870:2;2842:31;2838:40;2826:53;;;2894:18;;;2914:22;;;2891:46;2888:2;;;2940:18;;:::i;:::-;2980:10;2976:2;2969:22;3015:2;3007:6;3000:18;3055:7;3050:2;3045;3041;3037:11;3033:20;3030:33;3027:2;;;3081:6;3073;3066:22;3027:2;3142;3137;3133;3129:11;3124:2;3116:6;3112:15;3099:46;3187:6;3182:2;3177;3169:6;3165:15;3161:24;3154:40;3213:6;3203:16;;;;;;;2236:989;;;;;:::o;3230:326::-;3307:6;3315;3323;3376:2;3364:9;3355:7;3351:23;3347:32;3344:2;;;3397:6;3389;3382:22;3344:2;-1:-1:-1;;3425:23:1;;;3495:2;3480:18;;3467:32;;-1:-1:-1;3546:2:1;3531:18;;;3518:32;;3334:222;-1:-1:-1;3334:222:1:o;3561:430::-;3690:3;3728:6;3722:13;3753:3;3765:129;3779:6;3776:1;3773:13;3765:129;;;3877:4;3861:14;;;3857:25;;3851:32;3838:11;;;3831:53;3794:12;3765:129;;;3912:6;3909:1;3906:13;3903:2;;;3947:3;3938:6;3933:3;3929:16;3922:29;3903:2;-1:-1:-1;3969:16:1;;;;;3698:293;-1:-1:-1;;3698:293:1:o;16063:355::-;16265:2;16247:21;;;16304:2;16284:18;;;16277:30;16343:33;16338:2;16323:18;;16316:61;16409:2;16394:18;;16237:181::o;16423:343::-;16625:2;16607:21;;;16664:2;16644:18;;;16637:30;-1:-1:-1;;;16698:2:1;16683:18;;16676:49;16757:2;16742:18;;16597:169::o;17118:349::-;17320:2;17302:21;;;17359:2;17339:18;;;17332:30;17398:27;17393:2;17378:18;;17371:55;17458:2;17443:18;;17292:175::o;18301:128::-;18341:3;18372:1;18368:6;18365:1;18362:13;18359:2;;;18378:18;;:::i;:::-;-1:-1:-1;18414:9:1;;18349:80::o;18434:125::-;18474:4;18502:1;18499;18496:8;18493:2;;;18507:18;;:::i;:::-;-1:-1:-1;18544:9:1;;18483:76::o;18564:127::-;18625:10;18620:3;18616:20;18613:1;18606:31;18656:4;18653:1;18646:15;18680:4;18677:1;18670:15;18696:127;18757:10;18752:3;18748:20;18745:1;18738:31;18788:4;18785:1;18778:15;18812:4;18809:1;18802:15;18828:131;-1:-1:-1;;;;;18903:31:1;;18893:42;;18883:2;;18949:1;18946;18939:12

Swarm Source

ipfs://98bc791eb59803e9233140cd83ccee9429aeb1d38a4a8256d1e7ebef299d7ec5

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ 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.