ETH Price: $2,453.59 (+10.53%)
Gas: 1.17 Gwei

Contract

0x776ca20DB76aF367Dc7Dd094C4Dc2F6B304020f9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

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

Contract Source Code Verified (Exact Match)

Contract Name:
EscrowRegistry

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
No with 200 runs

Other Settings:
istanbul EvmVersion, GNU GPLv3 license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: EscrowRegistry.sol
// SPDX-License-Identifier: GPL-3.0-or-later

// Smart Contract for Trustless Escrow at https://trustlessescrow.com

pragma solidity ^0.6.0;

import "./SafeMath.sol";


contract EscrowRegistry {
    using SafeMath for uint;

    //////////////////////////////////////////////////////////
    // Modifiers
    modifier onlyOwner() {
        require(
            msg.sender == owner,
            "Only owner can call this."
        );
        _;
    }

    //////////////////////////////////////////////////////////
    // Custom data types
    /*
     * 0. Init
     * 1. BuyerLocked or SellerLocked
     * 2. Locked
     * 3. Inactive
     */
    enum State {
        Init,
        BuyerLocked,
        SellerLocked,
        Locked,
        Inactive
    }

    struct Escrow {
        State state;

        uint value;
        uint buyerDeposit;
        uint sellerDeposit;
        uint expireAt;
        address payable buyer;
        address payable seller;
    }

    //////////////////////////////////////////////////////////
    // Constants
    uint constant one_hour = 60 * 60;
    uint constant one_day = 24 * one_hour;
    uint constant one_year = 365 * one_day;
    uint constant min_expiration_time = 3 * one_day;
    uint constant max_expiration_time = 3 * one_year;

    //////////////////////////////////////////////////////////
    // Data
    address payable owner;
    mapping(bytes24 => Escrow) escrows;
    uint feePct;  // in 0.01% i.e fee = value * fee_pct / 10000
    uint feeStore;

    //////////////////////////////////////////////////////////
    // Events
    event EscrowCreated(bytes24 indexed escrowId, bool buyerCreated, address indexed buyer, address indexed seller);
    event BuyerAborted(bytes24 indexed escrowId);
    event SellerAborted(bytes24 indexed escrowId);
    event BuyerConfirmed(bytes24 indexed escrowId);
    event SellerConfirmed(bytes24 indexed escrowId);
    event Completed(bytes24 indexed escrowId);
    event Expired(bytes24 indexed escrowId);

    //////////////////////////////////////////////////////////
    // Functions
    function getUniqueKey() internal view returns (bytes24) {
        bytes24 uniqId = bytes24(keccak256(abi.encodePacked(msg.sender, blockhash(block.number - 1))));
        while (escrows[uniqId].value != 0) {
            uniqId = bytes24(keccak256(abi.encodePacked(uniqId)));
        }
        return uniqId;
    }

    constructor() public {
        owner = msg.sender;
        feePct = 10;
        feeStore = 0;
    }

    function changeOwner(address payable newOwner) public onlyOwner {
        owner = newOwner;
    }

    function setFee(uint newFeePct) public onlyOwner {
        feePct = newFeePct;
    }

    function emptyFeeStore() public onlyOwner {
        require(feeStore > 0, "Fee store is empty");
        owner.transfer(feeStore);
        feeStore = 0;
    }

    function buyerCreate(uint value, address payable seller, uint sellerDeposit, uint expireIn) public payable {
        require(value > 0 && value <= msg.value, "Invalid value");
        require(expireIn >= min_expiration_time && expireIn <= max_expiration_time, "Invalid expiration time");
        bytes24 escrowId = getUniqueKey();
        emit EscrowCreated(escrowId, true, msg.sender, seller);
        escrows[escrowId] = Escrow({
            expireAt: now + expireIn,
            value: value,
            buyerDeposit: msg.value - value,
            sellerDeposit: sellerDeposit,
            buyer: msg.sender,
            seller: seller,
            state: State.BuyerLocked
        });
    }

    function sellerCreate(uint value, address payable buyer, uint buyerDeposit, uint expireIn) public payable {
        require(value > 0, "Invalid value");
        require(expireIn >= min_expiration_time && expireIn <= max_expiration_time, "Invalid expiration time");
        bytes24 escrowId = getUniqueKey();
        emit EscrowCreated(escrowId, false, buyer, msg.sender);
        escrows[escrowId] = Escrow({
            expireAt: now + expireIn,
            value: value,
            buyerDeposit: buyerDeposit,
            sellerDeposit: msg.value,
            buyer: buyer,
            seller: msg.sender,
            state: State.SellerLocked
        });
    }

    function buyerConfirm(bytes24 escrowId) public payable {
        emit BuyerConfirmed(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.SellerLocked, "Invalid state");
        require(msg.sender == e.buyer, "Not allowed");
        require(msg.value == e.value + e.buyerDeposit, "Invalid amount sent");
        e.state = State.Locked;
    }

    function sellerConfirm(bytes24 escrowId) public payable {
        emit SellerConfirmed(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.BuyerLocked, "Invalid state");
        require(msg.sender == e.seller, "Not allowed");
        require(msg.value == e.sellerDeposit, "Invalid amount sent");
        e.state = State.Locked;
    }

    function buyerAbort(bytes24 escrowId) public {
        emit BuyerAborted(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.BuyerLocked, "Invalid state");
        require(msg.sender == e.buyer, "Not allowed");
        e.state = State.Inactive;
        e.buyer.transfer(e.value + e.buyerDeposit);
    }

    function sellerAbort(bytes24 escrowId) public {
        emit SellerAborted(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.SellerLocked, "Invalid state");
        require(msg.sender == e.seller, "Not allowed");
        e.state = State.Inactive;
        e.seller.transfer(e.sellerDeposit);
    }

    function complete(bytes24 escrowId) public {
        emit Completed(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.Locked, "Invalid state");
        require(msg.sender == e.buyer, "Not allowed");
        uint fee = e.value * feePct / 10000;
        e.state = State.Inactive;
        feeStore += fee;
        e.buyer.transfer(e.buyerDeposit);
        e.seller.transfer(e.value - fee + e.sellerDeposit);
    }

    function expire(bytes24 escrowId) public onlyOwner {
        emit Expired(escrowId);
        Escrow storage e = escrows[escrowId];
        require(e.state == State.Locked, "Invalid state");
        require(now > e.expireAt, "Not expired");
        e.state = State.Inactive;
        owner.transfer(e.value + e.buyerDeposit + e.sellerDeposit);
    }

    function getEscrow(bytes24 escrowId) public view returns (State state, uint value, uint buyerDeposit,
                                                              uint sellerDeposit, uint expireAt, address buyer, address seller) {
        Escrow storage e = escrows[escrowId];
        require(e.state != State.Init, "Not found");

        return (e.state, e.value, e.buyerDeposit, e.sellerDeposit, e.expireAt, e.buyer, e.seller);
    }

    function isEscrowExpired(bytes24 escrowId) public view returns (bool) {
        Escrow storage e = escrows[escrowId];
        require(e.state != State.Init, "Not found");
        return now > e.expireAt;
    }
}

File 2 of 2: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"BuyerAborted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"BuyerConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"Completed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"},{"indexed":false,"internalType":"bool","name":"buyerCreated","type":"bool"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"EscrowCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"SellerAborted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"SellerConfirmed","type":"event"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"buyerAbort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"buyerConfirm","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address payable","name":"seller","type":"address"},{"internalType":"uint256","name":"sellerDeposit","type":"uint256"},{"internalType":"uint256","name":"expireIn","type":"uint256"}],"name":"buyerCreate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"complete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emptyFeeStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"expire","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"getEscrow","outputs":[{"internalType":"enum EscrowRegistry.State","name":"state","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"buyerDeposit","type":"uint256"},{"internalType":"uint256","name":"sellerDeposit","type":"uint256"},{"internalType":"uint256","name":"expireAt","type":"uint256"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"seller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"isEscrowExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"sellerAbort","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes24","name":"escrowId","type":"bytes24"}],"name":"sellerConfirm","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address payable","name":"buyer","type":"address"},{"internalType":"uint256","name":"buyerDeposit","type":"uint256"},{"internalType":"uint256","name":"expireIn","type":"uint256"}],"name":"sellerCreate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeePct","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600a6002819055506000600381905550612183806100706000396000f3fe6080604052600436106100c25760003560e01c80634a387f2c1161007f578063bbef06a111610059578063bbef06a114610357578063bd7a73aa1461039d578063cf650083146103b4578063d3d4b3d514610416576100c2565b80634a387f2c1461029257806369fe0e2d146102cb578063a6f9dae114610306576100c2565b80631ebd485e146100c757806320fed9d4146101005780632930ee841461014657806335b539b31461018c5780633afc811f146101ee5780633d0eef1814610234575b600080fd5b6100fe600480360360208110156100dd57600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610500565b005b34801561010c57600080fd5b506101446004803603602081101561012357600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610770565b005b34801561015257600080fd5b5061018a6004803603602081101561016957600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610a4f565b005b6101ec600480360360808110156101a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610caf565b005b3480156101fa57600080fd5b506102326004803603602081101561021157600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610fbc565b005b34801561024057600080fd5b506102786004803603602081101561025757600080fd5b81019080803567ffffffffffffffff191690602001909291905050506112bc565b604051808215151515815260200191505060405180910390f35b6102c9600480360360208110156102a857600080fd5b81019080803567ffffffffffffffff19169060200190929190505050611397565b005b3480156102d757600080fd5b50610304600480360360208110156102ee57600080fd5b8101908080359060200190929190505050611601565b005b34801561031257600080fd5b506103556004803603602081101561032957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cd565b005b34801561036357600080fd5b5061039b6004803603602081101561037a57600080fd5b81019080803567ffffffffffffffff191690602001909291905050506117d2565b005b3480156103a957600080fd5b506103b2611a38565b005b610414600480360360808110156103ca57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611be6565b005b34801561042257600080fd5b5061045a6004803603602081101561043957600080fd5b81019080803567ffffffffffffffff19169060200190929190505050611f01565b6040518088600481111561046a57fe5b60ff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200197505050505050505060405180910390f35b8067ffffffffffffffff19167f2616be2bf1c97e8b34088bb48c9d65d892a11ba7e07042b07eca6a69dd38e4de60405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506002600481111561057257fe5b8160000160009054906101000a900460ff16600481111561058f57fe5b14610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600201548160010154013414610746576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c696420616d6f756e742073656e740000000000000000000000000081525060200191505060405180910390fd5b60038160000160006101000a81548160ff0219169083600481111561076757fe5b02179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610832576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff19167fe8cf04b0276c590ba668486c9da7897393cbbdbf3289dff19d8ce314ca011a8660405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff191681526020019081526020016000209050600360048111156108a457fe5b8160000160009054906101000a900460ff1660048111156108c157fe5b14610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b806004015442116109ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f74206578706972656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff021916908360048111156109ce57fe5b02179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600301548360020154846001015401019081150290604051600060405180830381858888f19350505050158015610a4a573d6000803e3d6000fd5b505050565b8067ffffffffffffffff19167feb6a0c601c982465f3468b0fc1546c9924a972ee71bdc6c87d517cca3d1d2fe360405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff19168152602001908152602001600020905060026004811115610ac157fe5b8160000160009054906101000a900460ff166004811115610ade57fe5b14610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff02191690836004811115610c3757fe5b02179055508060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600301549081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b505050565b60008411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b610e106018026003028110158015610d495750610e1060180261016d026003028111155b610dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c69642065787069726174696f6e2074696d6500000000000000000081525060200191505060405180910390fd5b6000610dc5612066565b90503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff19167f3a31c010508251ab6cc2d5384e0d829d22e6aa361399569d8f880db6625a8b256000604051808215151515815260200191505060405180910390a46040518060e0016040528060026004811115610e5557fe5b815260200186815260200184815260200134815260200183420181526020018573ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815250600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548160ff02191690836004811115610ef757fe5b02179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b8067ffffffffffffffff19167ff55f790ce9867f37f49bc66b1258c418930747888b956b8013599c311316199d60405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506003600481111561102e57fe5b8160000160009054906101000a900460ff16600481111561104b57fe5b146110be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006127106002548360010154028161119857fe5b04905060048260000160006101000a81548160ff021916908360048111156111bc57fe5b0217905550806003600082825401925050819055508160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600201549081150290604051600060405180830381858888f1935050505015801561123f573d6000803e3d6000fd5b508160060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc836003015483856001015403019081150290604051600060405180830381858888f193505050501580156112b6573d6000803e3d6000fd5b50505050565b600080600160008467ffffffffffffffff191667ffffffffffffffff191681526020019081526020016000209050600060048111156112f757fe5b8160000160009054906101000a900460ff16600481111561131457fe5b1415611388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f7420666f756e64000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600401544211915050919050565b8067ffffffffffffffff19167f8680e38cfbd8d843471a7ab0631ceff7573ab1f967751eda6ccdaad5d55bddf860405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506001600481111561140957fe5b8160000160009054906101000a900460ff16600481111561142657fe5b14611499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b806003015434146115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c696420616d6f756e742073656e740000000000000000000000000081525060200191505060405180910390fd5b60038160000160006101000a81548160ff021916908360048111156115f857fe5b02179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b8060028190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8067ffffffffffffffff19167f4552526c9db16d39d2d28394c85e213bc76d3332e82165591bc1e9e5aae2506460405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506001600481111561184457fe5b8160000160009054906101000a900460ff16600481111561186157fe5b146118d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff021916908360048111156119ba57fe5b02179055508060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600201548360010154019081150290604051600060405180830381858888f19350505050158015611a33573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611afa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b600060035411611b72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4665652073746f726520697320656d707479000000000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003549081150290604051600060405180830381858888f19350505050158015611bdb573d6000803e3d6000fd5b506000600381905550565b600084118015611bf65750348411155b611c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b610e106018026003028110158015611c8c5750610e1060180261016d026003028111155b611cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c69642065787069726174696f6e2074696d6500000000000000000081525060200191505060405180910390fd5b6000611d08612066565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff19167f3a31c010508251ab6cc2d5384e0d829d22e6aa361399569d8f880db6625a8b256001604051808215151515815260200191505060405180910390a46040518060e0016040528060016004811115611d9857fe5b8152602001868152602001863403815260200184815260200183420181526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815250600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548160ff02191690836004811115611e3c57fe5b02179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b600080600080600080600080600160008a67ffffffffffffffff191667ffffffffffffffff19168152602001908152602001600020905060006004811115611f4557fe5b8160000160009054906101000a900460ff166004811115611f6257fe5b1415611fd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f7420666f756e64000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8060000160009054906101000a900460ff1681600101548260020154836003015484600401548560050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16819150809050975097509750975097509750975050919395979092949650565b600080336001430340604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001925050506040516020818303038152906040528051906020012090505b6000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060010154146121465780604051602001808267ffffffffffffffff191667ffffffffffffffff191681526018019150506040516020818303038152906040528051906020012090506120ce565b809150509056fea2646970667358221220cd0c2b2a7943b8fd938fd20c8b4cf221657ff54aca98ca73f396ba0d63d27be464736f6c63430006070033

Deployed Bytecode

0x6080604052600436106100c25760003560e01c80634a387f2c1161007f578063bbef06a111610059578063bbef06a114610357578063bd7a73aa1461039d578063cf650083146103b4578063d3d4b3d514610416576100c2565b80634a387f2c1461029257806369fe0e2d146102cb578063a6f9dae114610306576100c2565b80631ebd485e146100c757806320fed9d4146101005780632930ee841461014657806335b539b31461018c5780633afc811f146101ee5780633d0eef1814610234575b600080fd5b6100fe600480360360208110156100dd57600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610500565b005b34801561010c57600080fd5b506101446004803603602081101561012357600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610770565b005b34801561015257600080fd5b5061018a6004803603602081101561016957600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610a4f565b005b6101ec600480360360808110156101a257600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050610caf565b005b3480156101fa57600080fd5b506102326004803603602081101561021157600080fd5b81019080803567ffffffffffffffff19169060200190929190505050610fbc565b005b34801561024057600080fd5b506102786004803603602081101561025757600080fd5b81019080803567ffffffffffffffff191690602001909291905050506112bc565b604051808215151515815260200191505060405180910390f35b6102c9600480360360208110156102a857600080fd5b81019080803567ffffffffffffffff19169060200190929190505050611397565b005b3480156102d757600080fd5b50610304600480360360208110156102ee57600080fd5b8101908080359060200190929190505050611601565b005b34801561031257600080fd5b506103556004803603602081101561032957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116cd565b005b34801561036357600080fd5b5061039b6004803603602081101561037a57600080fd5b81019080803567ffffffffffffffff191690602001909291905050506117d2565b005b3480156103a957600080fd5b506103b2611a38565b005b610414600480360360808110156103ca57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611be6565b005b34801561042257600080fd5b5061045a6004803603602081101561043957600080fd5b81019080803567ffffffffffffffff19169060200190929190505050611f01565b6040518088600481111561046a57fe5b60ff1681526020018781526020018681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200197505050505050505060405180910390f35b8067ffffffffffffffff19167f2616be2bf1c97e8b34088bb48c9d65d892a11ba7e07042b07eca6a69dd38e4de60405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506002600481111561057257fe5b8160000160009054906101000a900460ff16600481111561058f57fe5b14610602576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600201548160010154013414610746576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c696420616d6f756e742073656e740000000000000000000000000081525060200191505060405180910390fd5b60038160000160006101000a81548160ff0219169083600481111561076757fe5b02179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610832576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b8067ffffffffffffffff19167fe8cf04b0276c590ba668486c9da7897393cbbdbf3289dff19d8ce314ca011a8660405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff191681526020019081526020016000209050600360048111156108a457fe5b8160000160009054906101000a900460ff1660048111156108c157fe5b14610934576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b806004015442116109ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f74206578706972656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff021916908360048111156109ce57fe5b02179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600301548360020154846001015401019081150290604051600060405180830381858888f19350505050158015610a4a573d6000803e3d6000fd5b505050565b8067ffffffffffffffff19167feb6a0c601c982465f3468b0fc1546c9924a972ee71bdc6c87d517cca3d1d2fe360405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff19168152602001908152602001600020905060026004811115610ac157fe5b8160000160009054906101000a900460ff166004811115610ade57fe5b14610b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff02191690836004811115610c3757fe5b02179055508060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600301549081150290604051600060405180830381858888f19350505050158015610caa573d6000803e3d6000fd5b505050565b60008411610d25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b610e106018026003028110158015610d495750610e1060180261016d026003028111155b610dbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c69642065787069726174696f6e2074696d6500000000000000000081525060200191505060405180910390fd5b6000610dc5612066565b90503373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff19167f3a31c010508251ab6cc2d5384e0d829d22e6aa361399569d8f880db6625a8b256000604051808215151515815260200191505060405180910390a46040518060e0016040528060026004811115610e5557fe5b815260200186815260200184815260200134815260200183420181526020018573ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff16815250600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548160ff02191690836004811115610ef757fe5b02179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b8067ffffffffffffffff19167ff55f790ce9867f37f49bc66b1258c418930747888b956b8013599c311316199d60405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506003600481111561102e57fe5b8160000160009054906101000a900460ff16600481111561104b57fe5b146110be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60006127106002548360010154028161119857fe5b04905060048260000160006101000a81548160ff021916908360048111156111bc57fe5b0217905550806003600082825401925050819055508160050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc83600201549081150290604051600060405180830381858888f1935050505015801561123f573d6000803e3d6000fd5b508160060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc836003015483856001015403019081150290604051600060405180830381858888f193505050501580156112b6573d6000803e3d6000fd5b50505050565b600080600160008467ffffffffffffffff191667ffffffffffffffff191681526020019081526020016000209050600060048111156112f757fe5b8160000160009054906101000a900460ff16600481111561131457fe5b1415611388576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f7420666f756e64000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b80600401544211915050919050565b8067ffffffffffffffff19167f8680e38cfbd8d843471a7ab0631ceff7573ab1f967751eda6ccdaad5d55bddf860405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506001600481111561140957fe5b8160000160009054906101000a900460ff16600481111561142657fe5b14611499576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b806003015434146115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c696420616d6f756e742073656e740000000000000000000000000081525060200191505060405180910390fd5b60038160000160006101000a81548160ff021916908360048111156115f857fe5b02179055505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b8060028190555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461178f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8067ffffffffffffffff19167f4552526c9db16d39d2d28394c85e213bc76d3332e82165591bc1e9e5aae2506460405160405180910390a26000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002090506001600481111561184457fe5b8160000160009054906101000a900460ff16600481111561186157fe5b146118d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642073746174650000000000000000000000000000000000000081525060200191505060405180910390fd5b8060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f4e6f7420616c6c6f77656400000000000000000000000000000000000000000081525060200191505060405180910390fd5b60048160000160006101000a81548160ff021916908360048111156119ba57fe5b02179055508060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc82600201548360010154019081150290604051600060405180830381858888f19350505050158015611a33573d6000803e3d6000fd5b505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611afa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f4f6e6c79206f776e65722063616e2063616c6c20746869732e0000000000000081525060200191505060405180910390fd5b600060035411611b72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4665652073746f726520697320656d707479000000000000000000000000000081525060200191505060405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6003549081150290604051600060405180830381858888f19350505050158015611bdb573d6000803e3d6000fd5b506000600381905550565b600084118015611bf65750348411155b611c68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f496e76616c69642076616c75650000000000000000000000000000000000000081525060200191505060405180910390fd5b610e106018026003028110158015611c8c5750610e1060180261016d026003028111155b611cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f496e76616c69642065787069726174696f6e2074696d6500000000000000000081525060200191505060405180910390fd5b6000611d08612066565b90508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff19167f3a31c010508251ab6cc2d5384e0d829d22e6aa361399569d8f880db6625a8b256001604051808215151515815260200191505060405180910390a46040518060e0016040528060016004811115611d9857fe5b8152602001868152602001863403815260200184815260200183420181526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815250600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548160ff02191690836004811115611e3c57fe5b02179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c08201518160060160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b600080600080600080600080600160008a67ffffffffffffffff191667ffffffffffffffff19168152602001908152602001600020905060006004811115611f4557fe5b8160000160009054906101000a900460ff166004811115611f6257fe5b1415611fd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260098152602001807f4e6f7420666f756e64000000000000000000000000000000000000000000000081525060200191505060405180910390fd5b8060000160009054906101000a900460ff1681600101548260020154836003015484600401548560050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660060160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16819150809050975097509750975097509750975050919395979092949650565b600080336001430340604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b8152601401828152602001925050506040516020818303038152906040528051906020012090505b6000600160008367ffffffffffffffff191667ffffffffffffffff1916815260200190815260200160002060010154146121465780604051602001808267ffffffffffffffff191667ffffffffffffffff191681526018019150506040516020818303038152906040528051906020012090506120ce565b809150509056fea2646970667358221220cd0c2b2a7943b8fd938fd20c8b4cf221657ff54aca98ca73f396ba0d63d27be464736f6c63430006070033

Deployed Bytecode Sourcemap

169:6977:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;4235:378:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;4235:378:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6140:347;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6140:347:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;6140:347:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5342:336;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5342:336:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;5342:336:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3565:664;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;3565:664:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5684:450;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5684:450:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;5684:450:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6935:209;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6935:209:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;6935:209:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4619:371;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;4619:371:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2609:84;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2609:84:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2609:84:0;;;;;;;;;;;;;;;;;:::i;:::-;;2506:97;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2506:97:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2506:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4996:340;;5:9:-1;2:2;;;27:1;24;17:12;2:2;4996:340:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;4996:340:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2699:158;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2699:158:0;;;:::i;:::-;;2863:696;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;2863:696:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6493:436;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6493:436:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;6493:436:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4235:378;4320:8;4305:24;;;;;;;;;;;;;4339:16;4358:7;:17;4366:8;4358:17;;;;;;;;;;;;;;;;;4339:36;;4404:18;4393:29;;;;;;;;:1;:7;;;;;;;;;;;;:29;;;;;;;;;4385:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4472:1;:7;;;;;;;;;;;;4458:21;;:10;:21;;;4450:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4536:1;:14;;;4526:1;:7;;;:24;4513:9;:37;4505:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4594:12;4584:1;:7;;;:22;;;;;;;;;;;;;;;;;;;;;;;;4235:378;;:::o;6140:347::-;375:5;;;;;;;;;;;361:19;;:10;:19;;;340:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6214:8:::1;6206:17;;;;;;;;;;;;;6233:16;6252:7;:17;6260:8;6252:17;;;;;;;;;;;;;;;;;6233:36;;6298:12;6287:23;;;;;;;;:1;:7;;;;;;;;;;;;:23;;;;;;;;;6279:49;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;6352:1;:10;;;6346:3;:16;6338:40;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;6398:14;6388:1;:7;;;:24;;;;;;;;;;;;;;;;;;;;;;;;6422:5;::::0;::::1;;;;;;;;;:14;;:58;6464:1;:15;;;6447:1;:14;;;6437:1;:7;;;:24;:42;6422:58;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;6422:58:0;441:1;6140:347:::0;:::o;5342:336::-;5417:8;5403:23;;;;;;;;;;;;;5436:16;5455:7;:17;5463:8;5455:17;;;;;;;;;;;;;;;;;5436:36;;5501:18;5490:29;;;;;;;;:1;:7;;;;;;;;;;;;:29;;;;;;;;;5482:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5569:1;:8;;;;;;;;;;;;5555:22;;:10;:22;;;5547:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5613:14;5603:1;:7;;;:24;;;;;;;;;;;;;;;;;;;;;;;;5637:1;:8;;;;;;;;;;;;:17;;:34;5655:1;:15;;;5637:34;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5637:34:0;5342:336;;:::o;3565:664::-;3697:1;3689:5;:9;3681:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1076:7;1113:2;:13;1212:1;:11;3734:8;:31;;:66;;;;;1076:7;1113:2;:13;1157:3;:13;1265:1;:12;3769:8;:31;;3734:66;3726:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3838:16;3857:14;:12;:14::i;:::-;3838:33;;3924:10;3886:49;;3917:5;3886:49;;3900:8;3886:49;;;;3910:5;3886:49;;;;;;;;;;;;;;;;;;;;;;3965:257;;;;;;;;4193:18;3965:257;;;;;;;;;;;;4031:5;3965:257;;;;4064:12;3965:257;;;;4105:9;3965:257;;;;4002:8;3996:3;:14;3965:257;;;;4135:5;3965:257;;;;;;4162:10;3965:257;;;;;3945:7;:17;3953:8;3945:17;;;;;;;;;;;;;;;;;:277;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3565:664;;;;;:::o;5684:450::-;5752:8;5742:19;;;;;;;;;;;;;5771:16;5790:7;:17;5798:8;5790:17;;;;;;;;;;;;;;;;;5771:36;;5836:12;5825:23;;;;;;;;:1;:7;;;;;;;;;;;;:23;;;;;;;;;5817:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5898:1;:7;;;;;;;;;;;;5884:21;;:10;:21;;;5876:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5931:8;5961:5;5952:6;;5942:1;:7;;;:16;:24;;;;;;5931:35;;5986:14;5976:1;:7;;;:24;;;;;;;;;;;;;;;;;;;;;;;;6022:3;6010:8;;:15;;;;;;;;;;;6035:1;:7;;;;;;;;;;;;:16;;:32;6052:1;:14;;;6035:32;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6035:32:0;6077:1;:8;;;;;;;;;;;;:17;;:50;6111:1;:15;;;6105:3;6095:1;:7;;;:13;:31;6077:50;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6077:50:0;5684:450;;;:::o;6935:209::-;6999:4;7015:16;7034:7;:17;7042:8;7034:17;;;;;;;;;;;;;;;;;7015:36;;7080:10;7069:21;;;;;;;;:1;:7;;;;;;;;;;;;:21;;;;;;;;;;7061:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7127:1;:10;;;7121:3;:16;7114:23;;;6935:209;;;:::o;4619:371::-;4706:8;4690:25;;;;;;;;;;;;;4725:16;4744:7;:17;4752:8;4744:17;;;;;;;;;;;;;;;;;4725:36;;4790:17;4779:28;;;;;;;;:1;:7;;;;;;;;;;;;:28;;;;;;;;;4771:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4857:1;:8;;;;;;;;;;;;4843:22;;:10;:22;;;4835:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4912:1;:15;;;4899:9;:28;4891:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4971:12;4961:1;:7;;;:22;;;;;;;;;;;;;;;;;;;;;;;;4619:371;;:::o;2609:84::-;375:5;;;;;;;;;;;361:19;;:10;:19;;;340:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2677:9:::1;2668:6;:18;;;;2609:84:::0;:::o;2506:97::-;375:5;;;;;;;;;;;361:19;;:10;:19;;;340:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2588:8:::1;2580:5;::::0;:16:::1;;;;;;;;;;;;;;;;;;2506:97:::0;:::o;4996:340::-;5069:8;5056:22;;;;;;;;;;;;;5088:16;5107:7;:17;5115:8;5107:17;;;;;;;;;;;;;;;;;5088:36;;5153:17;5142:28;;;;;;;;:1;:7;;;;;;;;;;;;:28;;;;;;;;;5134:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5220:1;:7;;;;;;;;;;;;5206:21;;:10;:21;;;5198:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5263:14;5253:1;:7;;;:24;;;;;;;;;;;;;;;;;;;;;;;;5287:1;:7;;;;;;;;;;;;:16;;:42;5314:1;:14;;;5304:1;:7;;;:24;5287:42;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5287:42:0;4996:340;;:::o;2699:158::-;375:5;;;;;;;;;;;361:19;;:10;:19;;;340:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2770:1:::1;2759:8;;:12;2751:43;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;2804:5;::::0;::::1;;;;;;;;;:14;;:24;2819:8;;2804:24;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;2804:24:0;2849:1;2838:8;:12;;;;2699:158::o:0;2863:696::-;2996:1;2988:5;:9;:31;;;;;3010:9;3001:5;:18;;2988:31;2980:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1076:7;1113:2;:13;1212:1;:11;3055:8;:31;;:66;;;;;1076:7;1113:2;:13;1157:3;:13;1265:1;:12;3090:8;:31;;3055:66;3047:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3159:16;3178:14;:12;:14::i;:::-;3159:33;;3249:6;3207:49;;3237:10;3207:49;;3221:8;3207:49;;;;3231:4;3207:49;;;;;;;;;;;;;;;;;;;;;;3286:266;;;;;;;;3524:17;3286:266;;;;;;;;;;;;3352:5;3286:266;;;;3397:5;3385:9;:17;3286:266;;;;3431:13;3286:266;;;;3323:8;3317:3;:14;3286:266;;;;3465:10;3286:266;;;;;;3497:6;3286:266;;;;;3266:7;:17;3274:8;3266:17;;;;;;;;;;;;;;;;;:286;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2863:696;;;;;:::o;6493:436::-;6551:11;6564:10;6576:17;6657:18;6677:13;6692;6707:14;6733:16;6752:7;:17;6760:8;6752:17;;;;;;;;;;;;;;;;;6733:36;;6798:10;6787:21;;;;;;;;:1;:7;;;;;;;;;;;;:21;;;;;;;;;;6779:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6841:1;:7;;;;;;;;;;;;6850:1;:7;;;6859:1;:14;;;6875:1;:15;;;6892:1;:10;;;6904:1;:7;;;;;;;;;;;;6913:1;:8;;;;;;;;;;;;6833:89;;;;;;;;;;;;;;;;;;;;;6493:436;;;;;;;;;:::o;2083:312::-;2130:7;2149:14;2201:10;2238:1;2223:12;:16;2213:27;2184:57;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2184:57:0;;;2174:68;;;;;;2149:94;;2253:113;2285:1;2260:7;:15;2268:6;2260:15;;;;;;;;;;;;;;;;;:21;;;:26;2253:113;;2346:6;2329:24;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2329:24:0;;;2319:35;;;;;;2302:53;;2253:113;;;2382:6;2375:13;;;2083:312;:::o

Swarm Source

ipfs://cd0c2b2a7943b8fd938fd20c8b4cf221657ff54aca98ca73f396ba0d63d27be4

Block Transaction Difficulty 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
Loading...
Loading

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.