ETH Price: $3,257.51 (-0.33%)
Gas: 1 Gwei

Contract

0x0B9078874a97d608B7C0c81c2C6998Ab5185f8af
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040148718142022-05-30 9:33:25788 days ago1653903205IN
 Create: Bebop
0 ETH0.0759760438.19279426

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Bebop

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *Submitted for verification at Etherscan.io on 2022-05-31
*/

/**
 *Submitted for verification at Etherscan.io on 2022-05-25
*/

//SPDX-License-Identifier: UNLICENSED

pragma experimental ABIEncoderV2;
pragma solidity >=0.7.0 <0.9.0;

interface IERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);
}

pragma solidity >=0.7.0 <0.9.0;

library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "ds-math-sub-underflow");
    }

    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
    }
}

pragma solidity >=0.7.0 <0.9.0;

contract Bebop {
    event OrderExecuted(
        address maker_address,
        address taker_address,
        address base_token,
        address quote_token,
        uint256 base_quantity,
        uint256 quote_quantity,
        address receiver
    );

    event OrderExecuted2(
        address maker_address,
        address taker_address,
        address[] base_tokens,
        address quote_token,
        uint256[] base_quantities,
        uint256 quote_quantity,
        address receiver
    );

    event OrderExecuted3(
        address maker_address,
        address taker_address,
        address base_token,
        address[] quote_tokens,
        uint256 base_quantity,
        uint256[] quote_quantities,
        address receiver
    );

    uint256 chainId = block.chainid;
    address verifyingContract = address(this);
    string private constant EIP712_DOMAIN =
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)";

    bytes32 public constant EIP712_DOMAIN_TYPEHASH =
        keccak256(abi.encodePacked(EIP712_DOMAIN));
    address constant ETH_ADD = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;

    struct Order {
        // one to one
        uint256 expiry;
        address taker_address;
        address maker_address;
        address base_token;
        address quote_token;
        uint256 base_quantity;
        uint256 quote_quantity;
        address receiver;
    }

    struct Order2 {
        //Many to one
        uint256 expiry;
        address taker_address;
        address maker_address;
        bytes32 base_tokens;
        address quote_token;
        bytes32 base_quantities;
        uint256 quote_quantity;
        address receiver;
    }

    struct Order3 {
        //One to many
        uint256 expiry;
        address taker_address;
        address maker_address;
        address base_token;
        bytes32 quote_tokens;
        uint256 base_quantity;
        bytes32 quote_quantities;
        address receiver;
    }

    string constant ORDER_TYPE =
        "Order(uint256 expiry,address taker_address,address maker_address,address base_token,address quote_token,uint256 base_quantity,uint256 quote_quantity,address receiver)";
    bytes32 constant ORDER_TYPEHASH = keccak256(abi.encodePacked(ORDER_TYPE));

    string constant ORDER_TYPE2 =
        "Order2(uint256 expiry,address taker_address,address maker_address,bytes32 base_tokens,address quote_token,bytes32 base_quantities,uint256 quote_quantity,address receiver)";
    bytes32 constant ORDER_TYPEHASH2 = keccak256(abi.encodePacked(ORDER_TYPE2));

    string constant ORDER_TYPE3 =
        "Order3(uint256 expiry,address taker_address,address maker_address,address base_token,bytes32 quote_tokens,uint256 base_quantity,bytes32 quote_quantities,address receiver)";
    bytes32 constant ORDER_TYPEHASH3 = keccak256(abi.encodePacked(ORDER_TYPE3));

    bytes32 private DOMAIN_SEPARATOR;

    mapping(bytes32 => bool) public Signatures;

    constructor() {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256("Bebop"),
                keccak256("1"),
                chainId,
                verifyingContract
            )
        );
    }

    function getRsv(bytes memory sig)
        public
        pure
        returns (
            bytes32,
            bytes32,
            uint8
        )
    {
        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := and(mload(add(sig, 65)), 255)
        }
        if (v < 27) v += 27;
        return (r, s, v);
    }

    function hashTokens(address[] memory tokens) public pure returns (bytes32) {
        return keccak256(abi.encode(tokens));
    }

    function hashTokenQuantities(uint256[] memory token_quantities)
        public
        pure
        returns (bytes32)
    {
        return keccak256(abi.encode(token_quantities));
    }

    function hashOrder(Order memory order) private view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR,
                    keccak256(
                        abi.encode(
                            ORDER_TYPEHASH,
                            order.expiry,
                            order.taker_address,
                            order.maker_address,
                            order.base_token,
                            order.quote_token,
                            order.base_quantity,
                            order.quote_quantity,
                            order.receiver
                        )
                    )
                )
            );
    }

    function hashOrder2(Order2 memory order) private view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR,
                    keccak256(
                        abi.encode(
                            ORDER_TYPEHASH2,
                            order.expiry,
                            order.taker_address,
                            order.maker_address,
                            order.base_tokens,
                            order.quote_token,
                            order.base_quantities,
                            order.quote_quantity,
                            order.receiver
                        )
                    )
                )
            );
    }

    function hashOrder3(Order3 memory order) private view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR,
                    keccak256(
                        abi.encode(
                            ORDER_TYPEHASH3,
                            order.expiry,
                            order.taker_address,
                            order.maker_address,
                            order.base_token,
                            order.quote_tokens,
                            order.base_quantity,
                            order.quote_quantities,
                            order.receiver
                        )
                    )
                )
            );
    }

    function assertValidOrder(Order memory order, bytes memory sig)
        public
        view
        returns (bytes32)
    {
        (bytes32 r, bytes32 s, uint8 v) = getRsv(sig);
        bytes32 h = hashOrder(order);
        address trader = ecrecover(h, v, r, s);

        require(trader == order.taker_address, "Invalid signature");
        require(msg.sender != trader, "Maker/taker must be different address");
        require(msg.sender == order.maker_address, "Maker address mismatch");
        require(order.expiry > block.timestamp, "Signature expired");
        require(
            order.base_quantity > 0 && order.quote_quantity > 0,
            "Invalid base/quote amount"
        );
        require(!Signatures[h], "Signature reuse"); //Ensure no replay attacks

        return h;
    }

    function assertValidOrder2(
        Order2 memory order,
        bytes memory sig,
        address[] memory base_tokens,
        uint256[] memory base_quantities
    ) public view returns (bytes32) {
        (bytes32 r, bytes32 s, uint8 v) = getRsv(sig);
        bytes32 h = hashOrder2(order);
        address trader = ecrecover(h, v, r, s);

        require(trader == order.taker_address, "Invalid signature");
        require(
            order.base_tokens == keccak256(abi.encode(base_tokens)),
            "base token hash mismatch"
        );
        require(
            order.base_quantities == keccak256(abi.encode(base_quantities)),
            "base quantities hash mismatch"
        );
        require(msg.sender != trader, "Maker/taker must be different address");
        require(msg.sender == order.maker_address, "Maker address mismatch");
        require(order.expiry > block.timestamp, "Signature expired");
        require(!Signatures[h], "Signature reuse"); //Ensure no replay attacks

        return h;
    }

    function assertValidOrder3(
        Order3 memory order,
        bytes memory sig,
        address[] memory quote_tokens,
        uint256[] memory quote_quantities
    ) public view returns (bytes32) {
        (bytes32 r, bytes32 s, uint8 v) = getRsv(sig);
        bytes32 h = hashOrder3(order);
        address trader = ecrecover(h, v, r, s);

        require(trader == order.taker_address, "Invalid signature");
        require(
            order.quote_tokens == keccak256(abi.encode(quote_tokens)),
            "quote tokens hash mismatch"
        );
        require(
            order.quote_quantities == keccak256(abi.encode(quote_quantities)),
            "quote quantities hash mismatch"
        );
        require(msg.sender != trader, "Maker/taker must be different address");
        require(msg.sender == order.maker_address, "Maker address mismatch");
        require(order.expiry > block.timestamp, "Signature expired");
        require(!Signatures[h], "Signature reuse"); //Ensure no replay attacks

        return h;
    }

    function makerTransferFunds(
        address from,
        address to,
        uint256 quantity,
        address token
    ) private returns (bool) {
        if (token == ETH_ADD) {
            require(msg.value == quantity);
            payable(to).transfer(msg.value);
        } else {
            require(IERC20(token).transferFrom(from, to, quantity));
        }
        return true;
    }

    //Can only be called by anyone with the signature from trader
    function SettleOrder(Order memory order, bytes memory sig)
        public
        payable
        returns (bool)
    {
        bytes32 h = assertValidOrder(order, sig);
        Signatures[h] = true;
        require(
            makerTransferFunds(
                msg.sender,
                order.receiver,
                order.quote_quantity,
                order.quote_token
            )
        );
        require(
            IERC20(order.base_token).transferFrom(
                order.taker_address,
                msg.sender,
                order.base_quantity
            )
        );

        emit OrderExecuted(
            msg.sender,
            order.taker_address,
            order.base_token,
            order.quote_token,
            order.base_quantity,
            order.quote_quantity,
            order.receiver
        );
        return true;
    }

    //Can only be called by anyone with the signature from trader
    function SettleOrder2(
        Order2 memory order,
        bytes memory sig,
        address[] memory base_tokens,
        uint256[] memory base_quantities
    ) public payable returns (bool) {
        bytes32 h = assertValidOrder2(order, sig, base_tokens, base_quantities);
        Signatures[h] = true;

        require(
            makerTransferFunds(
                msg.sender,
                order.receiver,
                order.quote_quantity,
                order.quote_token
            )
        );

        for (uint256 i = 0; i < base_tokens.length; i++) {
            require(
                IERC20(address(base_tokens[i])).transferFrom(
                    order.taker_address,
                    msg.sender,
                    base_quantities[i]
                )
            );
        }

        emit OrderExecuted2(
            msg.sender,
            order.taker_address,
            base_tokens,
            order.quote_token,
            base_quantities,
            order.quote_quantity,
            order.receiver
        );

        return true;
    }

    //Can only be called by anyone with the signature from trader
    function SettleOrder3(
        Order3 memory order,
        bytes memory sig,
        address[] memory quote_tokens,
        uint256[] memory quote_quantities
    ) public payable returns (bool) {
        bytes32 h = assertValidOrder3(
            order,
            sig,
            quote_tokens,
            quote_quantities
        );
        Signatures[h] = true;

        for (uint256 i = 0; i < quote_tokens.length; i++) {
            require(
                makerTransferFunds(
                    msg.sender,
                    order.receiver,
                    quote_quantities[i],
                    quote_tokens[i]
                )
            );
        }

        require(
            IERC20(address(order.base_token)).transferFrom(
                order.taker_address,
                msg.sender,
                order.base_quantity
            )
        );

        emit OrderExecuted3(
            msg.sender,
            order.taker_address,
            order.base_token,
            quote_tokens,
            order.base_quantity,
            quote_quantities,
            order.receiver
        );

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"maker_address","type":"address"},{"indexed":false,"internalType":"address","name":"taker_address","type":"address"},{"indexed":false,"internalType":"address","name":"base_token","type":"address"},{"indexed":false,"internalType":"address","name":"quote_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"base_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"OrderExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"maker_address","type":"address"},{"indexed":false,"internalType":"address","name":"taker_address","type":"address"},{"indexed":false,"internalType":"address[]","name":"base_tokens","type":"address[]"},{"indexed":false,"internalType":"address","name":"quote_token","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"base_quantities","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"OrderExecuted2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"maker_address","type":"address"},{"indexed":false,"internalType":"address","name":"taker_address","type":"address"},{"indexed":false,"internalType":"address","name":"base_token","type":"address"},{"indexed":false,"internalType":"address[]","name":"quote_tokens","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"base_quantity","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"quote_quantities","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"OrderExecuted3","type":"event"},{"inputs":[],"name":"EIP712_DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"address","name":"base_token","type":"address"},{"internalType":"address","name":"quote_token","type":"address"},{"internalType":"uint256","name":"base_quantity","type":"uint256"},{"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"SettleOrder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"bytes32","name":"base_tokens","type":"bytes32"},{"internalType":"address","name":"quote_token","type":"address"},{"internalType":"bytes32","name":"base_quantities","type":"bytes32"},{"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order2","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"address[]","name":"base_tokens","type":"address[]"},{"internalType":"uint256[]","name":"base_quantities","type":"uint256[]"}],"name":"SettleOrder2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"address","name":"base_token","type":"address"},{"internalType":"bytes32","name":"quote_tokens","type":"bytes32"},{"internalType":"uint256","name":"base_quantity","type":"uint256"},{"internalType":"bytes32","name":"quote_quantities","type":"bytes32"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order3","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"address[]","name":"quote_tokens","type":"address[]"},{"internalType":"uint256[]","name":"quote_quantities","type":"uint256[]"}],"name":"SettleOrder3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"Signatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"address","name":"base_token","type":"address"},{"internalType":"address","name":"quote_token","type":"address"},{"internalType":"uint256","name":"base_quantity","type":"uint256"},{"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"assertValidOrder","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"bytes32","name":"base_tokens","type":"bytes32"},{"internalType":"address","name":"quote_token","type":"address"},{"internalType":"bytes32","name":"base_quantities","type":"bytes32"},{"internalType":"uint256","name":"quote_quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order2","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"address[]","name":"base_tokens","type":"address[]"},{"internalType":"uint256[]","name":"base_quantities","type":"uint256[]"}],"name":"assertValidOrder2","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"address","name":"taker_address","type":"address"},{"internalType":"address","name":"maker_address","type":"address"},{"internalType":"address","name":"base_token","type":"address"},{"internalType":"bytes32","name":"quote_tokens","type":"bytes32"},{"internalType":"uint256","name":"base_quantity","type":"uint256"},{"internalType":"bytes32","name":"quote_quantities","type":"bytes32"},{"internalType":"address","name":"receiver","type":"address"}],"internalType":"struct Bebop.Order3","name":"order","type":"tuple"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"address[]","name":"quote_tokens","type":"address[]"},{"internalType":"uint256[]","name":"quote_quantities","type":"uint256[]"}],"name":"assertValidOrder3","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"sig","type":"bytes"}],"name":"getRsv","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"token_quantities","type":"uint256[]"}],"name":"hashTokenQuantities","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"hashTokens","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]

608060405246600055600180546001600160a01b031916301790553480156200002757600080fd5b506040518060800160405280605281526020016200232a60529139604051602001620000549190620000fb565b60408051601f198184030181528282528051602091820120600054600154838601929092527f736d701bb727f66c4cce086c2238a8fddd516a61828453086e88c1df5c1c61ae858501527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606086015260808501526001600160a01b031660a0808501919091528251808503909101815260c0909301909152815191012060025562000139565b6000825160005b818110156200011e576020818601810151858301520162000102565b818111156200012e576000828501525b509190910192915050565b6121e180620001496000396000f3fe6080604052600436106100bc5760003560e01c8063acbeb43311610074578063dca1ff991161004e578063dca1ff99146101c2578063dd12f065146101e2578063ebaa55df1461022057600080fd5b8063acbeb4331461017a578063c7977be71461018d578063c81560dd146101a257600080fd5b806365a9b6fd116100a557806365a9b6fd14610119578063704ca8c01461012c5780639149fefa1461015a57600080fd5b80633cff3a4c146100c157806347783f4f14610106575b600080fd5b3480156100cd57600080fd5b506100f16100dc366004611741565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f161011436600461199f565b610240565b6100f1610127366004611ab2565b610417565b34801561013857600080fd5b5061014c61014736600461199f565b6105fc565b6040519081526020016100fd565b34801561016657600080fd5b5061014c610175366004611b45565b610a73565b6100f1610188366004611b82565b610aa3565b34801561019957600080fd5b5061014c610c80565b3480156101ae57600080fd5b5061014c6101bd366004611ab2565b610cc2565b3480156101ce57600080fd5b5061014c6101dd366004611b82565b610f05565b3480156101ee57600080fd5b506102026101fd366004611c4f565b6112cd565b60408051938452602084019290925260ff16908201526060016100fd565b34801561022c57600080fd5b5061014c61023b366004611c84565b61130a565b60008061024f868686866105fc565b600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559091505b84518110156102f0576102d5338860e001518684815181106102ae576102ae611cb9565b60200260200101518885815181106102c8576102c8611cb9565b602002602001015161131d565b6102de57600080fd5b806102e881611d17565b91505061028a565b506060860151602087015160a08801516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015233602482015260448101919091529116906323b872dd90606401602060405180830381600087803b15801561037757600080fd5b505af115801561038b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103af9190611d50565b6103b857600080fd5b7ffe7ce4ede4e17a67309fb218be86869fcb5ddf36df5527e01b6587401975d5323387602001518860600151878a60a00151888c60e001516040516104039796959493929190611dfa565b60405180910390a150600195945050505050565b60008061042686868686610cc2565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560e087015160c0880151608089015192935061047c923392919061131d565b61048557600080fd5b60005b84518110156105b0578481815181106104a3576104a3611cb9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166323b872dd8860200151338785815181106104de576104de611cb9565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105959190611d50565b61059e57600080fd5b806105a881611d17565b915050610488565b507fd738f9db82fc9d0ced647127bc6af6b87cab3bf281afb2ab409a34452e806ce4338760200151868960800151878b60c001518c60e001516040516104039796959493929190611e6a565b60008060008061060b876112cd565b925092509250600061061c89611469565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610674573d6000803e3d6000fd5b505050602060405103519050896020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e617475726500000000000000000000000000000060448201526064015b60405180910390fd5b8760405160200161072f9190611ed9565b604051602081830303815290604052805190602001208a60800151146107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f71756f746520746f6b656e732068617368206d69736d617463680000000000006044820152606401610715565b866040516020016107c29190611eec565b604051602081830303815290604052805190602001208a60c0015114610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f71756f7465207175616e7469746965732068617368206d69736d6174636800006044820152606401610715565b3373ffffffffffffffffffffffffffffffffffffffff821614156108ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616b65722f74616b6572206d75737420626520646966666572656e7420616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610715565b896040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d616b65722061646472657373206d69736d61746368000000000000000000006044820152606401610715565b895142106109ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e617475726520657870697265640000000000000000000000000000006044820152606401610715565b60008281526003602052604090205460ff1615610a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5369676e617475726520726575736500000000000000000000000000000000006044820152606401610715565b5098975050505050505050565b600081604051602001610a869190611eec565b604051602081830303815290604052805190602001209050919050565b600080610ab08484610f05565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560e085015160c08601516080870151929350610b06923392919061131d565b610b0f57600080fd5b6060840151602085015160a08601516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015233602482015260448101919091529116906323b872dd90606401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190611d50565b610bd657600080fd5b7f6738a758f2c8e7950ecaa7a951b807c13226cf94cc476a977552fe145aa91caf338560200151866060015187608001518860a001518960c001518a60e00151604051610c6e979695949392919073ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b60405180910390a15060019392505050565b604051806080016040528060528152602001611f6060529139604051602001610ca99190611eff565b6040516020818303038152906040528051906020012081565b600080600080610cd1876112cd565b9250925092506000610ce289611595565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610d3a573d6000803e3d6000fd5b505050602060405103519050896020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610715565b87604051602001610df09190611ed9565b604051602081830303815290604052805190602001208a6060015114610e72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6261736520746f6b656e2068617368206d69736d6174636800000000000000006044820152606401610715565b86604051602001610e839190611eec565b604051602081830303815290604052805190602001208a60a0015114610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f62617365207175616e7469746965732068617368206d69736d617463680000006044820152606401610715565b600080600080610f14856112cd565b9250925092506000610f258761166b565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f7d573d6000803e3d6000fd5b505050602060405103519050876020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610715565b3373ffffffffffffffffffffffffffffffffffffffff821614156110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616b65722f74616b6572206d75737420626520646966666572656e7420616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610715565b876040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d616b65722061646472657373206d69736d61746368000000000000000000006044820152606401610715565b875142106111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e617475726520657870697265640000000000000000000000000000006044820152606401610715565b60008860a001511180156111e3575060008860c00151115b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420626173652f71756f746520616d6f756e74000000000000006044820152606401610715565b60008281526003602052604090205460ff16156112c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5369676e617475726520726575736500000000000000000000000000000000006044820152606401610715565b509695505050505050565b6020810151604082015160418301516000928392839260ff16601b8110156112fd576112fa601b82611f3a565b90505b9196909550909350915050565b600081604051602001610a869190611ed9565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156113a55782341461135d57600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff8516903480156108fc02916000818181858888f1935050505015801561139f573d6000803e3d6000fd5b5061145e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590528316906323b872dd90606401602060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114559190611d50565b61145e57600080fd5b506001949350505050565b60006002546040518060e0016040528060aa815260200161205860aa91396040516020016114979190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff95861660408901529385166060880152918416608087015260a086015260c085015260e0840152166101008201526101200190565b60405160208183030381529060405280519060200120604051602001610a869291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60006002546040518060e0016040528060aa815260200161210260aa91396040516020016115c39190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff958616604089015293851660608801526080870192909252831660a086015260c085015260e0840152166101008201526101200190565b60006002546040518060e0016040528060a68152602001611fb260a691396040516020016116999190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff958616604089015293851660608801529184166080870152831660a086015260c085015260e0840152166101008201526101200190565b60006020828403121561175357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff811182821017156117ad576117ad61175a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117fa576117fa61175a565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461182657600080fd5b919050565b600082601f83011261183c57600080fd5b813567ffffffffffffffff8111156118565761185661175a565b61188760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117b3565b81815284602083860101111561189c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156118d3576118d361175a565b5060051b60200190565b600082601f8301126118ee57600080fd5b813560206119036118fe836118b9565b6117b3565b82815260059290921b8401810191818101908684111561192257600080fd5b8286015b848110156112c25761193781611802565b8352918301918301611926565b600082601f83011261195557600080fd5b813560206119656118fe836118b9565b82815260059290921b8401810191818101908684111561198457600080fd5b8286015b848110156112c25780358352918301918301611988565b6000806000808486036101608112156119b757600080fd5b610100808212156119c757600080fd5b6119cf611789565b9150863582526119e160208801611802565b60208301526119f260408801611802565b6040830152611a0360608801611802565b60608301526080870135608083015260a087013560a083015260c087013560c0830152611a3260e08801611802565b60e083015290945085013567ffffffffffffffff80821115611a5357600080fd5b611a5f8883890161182b565b9450610120870135915080821115611a7657600080fd5b611a82888389016118dd565b9350610140870135915080821115611a9957600080fd5b50611aa687828801611944565b91505092959194509250565b600080600080848603610160811215611aca57600080fd5b61010080821215611ada57600080fd5b611ae2611789565b915086358252611af460208801611802565b6020830152611b0560408801611802565b604083015260608701356060830152611b2060808801611802565b608083015260a087013560a083015260c087013560c0830152611a3260e08801611802565b600060208284031215611b5757600080fd5b813567ffffffffffffffff811115611b6e57600080fd5b611b7a84828501611944565b949350505050565b600080828403610120811215611b9757600080fd5b61010080821215611ba757600080fd5b611baf611789565b915084358252611bc160208601611802565b6020830152611bd260408601611802565b6040830152611be360608601611802565b6060830152611bf460808601611802565b608083015260a085013560a083015260c085013560c0830152611c1960e08601611802565b60e083015290925083013567ffffffffffffffff811115611c3957600080fd5b611c458582860161182b565b9150509250929050565b600060208284031215611c6157600080fd5b813567ffffffffffffffff811115611c7857600080fd5b611b7a8482850161182b565b600060208284031215611c9657600080fd5b813567ffffffffffffffff811115611cad57600080fd5b611b7a848285016118dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611d4957611d49611ce8565b5060010190565b600060208284031215611d6257600080fd5b81518015158114611d7257600080fd5b9392505050565b600081518084526020808501945080840160005b83811015611dbf57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611d8d565b509495945050505050565b600081518084526020808501945080840160005b83811015611dbf57815187529582019590820190600101611dde565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015260e06060840152611e3a60e0840188611d79565b86608085015283810360a0850152611e528187611dca565b92505080841660c08401525098975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a168352808916602084015260e06040840152611ea260e0840189611d79565b81881660608501528381036080850152611ebc8188611dca565b60a0850196909652509290921660c0909101525095945050505050565b602081526000611d726020830184611d79565b602081526000611d726020830184611dca565b6000825160005b81811015611f205760208186018101518583015201611f06565b81811115611f2f576000828501525b509190910192915050565b600060ff821660ff84168060ff03821115611f5757611f57611ce8565b01939250505056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294f726465722875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6164647265737320626173655f746f6b656e2c616464726573732071756f74655f746f6b656e2c75696e7432353620626173655f7175616e746974792c75696e743235362071756f74655f7175616e746974792c61646472657373207265636569766572294f72646572332875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6164647265737320626173655f746f6b656e2c627974657333322071756f74655f746f6b656e732c75696e7432353620626173655f7175616e746974792c627974657333322071756f74655f7175616e7469746965732c61646472657373207265636569766572294f72646572322875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6279746573333220626173655f746f6b656e732c616464726573732071756f74655f746f6b656e2c6279746573333220626173655f7175616e7469746965732c75696e743235362071756f74655f7175616e746974792c6164647265737320726563656976657229a26469706673582212207c2909c904d1589091d876d046e70836df2a0e3f707b326b8e5cc446b253dcd464736f6c63430008090033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429

Deployed Bytecode

0x6080604052600436106100bc5760003560e01c8063acbeb43311610074578063dca1ff991161004e578063dca1ff99146101c2578063dd12f065146101e2578063ebaa55df1461022057600080fd5b8063acbeb4331461017a578063c7977be71461018d578063c81560dd146101a257600080fd5b806365a9b6fd116100a557806365a9b6fd14610119578063704ca8c01461012c5780639149fefa1461015a57600080fd5b80633cff3a4c146100c157806347783f4f14610106575b600080fd5b3480156100cd57600080fd5b506100f16100dc366004611741565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100f161011436600461199f565b610240565b6100f1610127366004611ab2565b610417565b34801561013857600080fd5b5061014c61014736600461199f565b6105fc565b6040519081526020016100fd565b34801561016657600080fd5b5061014c610175366004611b45565b610a73565b6100f1610188366004611b82565b610aa3565b34801561019957600080fd5b5061014c610c80565b3480156101ae57600080fd5b5061014c6101bd366004611ab2565b610cc2565b3480156101ce57600080fd5b5061014c6101dd366004611b82565b610f05565b3480156101ee57600080fd5b506102026101fd366004611c4f565b6112cd565b60408051938452602084019290925260ff16908201526060016100fd565b34801561022c57600080fd5b5061014c61023b366004611c84565b61130a565b60008061024f868686866105fc565b600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790559091505b84518110156102f0576102d5338860e001518684815181106102ae576102ae611cb9565b60200260200101518885815181106102c8576102c8611cb9565b602002602001015161131d565b6102de57600080fd5b806102e881611d17565b91505061028a565b506060860151602087015160a08801516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015233602482015260448101919091529116906323b872dd90606401602060405180830381600087803b15801561037757600080fd5b505af115801561038b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103af9190611d50565b6103b857600080fd5b7ffe7ce4ede4e17a67309fb218be86869fcb5ddf36df5527e01b6587401975d5323387602001518860600151878a60a00151888c60e001516040516104039796959493929190611dfa565b60405180910390a150600195945050505050565b60008061042686868686610cc2565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560e087015160c0880151608089015192935061047c923392919061131d565b61048557600080fd5b60005b84518110156105b0578481815181106104a3576104a3611cb9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff166323b872dd8860200151338785815181106104de576104de611cb9565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff93841660048201529290911660248301526044820152606401602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105959190611d50565b61059e57600080fd5b806105a881611d17565b915050610488565b507fd738f9db82fc9d0ced647127bc6af6b87cab3bf281afb2ab409a34452e806ce4338760200151868960800151878b60c001518c60e001516040516104039796959493929190611e6a565b60008060008061060b876112cd565b925092509250600061061c89611469565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610674573d6000803e3d6000fd5b505050602060405103519050896020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461071e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e617475726500000000000000000000000000000060448201526064015b60405180910390fd5b8760405160200161072f9190611ed9565b604051602081830303815290604052805190602001208a60800151146107b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f71756f746520746f6b656e732068617368206d69736d617463680000000000006044820152606401610715565b866040516020016107c29190611eec565b604051602081830303815290604052805190602001208a60c0015114610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f71756f7465207175616e7469746965732068617368206d69736d6174636800006044820152606401610715565b3373ffffffffffffffffffffffffffffffffffffffff821614156108ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616b65722f74616b6572206d75737420626520646966666572656e7420616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610715565b896040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d616b65722061646472657373206d69736d61746368000000000000000000006044820152606401610715565b895142106109ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e617475726520657870697265640000000000000000000000000000006044820152606401610715565b60008281526003602052604090205460ff1615610a66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5369676e617475726520726575736500000000000000000000000000000000006044820152606401610715565b5098975050505050505050565b600081604051602001610a869190611eec565b604051602081830303815290604052805190602001209050919050565b600080610ab08484610f05565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560e085015160c08601516080870151929350610b06923392919061131d565b610b0f57600080fd5b6060840151602085015160a08601516040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff928316600482015233602482015260448101919091529116906323b872dd90606401602060405180830381600087803b158015610b9557600080fd5b505af1158015610ba9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcd9190611d50565b610bd657600080fd5b7f6738a758f2c8e7950ecaa7a951b807c13226cf94cc476a977552fe145aa91caf338560200151866060015187608001518860a001518960c001518a60e00151604051610c6e979695949392919073ffffffffffffffffffffffffffffffffffffffff9788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b60405180910390a15060019392505050565b604051806080016040528060528152602001611f6060529139604051602001610ca99190611eff565b6040516020818303038152906040528051906020012081565b600080600080610cd1876112cd565b9250925092506000610ce289611595565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610d3a573d6000803e3d6000fd5b505050602060405103519050896020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ddf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610715565b87604051602001610df09190611ed9565b604051602081830303815290604052805190602001208a6060015114610e72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6261736520746f6b656e2068617368206d69736d6174636800000000000000006044820152606401610715565b86604051602001610e839190611eec565b604051602081830303815290604052805190602001208a60a0015114610844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f62617365207175616e7469746965732068617368206d69736d617463680000006044820152606401610715565b600080600080610f14856112cd565b9250925092506000610f258761166b565b6040805160008082526020820180845284905260ff86169282019290925260608101879052608081018690529192509060019060a0016020604051602081039080840390855afa158015610f7d573d6000803e3d6000fd5b505050602060405103519050876020015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610715565b3373ffffffffffffffffffffffffffffffffffffffff821614156110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f4d616b65722f74616b6572206d75737420626520646966666572656e7420616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610715565b876040015173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611161576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d616b65722061646472657373206d69736d61746368000000000000000000006044820152606401610715565b875142106111cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5369676e617475726520657870697265640000000000000000000000000000006044820152606401610715565b60008860a001511180156111e3575060008860c00151115b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420626173652f71756f746520616d6f756e74000000000000006044820152606401610715565b60008281526003602052604090205460ff16156112c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5369676e617475726520726575736500000000000000000000000000000000006044820152606401610715565b509695505050505050565b6020810151604082015160418301516000928392839260ff16601b8110156112fd576112fa601b82611f3a565b90505b9196909550909350915050565b600081604051602001610a869190611ed9565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156113a55782341461135d57600080fd5b60405173ffffffffffffffffffffffffffffffffffffffff8516903480156108fc02916000818181858888f1935050505015801561139f573d6000803e3d6000fd5b5061145e565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590528316906323b872dd90606401602060405180830381600087803b15801561141d57600080fd5b505af1158015611431573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114559190611d50565b61145e57600080fd5b506001949350505050565b60006002546040518060e0016040528060aa815260200161205860aa91396040516020016114979190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff95861660408901529385166060880152918416608087015260a086015260c085015260e0840152166101008201526101200190565b60405160208183030381529060405280519060200120604051602001610a869291907f190100000000000000000000000000000000000000000000000000000000000081526002810192909252602282015260420190565b60006002546040518060e0016040528060aa815260200161210260aa91396040516020016115c39190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff958616604089015293851660608801526080870192909252831660a086015260c085015260e0840152166101008201526101200190565b60006002546040518060e0016040528060a68152602001611fb260a691396040516020016116999190611eff565b60405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a001518960c001518a60e0015160405160200161153d99989796959493929190988952602089019790975273ffffffffffffffffffffffffffffffffffffffff958616604089015293851660608801529184166080870152831660a086015260c085015260e0840152166101008201526101200190565b60006020828403121561175357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff811182821017156117ad576117ad61175a565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156117fa576117fa61175a565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461182657600080fd5b919050565b600082601f83011261183c57600080fd5b813567ffffffffffffffff8111156118565761185661175a565b61188760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016117b3565b81815284602083860101111561189c57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff8211156118d3576118d361175a565b5060051b60200190565b600082601f8301126118ee57600080fd5b813560206119036118fe836118b9565b6117b3565b82815260059290921b8401810191818101908684111561192257600080fd5b8286015b848110156112c25761193781611802565b8352918301918301611926565b600082601f83011261195557600080fd5b813560206119656118fe836118b9565b82815260059290921b8401810191818101908684111561198457600080fd5b8286015b848110156112c25780358352918301918301611988565b6000806000808486036101608112156119b757600080fd5b610100808212156119c757600080fd5b6119cf611789565b9150863582526119e160208801611802565b60208301526119f260408801611802565b6040830152611a0360608801611802565b60608301526080870135608083015260a087013560a083015260c087013560c0830152611a3260e08801611802565b60e083015290945085013567ffffffffffffffff80821115611a5357600080fd5b611a5f8883890161182b565b9450610120870135915080821115611a7657600080fd5b611a82888389016118dd565b9350610140870135915080821115611a9957600080fd5b50611aa687828801611944565b91505092959194509250565b600080600080848603610160811215611aca57600080fd5b61010080821215611ada57600080fd5b611ae2611789565b915086358252611af460208801611802565b6020830152611b0560408801611802565b604083015260608701356060830152611b2060808801611802565b608083015260a087013560a083015260c087013560c0830152611a3260e08801611802565b600060208284031215611b5757600080fd5b813567ffffffffffffffff811115611b6e57600080fd5b611b7a84828501611944565b949350505050565b600080828403610120811215611b9757600080fd5b61010080821215611ba757600080fd5b611baf611789565b915084358252611bc160208601611802565b6020830152611bd260408601611802565b6040830152611be360608601611802565b6060830152611bf460808601611802565b608083015260a085013560a083015260c085013560c0830152611c1960e08601611802565b60e083015290925083013567ffffffffffffffff811115611c3957600080fd5b611c458582860161182b565b9150509250929050565b600060208284031215611c6157600080fd5b813567ffffffffffffffff811115611c7857600080fd5b611b7a8482850161182b565b600060208284031215611c9657600080fd5b813567ffffffffffffffff811115611cad57600080fd5b611b7a848285016118dd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415611d4957611d49611ce8565b5060010190565b600060208284031215611d6257600080fd5b81518015158114611d7257600080fd5b9392505050565b600081518084526020808501945080840160005b83811015611dbf57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611d8d565b509495945050505050565b600081518084526020808501945080840160005b83811015611dbf57815187529582019590820190600101611dde565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015260e06060840152611e3a60e0840188611d79565b86608085015283810360a0850152611e528187611dca565b92505080841660c08401525098975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a168352808916602084015260e06040840152611ea260e0840189611d79565b81881660608501528381036080850152611ebc8188611dca565b60a0850196909652509290921660c0909101525095945050505050565b602081526000611d726020830184611d79565b602081526000611d726020830184611dca565b6000825160005b81811015611f205760208186018101518583015201611f06565b81811115611f2f576000828501525b509190910192915050565b600060ff821660ff84168060ff03821115611f5757611f57611ce8565b01939250505056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294f726465722875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6164647265737320626173655f746f6b656e2c616464726573732071756f74655f746f6b656e2c75696e7432353620626173655f7175616e746974792c75696e743235362071756f74655f7175616e746974792c61646472657373207265636569766572294f72646572332875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6164647265737320626173655f746f6b656e2c627974657333322071756f74655f746f6b656e732c75696e7432353620626173655f7175616e746974792c627974657333322071756f74655f7175616e7469746965732c61646472657373207265636569766572294f72646572322875696e74323536206578706972792c616464726573732074616b65725f616464726573732c61646472657373206d616b65725f616464726573732c6279746573333220626173655f746f6b656e732c616464726573732071756f74655f746f6b656e2c6279746573333220626173655f7175616e7469746965732c75696e743235362071756f74655f7175616e746974792c6164647265737320726563656976657229a26469706673582212207c2909c904d1589091d876d046e70836df2a0e3f707b326b8e5cc446b253dcd464736f6c63430008090033

Deployed Bytecode Sourcemap

1672:13427:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4697:42;;;;;;;;;;-1:-1:-1;4697:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;364:14:1;;357:22;339:41;;327:2;312:18;4697:42:0;;;;;;;;13903:1193;;;;;;:::i;:::-;;:::i;12707:1121::-;;;;;;:::i;:::-;;:::i;10171:1062::-;;;;;;;;;;-1:-1:-1;10171:1062:0;;;;;:::i;:::-;;:::i;:::-;;;6724:25:1;;;6712:2;6697:18;10171:1062:0;6578:177:1;5627:191:0;;;;;;;;;;-1:-1:-1;5627:191:0;;;;;:::i;:::-;;:::i;11722:910::-;;;;;;:::i;:::-;;:::i;2688:100::-;;;;;;;;;;;;;:::i;9110:1053::-;;;;;;;;;;-1:-1:-1;9110:1053:0;;;;;:::i;:::-;;:::i;8283:819::-;;;;;;;;;;-1:-1:-1;8283:819:0;;;;;:::i;:::-;;:::i;5041:440::-;;;;;;;;;;-1:-1:-1;5041:440:0;;;;;:::i;:::-;;:::i;:::-;;;;8704:25:1;;;8760:2;8745:18;;8738:34;;;;8820:4;8808:17;8788:18;;;8781:45;8692:2;8677:18;5041:440:0;8506:326:1;5489:130:0;;;;;;;;;;-1:-1:-1;5489:130:0;;;;;:::i;:::-;;:::i;13903:1193::-;14097:4;14114:9;14126:124;14158:5;14178:3;14196:12;14223:16;14126:17;:124::i;:::-;14261:13;;;;:10;:13;;;;;:20;;;;14277:4;14261:20;;;14114:136;;-1:-1:-1;14294:305:0;14318:12;:19;14314:1;:23;14294:305;;;14385:187;14426:10;14459:5;:14;;;14496:16;14513:1;14496:19;;;;;;;;:::i;:::-;;;;;;;14538:12;14551:1;14538:15;;;;;;;;:::i;:::-;;;;;;;14385:18;:187::i;:::-;14359:228;;;;;;14339:3;;;;:::i;:::-;;;;14294:305;;;-1:-1:-1;14648:16:0;;;;14698:19;;;;14765;;;;14633:166;;;;;:46;10049:15:1;;;14633:166:0;;;10031:34:1;14736:10:0;10081:18:1;;;10074:43;10133:18;;;10126:34;;;;14633:46:0;;;;;9943:18:1;;14633:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14611:199;;;;;;14828:236;14857:10;14882:5;:19;;;14916:5;:16;;;14947:12;14974:5;:19;;;15008:16;15039:5;:14;;;14828:236;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;15084:4:0;;13903:1193;-1:-1:-1;;;;;13903:1193:0:o;12707:1121::-;12899:4;12916:9;12928:59;12946:5;12953:3;12958:11;12971:15;12928:17;:59::i;:::-;12998:13;;;;:10;:13;;;;;:20;;;;13014:4;12998:20;;;13119:14;;;;13152:20;;;;13191:17;;;;12916:71;;-1:-1:-1;13053:170:0;;13090:10;;13119:14;13152:20;13053:18;:170::i;:::-;13031:203;;;;;;13252:9;13247:296;13271:11;:18;13267:1;:22;13247:296;;;13352:11;13364:1;13352:14;;;;;;;;:::i;:::-;;;;;;;13337:44;;;13404:5;:19;;;13446:10;13479:15;13495:1;13479:18;;;;;;;;:::i;:::-;;;;;;;;;;;13337:179;;;;;;;;;;9980:42:1;10049:15;;;13337:179:0;;;10031:34:1;10101:15;;;;10081:18;;;10074:43;10133:18;;;10126:34;9943:18;;13337:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13311:220;;;;;;13291:3;;;;:::i;:::-;;;;13247:296;;;;13560:236;13589:10;13614:5;:19;;;13648:11;13674:5;:17;;;13706:15;13736:5;:20;;;13771:5;:14;;;13560:236;;;;;;;;;;;;:::i;10171:1062::-;10367:7;10388:9;10399;10410:7;10421:11;10428:3;10421:6;:11::i;:::-;10387:45;;;;;;10443:9;10455:17;10466:5;10455:10;:17::i;:::-;10500:21;;;10483:14;10500:21;;;;;;;;;13463:25:1;;;13536:4;13524:17;;13504:18;;;13497:45;;;;13558:18;;;13551:34;;;13601:18;;;13594:34;;;10443:29:0;;-1:-1:-1;10483:14:0;10500:21;;13435:19:1;;10500:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10483:38;;10552:5;:19;;;10542:29;;:6;:29;;;10534:59;;;;;;;13841:2:1;10534:59:0;;;13823:21:1;13880:2;13860:18;;;13853:30;13919:19;13899:18;;;13892:47;13956:18;;10534:59:0;;;;;;;;;10669:12;10658:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;10648:35;;;;;;10626:5;:18;;;:57;10604:133;;;;;;;14453:2:1;10604:133:0;;;14435:21:1;14492:2;14472:18;;;14465:30;14531:28;14511:18;;;14504:56;14577:18;;10604:133:0;14251:350:1;10604:133:0;10817:16;10806:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;10796:39;;;;;;10770:5;:22;;;:65;10748:145;;;;;;;15074:2:1;10748:145:0;;;15056:21:1;15113:2;15093:18;;;15086:30;15152:32;15132:18;;;15125:60;15202:18;;10748:145:0;14872:354:1;10748:145:0;10912:10;:20;;;;;10904:70;;;;;;;15433:2:1;10904:70:0;;;15415:21:1;15472:2;15452:18;;;15445:30;15511:34;15491:18;;;15484:62;15582:7;15562:18;;;15555:35;15607:19;;10904:70:0;15231:401:1;10904:70:0;11007:5;:19;;;10993:33;;:10;:33;;;10985:68;;;;;;;15839:2:1;10985:68:0;;;15821:21:1;15878:2;15858:18;;;15851:30;15917:24;15897:18;;;15890:52;15959:18;;10985:68:0;15637:346:1;10985:68:0;11072:12;;11087:15;-1:-1:-1;11064:60:0;;;;;;;16190:2:1;11064:60:0;;;16172:21:1;16229:2;16209:18;;;16202:30;16268:19;16248:18;;;16241:47;16305:18;;11064:60:0;15988:341:1;11064:60:0;11144:13;;;;:10;:13;;;;;;;;11143:14;11135:42;;;;;;;16536:2:1;11135:42:0;;;16518:21:1;16575:2;16555:18;;;16548:30;16614:17;16594:18;;;16587:45;16649:18;;11135:42:0;16334:339:1;11135:42:0;-1:-1:-1;11224:1:0;10171:1062;-1:-1:-1;;;;;;;;10171:1062:0:o;5627:191::-;5739:7;5792:16;5781:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;5771:39;;;;;;5764:46;;5627:191;;;:::o;11722:910::-;11832:4;11854:9;11866:28;11883:5;11890:3;11866:16;:28::i;:::-;11905:13;;;;:10;:13;;;;;:20;;;;11921:4;11905:20;;;12024:14;;;;12057:20;;;;12096:17;;;;11854:40;;-1:-1:-1;11958:170:0;;11995:10;;12024:14;12057:20;11958:18;:170::i;:::-;11936:203;;;;;;12179:16;;;;12228:19;;;;12295;;;;12172:157;;;;;:37;10049:15:1;;;12172:157:0;;;10031:34:1;12266:10:0;10081:18:1;;;10074:43;10133:18;;;10126:34;;;;12172:37:0;;;;;9943:18:1;;12172:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12150:190;;;;;;12358:244;12386:10;12411:5;:19;;;12445:5;:16;;;12476:5;:17;;;12508:5;:19;;;12542:5;:20;;;12577:5;:14;;;12358:244;;;;;;;;;;;17003:42:1;17072:15;;;17054:34;;17124:15;;;17119:2;17104:18;;17097:43;17176:15;;;17171:2;17156:18;;17149:43;17228:15;;;17223:2;17208:18;;17201:43;17275:3;17260:19;;17253:35;17319:3;17304:19;;17297:35;17369:15;;;17363:3;17348:19;;17341:44;16980:3;16965:19;;16678:713;12358:244:0;;;;;;;;-1:-1:-1;12620:4:0;;11722:910;-1:-1:-1;;;11722:910:0:o;2688:100::-;2773:13;;;;;;;;;;;;;;;;;2756:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;2746:42;;;;;;2688:100;:::o;9110:1053::-;9304:7;9325:9;9336;9347:7;9358:11;9365:3;9358:6;:11::i;:::-;9324:45;;;;;;9380:9;9392:17;9403:5;9392:10;:17::i;:::-;9437:21;;;9420:14;9437:21;;;;;;;;;13463:25:1;;;13536:4;13524:17;;13504:18;;;13497:45;;;;13558:18;;;13551:34;;;13601:18;;;13594:34;;;9380:29:0;;-1:-1:-1;9420:14:0;9437:21;;13435:19:1;;9437:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9420:38;;9489:5;:19;;;9479:29;;:6;:29;;;9471:59;;;;;;;13841:2:1;9471:59:0;;;13823:21:1;13880:2;13860:18;;;13853:30;13919:19;13899:18;;;13892:47;13956:18;;9471:59:0;13639:341:1;9471:59:0;9605:11;9594:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;9584:34;;;;;;9563:5;:17;;;:55;9541:129;;;;;;;18031:2:1;9541:129:0;;;18013:21:1;18070:2;18050:18;;;18043:30;18109:26;18089:18;;;18082:54;18153:18;;9541:129:0;17829:348:1;9541:129:0;9749:15;9738:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;9728:38;;;;;;9703:5;:21;;;:63;9681:142;;;;;;;18384:2:1;9681:142:0;;;18366:21:1;18423:2;18403:18;;;18396:30;18462:31;18442:18;;;18435:59;18511:18;;9681:142:0;18182:353:1;8283:819:0;8395:7;8421:9;8432;8443:7;8454:11;8461:3;8454:6;:11::i;:::-;8420:45;;;;;;8476:9;8488:16;8498:5;8488:9;:16::i;:::-;8532:21;;;8515:14;8532:21;;;;;;;;;13463:25:1;;;13536:4;13524:17;;13504:18;;;13497:45;;;;13558:18;;;13551:34;;;13601:18;;;13594:34;;;8476:28:0;;-1:-1:-1;8515:14:0;8532:21;;13435:19:1;;8532:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8515:38;;8584:5;:19;;;8574:29;;:6;:29;;;8566:59;;;;;;;13841:2:1;8566:59:0;;;13823:21:1;13880:2;13860:18;;;13853:30;13919:19;13899:18;;;13892:47;13956:18;;8566:59:0;13639:341:1;8566:59:0;8644:10;:20;;;;;8636:70;;;;;;;15433:2:1;8636:70:0;;;15415:21:1;15472:2;15452:18;;;15445:30;15511:34;15491:18;;;15484:62;15582:7;15562:18;;;15555:35;15607:19;;8636:70:0;15231:401:1;8636:70:0;8739:5;:19;;;8725:33;;:10;:33;;;8717:68;;;;;;;15839:2:1;8717:68:0;;;15821:21:1;15878:2;15858:18;;;15851:30;15917:24;15897:18;;;15890:52;15959:18;;8717:68:0;15637:346:1;8717:68:0;8804:12;;8819:15;-1:-1:-1;8796:60:0;;;;;;;16190:2:1;8796:60:0;;;16172:21:1;16229:2;16209:18;;;16202:30;16268:19;16248:18;;;16241:47;16305:18;;8796:60:0;15988:341:1;8796:60:0;8911:1;8889:5;:19;;;:23;:51;;;;;8939:1;8916:5;:20;;;:24;8889:51;8867:126;;;;;;;18742:2:1;8867:126:0;;;18724:21:1;18781:2;18761:18;;;18754:30;18820:27;18800:18;;;18793:55;18865:18;;8867:126:0;18540:349:1;8867:126:0;9013:13;;;;:10;:13;;;;;;;;9012:14;9004:42;;;;;;;16536:2:1;9004:42:0;;;16518:21:1;16575:2;16555:18;;;16548:30;16614:17;16594:18;;;16587:45;16649:18;;9004:42:0;16334:339:1;9004:42:0;-1:-1:-1;9093:1:0;8283:819;-1:-1:-1;;;;;;8283:819:0:o;5041:440::-;5316:2;5307:12;;5301:19;5354:2;5345:12;;5339:19;5396:2;5387:12;;5381:19;5137:7;;;;;;5402:3;5377:29;5435:2;5431:6;;5427:19;;;5439:7;5444:2;5439:7;;:::i;:::-;;;5427:19;5465:1;;5468;;-1:-1:-1;5465:1:0;;-1:-1:-1;5041:440:0;-1:-1:-1;;5041:440:0:o;5489:130::-;5555:7;5603:6;5592:18;;;;;;;;:::i;11241:406::-;11388:4;11409:16;;;2822:42;11409:16;11405:213;;;11463:8;11450:9;:21;11442:30;;;;;;11487:31;;:20;;;;11508:9;11487:31;;;;;;;;;11508:9;11487:20;:31;;;;;;;;;;;;;;;;;;;;;11405:213;;;11559:46;;;;;:26;10049:15:1;;;11559:46:0;;;10031:34:1;10101:15;;;10081:18;;;10074:43;10133:18;;;10126:34;;;11559:26:0;;;;;9943:18:1;;11559:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11551:55;;;;;;-1:-1:-1;11635:4:0;11241:406;;;;;;:::o;7462:813::-;7525:7;7665:16;;4634:11;;;;;;;;;;;;;;;;;4617:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;4607:40;;;;;;7827:5;:12;;;7870:5;:19;;;7920:5;:19;;;7970:5;:16;;;8017:5;:18;;;8066:5;:19;;;8116:5;:22;;;8169:5;:14;;;7740:470;;;;;;;;;;;;;;;19474:25:1;;;19530:2;19515:18;;19508:34;;;;19561:42;19639:15;;;19634:2;19619:18;;19612:43;19691:15;;;19686:2;19671:18;;19664:43;19744:15;;;19738:3;19723:19;;19716:44;19791:3;19776:19;;19769:35;19835:3;19820:19;;19813:35;19879:3;19864:19;;19857:35;19929:15;19923:3;19908:19;;19901:44;19461:3;19446:19;;19103:848;7740:470:0;;;;;;;;;;;;;7704:529;;;;;;7593:659;;;;;;;;20226:66:1;20214:79;;20318:1;20309:11;;20302:27;;;;20354:2;20345:12;;20338:28;20391:2;20382:12;;19956:444;6641:813:0;6704:7;6844:16;;4332:11;;;;;;;;;;;;;;;;;4315:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;4305:40;;;;;;7006:5;:12;;;7049:5;:19;;;7099:5;:19;;;7149:5;:17;;;7197:5;:17;;;7245:5;:21;;;7297:5;:20;;;7348:5;:14;;;6919:470;;;;;;;;;;;;;;;20776:25:1;;;20832:2;20817:18;;20810:34;;;;20863:42;20941:15;;;20936:2;20921:18;;20914:43;20993:15;;;20988:2;20973:18;;20966:43;21040:3;21025:19;;21018:35;;;;21090:15;;21084:3;21069:19;;21062:44;21137:3;21122:19;;21115:35;21181:3;21166:19;;21159:35;21231:15;21225:3;21210:19;;21203:44;20763:3;20748:19;;20405:848;5826:807:0;5887:7;6027:16;;4031:10;;;;;;;;;;;;;;;;;4014:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;4004:39;;;;;;6188:5;:12;;;6231:5;:19;;;6281:5;:19;;;6331:5;:16;;;6378:5;:17;;;6426:5;:19;;;6476:5;:20;;;6527:5;:14;;;6102:466;;;;;;;;;;;;;;;21629:25:1;;;21685:2;21670:18;;21663:34;;;;21716:42;21794:15;;;21789:2;21774:18;;21767:43;21846:15;;;21841:2;21826:18;;21819:43;21899:15;;;21893:3;21878:19;;21871:44;21952:15;;21946:3;21931:19;;21924:44;21999:3;21984:19;;21977:35;22043:3;22028:19;;22021:35;22093:15;22087:3;22072:19;;22065:44;21616:3;21601:19;;21258:857;14:180;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;391:184::-;443:77;440:1;433:88;540:4;537:1;530:15;564:4;561:1;554:15;580:255;652:2;646:9;694:6;682:19;;731:18;716:34;;752:22;;;713:62;710:88;;;778:18;;:::i;:::-;814:2;807:22;580:255;:::o;840:334::-;911:2;905:9;967:2;957:13;;972:66;953:86;941:99;;1070:18;1055:34;;1091:22;;;1052:62;1049:88;;;1117:18;;:::i;:::-;1153:2;1146:22;840:334;;-1:-1:-1;840:334:1:o;1179:196::-;1247:20;;1307:42;1296:54;;1286:65;;1276:93;;1365:1;1362;1355:12;1276:93;1179:196;;;:::o;1380:589::-;1422:5;1475:3;1468:4;1460:6;1456:17;1452:27;1442:55;;1493:1;1490;1483:12;1442:55;1529:6;1516:20;1555:18;1551:2;1548:26;1545:52;;;1577:18;;:::i;:::-;1621:114;1729:4;1660:66;1653:4;1649:2;1645:13;1641:86;1637:97;1621:114;:::i;:::-;1760:2;1751:7;1744:19;1806:3;1799:4;1794:2;1786:6;1782:15;1778:26;1775:35;1772:55;;;1823:1;1820;1813:12;1772:55;1888:2;1881:4;1873:6;1869:17;1862:4;1853:7;1849:18;1836:55;1936:1;1911:16;;;1929:4;1907:27;1900:38;;;;1915:7;1380:589;-1:-1:-1;;;1380:589:1:o;1974:183::-;2034:4;2067:18;2059:6;2056:30;2053:56;;;2089:18;;:::i;:::-;-1:-1:-1;2134:1:1;2130:14;2146:4;2126:25;;1974:183::o;2162:668::-;2216:5;2269:3;2262:4;2254:6;2250:17;2246:27;2236:55;;2287:1;2284;2277:12;2236:55;2323:6;2310:20;2349:4;2373:60;2389:43;2429:2;2389:43;:::i;:::-;2373:60;:::i;:::-;2467:15;;;2553:1;2549:10;;;;2537:23;;2533:32;;;2498:12;;;;2577:15;;;2574:35;;;2605:1;2602;2595:12;2574:35;2641:2;2633:6;2629:15;2653:148;2669:6;2664:3;2661:15;2653:148;;;2735:23;2754:3;2735:23;:::i;:::-;2723:36;;2779:12;;;;2686;;2653:148;;2835:662;2889:5;2942:3;2935:4;2927:6;2923:17;2919:27;2909:55;;2960:1;2957;2950:12;2909:55;2996:6;2983:20;3022:4;3046:60;3062:43;3102:2;3062:43;:::i;3046:60::-;3140:15;;;3226:1;3222:10;;;;3210:23;;3206:32;;;3171:12;;;;3250:15;;;3247:35;;;3278:1;3275;3268:12;3247:35;3314:2;3306:6;3302:15;3326:142;3342:6;3337:3;3334:15;3326:142;;;3408:17;;3396:30;;3446:12;;;;3359;;3326:142;;3502:1533;3670:6;3678;3686;3694;3738:9;3729:7;3725:23;3768:3;3764:2;3760:12;3757:32;;;3785:1;3782;3775:12;3757:32;3808:6;3834:2;3830;3826:11;3823:31;;;3850:1;3847;3840:12;3823:31;3876:22;;:::i;:::-;3863:35;;3934:9;3921:23;3914:5;3907:38;3977;4011:2;4000:9;3996:18;3977:38;:::i;:::-;3972:2;3965:5;3961:14;3954:62;4048:38;4082:2;4071:9;4067:18;4048:38;:::i;:::-;4043:2;4036:5;4032:14;4025:62;4119:38;4153:2;4142:9;4138:18;4119:38;:::i;:::-;4114:2;4107:5;4103:14;4096:62;4219:3;4208:9;4204:19;4191:33;4185:3;4178:5;4174:15;4167:58;4286:3;4275:9;4271:19;4258:33;4252:3;4245:5;4241:15;4234:58;4353:3;4342:9;4338:19;4325:33;4319:3;4312:5;4308:15;4301:58;4392:39;4426:3;4415:9;4411:19;4392:39;:::i;:::-;4386:3;4375:15;;4368:64;4379:5;;-1:-1:-1;4492:18:1;;4479:32;4530:18;4560:14;;;4557:34;;;4587:1;4584;4577:12;4557:34;4610:49;4651:7;4642:6;4631:9;4627:22;4610:49;:::i;:::-;4600:59;;4712:3;4701:9;4697:19;4684:33;4668:49;;4742:2;4732:8;4729:16;4726:36;;;4758:1;4755;4748:12;4726:36;4781:63;4836:7;4825:8;4814:9;4810:24;4781:63;:::i;:::-;4771:73;;4897:3;4886:9;4882:19;4869:33;4853:49;;4927:2;4917:8;4914:16;4911:36;;;4943:1;4940;4933:12;4911:36;;4966:63;5021:7;5010:8;4999:9;4995:24;4966:63;:::i;:::-;4956:73;;;3502:1533;;;;;;;:::o;5040:::-;5208:6;5216;5224;5232;5276:9;5267:7;5263:23;5306:3;5302:2;5298:12;5295:32;;;5323:1;5320;5313:12;5295:32;5346:6;5372:2;5368;5364:11;5361:31;;;5388:1;5385;5378:12;5361:31;5414:22;;:::i;:::-;5401:35;;5472:9;5459:23;5452:5;5445:38;5515;5549:2;5538:9;5534:18;5515:38;:::i;:::-;5510:2;5503:5;5499:14;5492:62;5586:38;5620:2;5609:9;5605:18;5586:38;:::i;:::-;5581:2;5574:5;5570:14;5563:62;5685:2;5674:9;5670:18;5657:32;5652:2;5645:5;5641:14;5634:56;5723:39;5757:3;5746:9;5742:19;5723:39;:::i;:::-;5717:3;5710:5;5706:15;5699:64;5824:3;5813:9;5809:19;5796:33;5790:3;5783:5;5779:15;5772:58;5891:3;5880:9;5876:19;5863:33;5857:3;5850:5;5846:15;5839:58;5930:39;5964:3;5953:9;5949:19;5930:39;:::i;6760:348::-;6844:6;6897:2;6885:9;6876:7;6872:23;6868:32;6865:52;;;6913:1;6910;6903:12;6865:52;6953:9;6940:23;6986:18;6978:6;6975:30;6972:50;;;7018:1;7015;7008:12;6972:50;7041:61;7094:7;7085:6;7074:9;7070:22;7041:61;:::i;:::-;7031:71;6760:348;-1:-1:-1;;;;6760:348:1:o;7113:1063::-;7212:6;7220;7264:9;7255:7;7251:23;7294:3;7290:2;7286:12;7283:32;;;7311:1;7308;7301:12;7283:32;7334:6;7360:2;7356;7352:11;7349:31;;;7376:1;7373;7366:12;7349:31;7402:22;;:::i;:::-;7389:35;;7460:9;7447:23;7440:5;7433:38;7503;7537:2;7526:9;7522:18;7503:38;:::i;:::-;7498:2;7491:5;7487:14;7480:62;7574:38;7608:2;7597:9;7593:18;7574:38;:::i;:::-;7569:2;7562:5;7558:14;7551:62;7645:38;7679:2;7668:9;7664:18;7645:38;:::i;:::-;7640:2;7633:5;7629:14;7622:62;7717:39;7751:3;7740:9;7736:19;7717:39;:::i;:::-;7711:3;7704:5;7700:15;7693:64;7818:3;7807:9;7803:19;7790:33;7784:3;7777:5;7773:15;7766:58;7885:3;7874:9;7870:19;7857:33;7851:3;7844:5;7840:15;7833:58;7924:39;7958:3;7947:9;7943:19;7924:39;:::i;:::-;7918:3;7907:15;;7900:64;7911:5;;-1:-1:-1;8024:18:1;;8011:32;8066:18;8055:30;;8052:50;;;8098:1;8095;8088:12;8052:50;8121:49;8162:7;8153:6;8142:9;8138:22;8121:49;:::i;:::-;8111:59;;;7113:1063;;;;;:::o;8181:320::-;8249:6;8302:2;8290:9;8281:7;8277:23;8273:32;8270:52;;;8318:1;8315;8308:12;8270:52;8358:9;8345:23;8391:18;8383:6;8380:30;8377:50;;;8423:1;8420;8413:12;8377:50;8446:49;8487:7;8478:6;8467:9;8463:22;8446:49;:::i;8837:348::-;8921:6;8974:2;8962:9;8953:7;8949:23;8945:32;8942:52;;;8990:1;8987;8980:12;8942:52;9030:9;9017:23;9063:18;9055:6;9052:30;9049:50;;;9095:1;9092;9085:12;9049:50;9118:61;9171:7;9162:6;9151:9;9147:22;9118:61;:::i;9190:184::-;9242:77;9239:1;9232:88;9339:4;9336:1;9329:15;9363:4;9360:1;9353:15;9379:184;9431:77;9428:1;9421:88;9528:4;9525:1;9518:15;9552:4;9549:1;9542:15;9568:195;9607:3;9638:66;9631:5;9628:77;9625:103;;;9708:18;;:::i;:::-;-1:-1:-1;9755:1:1;9744:13;;9568:195::o;10171:277::-;10238:6;10291:2;10279:9;10270:7;10266:23;10262:32;10259:52;;;10307:1;10304;10297:12;10259:52;10339:9;10333:16;10392:5;10385:13;10378:21;10371:5;10368:32;10358:60;;10414:1;10411;10404:12;10358:60;10437:5;10171:277;-1:-1:-1;;;10171:277:1:o;10453:484::-;10506:3;10544:5;10538:12;10571:6;10566:3;10559:19;10597:4;10626:2;10621:3;10617:12;10610:19;;10663:2;10656:5;10652:14;10684:1;10694:218;10708:6;10705:1;10702:13;10694:218;;;10773:13;;10788:42;10769:62;10757:75;;10852:12;;;;10887:15;;;;10730:1;10723:9;10694:218;;;-1:-1:-1;10928:3:1;;10453:484;-1:-1:-1;;;;;10453:484:1:o;10942:435::-;10995:3;11033:5;11027:12;11060:6;11055:3;11048:19;11086:4;11115:2;11110:3;11106:12;11099:19;;11152:2;11145:5;11141:14;11173:1;11183:169;11197:6;11194:1;11191:13;11183:169;;;11258:13;;11246:26;;11292:12;;;;11327:15;;;;11219:1;11212:9;11183:169;;11382:922;11742:4;11771:42;11852:2;11844:6;11840:15;11829:9;11822:34;11904:2;11896:6;11892:15;11887:2;11876:9;11872:18;11865:43;11956:2;11948:6;11944:15;11939:2;11928:9;11924:18;11917:43;11996:3;11991:2;11980:9;11976:18;11969:31;12023:57;12075:3;12064:9;12060:19;12052:6;12023:57;:::i;:::-;12117:6;12111:3;12100:9;12096:19;12089:35;12173:9;12165:6;12161:22;12155:3;12144:9;12140:19;12133:51;12201:44;12238:6;12230;12201:44;:::i;:::-;12193:52;;;12294:2;12286:6;12282:15;12276:3;12265:9;12261:19;12254:44;;11382:922;;;;;;;;;;:::o;12309:::-;12669:4;12698:42;12779:2;12771:6;12767:15;12756:9;12749:34;12831:2;12823:6;12819:15;12814:2;12803:9;12799:18;12792:43;12871:3;12866:2;12855:9;12851:18;12844:31;12898:57;12950:3;12939:9;12935:19;12927:6;12898:57;:::i;:::-;13003:2;12995:6;12991:15;12986:2;12975:9;12971:18;12964:43;13056:9;13048:6;13044:22;13038:3;13027:9;13023:19;13016:51;13084:44;13121:6;13113;13084:44;:::i;:::-;13159:3;13144:19;;13137:35;;;;-1:-1:-1;13209:15:1;;;;13203:3;13188:19;;;13181:44;-1:-1:-1;13076:52:1;12309:922;-1:-1:-1;;;;;12309:922:1:o;13985:261::-;14164:2;14153:9;14146:21;14127:4;14184:56;14236:2;14225:9;14221:18;14213:6;14184:56;:::i;14606:261::-;14785:2;14774:9;14767:21;14748:4;14805:56;14857:2;14846:9;14842:18;14834:6;14805:56;:::i;17396:428::-;17527:3;17565:6;17559:13;17590:1;17600:129;17614:6;17611:1;17608:13;17600:129;;;17712:4;17696:14;;;17692:25;;17686:32;17673:11;;;17666:53;17629:12;17600:129;;;17747:6;17744:1;17741:13;17738:48;;;17782:1;17773:6;17768:3;17764:16;17757:27;17738:48;-1:-1:-1;17802:16:1;;;;;17396:428;-1:-1:-1;;17396:428:1:o;18894:204::-;18932:3;18968:4;18965:1;18961:12;19000:4;18997:1;18993:12;19035:3;19029:4;19025:14;19020:3;19017:23;19014:49;;;19043:18;;:::i;:::-;19079:13;;18894:204;-1:-1:-1;;;18894:204:1:o

Swarm Source

ipfs://7c2909c904d1589091d876d046e70836df2a0e3f707b326b8e5cc446b253dcd4

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
[ 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.