Sepolia Testnet

Contract

0x7ca4a3e99f0BBF5864A581D3375745E192D6c1C7

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Set TB Sign62614262024-07-07 4:09:48154 days ago1720325388IN
0x7ca4a3e9...192D6c1C7
0 ETH0.000281916.11068928

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

Contract Source Code Verified (Exact Match)

Contract Name:
TBDMS

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 3 : TBDMS.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/access/Ownable.sol";

interface ITBSign {
    function verify(
        address,
        uint256,
        string memory,
        bytes memory
    ) external view returns (bool);

    function increaseNonce(address) external;
}

contract TBDMS is Ownable {
    address public tbsign;

    enum RequestStatus {
        PENDING,
        CONFIRMED,
        REVOKED
    }

    struct CollabInfo {
        address collab;
        string role;
    }

    struct DocInfo {
        address creator;
        string cid;
        CollabInfo[] collabs;
        uint256 currentReqId;
        bool isConfirmed;
        uint256 createdDate;
    }

    struct RequestInfo {
        uint256 docId;
        address collab;
        string cid;
        uint8 confirmNumber;
        RequestStatus status;
    }

    struct UserInfo {
        string name;
        string company;
    }

    uint256 public docID;
    uint256 public requestID;

    mapping(uint256 docId => DocInfo) public docList;
    mapping(uint256 reqId => RequestInfo) public requestList;

    mapping(uint256 docId => mapping(address collab => bool)) public isSigned;

    mapping(uint256 reqId => mapping(address collab => RequestStatus))
        public collabDecisionOnRequest;

    mapping(address user => UserInfo) public users;
    mapping(address user => bool) public isRegistered;
    mapping(uint256 docId => mapping(address collab => uint8 index))
        public docCollabIndex;

    event AddESign(address collab, uint256 docId, string cid);
    event ConfirmDocUpdate(address collab, uint256 docId, string cid);
    event ConfirmRequest(address collab, uint256 reqId);
    event DelCollab(uint256 docId, address collab);
    event DocFinalized(uint256 docId);
    event NewCollab(uint256 docId, CollabInfo collab);
    event NewDoc(
        address creator,
        string title,
        CollabInfo[] collabs,
        uint256 docId,
        uint256 reqId,
        string cid
    );
    event NewUser(address user, string name, string company);
    event RequestConfirmed(uint256 reqId);
    event RequestDocUpdate(
        address collab,
        uint256 docId,
        uint256 reqId,
        string cid
    );
    event RevokeDocUpdate(address collab, uint256 docId);
    event RevokeRequest(address collab, uint256 reqId);
    event UpdateUser(address user, string name, string company);

    modifier onlyDocCollab(uint256 docId) {
        require(
            isCollab(docId, msg.sender),
            "You are not the collab of that DOC!"
        );
        _;
    }

    modifier notConfirmedRequest(uint256 reqId) {
        require(
            collabDecisionOnRequest[reqId][msg.sender] == RequestStatus.PENDING,
            "You already confirmed that request!"
        );
        _;
    }

    modifier notConfirmedDoc(uint256 docId) {
        require(!docList[docId].isConfirmed, "Already confirmed document!");
        _;
    }

    modifier isOnRequest(uint256 reqId) {
        require(
            docList[requestList[reqId].docId].currentReqId == reqId,
            "Not on that request!"
        );
        _;
    }

    modifier onlyDocCreator(uint256 docId) {
        require(
            docList[docId].creator == msg.sender,
            "You are not the doc creator!"
        );
        _;
    }

    constructor() Ownable(msg.sender) {}

    function createDoc(
        CollabInfo[] memory collabs,
        string memory title,
        string memory cid,
        bytes memory signature
    ) external {
        require(
            ITBSign(tbsign).verify(msg.sender, 0, cid, signature),
            "Invalid Signature!"
        );

        require(collabs.length <= type(uint8).max, "Too many collabs!");

        docID++;
        requestID++;

        docList[docID].creator = msg.sender;
        docList[docID].cid = cid;
        docList[docID].currentReqId = requestID;
        docList[docID].createdDate = block.timestamp;

        for (uint8 i; i < collabs.length; ++i) {
            docList[docID].collabs.push(collabs[i]);
            docCollabIndex[docID][collabs[i].collab] = i + 1;
        }

        requestList[requestID] = RequestInfo(
            docID,
            msg.sender,
            cid,
            1,
            RequestStatus.PENDING
        );

        collabDecisionOnRequest[requestID][msg.sender] = RequestStatus
            .CONFIRMED;

        ITBSign(tbsign).increaseNonce(msg.sender);

        emit NewDoc(msg.sender, title, collabs, docID, requestID, cid);
    }

    function confirmRequest(
        uint256 reqId
    )
        external
        onlyDocCollab(requestList[reqId].docId)
        notConfirmedRequest(reqId)
    {
        requestList[reqId].confirmNumber++;
        collabDecisionOnRequest[reqId][msg.sender] = RequestStatus.CONFIRMED;

        uint256 docId = requestList[reqId].docId;

        DocInfo storage doc = docList[docId];

        uint8 collabsNumber = uint8(doc.collabs.length);

        emit ConfirmRequest(msg.sender, reqId);

        if (requestList[reqId].confirmNumber == collabsNumber) {
            requestList[reqId].status = RequestStatus.CONFIRMED;

            emit RequestConfirmed(reqId);
        }
    }

    function revokeRequest(
        uint256 reqId
    )
        external
        onlyDocCollab(requestList[reqId].docId)
        notConfirmedRequest(reqId)
    {
        collabDecisionOnRequest[reqId][msg.sender] = RequestStatus.REVOKED;

        requestList[reqId].status = RequestStatus.REVOKED;

        emit RevokeRequest(msg.sender, reqId);
    }

    function confirmDocContent(
        uint256 reqId
    )
        external
        onlyDocCollab(requestList[reqId].docId)
        notConfirmedDoc(requestList[reqId].docId)
        isOnRequest(reqId)
    {
        uint256 docId = requestList[reqId].docId;

        docList[docId].cid = requestList[reqId].cid;
        docList[docId].currentReqId = 0;

        emit ConfirmDocUpdate(msg.sender, docId, requestList[reqId].cid);
    }

    function revokeDocContent(
        uint256 reqId
    )
        external
        onlyDocCollab(requestList[reqId].docId)
        notConfirmedDoc(requestList[reqId].docId)
        isOnRequest(reqId)
    {
        uint256 docId = requestList[reqId].docId;

        docList[docId].currentReqId = 0;

        emit RevokeDocUpdate(msg.sender, docId);
    }

    function requestDocUpdate(
        uint256 docId,
        string memory _cid,
        bytes memory _signature
    ) external onlyDocCollab(docId) {
        require(!docList[docId].isConfirmed, "Already confirmed Doc!");
        require(docList[docId].currentReqId == 0, "Already on update!");
        require(
            ITBSign(tbsign).verify(msg.sender, docId, _cid, _signature),
            "Invalid Signature!"
        );
        ITBSign(tbsign).increaseNonce(msg.sender);

        requestID++;
        requestList[requestID] = RequestInfo(
            docId,
            msg.sender,
            _cid,
            1,
            RequestStatus.PENDING
        );
        collabDecisionOnRequest[requestID][msg.sender] = RequestStatus
            .CONFIRMED;

        docList[docId].currentReqId = requestID;

        emit RequestDocUpdate(msg.sender, docId, requestID, _cid);
    }

    function finalizeDocContent(uint256 docId) external onlyDocCreator(docId) {
        docList[docId].isConfirmed = true;
        emit DocFinalized(docId);
    }

    function addESign(
        uint256 docId,
        string memory _signCid,
        bytes memory _signature
    ) external onlyDocCollab(docId) {
        require(docList[docId].isConfirmed, "Have to confirm doc before sign!");

        require(!isSigned[docId][msg.sender], "You already signed!");

        require(
            ITBSign(tbsign).verify(msg.sender, docId, _signCid, _signature),
            "Invalid Signature!"
        );

        isSigned[docId][msg.sender] = true;

        emit AddESign(msg.sender, docId, _signCid);
    }

    function isCollab(
        uint256 docId,
        address collab
    ) public view returns (bool) {
        return docCollabIndex[docId][collab] != 0;
    }

    function registerUser(string memory name, string memory company) external {
        require(!isRegistered[msg.sender], "You are already registered!");
        users[msg.sender] = UserInfo(name, company);
        isRegistered[msg.sender] = true;

        emit NewUser(msg.sender, name, company);
    }

    function editUser(string memory name, string memory company) external {
        require(isRegistered[msg.sender], "You are not registered!");
        users[msg.sender].name = name;
        users[msg.sender].company = company;

        emit UpdateUser(msg.sender, name, company);
    }

    function addCollab(
        uint256 docId,
        CollabInfo memory collab
    ) external onlyDocCreator(docId) notConfirmedDoc(docId) {
        require(!isCollab(docId, collab.collab), "It's already a collab!");
        CollabInfo[] storage collabs = docList[docId].collabs;
        require(collabs.length < type(uint8).max, "Can't add more collab!");
        collabs.push(collab);
        docCollabIndex[docId][collab.collab] = uint8(collabs.length);

        emit NewCollab(docId, collab);
    }

    function removeCollab(
        uint256 docId,
        address collab
    ) external onlyDocCreator(docId) notConfirmedDoc(docId) {
        require(isCollab(docId, collab), "It's not a collab!");
        CollabInfo[] storage collabs = docList[docId].collabs;
        uint8 currentIndex = docCollabIndex[docId][collab];
        CollabInfo memory lastCollab = collabs[collabs.length - 1];
        collabs[currentIndex - 1] = lastCollab;
        collabs.pop();
        docCollabIndex[docId][lastCollab.collab] = currentIndex;

        emit DelCollab(docId, collab);
    }

    function setTBSign(address _tbsign) external onlyOwner {
        tbsign = _tbsign;
    }
}

File 2 of 3 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 3 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"indexed":false,"internalType":"string","name":"cid","type":"string"}],"name":"AddESign","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"indexed":false,"internalType":"string","name":"cid","type":"string"}],"name":"ConfirmDocUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"ConfirmRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"indexed":false,"internalType":"address","name":"collab","type":"address"}],"name":"DelCollab","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"}],"name":"DocFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"components":[{"internalType":"address","name":"collab","type":"address"},{"internalType":"string","name":"role","type":"string"}],"indexed":false,"internalType":"struct TBDMS.CollabInfo","name":"collab","type":"tuple"}],"name":"NewCollab","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"components":[{"internalType":"address","name":"collab","type":"address"},{"internalType":"string","name":"role","type":"string"}],"indexed":false,"internalType":"struct TBDMS.CollabInfo[]","name":"collabs","type":"tuple[]"},{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":false,"internalType":"string","name":"cid","type":"string"}],"name":"NewDoc","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"company","type":"string"}],"name":"NewUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"RequestConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reqId","type":"uint256"},{"indexed":false,"internalType":"string","name":"cid","type":"string"}],"name":"RequestDocUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"docId","type":"uint256"}],"name":"RevokeDocUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collab","type":"address"},{"indexed":false,"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"RevokeRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"company","type":"string"}],"name":"UpdateUser","type":"event"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"components":[{"internalType":"address","name":"collab","type":"address"},{"internalType":"string","name":"role","type":"string"}],"internalType":"struct TBDMS.CollabInfo","name":"collab","type":"tuple"}],"name":"addCollab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"string","name":"_signCid","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"addESign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"}],"name":"collabDecisionOnRequest","outputs":[{"internalType":"enum TBDMS.RequestStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"confirmDocContent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"confirmRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"collab","type":"address"},{"internalType":"string","name":"role","type":"string"}],"internalType":"struct TBDMS.CollabInfo[]","name":"collabs","type":"tuple[]"},{"internalType":"string","name":"title","type":"string"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"createDoc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"}],"name":"docCollabIndex","outputs":[{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"docID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"}],"name":"docList","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"uint256","name":"currentReqId","type":"uint256"},{"internalType":"bool","name":"isConfirmed","type":"bool"},{"internalType":"uint256","name":"createdDate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"company","type":"string"}],"name":"editUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"}],"name":"finalizeDocContent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"}],"name":"isCollab","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"}],"name":"isSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"company","type":"string"}],"name":"registerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"}],"name":"removeCollab","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"string","name":"_cid","type":"string"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"requestDocUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"requestList","outputs":[{"internalType":"uint256","name":"docId","type":"uint256"},{"internalType":"address","name":"collab","type":"address"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"uint8","name":"confirmNumber","type":"uint8"},{"internalType":"enum TBDMS.RequestStatus","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"revokeDocContent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"reqId","type":"uint256"}],"name":"revokeRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tbsign","type":"address"}],"name":"setTBSign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tbsign","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"users","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"company","type":"string"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50338061003757604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61004081610046565b50610096565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6129f180620000a66000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c806393592cbe116100f9578063dc479bba11610097578063f2fde38b11610071578063f2fde38b1461042f578063f35e237b14610442578063fabaeb1814610455578063ff79e8b61461046857600080fd5b8063dc479bba146103d8578063e436426614610413578063e7d915cf1461041c57600080fd5b8063b024d3ce116100d3578063b024d3ce1461037c578063c2e66dfb1461038f578063c3c5a547146103a2578063d42cca15146103c557600080fd5b806393592cbe14610335578063a6b2c43714610348578063a87430ba1461035b57600080fd5b80636057744911610166578063757c075711610140578063757c0757146102d35780637f53afcb146102e65780638da5cb5b146102f95780638f7792011461031e57600080fd5b8063605774491461029457806369d7427d146102a7578063715018a6146102cb57600080fd5b806302e9d43b146101ae5780631d2e4afd146101db5780632d3ba33e146101f057806332a32c94146102305780633e6d21fa146102435780635b430cda14610281575b600080fd5b6101c16101bc366004611e0a565b61047b565b6040516101d2959493929190611ea1565b60405180910390f35b6101ee6101e9366004611fa4565b610542565b005b61021e6101fe366004612024565b600a60209081526000928352604080842090915290825290205460ff1681565b60405160ff90911681526020016101d2565b6101ee61023e3660046120c6565b610649565b610271610251366004612024565b600660209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101d2565b6101ee61028f366004611e0a565b610a51565b6101ee6102a23660046121f5565b610bc7565b6102ba6102b5366004611e0a565b610ece565b6040516101d2959493929190612262565b6101ee610f95565b6101ee6102e13660046122a3565b610fa9565b6101ee6102f43660046122e0565b61117d565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101d2565b61032760035481565b6040519081526020016101d2565b600154610306906001600160a01b031681565b6101ee610356366004611e0a565b6111a7565b61036e6103693660046122e0565b61135b565b6040516101d2929190612302565b6101ee61038a3660046121f5565b611487565b61027161039d366004612024565b61165a565b6102716103b03660046122e0565b60096020526000908152604090205460ff1681565b6101ee6103d3366004612024565b611689565b6104066103e6366004612024565b600760209081526000928352604080842090915290825290205460ff1681565b6040516101d29190612330565b61032760025481565b6101ee61042a366004611e0a565b611982565b6101ee61043d3660046122e0565b611a82565b6101ee610450366004611fa4565b611ac0565b6101ee610463366004611e0a565b611b89565b6101ee610476366004611e0a565b611cb9565b60056020526000908152604090208054600182015460028301805492936001600160a01b03909216926104ad9061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546104d99061233e565b80156105265780601f106104fb57610100808354040283529160200191610526565b820191906000526020600020905b81548152906001019060200180831161050957829003601f168201915b5050506003909301549192505060ff8082169161010090041685565b3360009081526009602052604090205460ff16156105a75760405162461bcd60e51b815260206004820152601b60248201527f596f752061726520616c7265616479207265676973746572656421000000000060448201526064015b60405180910390fd5b6040805180820182528381526020808201849052336000908152600890915291909120815181906105d890826123c3565b50602082015160018201906105ed90826123c3565b50503360008181526009602052604090819020805460ff19166001179055517f4ddffe5495169d350d09d432b0c9ffb9156ae79ccd81b2113fca4bbea47f1bda925061063d919085908590612483565b60405180910390a15050565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e4890610680903390600090879087906004016124b9565b602060405180830381865afa15801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c191906124fd565b6106dd5760405162461bcd60e51b815260040161059e9061251f565b835160ff10156107235760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920636f6c6c6162732160781b604482015260640161059e565b6002805490600061073383612561565b90915550506003805490600061074883612561565b90915550506002805460009081526004602052604080822080546001600160a01b03191633179055915481522060010161078283826123c3565b50600380546002805460009081526004602052604080822090940192909255548152908120426005909101555b84518160ff1610156108c057600460006002548152602001908152602001600020600201858260ff16815181106107e8576107e861257a565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591810151909282019061083e90826123c3565b50505080600161084e9190612590565b600a600060025481526020019081526020016000206000878460ff168151811061087a5761087a61257a565b602090810291909101810151516001600160a01b03168252810191909152604001600020805460ff191660ff929092169190911790556108b9816125a9565b90506107af565b506040805160a081018252600254815233602082015290810183905260016060820152608081016000905260035460009081526005602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b0390921691909117905590820151600282019061093c90826123c3565b50606082015160038201805460ff90921660ff1983168117825560808501519261ffff19161761010083600281111561097757610977611e69565b0217905550506003546000908152600760209081526040808320338452909152902080546001925060ff191682800217905550600154604051632091ea5f60e21b81523360048201526001600160a01b0390911690638247a97c90602401600060405180830381600087803b1580156109ef57600080fd5b505af1158015610a03573d6000803e3d6000fd5b50506002546003546040517f2b4587bc06ed8e0680a5e4250ea9f92fad5213927711d30cc22436a41d710eb39450610a439350339288928a9289906125f7565b60405180910390a150505050565b600081815260056020526040902054610a6a813361165a565b610a865760405162461bcd60e51b815260040161059e9061269b565b6000828152600560209081526040808320548084526004928390529220015460ff1615610ac55760405162461bcd60e51b815260040161059e906126de565b6000838152600560209081526040808320548352600490915290206003015483908114610b2b5760405162461bcd60e51b81526020600482015260146024820152734e6f74206f6e207468617420726571756573742160601b604482015260640161059e565b60008481526005602090815260408083208054808552600490935292209091600190910190610b5d9060020182612715565b50600081815260046020908152604080832060030183905587835260059091529081902090517ff2a85f7a294675c2b60bbccaa6dae2668ceacb6943568399f2e8d7bd41b0025091610bb891339185916002909101906127f0565b60405180910390a15050505050565b82610bd2813361165a565b610bee5760405162461bcd60e51b815260040161059e9061269b565b6000848152600460208190526040909120015460ff1615610c4a5760405162461bcd60e51b8152602060048201526016602482015275416c726561647920636f6e6669726d656420446f632160501b604482015260640161059e565b60008481526004602052604090206003015415610c9e5760405162461bcd60e51b8152602060048201526012602482015271416c7265616479206f6e207570646174652160701b604482015260640161059e565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e4890610cd49033908890889088906004016124b9565b602060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906124fd565b610d315760405162461bcd60e51b815260040161059e9061251f565b600154604051632091ea5f60e21b81523360048201526001600160a01b0390911690638247a97c90602401600060405180830381600087803b158015610d7657600080fd5b505af1158015610d8a573d6000803e3d6000fd5b505060038054925090506000610d9f83612561565b90915550506040805160a08101825285815233602082015290810184905260016060820152608081016000905260035460009081526005602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b03909216919091179055908201516002820190610e1d90826123c3565b50606082015160038201805460ff90921660ff1983168117825560808501519261ffff191617610100836002811115610e5857610e58611e69565b02179055505060038054600090815260076020908152604080832033808552908352818420805460ff1916600117905584548a855260049093529281902090930181905591517fa3a5b7198374ac273bf7616259b230f4831f8730600bc8a1760cf52baadf2c0a9350610a439288918890612892565b600460205260009081526040902080546001820180546001600160a01b039092169291610efa9061233e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f269061233e565b8015610f735780601f10610f4857610100808354040283529160200191610f73565b820191906000526020600020905b815481529060010190602001808311610f5657829003601f168201915b50505050600383015460048401546005909401549293909260ff909116915085565b610f9d611d3f565b610fa76000611d6c565b565b60008281526004602052604090205482906001600160a01b03163314610fe15760405162461bcd60e51b815260040161059e906128bf565b60008381526004602081905260409091200154839060ff16156110165760405162461bcd60e51b815260040161059e906126de565b61102484846000015161165a565b1561106a5760405162461bcd60e51b81526020600482015260166024820152754974277320616c7265616479206120636f6c6c61622160501b604482015260640161059e565b6000848152600460205260409020600201805460ff116110c55760405162461bcd60e51b815260206004820152601660248201527543616e277420616464206d6f726520636f6c6c61622160501b604482015260640161059e565b8054600180820183556000838152602090819020875160029094020180546001600160a01b0319166001600160a01b0390941693909317835586015186929182019061111190826123c3565b505081546000878152600a6020908152604080832089516001600160a01b0316845290915290819020805460ff191660ff90931692909217909155517f9231c7fb604793dfa63c72d99e55a81ad132a68360350cd72367d823b4481d369150610bb890879087906128f6565b611185611d3f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600560205260409020546111c0813361165a565b6111dc5760405162461bcd60e51b815260040161059e9061269b565b8160008082815260076020908152604080832033845290915290205460ff16600281111561120c5761120c611e69565b146112295760405162461bcd60e51b815260040161059e9061290f565b6000838152600560205260408120600301805460ff1691611249836125a9565b82546101009290920a60ff81810219909316919092169190910217905550600083815260076020908152604080832033808552908352818420805460ff19166001179055868452600583528184205480855260048452938290206002810154835192835293820188905292917ff63ea3eae557a7022ec4accf5dd3529a31d448603687447053e3b8919572b20e910160405180910390a160008681526005602052604090206003015460ff80831691160361135357600086815260056020908152604091829020600301805461010061ff001990911617905590518781527ff82a94675f90ef5361ee99a4fba4d5c46c7afffb3522499c668f74c496fb58e4910160405180910390a15b505050505050565b6008602052600090815260409020805481906113769061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546113a29061233e565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b5050505050908060010180546114049061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546114309061233e565b801561147d5780601f106114525761010080835404028352916020019161147d565b820191906000526020600020905b81548152906001019060200180831161146057829003601f168201915b5050505050905082565b82611492813361165a565b6114ae5760405162461bcd60e51b815260040161059e9061269b565b6000848152600460208190526040909120015460ff166115105760405162461bcd60e51b815260206004820181905260248201527f4861766520746f20636f6e6669726d20646f63206265666f7265207369676e21604482015260640161059e565b600084815260066020908152604080832033845290915290205460ff16156115705760405162461bcd60e51b8152602060048201526013602482015272596f7520616c7265616479207369676e65642160681b604482015260640161059e565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e48906115a69033908890889088906004016124b9565b602060405180830381865afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e791906124fd565b6116035760405162461bcd60e51b815260040161059e9061251f565b600084815260066020908152604080832033808552925291829020805460ff1916600117905590517fad1ef0f31a5a91874aa5ea96af9a36e32cbac60bcfe3ed547208774c457471fe91610a439187908790612952565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1615155b92915050565b60008281526004602052604090205482906001600160a01b031633146116c15760405162461bcd60e51b815260040161059e906128bf565b60008381526004602081905260409091200154839060ff16156116f65760405162461bcd60e51b815260040161059e906126de565b611700848461165a565b6117415760405162461bcd60e51b815260206004820152601260248201527149742773206e6f74206120636f6c6c61622160701b604482015260640161059e565b6000848152600460209081526040808320600a83528184206001600160a01b038816855290925282205460029091018054909260ff9092169190839061178990600190612979565b815481106117995761179961257a565b60009182526020918290206040805180820190915260029092020180546001600160a01b0316825260018101805492939192918401916117d89061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546118049061233e565b80156118515780601f1061182657610100808354040283529160200191611851565b820191906000526020600020905b81548152906001019060200180831161183457829003601f168201915b5050505050815250509050808360018461186b919061298c565b60ff168154811061187e5761187e61257a565b600091825260209182902083516002929092020180546001600160a01b0319166001600160a01b039092169190911781559082015160018201906118c290826123c3565b50905050828054806118d6576118d66129a5565b60008281526020812060026000199093019283020180546001600160a01b0319168155906119076001830182611dbc565b505090556000878152600a6020908152604080832084516001600160a01b03908116855290835292819020805460ff191660ff871617905580518a8152928916918301919091527f8f8ba90a3537bb5db73c92326b03d5cf9903a8c6ba588309512f287a9da0a7b4910160405180910390a150505050505050565b60008181526005602052604090205461199b813361165a565b6119b75760405162461bcd60e51b815260040161059e9061269b565b8160008082815260076020908152604080832033845290915290205460ff1660028111156119e7576119e7611e69565b14611a045760405162461bcd60e51b815260040161059e9061290f565b600083815260076020908152604080832033808552908352818420805460ff191660021790558684526005835292819020600301805461020061ff001990911617905580519283529082018590527fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0910160405180910390a1505050565b611a8a611d3f565b6001600160a01b038116611ab457604051631e4fbdf760e01b81526000600482015260240161059e565b611abd81611d6c565b50565b3360009081526009602052604090205460ff16611b1f5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f74207265676973746572656421000000000000000000604482015260640161059e565b336000908152600860205260409020611b3883826123c3565b50336000908152600860205260409020600101611b5582826123c3565b507f780d856ed9ea931025ba084067327ac59ec5901a2d40b1019936c4561eb66efb33838360405161063d93929190612483565b600081815260056020526040902054611ba2813361165a565b611bbe5760405162461bcd60e51b815260040161059e9061269b565b6000828152600560209081526040808320548084526004928390529220015460ff1615611bfd5760405162461bcd60e51b815260040161059e906126de565b6000838152600560209081526040808320548352600490915290206003015483908114611c635760405162461bcd60e51b81526020600482015260146024820152734e6f74206f6e207468617420726571756573742160601b604482015260640161059e565b600084815260056020908152604080832054808452600483528184206003019390935580513381529182018390527fd9168354e7488be9ffebf8f086c5d0a417368fc090dd17e987927b5e2bf75ded9101610bb8565b60008181526004602052604090205481906001600160a01b03163314611cf15760405162461bcd60e51b815260040161059e906128bf565b60008281526004602081905260409182902001805460ff19166001179055517f7bfc51787cf9b207191cae1618bc4b3ca9cadc6dfb5b920e569de8d4a847d0389061063d9084815260200190565b6000546001600160a01b03163314610fa75760405163118cdaa760e01b815233600482015260240161059e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b508054611dc89061233e565b6000825580601f10611dd8575050565b601f016020900490600052602060002090810190611abd91905b80821115611e065760008155600101611df2565b5090565b600060208284031215611e1c57600080fd5b5035919050565b6000815180845260005b81811015611e4957602081850181015186830182015201611e2d565b506000602082860101526020601f19601f83011685010191505092915050565b634e487b7160e01b600052602160045260246000fd5b60038110611e9d57634e487b7160e01b600052602160045260246000fd5b9052565b8581526001600160a01b038516602082015260a060408201819052600090611ecb90830186611e23565b905060ff84166060830152611ee36080830184611e7f565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f2c57611f2c611eed565b604052919050565b600082601f830112611f4557600080fd5b813567ffffffffffffffff811115611f5f57611f5f611eed565b611f72601f8201601f1916602001611f03565b818152846020838601011115611f8757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611fb757600080fd5b823567ffffffffffffffff80821115611fcf57600080fd5b611fdb86838701611f34565b93506020850135915080821115611ff157600080fd5b50611ffe85828601611f34565b9150509250929050565b80356001600160a01b038116811461201f57600080fd5b919050565b6000806040838503121561203757600080fd5b8235915061204760208401612008565b90509250929050565b60006040828403121561206257600080fd5b6040516040810167ffffffffffffffff828210818311171561208657612086611eed565b8160405282935061209685612008565b835260208501359150808211156120ac57600080fd5b506120b985828601611f34565b6020830152505092915050565b600080600080608085870312156120dc57600080fd5b843567ffffffffffffffff808211156120f457600080fd5b818701915087601f83011261210857600080fd5b813560208282111561211c5761211c611eed565b8160051b61212b828201611f03565b928352848101820192828101908c85111561214557600080fd5b83870192505b84831015612181578235868111156121635760008081fd5b6121718e86838b0101612050565b835250918301919083019061214b565b995050508801359250508082111561219857600080fd5b6121a488838901611f34565b945060408701359150808211156121ba57600080fd5b6121c688838901611f34565b935060608701359150808211156121dc57600080fd5b506121e987828801611f34565b91505092959194509250565b60008060006060848603121561220a57600080fd5b83359250602084013567ffffffffffffffff8082111561222957600080fd5b61223587838801611f34565b9350604086013591508082111561224b57600080fd5b5061225886828701611f34565b9150509250925092565b6001600160a01b038616815260a06020820181905260009061228690830187611e23565b604083019590955250911515606083015260809091015292915050565b600080604083850312156122b657600080fd5b82359150602083013567ffffffffffffffff8111156122d457600080fd5b611ffe85828601612050565b6000602082840312156122f257600080fd5b6122fb82612008565b9392505050565b6040815260006123156040830185611e23565b82810360208401526123278185611e23565b95945050505050565b602081016116838284611e7f565b600181811c9082168061235257607f821691505b60208210810361237257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156123be57600081815260208120601f850160051c8101602086101561239f5750805b601f850160051c820191505b81811015611353578281556001016123ab565b505050565b815167ffffffffffffffff8111156123dd576123dd611eed565b6123f1816123eb845461233e565b84612378565b602080601f831160018114612426576000841561240e5750858301515b600019600386901b1c1916600185901b178555611353565b600085815260208120601f198616915b8281101561245557888601518255948401946001909101908401612436565b50858210156124735787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03841681526060602082018190526000906124a790830185611e23565b8281036040840152611ee38185611e23565b60018060a01b03851681528360208201526080604082015260006124e06080830185611e23565b82810360608401526124f28185611e23565b979650505050505050565b60006020828403121561250f57600080fd5b815180151581146122fb57600080fd5b602080825260129082015271496e76616c6964205369676e61747572652160701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016125735761257361254b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156116835761168361254b565b600060ff821660ff81036125bf576125bf61254b565b60010192915050565b60018060a01b03815116825260006020820151604060208501526125ef6040850182611e23565b949350505050565b6001600160a01b038716815260c0602080830182905260009161261c90840189611e23565b8381036040850152875180825282820190600581901b83018401848b0160005b8381101561266a57601f198684030185526126588383516125c8565b9487019492509086019060010161263c565b505089606088015288608088015286810360a088015261268a8189611e23565b9d9c50505050505050505050505050565b60208082526023908201527f596f7520617265206e6f742074686520636f6c6c6162206f66207468617420446040820152624f432160e81b606082015260800190565b6020808252601b908201527f416c726561647920636f6e6669726d656420646f63756d656e74210000000000604082015260600190565b818103612720575050565b61272a825461233e565b67ffffffffffffffff81111561274257612742611eed565b612750816123eb845461233e565b6000601f821160018114612784576000831561276c5750848201545b600019600385901b1c1916600184901b1784556127e9565b600085815260209020601f19841690600086815260209020845b838110156127be578286015482556001958601959091019060200161279e565b50858310156127dc5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b5050505050565b60018060a01b038416815260006020848184015260606040840152600084546128188161233e565b806060870152608060018084166000811461283a576001811461285457612882565b60ff1985168984015283151560051b890183019550612882565b896000528660002060005b8581101561287a5781548b820186015290830190880161285f565b8a0184019650505b50939a9950505050505050505050565b60018060a01b0385168152836020820152826040820152608060608201526000611ee36080830184611e23565b6020808252601c908201527f596f7520617265206e6f742074686520646f632063726561746f722100000000604082015260600190565b8281526040602082015260006125ef60408301846125c8565b60208082526023908201527f596f7520616c726561647920636f6e6669726d6564207468617420726571756560408201526273742160e81b606082015260800190565b60018060a01b03841681528260208201526060604082015260006123276060830184611e23565b818103818111156116835761168361254b565b60ff82811682821603908111156116835761168361254b565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f7e1ba275c98da5f01c6b37af3854aca92e53099d9937444ae7a8276da9768a864736f6c63430008140033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c806393592cbe116100f9578063dc479bba11610097578063f2fde38b11610071578063f2fde38b1461042f578063f35e237b14610442578063fabaeb1814610455578063ff79e8b61461046857600080fd5b8063dc479bba146103d8578063e436426614610413578063e7d915cf1461041c57600080fd5b8063b024d3ce116100d3578063b024d3ce1461037c578063c2e66dfb1461038f578063c3c5a547146103a2578063d42cca15146103c557600080fd5b806393592cbe14610335578063a6b2c43714610348578063a87430ba1461035b57600080fd5b80636057744911610166578063757c075711610140578063757c0757146102d35780637f53afcb146102e65780638da5cb5b146102f95780638f7792011461031e57600080fd5b8063605774491461029457806369d7427d146102a7578063715018a6146102cb57600080fd5b806302e9d43b146101ae5780631d2e4afd146101db5780632d3ba33e146101f057806332a32c94146102305780633e6d21fa146102435780635b430cda14610281575b600080fd5b6101c16101bc366004611e0a565b61047b565b6040516101d2959493929190611ea1565b60405180910390f35b6101ee6101e9366004611fa4565b610542565b005b61021e6101fe366004612024565b600a60209081526000928352604080842090915290825290205460ff1681565b60405160ff90911681526020016101d2565b6101ee61023e3660046120c6565b610649565b610271610251366004612024565b600660209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101d2565b6101ee61028f366004611e0a565b610a51565b6101ee6102a23660046121f5565b610bc7565b6102ba6102b5366004611e0a565b610ece565b6040516101d2959493929190612262565b6101ee610f95565b6101ee6102e13660046122a3565b610fa9565b6101ee6102f43660046122e0565b61117d565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016101d2565b61032760035481565b6040519081526020016101d2565b600154610306906001600160a01b031681565b6101ee610356366004611e0a565b6111a7565b61036e6103693660046122e0565b61135b565b6040516101d2929190612302565b6101ee61038a3660046121f5565b611487565b61027161039d366004612024565b61165a565b6102716103b03660046122e0565b60096020526000908152604090205460ff1681565b6101ee6103d3366004612024565b611689565b6104066103e6366004612024565b600760209081526000928352604080842090915290825290205460ff1681565b6040516101d29190612330565b61032760025481565b6101ee61042a366004611e0a565b611982565b6101ee61043d3660046122e0565b611a82565b6101ee610450366004611fa4565b611ac0565b6101ee610463366004611e0a565b611b89565b6101ee610476366004611e0a565b611cb9565b60056020526000908152604090208054600182015460028301805492936001600160a01b03909216926104ad9061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546104d99061233e565b80156105265780601f106104fb57610100808354040283529160200191610526565b820191906000526020600020905b81548152906001019060200180831161050957829003601f168201915b5050506003909301549192505060ff8082169161010090041685565b3360009081526009602052604090205460ff16156105a75760405162461bcd60e51b815260206004820152601b60248201527f596f752061726520616c7265616479207265676973746572656421000000000060448201526064015b60405180910390fd5b6040805180820182528381526020808201849052336000908152600890915291909120815181906105d890826123c3565b50602082015160018201906105ed90826123c3565b50503360008181526009602052604090819020805460ff19166001179055517f4ddffe5495169d350d09d432b0c9ffb9156ae79ccd81b2113fca4bbea47f1bda925061063d919085908590612483565b60405180910390a15050565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e4890610680903390600090879087906004016124b9565b602060405180830381865afa15801561069d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c191906124fd565b6106dd5760405162461bcd60e51b815260040161059e9061251f565b835160ff10156107235760405162461bcd60e51b8152602060048201526011602482015270546f6f206d616e7920636f6c6c6162732160781b604482015260640161059e565b6002805490600061073383612561565b90915550506003805490600061074883612561565b90915550506002805460009081526004602052604080822080546001600160a01b03191633179055915481522060010161078283826123c3565b50600380546002805460009081526004602052604080822090940192909255548152908120426005909101555b84518160ff1610156108c057600460006002548152602001908152602001600020600201858260ff16815181106107e8576107e861257a565b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b0390921691909117815591810151909282019061083e90826123c3565b50505080600161084e9190612590565b600a600060025481526020019081526020016000206000878460ff168151811061087a5761087a61257a565b602090810291909101810151516001600160a01b03168252810191909152604001600020805460ff191660ff929092169190911790556108b9816125a9565b90506107af565b506040805160a081018252600254815233602082015290810183905260016060820152608081016000905260035460009081526005602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b0390921691909117905590820151600282019061093c90826123c3565b50606082015160038201805460ff90921660ff1983168117825560808501519261ffff19161761010083600281111561097757610977611e69565b0217905550506003546000908152600760209081526040808320338452909152902080546001925060ff191682800217905550600154604051632091ea5f60e21b81523360048201526001600160a01b0390911690638247a97c90602401600060405180830381600087803b1580156109ef57600080fd5b505af1158015610a03573d6000803e3d6000fd5b50506002546003546040517f2b4587bc06ed8e0680a5e4250ea9f92fad5213927711d30cc22436a41d710eb39450610a439350339288928a9289906125f7565b60405180910390a150505050565b600081815260056020526040902054610a6a813361165a565b610a865760405162461bcd60e51b815260040161059e9061269b565b6000828152600560209081526040808320548084526004928390529220015460ff1615610ac55760405162461bcd60e51b815260040161059e906126de565b6000838152600560209081526040808320548352600490915290206003015483908114610b2b5760405162461bcd60e51b81526020600482015260146024820152734e6f74206f6e207468617420726571756573742160601b604482015260640161059e565b60008481526005602090815260408083208054808552600490935292209091600190910190610b5d9060020182612715565b50600081815260046020908152604080832060030183905587835260059091529081902090517ff2a85f7a294675c2b60bbccaa6dae2668ceacb6943568399f2e8d7bd41b0025091610bb891339185916002909101906127f0565b60405180910390a15050505050565b82610bd2813361165a565b610bee5760405162461bcd60e51b815260040161059e9061269b565b6000848152600460208190526040909120015460ff1615610c4a5760405162461bcd60e51b8152602060048201526016602482015275416c726561647920636f6e6669726d656420446f632160501b604482015260640161059e565b60008481526004602052604090206003015415610c9e5760405162461bcd60e51b8152602060048201526012602482015271416c7265616479206f6e207570646174652160701b604482015260640161059e565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e4890610cd49033908890889088906004016124b9565b602060405180830381865afa158015610cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1591906124fd565b610d315760405162461bcd60e51b815260040161059e9061251f565b600154604051632091ea5f60e21b81523360048201526001600160a01b0390911690638247a97c90602401600060405180830381600087803b158015610d7657600080fd5b505af1158015610d8a573d6000803e3d6000fd5b505060038054925090506000610d9f83612561565b90915550506040805160a08101825285815233602082015290810184905260016060820152608081016000905260035460009081526005602090815260409182902083518155908301516001820180546001600160a01b0319166001600160a01b03909216919091179055908201516002820190610e1d90826123c3565b50606082015160038201805460ff90921660ff1983168117825560808501519261ffff191617610100836002811115610e5857610e58611e69565b02179055505060038054600090815260076020908152604080832033808552908352818420805460ff1916600117905584548a855260049093529281902090930181905591517fa3a5b7198374ac273bf7616259b230f4831f8730600bc8a1760cf52baadf2c0a9350610a439288918890612892565b600460205260009081526040902080546001820180546001600160a01b039092169291610efa9061233e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f269061233e565b8015610f735780601f10610f4857610100808354040283529160200191610f73565b820191906000526020600020905b815481529060010190602001808311610f5657829003601f168201915b50505050600383015460048401546005909401549293909260ff909116915085565b610f9d611d3f565b610fa76000611d6c565b565b60008281526004602052604090205482906001600160a01b03163314610fe15760405162461bcd60e51b815260040161059e906128bf565b60008381526004602081905260409091200154839060ff16156110165760405162461bcd60e51b815260040161059e906126de565b61102484846000015161165a565b1561106a5760405162461bcd60e51b81526020600482015260166024820152754974277320616c7265616479206120636f6c6c61622160501b604482015260640161059e565b6000848152600460205260409020600201805460ff116110c55760405162461bcd60e51b815260206004820152601660248201527543616e277420616464206d6f726520636f6c6c61622160501b604482015260640161059e565b8054600180820183556000838152602090819020875160029094020180546001600160a01b0319166001600160a01b0390941693909317835586015186929182019061111190826123c3565b505081546000878152600a6020908152604080832089516001600160a01b0316845290915290819020805460ff191660ff90931692909217909155517f9231c7fb604793dfa63c72d99e55a81ad132a68360350cd72367d823b4481d369150610bb890879087906128f6565b611185611d3f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600560205260409020546111c0813361165a565b6111dc5760405162461bcd60e51b815260040161059e9061269b565b8160008082815260076020908152604080832033845290915290205460ff16600281111561120c5761120c611e69565b146112295760405162461bcd60e51b815260040161059e9061290f565b6000838152600560205260408120600301805460ff1691611249836125a9565b82546101009290920a60ff81810219909316919092169190910217905550600083815260076020908152604080832033808552908352818420805460ff19166001179055868452600583528184205480855260048452938290206002810154835192835293820188905292917ff63ea3eae557a7022ec4accf5dd3529a31d448603687447053e3b8919572b20e910160405180910390a160008681526005602052604090206003015460ff80831691160361135357600086815260056020908152604091829020600301805461010061ff001990911617905590518781527ff82a94675f90ef5361ee99a4fba4d5c46c7afffb3522499c668f74c496fb58e4910160405180910390a15b505050505050565b6008602052600090815260409020805481906113769061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546113a29061233e565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b5050505050908060010180546114049061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546114309061233e565b801561147d5780601f106114525761010080835404028352916020019161147d565b820191906000526020600020905b81548152906001019060200180831161146057829003601f168201915b5050505050905082565b82611492813361165a565b6114ae5760405162461bcd60e51b815260040161059e9061269b565b6000848152600460208190526040909120015460ff166115105760405162461bcd60e51b815260206004820181905260248201527f4861766520746f20636f6e6669726d20646f63206265666f7265207369676e21604482015260640161059e565b600084815260066020908152604080832033845290915290205460ff16156115705760405162461bcd60e51b8152602060048201526013602482015272596f7520616c7265616479207369676e65642160681b604482015260640161059e565b600154604051630d2a47c960e31b81526001600160a01b03909116906369523e48906115a69033908890889088906004016124b9565b602060405180830381865afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e791906124fd565b6116035760405162461bcd60e51b815260040161059e9061251f565b600084815260066020908152604080832033808552925291829020805460ff1916600117905590517fad1ef0f31a5a91874aa5ea96af9a36e32cbac60bcfe3ed547208774c457471fe91610a439187908790612952565b6000828152600a602090815260408083206001600160a01b038516845290915290205460ff1615155b92915050565b60008281526004602052604090205482906001600160a01b031633146116c15760405162461bcd60e51b815260040161059e906128bf565b60008381526004602081905260409091200154839060ff16156116f65760405162461bcd60e51b815260040161059e906126de565b611700848461165a565b6117415760405162461bcd60e51b815260206004820152601260248201527149742773206e6f74206120636f6c6c61622160701b604482015260640161059e565b6000848152600460209081526040808320600a83528184206001600160a01b038816855290925282205460029091018054909260ff9092169190839061178990600190612979565b815481106117995761179961257a565b60009182526020918290206040805180820190915260029092020180546001600160a01b0316825260018101805492939192918401916117d89061233e565b80601f01602080910402602001604051908101604052809291908181526020018280546118049061233e565b80156118515780601f1061182657610100808354040283529160200191611851565b820191906000526020600020905b81548152906001019060200180831161183457829003601f168201915b5050505050815250509050808360018461186b919061298c565b60ff168154811061187e5761187e61257a565b600091825260209182902083516002929092020180546001600160a01b0319166001600160a01b039092169190911781559082015160018201906118c290826123c3565b50905050828054806118d6576118d66129a5565b60008281526020812060026000199093019283020180546001600160a01b0319168155906119076001830182611dbc565b505090556000878152600a6020908152604080832084516001600160a01b03908116855290835292819020805460ff191660ff871617905580518a8152928916918301919091527f8f8ba90a3537bb5db73c92326b03d5cf9903a8c6ba588309512f287a9da0a7b4910160405180910390a150505050505050565b60008181526005602052604090205461199b813361165a565b6119b75760405162461bcd60e51b815260040161059e9061269b565b8160008082815260076020908152604080832033845290915290205460ff1660028111156119e7576119e7611e69565b14611a045760405162461bcd60e51b815260040161059e9061290f565b600083815260076020908152604080832033808552908352818420805460ff191660021790558684526005835292819020600301805461020061ff001990911617905580519283529082018590527fa36a540c5fea3a5e69d4b1c2247b28a93fd183ef1314af26a8db7b3ae080bcd0910160405180910390a1505050565b611a8a611d3f565b6001600160a01b038116611ab457604051631e4fbdf760e01b81526000600482015260240161059e565b611abd81611d6c565b50565b3360009081526009602052604090205460ff16611b1f5760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f74207265676973746572656421000000000000000000604482015260640161059e565b336000908152600860205260409020611b3883826123c3565b50336000908152600860205260409020600101611b5582826123c3565b507f780d856ed9ea931025ba084067327ac59ec5901a2d40b1019936c4561eb66efb33838360405161063d93929190612483565b600081815260056020526040902054611ba2813361165a565b611bbe5760405162461bcd60e51b815260040161059e9061269b565b6000828152600560209081526040808320548084526004928390529220015460ff1615611bfd5760405162461bcd60e51b815260040161059e906126de565b6000838152600560209081526040808320548352600490915290206003015483908114611c635760405162461bcd60e51b81526020600482015260146024820152734e6f74206f6e207468617420726571756573742160601b604482015260640161059e565b600084815260056020908152604080832054808452600483528184206003019390935580513381529182018390527fd9168354e7488be9ffebf8f086c5d0a417368fc090dd17e987927b5e2bf75ded9101610bb8565b60008181526004602052604090205481906001600160a01b03163314611cf15760405162461bcd60e51b815260040161059e906128bf565b60008281526004602081905260409182902001805460ff19166001179055517f7bfc51787cf9b207191cae1618bc4b3ca9cadc6dfb5b920e569de8d4a847d0389061063d9084815260200190565b6000546001600160a01b03163314610fa75760405163118cdaa760e01b815233600482015260240161059e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b508054611dc89061233e565b6000825580601f10611dd8575050565b601f016020900490600052602060002090810190611abd91905b80821115611e065760008155600101611df2565b5090565b600060208284031215611e1c57600080fd5b5035919050565b6000815180845260005b81811015611e4957602081850181015186830182015201611e2d565b506000602082860101526020601f19601f83011685010191505092915050565b634e487b7160e01b600052602160045260246000fd5b60038110611e9d57634e487b7160e01b600052602160045260246000fd5b9052565b8581526001600160a01b038516602082015260a060408201819052600090611ecb90830186611e23565b905060ff84166060830152611ee36080830184611e7f565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f2c57611f2c611eed565b604052919050565b600082601f830112611f4557600080fd5b813567ffffffffffffffff811115611f5f57611f5f611eed565b611f72601f8201601f1916602001611f03565b818152846020838601011115611f8757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215611fb757600080fd5b823567ffffffffffffffff80821115611fcf57600080fd5b611fdb86838701611f34565b93506020850135915080821115611ff157600080fd5b50611ffe85828601611f34565b9150509250929050565b80356001600160a01b038116811461201f57600080fd5b919050565b6000806040838503121561203757600080fd5b8235915061204760208401612008565b90509250929050565b60006040828403121561206257600080fd5b6040516040810167ffffffffffffffff828210818311171561208657612086611eed565b8160405282935061209685612008565b835260208501359150808211156120ac57600080fd5b506120b985828601611f34565b6020830152505092915050565b600080600080608085870312156120dc57600080fd5b843567ffffffffffffffff808211156120f457600080fd5b818701915087601f83011261210857600080fd5b813560208282111561211c5761211c611eed565b8160051b61212b828201611f03565b928352848101820192828101908c85111561214557600080fd5b83870192505b84831015612181578235868111156121635760008081fd5b6121718e86838b0101612050565b835250918301919083019061214b565b995050508801359250508082111561219857600080fd5b6121a488838901611f34565b945060408701359150808211156121ba57600080fd5b6121c688838901611f34565b935060608701359150808211156121dc57600080fd5b506121e987828801611f34565b91505092959194509250565b60008060006060848603121561220a57600080fd5b83359250602084013567ffffffffffffffff8082111561222957600080fd5b61223587838801611f34565b9350604086013591508082111561224b57600080fd5b5061225886828701611f34565b9150509250925092565b6001600160a01b038616815260a06020820181905260009061228690830187611e23565b604083019590955250911515606083015260809091015292915050565b600080604083850312156122b657600080fd5b82359150602083013567ffffffffffffffff8111156122d457600080fd5b611ffe85828601612050565b6000602082840312156122f257600080fd5b6122fb82612008565b9392505050565b6040815260006123156040830185611e23565b82810360208401526123278185611e23565b95945050505050565b602081016116838284611e7f565b600181811c9082168061235257607f821691505b60208210810361237257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156123be57600081815260208120601f850160051c8101602086101561239f5750805b601f850160051c820191505b81811015611353578281556001016123ab565b505050565b815167ffffffffffffffff8111156123dd576123dd611eed565b6123f1816123eb845461233e565b84612378565b602080601f831160018114612426576000841561240e5750858301515b600019600386901b1c1916600185901b178555611353565b600085815260208120601f198616915b8281101561245557888601518255948401946001909101908401612436565b50858210156124735787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03841681526060602082018190526000906124a790830185611e23565b8281036040840152611ee38185611e23565b60018060a01b03851681528360208201526080604082015260006124e06080830185611e23565b82810360608401526124f28185611e23565b979650505050505050565b60006020828403121561250f57600080fd5b815180151581146122fb57600080fd5b602080825260129082015271496e76616c6964205369676e61747572652160701b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016125735761257361254b565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60ff81811683821601908111156116835761168361254b565b600060ff821660ff81036125bf576125bf61254b565b60010192915050565b60018060a01b03815116825260006020820151604060208501526125ef6040850182611e23565b949350505050565b6001600160a01b038716815260c0602080830182905260009161261c90840189611e23565b8381036040850152875180825282820190600581901b83018401848b0160005b8381101561266a57601f198684030185526126588383516125c8565b9487019492509086019060010161263c565b505089606088015288608088015286810360a088015261268a8189611e23565b9d9c50505050505050505050505050565b60208082526023908201527f596f7520617265206e6f742074686520636f6c6c6162206f66207468617420446040820152624f432160e81b606082015260800190565b6020808252601b908201527f416c726561647920636f6e6669726d656420646f63756d656e74210000000000604082015260600190565b818103612720575050565b61272a825461233e565b67ffffffffffffffff81111561274257612742611eed565b612750816123eb845461233e565b6000601f821160018114612784576000831561276c5750848201545b600019600385901b1c1916600184901b1784556127e9565b600085815260209020601f19841690600086815260209020845b838110156127be578286015482556001958601959091019060200161279e565b50858310156127dc5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b5050505050565b60018060a01b038416815260006020848184015260606040840152600084546128188161233e565b806060870152608060018084166000811461283a576001811461285457612882565b60ff1985168984015283151560051b890183019550612882565b896000528660002060005b8581101561287a5781548b820186015290830190880161285f565b8a0184019650505b50939a9950505050505050505050565b60018060a01b0385168152836020820152826040820152608060608201526000611ee36080830184611e23565b6020808252601c908201527f596f7520617265206e6f742074686520646f632063726561746f722100000000604082015260600190565b8281526040602082015260006125ef60408301846125c8565b60208082526023908201527f596f7520616c726561647920636f6e6669726d6564207468617420726571756560408201526273742160e81b606082015260800190565b60018060a01b03841681528260208201526060604082015260006123276060830184611e23565b818103818111156116835761168361254b565b60ff82811682821603908111156116835761168361254b565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220f7e1ba275c98da5f01c6b37af3854aca92e53099d9937444ae7a8276da9768a864736f6c63430008140033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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