ETH Price: $2,190.67 (+4.48%)

Contract

0x80BaCff346B34df50316b78ecCED99F501dc5e8a
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Method Block
From
To
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xB48cE889...33C85F396
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
NativeMetaTransactionProcessor

Compiler Version
v0.5.9+commit.e560f70d

Optimization Enabled:
Yes with 2000 runs

Other Settings:
petersburg EvmVersion, None license

Contract Source Code (Solidity Standard Json-Input format)

pragma solidity 0.5.9;

import "../../../contracts_common/src/Libraries/BytesUtil.sol";
import "../../../contracts_common/src/Libraries/SigUtil.sol";
import "../../../contracts_common/src/Interfaces/ERC1271.sol";
import "../../../contracts_common/src/Interfaces/ERC1271Constants.sol";
import "../../../contracts_common/src/Interfaces/ERC1654.sol";
import "../../../contracts_common/src/Interfaces/ERC1654Constants.sol";
import "../../TheSandbox712.sol";

interface ExecutionableERC20 {

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

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

    function approveAndExecuteWithSpecificGas(
        address from,
        address to,
        uint256 amount,
        uint256 gasLimit,
        bytes calldata data
    ) external returns (bool success, bytes memory returnData);

    function approveAndExecuteWithSpecificGasAndChargeForIt(
        address from,
        address to,
        uint256 amount,
        uint256 gasLimit,
        uint256 tokenGasPrice,
        uint256 baseGasCharge,
        address tokenReceiver,
        bytes calldata data
    ) external returns (bool success, bytes memory returnData);

    function transferAndChargeForGas(
        address from,
        address to,
        uint256 amount,
        uint256 gasLimit,
        uint256 tokenGasPrice,
        uint256 baseGasCharge,
        address tokenReceiver
    ) external;
}

contract NativeMetaTransactionProcessor is ERC1654Constants, ERC1271Constants, TheSandbox712 {
    enum SignatureType { DIRECT, EIP1654, EIP1271 }

    bytes32 constant ERC20METATRANSACTION_TYPEHASH = keccak256(
        "ERC20MetaTransaction(address from,address to,uint256 amount,bytes data,uint256 nonce,uint256 minGasPrice,uint256 txGas,uint256 baseGas,uint256 tokenGasPrice,address relayer)"
    );
    mapping(address => uint256) nonces;

    event MetaTx(
        address indexed from,
        uint256 indexed nonce,
        bool success
    );

    ExecutionableERC20 _tokenContract;

    constructor(ExecutionableERC20 tokenContract) public {
        _tokenContract = tokenContract;
        init712();
    }

    /// @notice gets the current nonce (number of metatx emitted) of `from`.
    /// @param owner The address to query the nonce of.
    /// @return the current nonce
    function meta_nonce(address owner) external view returns (uint256 nonce) {
        return nonces[owner];
    }

    /// @notice perform the meta-tx using EIP-712 message.
    /// @param from address from which the meta-tx originate.
    /// @param to destination address where the call will be performed.
    /// @param amount number of tokens to be transfered/allowed as part of the call.
    /// @param data bytes to send to the destination.
    /// @param params the meta-tx parameters : nonce, minGasPrice, txGas, baseGas, tokenGasPrice.
    /// @param relayer the address allowed to perform the meta-tx.
    /// @param signature the signature that ensure from has allowed the meta-tx to be performed.
    /// @param tokenReceiver recipient of the gas charge.
    /// @param signatureType indicate whether it was signed via EOA=0, EIP-1654=1 or EIP-1271=2.
    /// @return success whether the execution was successful.
    /// @return returnData data resulting from the execution.
    function executeERC20MetaTx(
        address from,
        address to,
        uint256 amount,
        bytes calldata data,
        uint256[5] calldata params, // nonce, minGasPrice, txGas, baseGas, tokenGasPrice
        address relayer,
        bytes calldata signature,
        address tokenReceiver,
        SignatureType signatureType
    ) external returns (bool success, bytes memory returnData) {
        ensureParametersValidity(from, params, relayer);
        ensureCorrectSigner(
            from,
            to,
            amount,
            data,
            params,
            relayer,
            signature,
            ERC20METATRANSACTION_TYPEHASH,
            signatureType
        );
        return
            performERC20MetaTx(
                from,
                to,
                amount,
                data,
                params,
                tokenReceiver
            );
    }

    /// @notice perform the meta-tx using personal_sign message.
    /// @param from address from which the meta-tx originate.
    /// @param to destination address where the call will be performed.
    /// @param amount number of tokens to be transfered/allowed as part of the call.
    /// @param data bytes to send to the destination.
    /// @param params the meta-tx parameters : nonce, minGasPrice, txGas, baseGas, tokenGasPrice.
    /// @param relayer the address allowed to perform the meta-tx.
    /// @param signature the signature that ensure from has allowed the meta-tx to be performed.
    /// @param tokenReceiver recipient of the gas charge.
    /// @param signatureType indicate whether it was signed via EOA=0, EIP-1654=1 or EIP-1271=2.
    /// @return success whether the execution was successful.
    /// @return returnData data resulting from the execution.
    function executeERC20MetaTxViaBasicSignature(
        address from,
        address to,
        uint256 amount,
        bytes calldata data,
        uint256[5] calldata params, // nonce, minGasPrice, txGas, baseGas, tokenGasPrice
        address relayer,
        bytes calldata signature,
        address tokenReceiver,
        SignatureType signatureType
    ) external returns (bool, bytes memory) {
        ensureParametersValidity(from, params, relayer);
        ensureCorrectSignerViaBasicSignature(
            from,
            to,
            amount,
            data,
            params,
            relayer,
            signature,
            ERC20METATRANSACTION_TYPEHASH,
            signatureType
        );
        return
            performERC20MetaTx(
                from,
                to,
                amount,
                data,
                params,
                tokenReceiver
            );
    }

    function ensureParametersValidity(
        address from,
        uint256[5] memory params, // nonce, minGasPrice, txGas, baseGas, tokenGasPrice
        address relayer
    ) internal view {
        require(
            relayer == address(0) || relayer == msg.sender,
            "wrong relayer"
        );
        require(nonces[from] + 1 == params[0], "nonce out of order");
        require(tx.gasprice >= params[1], "gasPrice < signer minGasPrice");
    }

    function ensureCorrectSigner(
        address from,
        address to,
        uint256 amount,
        bytes memory data,
        uint256[5] memory params, // nonce, minGasPrice, txGas, baseGas, tokenGasPrice
        address relayer,
        bytes memory signature,
        bytes32 typeHash,
        SignatureType signatureType
    ) internal view {
        bytes memory dataToHash = abi.encodePacked(
            "\x19\x01",
            domainSeparator(),
            keccak256(
                abi.encode(
                    typeHash,
                    from,
                    to,
                    amount,
                    keccak256(data),
                    params[0],
                    params[1],
                    params[2],
                    params[3],
                    params[4],
                    relayer
                )
            )
        );
        if (signatureType == SignatureType.EIP1271) {
            require(
                ERC1271(from).isValidSignature(dataToHash, signature) == ERC1271_MAGICVALUE,
                "invalid 1271 signature"
            );
        } else if(signatureType == SignatureType.EIP1654){
            require(
                ERC1654(from).isValidSignature(keccak256(dataToHash), signature) == ERC1654_MAGICVALUE,
                "invalid 1654 signature"
            );
        } else {
            address signer = SigUtil.recover(keccak256(dataToHash), signature);
            require(signer == from, "signer != from");
        }
    }

    function encodeBasicSignatureData(
        bytes32 typeHash,
        address from,
        address to,
        uint256 amount,
        bytes memory data,
        uint256[5] memory params,
        address relayer
    ) internal view returns (bytes32) {
        return
            keccak256(
                abi.encodePacked(
                    address(this),
                    typeHash,
                    from,
                    to,
                    amount,
                    keccak256(data),
                    params[0],
                    params[1],
                    params[2],
                    params[3],
                    params[4],
                    relayer
                )
            );
    }

    function ensureCorrectSignerViaBasicSignature(
        address from,
        address to,
        uint256 amount,
        bytes memory data,
        uint256[5] memory params, // nonce, minGasPrice, txGas, baseGas, tokenGasPrice
        address relayer,
        bytes memory signature,
        bytes32 typeHash,
        SignatureType signatureType
    ) internal view {
        bytes memory dataToHash = SigUtil.prefixed(
            encodeBasicSignatureData(
                typeHash,
                from,
                to,
                amount,
                data,
                params,
                relayer
            )
        );
        if (signatureType == SignatureType.EIP1271) {
            require(
                ERC1271(from).isValidSignature(dataToHash, signature) == ERC1271_MAGICVALUE,
                "invalid 1271 signature"
            );
        } else if (signatureType == SignatureType.EIP1654) {
            require(
                ERC1654(from).isValidSignature(keccak256(dataToHash), signature) == ERC1654_MAGICVALUE,
                "invalid 1654 signature"
            );
        } else {
            address signer = SigUtil.recover(keccak256(dataToHash), signature);
            require(signer == from, "signer != from");
        }
    }

    function performERC20MetaTx(
        address from,
        address to,
        uint256 amount,
        bytes memory data,
        uint256[5] memory params,
        address tokenReceiver
    ) internal returns (bool success, bytes memory returnData) {
        nonces[from] = params[0];

        if (data.length == 0) {
            if(params[4] > 0) {
                _tokenContract.transferAndChargeForGas(
                    from,
                    to,
                    amount,
                    params[2],
                    params[4],
                    params[3],
                    tokenReceiver
                );
            } else {
                require(_tokenContract.transferFrom(from, to, amount), "failed transfer");
            }
            success = true;
        } else {
            require(
                BytesUtil.doFirstParamEqualsAddress(data, from),
                "first param != from"
            );
            if(params[4] > 0) {
                (success, returnData) = _tokenContract.approveAndExecuteWithSpecificGasAndChargeForIt(
                    from,
                    to,
                    amount,
                    params[2],
                    params[4],
                    params[3],
                    tokenReceiver,
                    data
                );
            } else {
                (success, returnData) = _tokenContract.approveAndExecuteWithSpecificGas(from, to, amount, params[2], data);
            }
        }

        emit MetaTx(from, params[0], success);
    }
}

File 2 of 9 : ProxyImplementation.sol
pragma solidity ^0.5.2;

contract ProxyImplementation {
    mapping(string => bool) _initialised;

    modifier phase(string memory phaseName) {
        if (!_initialised[phaseName]) {
            _initialised[phaseName] = true;
            _;
        }
    }
}

pragma solidity ^0.5.2;

contract ERC1271 {

    /**
    * @dev Should return whether the signature provided is valid for the provided data
    * @param data Arbitrary length data signed on the behalf of address(this)
    * @param signature Signature byte array associated with _data
    *
    * MUST return the bytes4 magic value 0x20c13b0b when function passes.
    * MUST NOT modify state (using STATICCALL for solc < 0.5, view modifier for solc > 0.5)
    * MUST allow external calls
    */
    function isValidSignature(bytes memory data, bytes memory signature)
        public
        view
        returns (bytes4 magicValue);
}

File 4 of 9 : ERC1271Constants.sol
pragma solidity ^0.5.2;

contract ERC1271Constants {
    bytes4 internal constant ERC1271_MAGICVALUE = 0x20c13b0b;
}

pragma solidity ^0.5.2;

contract ERC1654 {

    /**
    * @dev Should return whether the signature provided is valid for the provided hash
    * @param hash 32 bytes hash to be signed
    * @param signature Signature byte array associated with hash
    * @return 0x1626ba7e if valid else 0x00000000
    */
    function isValidSignature(bytes32 hash, bytes memory signature)
        public
        view
        returns (bytes4 magicValue);
}

File 6 of 9 : ERC1654Constants.sol
pragma solidity ^0.5.2;

contract ERC1654Constants {
    bytes4 internal constant ERC1654_MAGICVALUE = 0x1626ba7e;
}

pragma solidity ^0.5.2;

library BytesUtil {
    function memcpy(uint256 dest, uint256 src, uint256 len) internal pure {
        // Copy word-length chunks while possible
        for (; len >= 32; len -= 32) {
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }

        // Copy remaining bytes
        uint256 mask = 256**(32 - len) - 1;
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
    }

    function pointerToBytes(uint256 src, uint256 len)
        internal
        pure
        returns (bytes memory)
    {
        bytes memory ret = new bytes(len);
        uint256 retptr;
        assembly {
            retptr := add(ret, 32)
        }

        memcpy(retptr, src, len);
        return ret;
    }

    function addressToBytes(address a) internal pure returns (bytes memory b) {
        assembly {
            let m := mload(0x40)
            mstore(
                add(m, 20),
                xor(0x140000000000000000000000000000000000000000, a)
            )
            mstore(0x40, add(m, 52))
            b := m
        }
    }

    function uint256ToBytes(uint256 a) internal pure returns (bytes memory b) {
        assembly {
            let m := mload(0x40)
            mstore(add(m, 32), a)
            mstore(0x40, add(m, 64))
            b := m
        }
    }

    function doFirstParamEqualsAddress(bytes memory data, address _address)
        internal
        pure
        returns (bool)
    {
        if (data.length < (36 + 32)) {
            return false;
        }
        uint256 value;
        assembly {
            value := mload(add(data, 36))
        }
        return value == uint256(_address);
    }

    function doParamEqualsUInt256(bytes memory data, uint256 i, uint256 value)
        internal
        pure
        returns (bool)
    {
        if (data.length < (36 + (i + 1) * 32)) {
            return false;
        }
        uint256 offset = 36 + i * 32;
        uint256 valuePresent;
        assembly {
            valuePresent := mload(add(data, offset))
        }
        return valuePresent == value;
    }

    function overrideFirst32BytesWithAddress(
        bytes memory data,
        address _address
    ) internal pure returns (bytes memory) {
        uint256 dest;
        assembly {
            dest := add(data, 48)
        } // 48 = 32 (offset) + 4 (func sig) + 12 (address is only 20 bytes)

        bytes memory addressBytes = addressToBytes(_address);
        uint256 src;
        assembly {
            src := add(addressBytes, 32)
        }

        memcpy(dest, src, 20);
        return data;
    }

    function overrideFirstTwo32BytesWithAddressAndInt(
        bytes memory data,
        address _address,
        uint256 _value
    ) internal pure returns (bytes memory) {
        uint256 dest;
        uint256 src;

        assembly {
            dest := add(data, 48)
        } // 48 = 32 (offset) + 4 (func sig) + 12 (address is only 20 bytes)
        bytes memory bbytes = addressToBytes(_address);
        assembly {
            src := add(bbytes, 32)
        }
        memcpy(dest, src, 20);

        assembly {
            dest := add(data, 68)
        } // 48 = 32 (offset) + 4 (func sig) + 32 (next slot)
        bbytes = uint256ToBytes(_value);
        assembly {
            src := add(bbytes, 32)
        }
        memcpy(dest, src, 32);

        return data;
    }
}

pragma solidity ^0.5.2;

library SigUtil {
    function recover(bytes32 hash, bytes memory sig)
        internal
        pure
        returns (address recovered)
    {
        require(sig.length == 65);

        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }

        // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
        if (v < 27) {
            v += 27;
        }
        require(v == 27 || v == 28);

        recovered = ecrecover(hash, v, r, s);
        require(recovered != address(0));
    }

    function recoverWithZeroOnFailure(bytes32 hash, bytes memory sig)
        internal
        pure
        returns (address)
    {
        if (sig.length != 65) {
            return (address(0));
        }

        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }

        // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            return ecrecover(hash, v, r, s);
        }
    }

    // Builds a prefixed hash to mimic the behavior of eth_sign.
    function prefixed(bytes32 hash) internal pure returns (bytes memory) {
        return abi.encodePacked("\x19Ethereum Signed Message:\n32", hash);
    }
}

pragma solidity 0.5.9;

import {
    ProxyImplementation
} from "../contracts_common/src/BaseWithStorage/ProxyImplementation.sol";

contract TheSandbox712 is ProxyImplementation {
    bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,address verifyingContract)"
    );
    bytes32 DOMAIN_SEPARATOR;

    function init712() public phase("712") {
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                EIP712DOMAIN_TYPEHASH,
                keccak256("The Sandbox 3D"),
                keccak256("1"),
                address(this)
            )
        );
    }

    function domainSeparator() internal view returns (bytes32) {
        return DOMAIN_SEPARATOR;
    }
}

Settings
{
  "evmVersion": "petersburg",
  "libraries": {},
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 2000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"meta_nonce","outputs":[{"name":"nonce","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"},{"name":"params","type":"uint256[5]"},{"name":"relayer","type":"address"},{"name":"signature","type":"bytes"},{"name":"tokenReceiver","type":"address"},{"name":"signatureType","type":"uint8"}],"name":"executeERC20MetaTxViaBasicSignature","outputs":[{"name":"","type":"bool"},{"name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"},{"name":"params","type":"uint256[5]"},{"name":"relayer","type":"address"},{"name":"signature","type":"bytes"},{"name":"tokenReceiver","type":"address"},{"name":"signatureType","type":"uint8"}],"name":"executeERC20MetaTx","outputs":[{"name":"success","type":"bool"},{"name":"returnData","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"init712","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tokenContract","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"nonce","type":"uint256"},{"indexed":false,"name":"success","type":"bool"}],"name":"MetaTx","type":"event"}]

0x60806040523480156200001157600080fd5b50604051620019bb380380620019bb833981810160405260208110156200003757600080fd5b5051600380546001600160a01b0319166001600160a01b0383161790556200005e62000065565b5062000231565b6040518060400160405280600381526020017f37313200000000000000000000000000000000000000000000000000000000008152506000816040518082805190602001908083835b60208310620000cf5780518252601f199092019160209182019101620000ae565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff1691506200022e90505760016000826040518082805190602001908083835b602083106200013d5780518252601f1990920191602091820191016200011c565b51815160209384036101000a600019018019909216911617905292019485525060405193849003018320805460ff191694151594909417909355509050806042620019798239604080519182900360420182207f5468652053616e64626f782033440000000000000000000000000000000000008352815192839003600e0183207f3100000000000000000000000000000000000000000000000000000000000000845282519384900360019081018520602080870194909452858501929092526060850191909152306080808601919091528351808603909101815260a090940190925282519201919091209055505b50565b61173880620002416000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630327f06c14610051578063405cdcac14610089578063ca7d3aae14610212578063ff75d70014610318575b600080fd5b6100776004803603602081101561006757600080fd5b50356001600160a01b0316610322565b60408051918252519081900360200190f35b61018f60048036036101a08110156100a057600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156100db57600080fd5b8201836020820111156100ed57600080fd5b8035906020019184600183028401116401000000008311171561010f57600080fd5b919390926001600160a01b0360a084013516919060e0840160c085013564010000000081111561013e57600080fd5b82018360208201111561015057600080fd5b8035906020019184600183028401116401000000008311171561017257600080fd5b919350915080356001600160a01b0316906020013560ff1661033d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156101d65781810151838201526020016101be565b50505050905090810190601f1680156102035780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61018f60048036036101a081101561022957600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561026457600080fd5b82018360208201111561027657600080fd5b8035906020019184600183028401116401000000008311171561029857600080fd5b919390926001600160a01b0360a084013516919060e0840160c08501356401000000008111156102c757600080fd5b8201836020820111156102d957600080fd5b803590602001918460018302840111640100000000831117156102fb57600080fd5b919350915080356001600160a01b0316906020013560ff166104aa565b61032061059a565b005b6001600160a01b031660009081526002602052604090205490565b600060606103768d8960058060200260405190810160405280929190826005602002808284376000920191909152508b915061077e9050565b61042d8d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f9150600590839083908082843760009201919091525050604080516020601f8f018190048102820181019092528d81528f9250908e908e908190840183828082843760009201919091525050604051915081905060ad611657823960ad01905060405180910390208b6108bb565b6104968d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f915060059083908390808284376000920191909152508b9150610cd69050565b915091509b509b9950505050505050505050565b600060606104e38d8960058060200260405190810160405280929190826005602002808284376000920191909152508b915061077e9050565b61042d8d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f9150600590839083908082843760009201919091525050604080516020601f8f018190048102820181019092528d81528f9250908e908e908190840183828082843760009201919091525050604051915081905060ad611657823960ad01905060405180910390208b6112c7565b6040518060400160405280600381526020017f37313200000000000000000000000000000000000000000000000000000000008152506000816040518082805190602001908083835b602083106106025780518252601f1990920191602091820191016105e3565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16915061077b90505760016000826040518082805190602001908083835b6020831061066d5780518252601f19909201916020918201910161064e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016941515949094179093555090508060426116158239604080519182900360420182207f5468652053616e64626f782033440000000000000000000000000000000000008352815192839003600e0183207f3100000000000000000000000000000000000000000000000000000000000000845282519384900360019081018520602080870194909452858501929092526060850191909152306080808601919091528351808603909101815260a090940190925282519201919091209055505b50565b6001600160a01b038116158061079c57506001600160a01b03811633145b6107ed576040805162461bcd60e51b815260206004820152600d60248201527f77726f6e672072656c6179657200000000000000000000000000000000000000604482015290519081900360640190fd5b81516001600160a01b0384166000908152600260205260409020546001011461085d576040805162461bcd60e51b815260206004820152601260248201527f6e6f6e6365206f7574206f66206f726465720000000000000000000000000000604482015290519081900360640190fd5b60208201513a10156108b6576040805162461bcd60e51b815260206004820152601d60248201527f6761735072696365203c207369676e6572206d696e4761735072696365000000604482015290519081900360640190fd5b505050565b60606108d46108cf848c8c8c8c8c8c6113e6565b6114d0565b905060025b8260028111156108e557fe5b1415610abd57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008082526004820192835283516044830152835190926001600160a01b038e16926320c13b0b9286928a92909182916024810191606490910190602087019080838360005b8381101561096c578181015183820152602001610954565b50505050905090810190601f1680156109995780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156109cc5781810151838201526020016109b4565b50505050905090810190601f1680156109f95780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015610a1857600080fd5b505afa158015610a2c573d6000803e3d6000fd5b505050506040513d6020811015610a4257600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614610ab8576040805162461bcd60e51b815260206004820152601660248201527f696e76616c69642031323731207369676e617475726500000000000000000000604482015290519081900360640190fd5b610cca565b6001826002811115610acb57fe5b1415610c4d57631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a6001600160a01b0316631626ba7e8380519060200120876040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015610bad57600080fd5b505afa158015610bc1573d6000803e3d6000fd5b505050506040513d6020811015610bd757600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614610ab8576040805162461bcd60e51b815260206004820152601660248201527f696e76616c69642031363534207369676e617475726500000000000000000000604482015290519081900360640190fd5b6000610c60828051906020012086611515565b90508a6001600160a01b0316816001600160a01b031614610cc8576040805162461bcd60e51b815260206004820152600e60248201527f7369676e657220213d2066726f6d000000000000000000000000000000000000604482015290519081900360640190fd5b505b50505050505050505050565b81516001600160a01b0387166000908152600260205260408120919091558351606090610ec157608084015115610dc4576003546040808601516080870151606088015183517fe18aa3350000000000000000000000000000000000000000000000000000000081526001600160a01b038e811660048301528d81166024830152604482018d90526064820194909452608481019290925260a482015286821660c4820152915192169163e18aa3359160e48082019260009290919082900301818387803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b50505050610eb8565b600354604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a81166024830152604482018a9052915191909216916323b872dd9160648083019260209291908290030181600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505050506040513d6020811015610e6557600080fd5b5051610eb8576040805162461bcd60e51b815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b60019150611279565b610ecb85896115e2565b610f1c576040805162461bcd60e51b815260206004820152601360248201527f666972737420706172616d20213d2066726f6d00000000000000000000000000604482015290519081900360640190fd5b6080840151156110ee576003546001600160a01b031663dc2173f3898989886002602002015189600460200201518a600360200201518a8d6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611000578181015183820152602001610fe8565b50505050905090810190601f16801561102d5780820380516001836020036101000a031916815260200191505b509950505050505050505050600060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561109057600080fd5b8151602083018051919392830192916401000000008111156110b157600080fd5b820160208101848111156110c457600080fd5b81516401000000008111828201871017156110de57600080fd5b5094965094506112799350505050565b6003546001600160a01b0316637dd711c489898988600260200201518a6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561119357818101518382015260200161117b565b50505050905090810190601f1680156111c05780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561122057600080fd5b81516020830180519193928301929164010000000081111561124157600080fd5b8201602081018481111561125457600080fd5b815164010000000081118282018710171561126e57600080fd5b509496509450505050505b835160408051841515815290516001600160a01b038b16917fefaba2f33aa25b55dc754bc8f130e29d44762a2c46ea678d680fd81da0d8b65e919081900360200190a3965096945050505050565b60606112d161160e565b838b8b8b8b805190602001208b6000600581106112ea57fe5b60200201518c600160200201518d600260200201518e600360200201518f600460209081029190910151604080518084019c909c526001600160a01b039a8b168c820152988a1660608c015260808b019790975260a08a019590955260c089019390935260e088019190915261010087015261012086015261014085019190915291891661016080850191909152815180850390910181526101808401825280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101a08401526101a28301939093526101c280830193909352805180830390930183526101e29091019052905060026108d9565b6000308888888888805190602001208860006005811061140257fe5b602090810291909101518a8201516040808d01516060808f01516080909f015183519c821b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081168e89015260348e019c909c5299811b8b1660548d015297881b8a1660688c0152607c8b0196909652609c8a019490945260bc89019190915260dc88015260fc87019290925261011c86019890985261013c8501929092529490941b1661015c820152835180820361015001815261017090910190935250815191012095945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8082019390935281518082039093018352605c01905290565b6000815160411461152557600080fd5b60208201516040830151606084015160001a601b81101561154457601b015b8060ff16601b148061155957508060ff16601c145b61156257600080fd5b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156115b9573d6000803e3d6000fd5b5050604051601f1901519450506001600160a01b0384166115d957600080fd5b50505092915050565b60006044835110156115f657506000611608565b5060248201516001600160a01b038216145b92915050565b6001549056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742945524332304d6574615472616e73616374696f6e28616464726573732066726f6d2c6164647265737320746f2c75696e7432353620616d6f756e742c627974657320646174612c75696e74323536206e6f6e63652c75696e74323536206d696e47617350726963652c75696e743235362074784761732c75696e7432353620626173654761732c75696e7432353620746f6b656e47617350726963652c616464726573732072656c6179657229a265627a7a7230582031a490d829ddb4cd9001e774a0a495b144837f5228105d37cc1759031bbf7fde64736f6c63430005090032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e7472616374290000000000000000000000001f67c99a21015c37c2c11b554917831cdd550f1f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630327f06c14610051578063405cdcac14610089578063ca7d3aae14610212578063ff75d70014610318575b600080fd5b6100776004803603602081101561006757600080fd5b50356001600160a01b0316610322565b60408051918252519081900360200190f35b61018f60048036036101a08110156100a057600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156100db57600080fd5b8201836020820111156100ed57600080fd5b8035906020019184600183028401116401000000008311171561010f57600080fd5b919390926001600160a01b0360a084013516919060e0840160c085013564010000000081111561013e57600080fd5b82018360208201111561015057600080fd5b8035906020019184600183028401116401000000008311171561017257600080fd5b919350915080356001600160a01b0316906020013560ff1661033d565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156101d65781810151838201526020016101be565b50505050905090810190601f1680156102035780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b61018f60048036036101a081101561022957600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561026457600080fd5b82018360208201111561027657600080fd5b8035906020019184600183028401116401000000008311171561029857600080fd5b919390926001600160a01b0360a084013516919060e0840160c08501356401000000008111156102c757600080fd5b8201836020820111156102d957600080fd5b803590602001918460018302840111640100000000831117156102fb57600080fd5b919350915080356001600160a01b0316906020013560ff166104aa565b61032061059a565b005b6001600160a01b031660009081526002602052604090205490565b600060606103768d8960058060200260405190810160405280929190826005602002808284376000920191909152508b915061077e9050565b61042d8d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f9150600590839083908082843760009201919091525050604080516020601f8f018190048102820181019092528d81528f9250908e908e908190840183828082843760009201919091525050604051915081905060ad611657823960ad01905060405180910390208b6108bb565b6104968d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f915060059083908390808284376000920191909152508b9150610cd69050565b915091509b509b9950505050505050505050565b600060606104e38d8960058060200260405190810160405280929190826005602002808284376000920191909152508b915061077e9050565b61042d8d8d8d8d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506040805160a081810190925292508f9150600590839083908082843760009201919091525050604080516020601f8f018190048102820181019092528d81528f9250908e908e908190840183828082843760009201919091525050604051915081905060ad611657823960ad01905060405180910390208b6112c7565b6040518060400160405280600381526020017f37313200000000000000000000000000000000000000000000000000000000008152506000816040518082805190602001908083835b602083106106025780518252601f1990920191602091820191016105e3565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff16915061077b90505760016000826040518082805190602001908083835b6020831061066d5780518252601f19909201916020918201910161064e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016941515949094179093555090508060426116158239604080519182900360420182207f5468652053616e64626f782033440000000000000000000000000000000000008352815192839003600e0183207f3100000000000000000000000000000000000000000000000000000000000000845282519384900360019081018520602080870194909452858501929092526060850191909152306080808601919091528351808603909101815260a090940190925282519201919091209055505b50565b6001600160a01b038116158061079c57506001600160a01b03811633145b6107ed576040805162461bcd60e51b815260206004820152600d60248201527f77726f6e672072656c6179657200000000000000000000000000000000000000604482015290519081900360640190fd5b81516001600160a01b0384166000908152600260205260409020546001011461085d576040805162461bcd60e51b815260206004820152601260248201527f6e6f6e6365206f7574206f66206f726465720000000000000000000000000000604482015290519081900360640190fd5b60208201513a10156108b6576040805162461bcd60e51b815260206004820152601d60248201527f6761735072696365203c207369676e6572206d696e4761735072696365000000604482015290519081900360640190fd5b505050565b60606108d46108cf848c8c8c8c8c8c6113e6565b6114d0565b905060025b8260028111156108e557fe5b1415610abd57604080517f20c13b0b000000000000000000000000000000000000000000000000000000008082526004820192835283516044830152835190926001600160a01b038e16926320c13b0b9286928a92909182916024810191606490910190602087019080838360005b8381101561096c578181015183820152602001610954565b50505050905090810190601f1680156109995780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156109cc5781810151838201526020016109b4565b50505050905090810190601f1680156109f95780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015610a1857600080fd5b505afa158015610a2c573d6000803e3d6000fd5b505050506040513d6020811015610a4257600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614610ab8576040805162461bcd60e51b815260206004820152601660248201527f696e76616c69642031323731207369676e617475726500000000000000000000604482015290519081900360640190fd5b610cca565b6001826002811115610acb57fe5b1415610c4d57631626ba7e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a6001600160a01b0316631626ba7e8380519060200120876040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610b62578181015183820152602001610b4a565b50505050905090810190601f168015610b8f5780820380516001836020036101000a031916815260200191505b50935050505060206040518083038186803b158015610bad57600080fd5b505afa158015610bc1573d6000803e3d6000fd5b505050506040513d6020811015610bd757600080fd5b50517fffffffff000000000000000000000000000000000000000000000000000000001614610ab8576040805162461bcd60e51b815260206004820152601660248201527f696e76616c69642031363534207369676e617475726500000000000000000000604482015290519081900360640190fd5b6000610c60828051906020012086611515565b90508a6001600160a01b0316816001600160a01b031614610cc8576040805162461bcd60e51b815260206004820152600e60248201527f7369676e657220213d2066726f6d000000000000000000000000000000000000604482015290519081900360640190fd5b505b50505050505050505050565b81516001600160a01b0387166000908152600260205260408120919091558351606090610ec157608084015115610dc4576003546040808601516080870151606088015183517fe18aa3350000000000000000000000000000000000000000000000000000000081526001600160a01b038e811660048301528d81166024830152604482018d90526064820194909452608481019290925260a482015286821660c4820152915192169163e18aa3359160e48082019260009290919082900301818387803b158015610da757600080fd5b505af1158015610dbb573d6000803e3d6000fd5b50505050610eb8565b600354604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301528a81166024830152604482018a9052915191909216916323b872dd9160648083019260209291908290030181600087803b158015610e3b57600080fd5b505af1158015610e4f573d6000803e3d6000fd5b505050506040513d6020811015610e6557600080fd5b5051610eb8576040805162461bcd60e51b815260206004820152600f60248201527f6661696c6564207472616e736665720000000000000000000000000000000000604482015290519081900360640190fd5b60019150611279565b610ecb85896115e2565b610f1c576040805162461bcd60e51b815260206004820152601360248201527f666972737420706172616d20213d2066726f6d00000000000000000000000000604482015290519081900360640190fd5b6080840151156110ee576003546001600160a01b031663dc2173f3898989886002602002015189600460200201518a600360200201518a8d6040518963ffffffff1660e01b815260040180896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001878152602001868152602001858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611000578181015183820152602001610fe8565b50505050905090810190601f16801561102d5780820380516001836020036101000a031916815260200191505b509950505050505050505050600060405180830381600087803b15801561105357600080fd5b505af1158015611067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561109057600080fd5b8151602083018051919392830192916401000000008111156110b157600080fd5b820160208101848111156110c457600080fd5b81516401000000008111828201871017156110de57600080fd5b5094965094506112799350505050565b6003546001600160a01b0316637dd711c489898988600260200201518a6040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561119357818101518382015260200161117b565b50505050905090810190601f1680156111c05780820380516001836020036101000a031916815260200191505b509650505050505050600060405180830381600087803b1580156111e357600080fd5b505af11580156111f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561122057600080fd5b81516020830180519193928301929164010000000081111561124157600080fd5b8201602081018481111561125457600080fd5b815164010000000081118282018710171561126e57600080fd5b509496509450505050505b835160408051841515815290516001600160a01b038b16917fefaba2f33aa25b55dc754bc8f130e29d44762a2c46ea678d680fd81da0d8b65e919081900360200190a3965096945050505050565b60606112d161160e565b838b8b8b8b805190602001208b6000600581106112ea57fe5b60200201518c600160200201518d600260200201518e600360200201518f600460209081029190910151604080518084019c909c526001600160a01b039a8b168c820152988a1660608c015260808b019790975260a08a019590955260c089019390935260e088019190915261010087015261012086015261014085019190915291891661016080850191909152815180850390910181526101808401825280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101a08401526101a28301939093526101c280830193909352805180830390930183526101e29091019052905060026108d9565b6000308888888888805190602001208860006005811061140257fe5b602090810291909101518a8201516040808d01516060808f01516080909f015183519c821b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081168e89015260348e019c909c5299811b8b1660548d015297881b8a1660688c0152607c8b0196909652609c8a019490945260bc89019190915260dc88015260fc87019290925261011c86019890985261013c8501929092529490941b1661015c820152835180820361015001815261017090910190935250815191012095945050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8082019390935281518082039093018352605c01905290565b6000815160411461152557600080fd5b60208201516040830151606084015160001a601b81101561154457601b015b8060ff16601b148061155957508060ff16601c145b61156257600080fd5b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156115b9573d6000803e3d6000fd5b5050604051601f1901519450506001600160a01b0384166115d957600080fd5b50505092915050565b60006044835110156115f657506000611608565b5060248201516001600160a01b038216145b92915050565b6001549056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742945524332304d6574615472616e73616374696f6e28616464726573732066726f6d2c6164647265737320746f2c75696e7432353620616d6f756e742c627974657320646174612c75696e74323536206e6f6e63652c75696e74323536206d696e47617350726963652c75696e743235362074784761732c75696e7432353620626173654761732c75696e7432353620746f6b656e47617350726963652c616464726573732072656c6179657229a265627a7a7230582031a490d829ddb4cd9001e774a0a495b144837f5228105d37cc1759031bbf7fde64736f6c63430005090032

Deployed Bytecode Sourcemap

1462:10157:7:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1462:10157:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2350:110;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2350:110:7;-1:-1:-1;;;;;2350:110:7;;:::i;:::-;;;;;;;;;;;;;;;;5139:930;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;5139:930:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;5139:930:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5139:930:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5139:930:7;;;;-1:-1:-1;;;;;5139:930:7;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;5139:930:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5139:930:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5139:930:7;;-1:-1:-1;5139:930:7;-1:-1:-1;5139:930:7;;-1:-1:-1;;;;;5139:930:7;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;5139:930:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3339:915;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;3339:915:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3339:915:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3339:915:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3339:915:7;;;;-1:-1:-1;;;;;3339:915:7;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3339:915:7;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3339:915:7;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;3339:915:7;;-1:-1:-1;3339:915:7;-1:-1:-1;3339:915:7;;-1:-1:-1;;;;;3339:915:7;;;;;;;;:::i;355:279:8:-;;;:::i;:::-;;2350:110:7;-1:-1:-1;;;;;2440:13:7;2408;2440;;;:6;:13;;;;;;;2350:110::o;5139:930::-;5519:4;5525:12;5549:47;5574:4;5580:6;5549:47;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;5588:7:7;;-1:-1:-1;5549:24:7;;-1:-1:-1;5549:47:7:i;:::-;5606:252;5656:4;5674:2;5690:6;5710:4;;5606:252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;5606:252:7;;;;;;;;;;;-1:-1:-1;5728:6:7;;-1:-1:-1;5606:252:7;;;;5728:6;;5606:252;5728:6;5606:252;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;5606:252:7;;;;137:4:-1;5606:252:7;;;;;;;;;;;;;;;;;5748:7;;-1:-1:-1;5606:252:7;5769:9;;;;;;5606:252;;5769:9;;;;5606:252;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;1663:200:7;;;-1:-1:-1;1663:200:7;;-1:-1:-1;1663:200:7;;;;;;;;;;;;;;;5835:13;5606:36;:252::i;:::-;5887:175;5923:4;5945:2;5965:6;5989:4;;5887:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;5887:175:7;;;;;;;;;;;-1:-1:-1;6011:6:7;;-1:-1:-1;5887:175:7;;;;6011:6;;5887:175;6011:6;5887:175;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;6035:13:7;;-1:-1:-1;5887:18:7;;-1:-1:-1;5887:175:7:i;:::-;5868:194;;;;5139:930;;;;;;;;;;;;;;:::o;3339:915::-;3702:12;3716:23;3751:47;3776:4;3782:6;3751:47;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3790:7:7;;-1:-1:-1;3751:24:7;;-1:-1:-1;3751:47:7:i;:::-;3808:235;3841:4;3859:2;3875:6;3895:4;;3808:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;3808:235:7;;;;;;;;;;;-1:-1:-1;3913:6:7;;-1:-1:-1;3808:235:7;;;;3913:6;;3808:235;3913:6;3808:235;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;3808:235:7;;;;137:4:-1;3808:235:7;;;;;;;;;;;;;;;;;3933:7;;-1:-1:-1;3808:235:7;3954:9;;;;;;3808:235;;3954:9;;;;3808:235;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;;1663:200:7;;;-1:-1:-1;1663:200:7;;-1:-1:-1;1663:200:7;;;;;;;;;;;;;;;4020:13;3808:19;:235::i;355:279:8:-;103:156:0;;;;;;;;;;;;;;;;;158:12;171:9;158:23;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;158:23:0;;;;;-1:-1:-1;158:23:0;;;;;;;;;;;;;;-1:-1:-1;153:100:0;;-1:-1:-1;153:100:0;223:4;197:12;210:9;197:23;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;197:23:0;;;;;-1:-1:-1;197:23:0;;;;;;;;;:30;;;;;;;;;;;;;;-1:-1:-1;197:23:0;-1:-1:-1;197:23:0;225:93:8;;197:23:0;225:93:8;;;;;;;;;;;;513:27;;;;;;;;;;;;;558:14;;;;;;;;;;;;;;;446:171;;;;;;;;;;;;;;;;;;;;;;598:4;446:171;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;446:171:8;;;;;;;423:204;;;;;;;;404:223;;-1:-1:-1;153:100:0;355:279:8;:::o;6075:457:7:-;-1:-1:-1;;;;;6294:21:7;;;;:46;;-1:-1:-1;;;;;;6319:21:7;;6330:10;6319:21;6294:46;6273:106;;;;;-1:-1:-1;;;6273:106:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;6417:9;;-1:-1:-1;;;;;6397:12:7;;6424:1;6397:12;;;:6;6417:9;6397:12;;;;;6412:1;6397:16;:29;6389:60;;;;;-1:-1:-1;;;6389:60:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;6482:9;;;;6467:11;:24;;6459:66;;;;;-1:-1:-1;;;6459:66:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;6075:457;;;:::o;8786:1278::-;9162:23;9188:241;9218:201;9260:8;9286:4;9308:2;9328:6;9352:4;9374:6;9398:7;9218:24;:201::i;:::-;9188:16;:241::i;:::-;9162:267;-1:-1:-1;9460:21:7;9443:38;:13;:38;;;;;;;;;9439:619;;;9522:53;;;9579:18;9522:53;;;;;;;;;;;;;;;;;9579:18;;-1:-1:-1;;;;;9522:30:7;;;103:10:2;;9553::7;;9565:9;;9522:53;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9522:53:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9522:53:7;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9522:53:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9522:53:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9522:53:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9522:53:7;:75;;;9497:156;;;;;-1:-1:-1;;;9497:156:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;9439:619;;;9691:21;9674:13;:38;;;;;;;;;9670:388;;;103:10:4;9821:18:7;;9753:86;;;9761:4;-1:-1:-1;;;;;9753:30:7;;9794:10;9784:21;;;;;;9807:9;9753:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9753:64:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9753:64:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9753:64:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9753:64:7;:86;;;9728:167;;;;;-1:-1:-1;;;9728:167:7;;;;;;;;;;;;;;;;;;;;;;;;;;;9670:388;9926:14;9943:49;9969:10;9959:21;;;;;;9982:9;9943:15;:49::i;:::-;9926:66;;10024:4;-1:-1:-1;;;;;10014:14:7;:6;-1:-1:-1;;;;;10014:14:7;;10006:41;;;;;-1:-1:-1;;;10006:41:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;9670:388;;8786:1278;;;;;;;;;;:::o;10070:1547::-;10344:9;;-1:-1:-1;;;;;10329:12:7;;10280;10329;;;:6;10344:9;10329:12;;;;:24;;;;10368:11;;10294:23;;10364:1199;;10403:9;;;;:13;10400:425;;10436:14;;10574:9;;;;;10605;;;;10636;;;;10436:262;;;;;-1:-1:-1;;;;;10436:262:7;;;10612:1;10436:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;;;:38;;:262;;;;;-1:-1:-1;;10436:262:7;;;;;;;;-1:-1:-1;10436:14:7;:262;;;5:2:-1;;;;30:1;27;20:12;5:2;10436:262:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10436:262:7;;;;10400:425;;;10745:14;;:45;;;;;;-1:-1:-1;;;;;10745:45:7;;;;;;;;;;;;;;;;;;;;;;:14;;;;;:27;;:45;;;;;;;;;;;;;;:14;;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;10745:45:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10745:45:7;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10745:45:7;10737:73;;;;;-1:-1:-1;;;10737:73:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;10848:4;10838:14;;10364:1199;;;10908:47;10944:4;10950;10908:35;:47::i;:::-;10883:125;;;;;-1:-1:-1;;;10883:125:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;11025:9;;;;:13;11022:531;;11082:14;;-1:-1:-1;;;;;11082:14:7;:61;11165:4;11191:2;11215:6;11243;11250:1;11243:9;;;;11274:6;11281:1;11274:9;;;;11305:6;11312:1;11305:9;;;;11336:13;11371:4;11082:311;;;;;;;;;;;;;-1:-1:-1;;;;;11082:311:7;-1:-1:-1;;;;;11082:311:7;;;;;;-1:-1:-1;;;;;11082:311:7;-1:-1:-1;;;;;11082:311:7;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11082:311:7;-1:-1:-1;;;;;11082:311:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;11082:311:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11082:311:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11082:311:7;;;;;;39:16:-1;36:1;17:17;2:54;101:4;11082:311:7;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;;;5:11;;2:2;;;29:1;26;19:12;2:2;11082:311:7;;;;;;;;;;;;;;19:11:-1;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;11058:335:7;;-1:-1:-1;11082:311:7;-1:-1:-1;11022:531:7;;-1:-1:-1;;;;11022:531:7;;11456:14;;-1:-1:-1;;;;;11456:14:7;:47;11504:4;11510:2;11514:6;11522;11529:1;11522:9;;;;11533:4;11456:82;;;;;;;;;;;;;-1:-1:-1;;;;;11456:82:7;-1:-1:-1;;;;;11456:82:7;;;;;;-1:-1:-1;;;;;11456:82:7;-1:-1:-1;;;;;11456:82:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;11456:82:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11456:82:7;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11456:82:7;;;;;;39:16:-1;36:1;17:17;2:54;101:4;11456:82:7;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;;;5:11;;2:2;;;29:1;26;19:12;2:2;11456:82:7;;;;;;;;;;;;;;19:11:-1;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;11432:106:7;;-1:-1:-1;11456:82:7;-1:-1:-1;;;;;11022:531:7;11591:9;;11578:32;;;;;;;;;;-1:-1:-1;;;;;11578:32:7;;;;;;;;;11591:9;11578:32;;;10070:1547;;;;;;;;;:::o;6538:1511::-;6897:23;6977:17;:15;:17::i;:::-;7067:8;7097:4;7123:2;7147:6;7185:4;7175:15;;;;;;7212:6;7219:1;7212:9;;;;;;;;;;;7243:6;7250:1;7243:9;;;;7274:6;7281:1;7274:9;;;;7305:6;7312:1;7305:9;;;;7336:6;7343:1;7336:9;;;;;;;;;7035:357;;;;;;;;;;-1:-1:-1;;;;;7035:357:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;7035:357:7;;;;;7008:398;;;;;;;;6923:493;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;6923:493:7;;;;;;;-1:-1:-1;6923:493:7;7430:38;;8055:725;8296:7;8407:4;8434:8;8464:4;8490:2;8514:6;8552:4;8542:15;;;;;;8579:6;8586:1;8579:9;;;;;;;;;;;;;;;;8610;;;;8641;;;;;8672;;;;;8703;;;;;8361:398;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;8361:398:7;;;;;;;-1:-1:-1;8334:439:7;;;;;;8055:725;-1:-1:-1;;;;;8055:725:7:o;1459:151:6:-;1545:58;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1545:58:6;;;;;1459:151::o;47:637::-;143:17;184:3;:10;198:2;184:16;176:25;;;;;;310:2;301:12;;295:19;347:2;338:12;;332:19;392:2;383:12;;377:19;212:9;369:28;516:2;512:6;;508:44;;;539:2;534:7;508:44;569:1;:7;;574:2;569:7;:18;;;;580:1;:7;;585:2;580:7;569:18;561:27;;;;;;611:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;611:24:6;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;611:24:6;;-1:-1:-1;;611:24:6;;;-1:-1:-1;;;;;;;653:23:6;;645:32;;;;;;47:637;;;;;;;:::o;1504:348:5:-;1623:4;1662:7;1647:4;:11;:23;1643:66;;;-1:-1:-1;1693:5:5;1686:12;;1643:66;-1:-1:-1;1789:2:5;1779:13;;1773:20;-1:-1:-1;;;;;1828:17:5;;1819:26;1504:348;;;;;:::o;640:99:8:-;716:16;;640:99;:::o

Swarm Source

bzzr://31a490d829ddb4cd9001e774a0a495b144837f5228105d37cc1759031bbf7fde

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.