ETH Price: $2,293.28 (-4.86%)

Contract

0x86132eED1084B46492Ed7f4F28Bb3d70Ae2f2d5F

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SigsRepo

Compiler Version
v0.8.8+commit.dddeac2f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: UNLICENSED

/* *
 * Copyright (c) 2021-2023 LI LI @ JINGTIAN & GONGCHENG.
 *
 * This WORK is licensed under ComBoox SoftWare License 1.0, a copy of which 
 * can be obtained at:
 *         [https://github.com/paul-lee-attorney/comboox]
 *
 * THIS WORK IS PROVIDED ON AN "AS IS" BASIS, WITHOUT 
 * WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED 
 * TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. IN NO 
 * EVENT SHALL ANY CONTRIBUTOR BE LIABLE TO YOU FOR ANY DAMAGES.
 *
 * YOU ARE PROHIBITED FROM DEPLOYING THE SMART CONTRACTS OF THIS WORK, IN WHOLE 
 * OR IN PART, FOR WHATEVER PURPOSE, ON ANY BLOCKCHAIN NETWORK THAT HAS ONE OR 
 * MORE NODES THAT ARE OUT OF YOUR CONTROL.
 * */

pragma solidity ^0.8.8;

import "./EnumerableSet.sol";

library SigsRepo {
    using EnumerableSet for EnumerableSet.UintSet;

    struct Signature {
        uint40 signer;
        uint48 sigDate;
        uint64 blocknumber;
        bool flag;
        uint16 para;
        uint16 arg;
        uint16 seq;
        uint16 attr;
        uint32 data;
    }

    struct Blank{
        EnumerableSet.UintSet seqOfDeals;
        Signature sig;
        bytes32 sigHash;
    }

    // blanks[0].sig {
    //     sigDate: circulateDate;
    //     flag: established;
    //     para: counterOfBlanks;
    //     arg: counterOfSigs;
    //     seq: signingDays;
    //     attr: closingDays;
    // }

    struct Page {
        // party => Blank
        mapping(uint256 => Blank) blanks;
        EnumerableSet.UintSet buyers;
        EnumerableSet.UintSet sellers;
    }

    //###################
    //##    设置接口    ##
    //###################

    function circulateDoc(
        Page storage p
    ) public {
        p.blanks[0].sig.sigDate = uint48(block.timestamp);
    }

    function setTiming(
        Page storage p,
        uint signingDays,
        uint closingDays
    ) public {
        p.blanks[0].sig.seq = uint16(signingDays);
        p.blanks[0].sig.attr = uint16(closingDays);
    }

    function addBlank(
        Page storage p,
        bool beBuyer,
        uint256 seq,
        uint256 acct
    ) public {
        require (seq > 0, "SR.AB: zero seq");
        require (acct > 0, "SR.AB: zero acct");

        
        if (beBuyer) {
            require(!p.sellers.contains(acct), "SR.AB: seller intends to buy");
            p.buyers.add(acct);
        } else {
            require(!p.buyers.contains(acct), "SR.AB: buyer intends to sell");
            p.sellers.add(acct);
        }

        if (p.blanks[uint40(acct)].seqOfDeals.add(uint16(seq)))
            _increaseCounterOfBlanks(p);
    }

    function removeBlank(
        Page storage p,
        uint256 seq,
        uint256 acct
    ) public {
        if (p.buyers.contains(acct) || p.sellers.contains(acct)) {
            if (p.blanks[acct].seqOfDeals.remove(seq))
                _decreaseCounterOfBlanks(p);

            if (p.blanks[acct].seqOfDeals.length() == 0) {
                delete p.blanks[acct]; 
                p.buyers.remove(acct) || p.sellers.remove(acct);
            }
        }
    }

    function signDoc(Page storage p, uint256 acct, bytes32 sigHash) 
        public 
    {
        require(block.timestamp < getSigDeadline(p) ||
            getSigningDays(p) == 0,
            "SR.SD: missed sigDeadline");

        require(!established(p),
            "SR.SD: Doc already established");

        if ((p.buyers.contains(acct) || p.sellers.contains(acct)) &&
            p.blanks[acct].sig.sigDate == 0) {

            Signature storage sig = p.blanks[acct].sig;

            sig.signer = uint40(acct);
            sig.sigDate = uint48(block.timestamp);
            sig.blocknumber = uint64(block.number);

            p.blanks[acct].sigHash = sigHash;

            _increaseCounterOfSigs(p, p.blanks[acct].seqOfDeals.length());
        }
    }

    function regSig(Page storage p, uint256 acct, uint sigDate, bytes32 sigHash)
        public returns (bool flag)
    {
        require(block.timestamp < getSigDeadline(p),
            "SR.RS: missed sigDeadline");

        require(!established(p),
            "SR.regSig: Doc already established");

        if (p.buyers.contains(acct) || p.sellers.contains(acct)) {

            Signature storage sig = p.blanks[acct].sig;

            sig.signer = uint40(acct);
            sig.sigDate = uint48(sigDate);
            sig.blocknumber = uint64(block.number);

            p.blanks[acct].sigHash = sigHash;

            _increaseCounterOfSigs(p, 1);

            flag = true;
        }

    }

    function _increaseCounterOfBlanks(Page storage p) private {
        p.blanks[0].sig.para++;
    }

    function _decreaseCounterOfBlanks(Page storage p) private {
        p.blanks[0].sig.para--;
    }

    function _increaseCounterOfSigs(Page storage p, uint qtyOfDeals) private {
        p.blanks[0].sig.arg += uint16(qtyOfDeals);
    }

    //####################
    //##    Read I/O    ##
    //####################

    function circulated(Page storage p) public view returns (bool)
    {
        return p.blanks[0].sig.sigDate > 0;
    }

    function established(Page storage p) public view returns (bool)
    {
        return counterOfBlanks(p) > 0 
            && counterOfBlanks(p) == counterOfSigs(p);
    }

    function counterOfBlanks(Page storage p) public view returns(uint16) {
        return p.blanks[0].sig.para;
    }

    function counterOfSigs(Page storage p) public view returns(uint16) {
        return p.blanks[0].sig.arg;
    }

    function getCirculateDate(Page storage p) public view returns(uint48) {
        return p.blanks[0].sig.sigDate;
    }

    function getSigningDays(Page storage p) public view returns(uint16) {
        return p.blanks[0].sig.seq;
    }

    function getClosingDays(Page storage p) public view returns(uint16) {
        return p.blanks[0].sig.attr;
    }

    function getSigDeadline(Page storage p) public view returns(uint48) {
        return p.blanks[0].sig.sigDate + uint48(p.blanks[0].sig.seq) * 86400; 
    }

    function getClosingDeadline(Page storage p) public view returns(uint48) {
        return p.blanks[0].sig.sigDate + uint48(p.blanks[0].sig.attr) * 86400; 
    }

    function isSigner(Page storage p, uint256 acct) 
        public view returns (bool) 
    {
        return p.blanks[acct].sig.signer > 0;
    }

    function sigOfParty(Page storage p, uint256 acct) public view
        returns (
            uint256[] memory seqOfDeals, 
            Signature memory sig,
            bytes32 sigHash
        ) 
    {
        seqOfDeals = p.blanks[acct].seqOfDeals.values();
        sig = p.blanks[acct].sig;
        sigHash = p.blanks[acct].sigHash;
    }

    function sigsOfPage(Page storage p) public view
        returns (
            Signature[] memory sigsOfBuyer, 
            Signature[]memory sigsOfSeller
        )
    {
        sigsOfBuyer = sigsOfSide(p, p.buyers);
        sigsOfSeller = sigsOfSide(p, p.sellers);
    }

    function sigsOfSide(Page storage p, EnumerableSet.UintSet storage partiesOfSide) 
        public view
        returns (Signature[] memory)
    {
        uint256[] memory parties = partiesOfSide.values();
        uint256 len = parties.length;

        Signature[] memory sigs = new Signature[](len);

        while (len > 0) {
            sigs[len-1] = p.blanks[parties[len-1]].sig;
            len--;
        }

        return sigs;
    }


}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.8;

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                set._indexes[lastValue] = valueIndex;
            }

            delete set._values[lastIndex];
            set._values.pop();

            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    //======== Bytes32Set ========

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value)
        public
        returns (bool)
    {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value)
        public
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value)
        public
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) public view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index)
        public
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set)
        public
        view
        returns (bytes32[] memory)
    {
        return _values(set._inner);
    }

    //======== AddressSet ========

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value)
        public
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value)
        public
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value)
        public
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) public view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index)
        public
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set)
        public
        view
        returns (address[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    //======== UintSet ========

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) public returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value)
        public
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value)
        public
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) public view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index)
        public
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set)
        public
        view
        returns (uint256[] memory)
    {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/lib/EnumerableSet.sol": {
      "EnumerableSet": "0xc4f24b69792ff96f0316fab2d7df198af8033930"
    }
  }
}

Contract Security Audit

Contract ABI

API
[]

611c7d61003a600b82828239805160001a60731461002d57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361061012b5760003560e01c806351189a6d116100b7578063c3525e421161007b578063c3525e42146103cd578063c37e0e1b146103e0578063c50ce1d414610413578063dc050e9c14610442578063e1ad5c071461047757600080fd5b806351189a6d1461030e57806353c787ae1461032e57806368c232531461035d578063bbcf33c61461037d578063c018ec87146103ac57600080fd5b80631bf6af56116100fe5780631bf6af5614610210578063232fb7421461023057806324d431a31461025a578063314f082614610297578063432bea50146102aa57600080fd5b8063044ae65914610130578063089ee29f146101525780630b5b0ad5146101a35780630c43afec146101ce575b600080fd5b81801561013c57600080fd5b5061015061014b3660046117ab565b610497565b005b81801561015e57600080fd5b5061015061016d3660046117d7565b60008080526020919091526040902060020180546affffffffffff00000000001916600160281b4265ffffffffffff1602179055565b6101b66101b13660046117f0565b610852565b6040516101c5939291906118ce565b60405180910390f35b6101fd6101dc3660046117d7565b60008080526020919091526040902060020154600160d01b900461ffff1690565b60405161ffff90911681526020016101c5565b81801561021c57600080fd5b5061015061022b36600461193a565b6109ba565b61024361023e3660046117d7565b610dcf565b60405165ffffffffffff90911681526020016101c5565b6102876102683660046117f0565b6000908152602091909152604090206002015464ffffffffff16151590565b60405190151581526020016101c5565b6102876102a53660046117d7565b610e2a565b8180156102b657600080fd5b506101506102c53660046117ab565b60008080526020939093526040909220600201805463ffffffff60c01b1916600160c01b61ffff9384160261ffff60d01b191617600160d01b9290931691909102919091179055565b61032161031c3660046117f0565b610e7e565b6040516101c591906119bd565b6101fd61033c3660046117d7565b60008080526020919091526040902060020154600160b01b900461ffff1690565b81801561036957600080fd5b506101506103783660046117ab565b611094565b6101fd61038b3660046117d7565b60008080526020919091526040902060020154600160a01b900461ffff1690565b6103bf6103ba3660046117d7565b6113b1565b6040516101c59291906119d7565b6102436103db3660046117d7565b6113d7565b6102436103ee3660046117d7565b60008080526020919091526040902060020154600160281b900465ffffffffffff1690565b6101fd6104213660046117d7565b60008080526020919091526040902060020154600160c01b900461ffff1690565b6102876104503660046117d7565b60008080526020919091526040902060020154600160281b900465ffffffffffff16151590565b81801561048357600080fd5b506102876104923660046119fc565b611401565b604051633f5f77cd60e01b81526001840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156104eb57600080fd5b505af41580156104ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105239190611a2e565b806105b55750604051633f5f77cd60e01b81526003840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561057d57600080fd5b505af4158015610591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b59190611a2e565b1561084d576000818152602084905260409081902090516392fd02df60e01b815260048101919091526024810183905273c4f24b69792ff96f0316fab2d7df198af8033930906392fd02df9060440160206040518083038186803b15801561061c57600080fd5b505af4158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611a2e565b156106625761066283611666565b60008181526020849052604090819020905163c2b46a8560e01b8152600481019190915273c4f24b69792ff96f0316fab2d7df198af80339309063c2b46a859060240160206040518083038186803b1580156106bd57600080fd5b505af41580156106d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f59190611a4b565b61084d57600081815260208490526040812090818181816107168282611725565b505060006002850181905560039094019390935550506040516392fd02df60e01b81526001850160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393091506392fd02df9060440160206040518083038186803b15801561078157600080fd5b505af4158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190611a2e565b8061084b57506040516392fd02df60e01b81526003840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392fd02df9060440160206040518083038186803b15801561081357600080fd5b505af4158015610827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b9190611a2e565b505b505050565b606061085c611746565b600083815260208590526040808220905163034306e160e21b8152600481019190915273c4f24b69792ff96f0316fab2d7df198af803393090630d0c1b849060240160006040518083038186803b1580156108b657600080fd5b505af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f29190810190611a7a565b600085815260208781526040808320815161012081018352600282015464ffffffffff81168252600160281b810465ffffffffffff1682860152600160581b810467ffffffffffffffff1693820193909352600160981b830460ff1615156060820152600160a01b830461ffff9081166080830152600160b01b8404811660a0830152600160c01b8404811660c0830152600160d01b84041660e0820152600160e01b90920463ffffffff166101008301529790925296909652600390940154939592505050565b60008211610a015760405162461bcd60e51b815260206004820152600f60248201526e53522e41423a207a65726f2073657160881b60448201526064015b60405180910390fd5b60008111610a445760405162461bcd60e51b815260206004820152601060248201526f14d48b90508e881e995c9bc81858d8dd60821b60448201526064016109f8565b8215610bb557604051633f5f77cd60e01b81526003850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b158015610a9e57600080fd5b505af4158015610ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad69190611a2e565b15610b235760405162461bcd60e51b815260206004820152601c60248201527f53522e41423a2073656c6c657220696e74656e647320746f206275790000000060448201526064016109f8565b6040516392f13c3f60e01b81526001850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610b7757600080fd5b505af4158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf9190611a2e565b50610d1c565b604051633f5f77cd60e01b81526001850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b158015610c0957600080fd5b505af4158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c419190611a2e565b15610c8e5760405162461bcd60e51b815260206004820152601c60248201527f53522e41423a20627579657220696e74656e647320746f2073656c6c0000000060448201526064016109f8565b6040516392f13c3f60e01b81526003850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610ce257600080fd5b505af4158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190611a2e565b505b64ffffffffff81166000908152602085905260409081902090516392f13c3f60e01b8152600481019190915261ffff8316602482015273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610d8957600080fd5b505af4158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc19190611a2e565b1561084b5761084b846116ae565b600080805260208290526040812060020154610df990600160c01b900461ffff1662015180611b4e565b600080805260208490526040902060020154610e249190600160281b900465ffffffffffff16611b7c565b92915050565b600080805260208290526040812060020154600160a01b900461ffff1615801590610e2457505060008080526020919091526040902060020154600160a01b810461ffff908116600160b01b909204161490565b60405163034306e160e21b81526004810182905260609060009073c4f24b69792ff96f0316fab2d7df198af803393090630d0c1b849060240160006040518083038186803b158015610ecf57600080fd5b505af4158015610ee3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0b9190810190611a7a565b805190915060008167ffffffffffffffff811115610f2b57610f2b611a64565b604051908082528060200260200182016040528015610f6457816020015b610f51611746565b815260200190600190039081610f495790505b5090505b811561108b5785600084610f7d600186611ba6565b81518110610f8d57610f8d611bbd565b602090810291909101810151825281810192909252604090810160002081516101208101835260029091015464ffffffffff81168252600160281b810465ffffffffffff1693820193909352600160581b830467ffffffffffffffff1691810191909152600160981b820460ff1615156060820152600160a01b820461ffff9081166080830152600160b01b8304811660a0830152600160c01b8304811660c0830152600160d01b83041660e0820152600160e01b90910463ffffffff166101008201528161105d600185611ba6565b8151811061106d5761106d611bbd565b6020026020010181905250818061108390611bd3565b925050610f68565b95945050505050565b61109d83610dcf565b65ffffffffffff164210806110cc5750600080805260208490526040902060020154600160c01b900461ffff16155b6111185760405162461bcd60e51b815260206004820152601960248201527f53522e53443a206d697373656420736967446561646c696e650000000000000060448201526064016109f8565b61112183610e2a565b1561116e5760405162461bcd60e51b815260206004820152601e60248201527f53522e53443a20446f6320616c72656164792065737461626c6973686564000060448201526064016109f8565b604051633f5f77cd60e01b81526001840160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156111c257600080fd5b505af41580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa9190611a2e565b8061128c5750604051633f5f77cd60e01b81526003840160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561125457600080fd5b505af4158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c9190611a2e565b80156112b65750600082815260208490526040902060020154600160281b900465ffffffffffff16155b1561084d576000828152602084905260409081902060028101805464ffffffffff86166affffffffffffffffffffff1990911617600160281b4265ffffffffffff16021767ffffffffffffffff60581b1916600160581b4367ffffffffffffffff160217815560038201849055915163c2b46a8560e01b8152600481019190915261084b90859073c4f24b69792ff96f0316fab2d7df198af80339309063c2b46a859060240160206040518083038186803b15801561137457600080fd5b505af4158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190611a4b565b6116d8565b6060806113c18384600101610e7e565b91506113d08384600301610e7e565b9050915091565b600080805260208290526040812060020154610df990600160d01b900461ffff1662015180611b4e565b600061140c85610dcf565b65ffffffffffff1642106114625760405162461bcd60e51b815260206004820152601960248201527f53522e52533a206d697373656420736967446561646c696e650000000000000060448201526064016109f8565b61146b85610e2a565b156114c35760405162461bcd60e51b815260206004820152602260248201527f53522e7265675369673a20446f6320616c72656164792065737461626c697368604482015261195960f21b60648201526084016109f8565b604051633f5f77cd60e01b81526001860160048201526024810185905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561151757600080fd5b505af415801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190611a2e565b806115e15750604051633f5f77cd60e01b81526003860160048201526024810185905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156115a957600080fd5b505af41580156115bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e19190611a2e565b1561165e57600084815260208690526040902060028101805464ffffffffff87166affffffffffffffffffffff1990911617600160281b65ffffffffffff8716021767ffffffffffffffff60581b1916600160581b4367ffffffffffffffff160217815560039091018390556116588660016116d8565b60019150505b949350505050565b60008080526020829052604090206002018054600160a01b900461ffff1690601461169083611bea565b91906101000a81548161ffff021916908361ffff1602179055505050565b60008080526020829052604090206002018054600160a01b900461ffff1690601461169083611c08565b60008080526020839052604090206002018054829190601690611707908490600160b01b900461ffff16611c2a565b92506101000a81548161ffff021916908361ffff1602179055505050565b50805460008255906000526020600020908101906117439190611792565b50565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5b808211156117a75760008155600101611793565b5090565b6000806000606084860312156117c057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156117e957600080fd5b5035919050565b6000806040838503121561180357600080fd5b50508035926020909101359150565b64ffffffffff815116825265ffffffffffff6020820151166020830152604081015161184a604084018267ffffffffffffffff169052565b50606081015161185e606084018215159052565b506080810151611874608084018261ffff169052565b5060a081015161188a60a084018261ffff169052565b5060c08101516118a060c084018261ffff169052565b5060e08101516118b660e084018261ffff169052565b506101008181015163ffffffff81168483015261084b565b6101608082528451908201819052600090610180830190602090818801845b82811015611909578151855293830193908301906001016118ed565b50505081925061191b81850187611812565b505082610140830152949350505050565b801515811461174357600080fd5b6000806000806080858703121561195057600080fd5b8435935060208501356119628161192c565b93969395505050506040820135916060013590565b600081518084526020808501945080840160005b838110156119b25761199e878351611812565b61012096909601959082019060010161198b565b509495945050505050565b6020815260006119d06020830184611977565b9392505050565b6040815260006119ea6040830185611977565b828103602084015261108b8185611977565b60008060008060808587031215611a1257600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215611a4057600080fd5b81516119d08161192c565b600060208284031215611a5d57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611a8d57600080fd5b825167ffffffffffffffff80821115611aa557600080fd5b818501915085601f830112611ab957600080fd5b815181811115611acb57611acb611a64565b8060051b604051601f19603f83011681018181108582111715611af057611af0611a64565b604052918252848201925083810185019188831115611b0e57600080fd5b938501935b82851015611b2c57845184529385019392850192611b13565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600065ffffffffffff80831681851681830481118215151615611b7357611b73611b38565b02949350505050565b600065ffffffffffff808316818516808303821115611b9d57611b9d611b38565b01949350505050565b600082821015611bb857611bb8611b38565b500390565b634e487b7160e01b600052603260045260246000fd5b600081611be257611be2611b38565b506000190190565b600061ffff821680611bfe57611bfe611b38565b6000190192915050565b600061ffff80831681811415611c2057611c20611b38565b6001019392505050565b600061ffff808316818516808303821115611b9d57611b9d611b3856fea2646970667358221220098c4d9ff454f054db94ab67a94dbe249985baacdeebcef12c6dc2ea3c33943664736f6c63430008080033

Deployed Bytecode

0x7386132eed1084b46492ed7f4f28bb3d70ae2f2d5f301460806040526004361061012b5760003560e01c806351189a6d116100b7578063c3525e421161007b578063c3525e42146103cd578063c37e0e1b146103e0578063c50ce1d414610413578063dc050e9c14610442578063e1ad5c071461047757600080fd5b806351189a6d1461030e57806353c787ae1461032e57806368c232531461035d578063bbcf33c61461037d578063c018ec87146103ac57600080fd5b80631bf6af56116100fe5780631bf6af5614610210578063232fb7421461023057806324d431a31461025a578063314f082614610297578063432bea50146102aa57600080fd5b8063044ae65914610130578063089ee29f146101525780630b5b0ad5146101a35780630c43afec146101ce575b600080fd5b81801561013c57600080fd5b5061015061014b3660046117ab565b610497565b005b81801561015e57600080fd5b5061015061016d3660046117d7565b60008080526020919091526040902060020180546affffffffffff00000000001916600160281b4265ffffffffffff1602179055565b6101b66101b13660046117f0565b610852565b6040516101c5939291906118ce565b60405180910390f35b6101fd6101dc3660046117d7565b60008080526020919091526040902060020154600160d01b900461ffff1690565b60405161ffff90911681526020016101c5565b81801561021c57600080fd5b5061015061022b36600461193a565b6109ba565b61024361023e3660046117d7565b610dcf565b60405165ffffffffffff90911681526020016101c5565b6102876102683660046117f0565b6000908152602091909152604090206002015464ffffffffff16151590565b60405190151581526020016101c5565b6102876102a53660046117d7565b610e2a565b8180156102b657600080fd5b506101506102c53660046117ab565b60008080526020939093526040909220600201805463ffffffff60c01b1916600160c01b61ffff9384160261ffff60d01b191617600160d01b9290931691909102919091179055565b61032161031c3660046117f0565b610e7e565b6040516101c591906119bd565b6101fd61033c3660046117d7565b60008080526020919091526040902060020154600160b01b900461ffff1690565b81801561036957600080fd5b506101506103783660046117ab565b611094565b6101fd61038b3660046117d7565b60008080526020919091526040902060020154600160a01b900461ffff1690565b6103bf6103ba3660046117d7565b6113b1565b6040516101c59291906119d7565b6102436103db3660046117d7565b6113d7565b6102436103ee3660046117d7565b60008080526020919091526040902060020154600160281b900465ffffffffffff1690565b6101fd6104213660046117d7565b60008080526020919091526040902060020154600160c01b900461ffff1690565b6102876104503660046117d7565b60008080526020919091526040902060020154600160281b900465ffffffffffff16151590565b81801561048357600080fd5b506102876104923660046119fc565b611401565b604051633f5f77cd60e01b81526001840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156104eb57600080fd5b505af41580156104ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105239190611a2e565b806105b55750604051633f5f77cd60e01b81526003840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561057d57600080fd5b505af4158015610591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b59190611a2e565b1561084d576000818152602084905260409081902090516392fd02df60e01b815260048101919091526024810183905273c4f24b69792ff96f0316fab2d7df198af8033930906392fd02df9060440160206040518083038186803b15801561061c57600080fd5b505af4158015610630573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106549190611a2e565b156106625761066283611666565b60008181526020849052604090819020905163c2b46a8560e01b8152600481019190915273c4f24b69792ff96f0316fab2d7df198af80339309063c2b46a859060240160206040518083038186803b1580156106bd57600080fd5b505af41580156106d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f59190611a4b565b61084d57600081815260208490526040812090818181816107168282611725565b505060006002850181905560039094019390935550506040516392fd02df60e01b81526001850160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393091506392fd02df9060440160206040518083038186803b15801561078157600080fd5b505af4158015610795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107b99190611a2e565b8061084b57506040516392fd02df60e01b81526003840160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392fd02df9060440160206040518083038186803b15801561081357600080fd5b505af4158015610827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084b9190611a2e565b505b505050565b606061085c611746565b600083815260208590526040808220905163034306e160e21b8152600481019190915273c4f24b69792ff96f0316fab2d7df198af803393090630d0c1b849060240160006040518083038186803b1580156108b657600080fd5b505af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108f29190810190611a7a565b600085815260208781526040808320815161012081018352600282015464ffffffffff81168252600160281b810465ffffffffffff1682860152600160581b810467ffffffffffffffff1693820193909352600160981b830460ff1615156060820152600160a01b830461ffff9081166080830152600160b01b8404811660a0830152600160c01b8404811660c0830152600160d01b84041660e0820152600160e01b90920463ffffffff166101008301529790925296909652600390940154939592505050565b60008211610a015760405162461bcd60e51b815260206004820152600f60248201526e53522e41423a207a65726f2073657160881b60448201526064015b60405180910390fd5b60008111610a445760405162461bcd60e51b815260206004820152601060248201526f14d48b90508e881e995c9bc81858d8dd60821b60448201526064016109f8565b8215610bb557604051633f5f77cd60e01b81526003850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b158015610a9e57600080fd5b505af4158015610ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad69190611a2e565b15610b235760405162461bcd60e51b815260206004820152601c60248201527f53522e41423a2073656c6c657220696e74656e647320746f206275790000000060448201526064016109f8565b6040516392f13c3f60e01b81526001850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610b7757600080fd5b505af4158015610b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610baf9190611a2e565b50610d1c565b604051633f5f77cd60e01b81526001850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b158015610c0957600080fd5b505af4158015610c1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c419190611a2e565b15610c8e5760405162461bcd60e51b815260206004820152601c60248201527f53522e41423a20627579657220696e74656e647320746f2073656c6c0000000060448201526064016109f8565b6040516392f13c3f60e01b81526003850160048201526024810182905273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610ce257600080fd5b505af4158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a9190611a2e565b505b64ffffffffff81166000908152602085905260409081902090516392f13c3f60e01b8152600481019190915261ffff8316602482015273c4f24b69792ff96f0316fab2d7df198af8033930906392f13c3f9060440160206040518083038186803b158015610d8957600080fd5b505af4158015610d9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc19190611a2e565b1561084b5761084b846116ae565b600080805260208290526040812060020154610df990600160c01b900461ffff1662015180611b4e565b600080805260208490526040902060020154610e249190600160281b900465ffffffffffff16611b7c565b92915050565b600080805260208290526040812060020154600160a01b900461ffff1615801590610e2457505060008080526020919091526040902060020154600160a01b810461ffff908116600160b01b909204161490565b60405163034306e160e21b81526004810182905260609060009073c4f24b69792ff96f0316fab2d7df198af803393090630d0c1b849060240160006040518083038186803b158015610ecf57600080fd5b505af4158015610ee3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f0b9190810190611a7a565b805190915060008167ffffffffffffffff811115610f2b57610f2b611a64565b604051908082528060200260200182016040528015610f6457816020015b610f51611746565b815260200190600190039081610f495790505b5090505b811561108b5785600084610f7d600186611ba6565b81518110610f8d57610f8d611bbd565b602090810291909101810151825281810192909252604090810160002081516101208101835260029091015464ffffffffff81168252600160281b810465ffffffffffff1693820193909352600160581b830467ffffffffffffffff1691810191909152600160981b820460ff1615156060820152600160a01b820461ffff9081166080830152600160b01b8304811660a0830152600160c01b8304811660c0830152600160d01b83041660e0820152600160e01b90910463ffffffff166101008201528161105d600185611ba6565b8151811061106d5761106d611bbd565b6020026020010181905250818061108390611bd3565b925050610f68565b95945050505050565b61109d83610dcf565b65ffffffffffff164210806110cc5750600080805260208490526040902060020154600160c01b900461ffff16155b6111185760405162461bcd60e51b815260206004820152601960248201527f53522e53443a206d697373656420736967446561646c696e650000000000000060448201526064016109f8565b61112183610e2a565b1561116e5760405162461bcd60e51b815260206004820152601e60248201527f53522e53443a20446f6320616c72656164792065737461626c6973686564000060448201526064016109f8565b604051633f5f77cd60e01b81526001840160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156111c257600080fd5b505af41580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fa9190611a2e565b8061128c5750604051633f5f77cd60e01b81526003840160048201526024810183905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561125457600080fd5b505af4158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c9190611a2e565b80156112b65750600082815260208490526040902060020154600160281b900465ffffffffffff16155b1561084d576000828152602084905260409081902060028101805464ffffffffff86166affffffffffffffffffffff1990911617600160281b4265ffffffffffff16021767ffffffffffffffff60581b1916600160581b4367ffffffffffffffff160217815560038201849055915163c2b46a8560e01b8152600481019190915261084b90859073c4f24b69792ff96f0316fab2d7df198af80339309063c2b46a859060240160206040518083038186803b15801561137457600080fd5b505af4158015611388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ac9190611a4b565b6116d8565b6060806113c18384600101610e7e565b91506113d08384600301610e7e565b9050915091565b600080805260208290526040812060020154610df990600160d01b900461ffff1662015180611b4e565b600061140c85610dcf565b65ffffffffffff1642106114625760405162461bcd60e51b815260206004820152601960248201527f53522e52533a206d697373656420736967446561646c696e650000000000000060448201526064016109f8565b61146b85610e2a565b156114c35760405162461bcd60e51b815260206004820152602260248201527f53522e7265675369673a20446f6320616c72656164792065737461626c697368604482015261195960f21b60648201526084016109f8565b604051633f5f77cd60e01b81526001860160048201526024810185905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b15801561151757600080fd5b505af415801561152b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154f9190611a2e565b806115e15750604051633f5f77cd60e01b81526003860160048201526024810185905273c4f24b69792ff96f0316fab2d7df198af803393090633f5f77cd9060440160206040518083038186803b1580156115a957600080fd5b505af41580156115bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e19190611a2e565b1561165e57600084815260208690526040902060028101805464ffffffffff87166affffffffffffffffffffff1990911617600160281b65ffffffffffff8716021767ffffffffffffffff60581b1916600160581b4367ffffffffffffffff160217815560039091018390556116588660016116d8565b60019150505b949350505050565b60008080526020829052604090206002018054600160a01b900461ffff1690601461169083611bea565b91906101000a81548161ffff021916908361ffff1602179055505050565b60008080526020829052604090206002018054600160a01b900461ffff1690601461169083611c08565b60008080526020839052604090206002018054829190601690611707908490600160b01b900461ffff16611c2a565b92506101000a81548161ffff021916908361ffff1602179055505050565b50805460008255906000526020600020908101906117439190611792565b50565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5b808211156117a75760008155600101611793565b5090565b6000806000606084860312156117c057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156117e957600080fd5b5035919050565b6000806040838503121561180357600080fd5b50508035926020909101359150565b64ffffffffff815116825265ffffffffffff6020820151166020830152604081015161184a604084018267ffffffffffffffff169052565b50606081015161185e606084018215159052565b506080810151611874608084018261ffff169052565b5060a081015161188a60a084018261ffff169052565b5060c08101516118a060c084018261ffff169052565b5060e08101516118b660e084018261ffff169052565b506101008181015163ffffffff81168483015261084b565b6101608082528451908201819052600090610180830190602090818801845b82811015611909578151855293830193908301906001016118ed565b50505081925061191b81850187611812565b505082610140830152949350505050565b801515811461174357600080fd5b6000806000806080858703121561195057600080fd5b8435935060208501356119628161192c565b93969395505050506040820135916060013590565b600081518084526020808501945080840160005b838110156119b25761199e878351611812565b61012096909601959082019060010161198b565b509495945050505050565b6020815260006119d06020830184611977565b9392505050565b6040815260006119ea6040830185611977565b828103602084015261108b8185611977565b60008060008060808587031215611a1257600080fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215611a4057600080fd5b81516119d08161192c565b600060208284031215611a5d57600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215611a8d57600080fd5b825167ffffffffffffffff80821115611aa557600080fd5b818501915085601f830112611ab957600080fd5b815181811115611acb57611acb611a64565b8060051b604051601f19603f83011681018181108582111715611af057611af0611a64565b604052918252848201925083810185019188831115611b0e57600080fd5b938501935b82851015611b2c57845184529385019392850192611b13565b98975050505050505050565b634e487b7160e01b600052601160045260246000fd5b600065ffffffffffff80831681851681830481118215151615611b7357611b73611b38565b02949350505050565b600065ffffffffffff808316818516808303821115611b9d57611b9d611b38565b01949350505050565b600082821015611bb857611bb8611b38565b500390565b634e487b7160e01b600052603260045260246000fd5b600081611be257611be2611b38565b506000190190565b600061ffff821680611bfe57611bfe611b38565b6000190192915050565b600061ffff80831681811415611c2057611c20611b38565b6001019392505050565b600061ffff808316818516808303821115611b9d57611b9d611b3856fea2646970667358221220098c4d9ff454f054db94ab67a94dbe249985baacdeebcef12c6dc2ea3c33943664736f6c63430008080033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.