ETH Price: $2,071.16 (+0.02%)

Contract

0x0BC788aDF6EDE55c9B9f112A52AAa57F2d35874A

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Register189492072025-01-06 16:44:3578 days ago1736181875IN
Dyson Finance: Agency
0 ETH0.000076720.361
Register182974602024-12-12 16:43:21103 days ago1734021801IN
Dyson Finance: Agency
0 ETH0.000055150.25949953
Register182941362024-12-12 13:38:56103 days ago1734010736IN
Dyson Finance: Agency
0 ETH0.000072480.341
Register182926092024-12-12 12:14:15103 days ago1734005655IN
Dyson Finance: Agency
0 ETH0.000061640.29
Register182900812024-12-12 9:54:27104 days ago1733997267IN
Dyson Finance: Agency
0 ETH0.000056490.246
Register182879692024-12-12 7:58:36104 days ago1733990316IN
Dyson Finance: Agency
0 ETH0.000047070.205
Register182115202024-12-09 9:55:29107 days ago1733738129IN
Dyson Finance: Agency
0 ETH0.000030810.145
Register182115132024-12-09 9:55:05107 days ago1733738105IN
Dyson Finance: Agency
0 ETH0.000032730.154
Register182115092024-12-09 9:54:51107 days ago1733738091IN
Dyson Finance: Agency
0 ETH0.000035590.155
Register180891812024-12-04 18:12:45111 days ago1733335965IN
Dyson Finance: Agency
0 ETH0.000104130.49
Register180084392024-12-01 11:19:14114 days ago1733051954IN
Dyson Finance: Agency
0 ETH0.000074390.35
Register180016922024-12-01 4:41:19115 days ago1733028079IN
Dyson Finance: Agency
0 ETH0.000025510.12
Register179933542024-11-30 20:26:01115 days ago1732998361IN
Dyson Finance: Agency
0 ETH0.000046390.202
Register179520062024-11-29 3:44:35117 days ago1732851875IN
Dyson Finance: Agency
0 ETH0.000020730.09756
Register179440952024-11-28 19:57:24117 days ago1732823844IN
Dyson Finance: Agency
0 ETH0.000040590.191
Register179420622024-11-28 17:58:40117 days ago1732816720IN
Dyson Finance: Agency
0 ETH0.000045930.2
Register179240322024-11-28 0:07:16118 days ago1732752436IN
Dyson Finance: Agency
0 ETH0.000114360.538
Register179103852024-11-27 10:34:58119 days ago1732703698IN
Dyson Finance: Agency
0 ETH0.000053140.25
Register179039162024-11-27 4:05:29119 days ago1732680329IN
Dyson Finance: Agency
0 ETH0.000073430.34542
Register179012402024-11-27 1:28:32119 days ago1732670912IN
Dyson Finance: Agency
0 ETH0.000027780.121
Register178992492024-11-26 23:30:54119 days ago1732663854IN
Dyson Finance: Agency
0 ETH0.000023380.11
Register178965292024-11-26 20:48:56119 days ago1732654136IN
Dyson Finance: Agency
0 ETH0.000032090.151
Register178838052024-11-26 8:03:25120 days ago1732608205IN
Dyson Finance: Agency
0 ETH0.000030540.133
Register178654772024-11-25 13:36:30120 days ago1732541790IN
Dyson Finance: Agency
0 ETH0.000056260.245
Register178617162024-11-25 9:46:25121 days ago1732527985IN
Dyson Finance: Agency
0 ETH0.000048720.2292

Latest 1 internal transaction

Parent Transaction Hash Block From To
78230142023-11-20 12:11:27491 days ago1700482287
Dyson Finance: Agency
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Agency

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : Agency.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-3.0-only

import "./AgentNFT.sol";
import "./lib/TransferHelper.sol";

/// @title Referral system contract
/// @notice If a user deposits in Pair and has registered in referral system,
/// he will get extra DYSON token as reward.
/// Each user in the referral system is an `Agent`.
/// Referral of a agent is called the `child` of the agent.
contract Agency {
    using TransferHelper for address;

    bytes32 public constant REGISTER_ONCE_TYPEHASH = keccak256("register(address child)"); // onceSig
    bytes32 public constant REGISTER_PARENT_TYPEHASH = keccak256("register(address once,uint256 deadline,uint256 price)"); // parentSig
    /// @notice Max number of children, i.e., referrals, per agent
    /// Note that this limit is not forced on root agent
    uint constant MAX_NUM_CHILDREN = 3;
    /// @notice Amount of time a new agent have to wait before he can refer a new user
    uint constant REGISTER_DELAY = 4 hours;
    /// @notice Cooldown time before an agent can transfer his agent
    uint constant TRANSFER_CD = 60000;
    
    AgentNFT public immutable agentNFT;

    /// @dev For EIP-2612 permit
    bytes32 public immutable DOMAIN_SEPARATOR;

    /// @member owner Owner of the agent data
    /// @member gen Agent's generation in the referral system
    /// @member birth Timestamp when the agent registerred in the referral system
    /// @member parentId Id of the agent's parent, i.e., it's referrer
    /// @member childrenId Ids of the agent's children, i.e., referrals

    struct Agent {
        address owner;
        uint gen;
        uint birth;
        uint parentId;
        uint[] childrenId;
    }

    address public owner;
    /// @notice Number of users in the referral system
    uint public totalSupply;

    /// @notice User's id in the referral system
    /// Param is User's address
    mapping(address => uint) public whois;
    /// @notice User's agent
    /// Param is User's id in the referral system
    mapping(uint => Agent) internal agents;
    /// @notice Record the time when a user can transfer his agent
    mapping(uint => uint) public transferCooldown;
    /// @notice Record if an invite code has been used
    mapping(address => bool) public oneTimeCodes;
    /// @notice Record if a hash has been presigned by an address
    mapping(address => mapping(bytes32 => bool)) public presign;
    /// @notice Record if an address is a controller
    mapping (address => bool) public isController;

    event TransferOwnership(address newOwner);
    event Register(uint indexed referrer, uint referee);
    event Sign(address indexed signer, bytes32 digest);

    constructor(address _owner, address root) {
        require(_owner != address(0), "invalid owner");
        DOMAIN_SEPARATOR = keccak256(abi.encode(
            keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
            keccak256(bytes("Agency")),
            keccak256(bytes("1")),
            block.chainid,
            address(this)
        ));

        owner = _owner;

        AgentNFT _agentNFT = new AgentNFT(address(this));
        agentNFT = _agentNFT;
        // Initialize root
        uint id = ++totalSupply; // root agent has id 1
        whois[root] = id;
        Agent storage rootAgent = agents[id];
        rootAgent.owner = root;
        rootAgent.birth = block.timestamp;
        rootAgent.parentId = id; // root agent's parent is also root agent itself
        _agentNFT.onMint(root, id);
        emit Register(id, id);
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "forbidden");
        _;
    }

    function transferOwnership(address _owner) external onlyOwner {
        require(_owner != address(0), "owner cannot be zero");
        owner = _owner;

        emit TransferOwnership(_owner);
    }

    /// @notice rescue token stucked in this contract
    /// @param tokenAddress Address of token to be rescued
    /// @param to Address that will receive token
    /// @param amount Amount of token to be rescued
    function rescueERC20(address tokenAddress, address to, uint256 amount) onlyOwner external {
        tokenAddress.safeTransfer(to, amount);
    }

    function addController(address _controller) external onlyOwner {
        isController[_controller] = true;
    }

    function removeController(address _controller) external onlyOwner {
        isController[_controller] = false;
    }

    /// @notice Add new child agent to root agent. This child will have the privilege of being a 1st generation agent.
    /// This function can only be executed by admin, which is either `owner` or `controller`.
    /// @param newUser User of the new agent
    /// @return id Id of the new agent
    function adminAdd(address newUser) external returns (uint id) {
        require(msg.sender == owner || isController[msg.sender], "forbidden");
        require(whois[newUser] == 0, "occupied");
        id = _newAgent(newUser, 1);
    }

    /// @notice Transfer agent data to another user
    /// Can not transfer to a user who already has an agent.
    /// @param from previous owner of the agent
    /// @param to User who will receive the agent
    /// @param id index of the agent to be transfered
    /// @return True if transfer succeed
    function transfer(address from, address to, uint id) external returns (bool) {
        require(msg.sender == address(agentNFT), "forbidden");
        require(to != address(0), "transfer invalid address");
        require(id != 0, "nothing to transfer");
        require(id == whois[from], "forbidden");
        require(transferCooldown[id] < block.timestamp, "cd");
        Agent storage agent = agents[id];
        require(whois[to] == 0, "occupied");
        agent.owner = to;
        whois[to] = id;
        whois[from] = 0;
        // agent can not be transfered again until cooldown time, (gen + 1) * TRANSFER_CD, 
        // which is 10 times as long as the cooldown time of swapping SP to DYSON
        transferCooldown[id] = block.timestamp + (agent.gen + 1) * TRANSFER_CD; 
        return true;
    }

    /// @dev Create new `Agent` data and update the link between the agent and it's parent agent
    function _newAgent(address _owner, uint parentId) internal returns (uint id) {
        require(_owner != address(0), "new agent invalid address");
        id = ++totalSupply;
        whois[_owner] = id;
        Agent storage parent = agents[parentId];
        Agent storage child = agents[id];
        parent.childrenId.push(id);
        child.owner = _owner;
        child.gen = parent.gen + 1;
        child.birth = block.timestamp;
        child.parentId = parentId;
        agentNFT.onMint(_owner, id);
        emit Register(parentId, id);
    }

    function _getHashTypedData(bytes32 structHash) internal view returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, structHash));
    }

    /// @notice User register in the referral system by providing an one time invite code: `onceSig`
    /// and his referrer's signature: `parentSig`.
    /// User can not register if he already has an agent.
    /// User can not register if the referrer already has maximum number of child agents.
    /// User can not register if the referrer is new and has not passed the register delay
    /// @notice If the referral code is presigned, use parent's address for parentSig
    /// @param parentSig Referrer's signature or referrer's address
    /// @param onceSig Invite code
    /// @param deadline Deadline of the invite code, set by the referrer
    /// @return id Id of the new agent
    function register(bytes memory parentSig, bytes memory onceSig, uint deadline) payable external returns (uint id) {
        require(block.timestamp < deadline, "exceed deadline");
        require(whois[msg.sender] == 0, "already registered");

        bytes32 onceSigDigest = _getHashTypedData(keccak256(abi.encode(
            REGISTER_ONCE_TYPEHASH,
            msg.sender
        )));
        address once = _ecrecover(onceSigDigest, onceSig);
        require(once != address(0), "invalid once sig");
        require(oneTimeCodes[once] == false, "signature is used");

        bytes32 parentSigDigest = _getHashTypedData(keccak256(abi.encode(
            REGISTER_PARENT_TYPEHASH,
            once,
            deadline,
            msg.value
        )));
        address _parent;
        if(parentSig.length == 65) {
            _parent = _ecrecover(parentSigDigest, parentSig);
        }
        else if(parentSig.length == 20) {
            assembly {
                _parent := mload(add(parentSig, 20))
            }
            require(presign[_parent][parentSigDigest], "invalid parent sig");
        }
        require(_parent != address(0), "invalid parent sig");

        uint parentId = whois[_parent];
        require(parentId != 0, "invalid parent");
        Agent storage parent = agents[parentId];
        require(parent.childrenId.length < MAX_NUM_CHILDREN, "no empty slot");
        require(parent.birth + REGISTER_DELAY <= block.timestamp, "not ready");

        id = _newAgent(msg.sender, parentId);
        oneTimeCodes[once] = true;
        if(msg.value > 0) {
            _parent.safeTransferETH(msg.value);
        }
    }

    /// @dev parent do onchain presign for a referral code
    function sign(bytes32 digest) external {
        presign[msg.sender][digest] = true;
        emit Sign(msg.sender, digest);
    }

    function getHashTypedData(bytes32 structHash) external view returns (bytes32) {
        return _getHashTypedData(structHash);
    }

    /// @notice User's agent data
    /// @param _owner User's address
    /// @return ref Parent agent's owner address
    /// @return gen Generation of user's agent
    function userInfo(address _owner) external view returns (address ref, uint gen) {
        Agent storage agent = agents[whois[_owner]];
        ref = agents[agent.parentId].owner;
        gen = agent.gen;
    }

    /// @notice Get agent data by user's id
    /// @param id Id of the user
    /// @return User's agent data
    function getAgent(uint id) external view returns (address, uint, uint, uint, uint[] memory) {
        Agent storage agent = agents[id];
        return(agent.owner, agent.gen, agent.birth, agent.parentId, agent.childrenId);
    }

    function _ecrecover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }

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

}

File 2 of 5 : AgentNFT.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-3.0-only

import "interface/IAgency.sol";
import "interface/IERC721Receiver.sol";

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

contract AgentNFT {
    IAgency public immutable agency;

    /// @dev ERC165 interface ID of ERC165
    bytes4 private constant ERC165_INTERFACE_ID = 0x01ffc9a7;
    /// @dev ERC165 interface ID of ERC721
    bytes4 private constant ERC721_INTERFACE_ID = 0x80ac58cd;
    /// @dev ERC165 interface ID of ERC721Metadata
    bytes4 private constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f;

    /// @dev Get the approved address for a single NFT.
    mapping(uint => address) public getApproved;
    /// @dev Checks if an address is an approved operator. 
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /**
    * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
    */
    event Transfer(address indexed from, address indexed to, uint indexed tokenId);
    /**
    * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
    */
    event Approval(address indexed owner, address indexed approved, uint indexed tokenId);
    /**
    * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
    */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    constructor(address _agency) {
        agency = IAgency(_agency);
    }

    /**
    * @dev Interface identification is specified in ERC-165.
    * @param interfaceID Id of the interface
    */
    function supportsInterface(bytes4 interfaceID) external pure returns (bool) {
        return (interfaceID == ERC165_INTERFACE_ID ||
                interfaceID == ERC721_INTERFACE_ID ||
                interfaceID == ERC721_METADATA_INTERFACE_ID);
    }

    function name() external pure returns (string memory) {
        return "Agent";
    }

    function symbol() external pure returns (string memory) {
        return "DAG";
    }

    function tokenURI(uint tokenId) external view returns (string memory) {
        (address owner, uint tier, uint birth, uint parent,) = agency.getAgent(tokenId);
        require(owner != address(0), "token not exist");
        return _tokenURI(tokenId, parent, tier, birth);
    }

    function _tokenURI(uint tokenId, uint parent, uint tier, uint birth) internal pure returns (string memory output) {
        output = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';
        output = string(abi.encodePacked(output, "token ", _toString(tokenId), '</text><text x="10" y="40" class="base">'));
        output = string(abi.encodePacked(output, "referer ", _toString(parent), '</text><text x="10" y="60" class="base">'));
        output = string(abi.encodePacked(output, "agent_tier ", _toString(tier), '</text><text x="10" y="80" class="base">'));
        output = string(abi.encodePacked(output, "time_of_creation ", _toString(birth), '</text></svg>'));

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Agent #', _toString(tokenId), '", "description": "Dyson Finance Agent NFT", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));
    }

    function _toString(uint value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint temp = value;
        uint digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function totalSupply() external view returns (uint) {
        return agency.totalSupply();
    }

    function balanceOf(address owner) external view returns (uint balance) {
        return agency.whois(owner) == 0 ? 0 : 1;
    }

    function ownerOf(uint tokenId) public view returns (address owner) {
        (owner,,,,) = agency.getAgent(tokenId);
    }

    function onMint(address user, uint tokenId) external {
        require(msg.sender == address(agency), "forbidden");
        emit Transfer(address(0), user, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId
    ) external {
        safeTransferFrom(from, to, tokenId, '');
    }

    function approve(address to, uint tokenId) external {
        address owner = ownerOf(tokenId);
        // Throws if `tokenId` is not a valid NFT
        require(owner != address(0), "token not exist");
        // Check requirements
        require(owner == msg.sender || isApprovedForAll[owner][msg.sender], "forbidden");
        getApproved[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function setApprovalForAll(address operator, bool approved) external {
        require(operator != msg.sender, "self approval");
        isApprovedForAll[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function _transferFrom(
        address from,
        address to,
        uint tokenId,
        address sender
    ) internal {
        require(from == sender || isApprovedForAll[from][sender] || getApproved[tokenId] == sender, "forbidden");

        getApproved[tokenId] = address(0);

        require(agency.transfer(from, to, tokenId), "forbidden");

        emit Transfer(from, to, tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint tokenId
    ) external {
        _transferFrom(from, to, tokenId, msg.sender);
    }

    function _isContract(address account) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint tokenId,
        bytes memory data
    ) public {
        _transferFrom(from, to, tokenId, msg.sender);

        if (_isContract(to)) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 retval) {
                require(retval == IERC721Receiver.onERC721Received.selector, "transfer failed");
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        }
    }

}

File 3 of 5 : TransferHelper.sol
pragma solidity 0.8.17;

// SPDX-License-Identifier: AGPL-2.0

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: approve failed');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transfer failed');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'transferHelper: transferFrom failed');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'transferHelper: ETH transfer failed');
    }
}

File 4 of 5 : IAgency.sol
pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

interface IAgency {
    struct Agent {
        address owner;
        uint gen;
        uint birth;
        uint parentId;
        uint[] childrenId;
    }

    event TransferOwnership(address newOwner);
    event Register(uint indexed referrer, uint referee);
    event Sign(address indexed signer, bytes32 digest);

    function REGISTER_ONCE_TYPEHASH() external view returns (bytes32);
    function REGISTER_PARENT_TYPEHASH() external view returns (bytes32);
    function MAX_NUM_CHILDREN() external view returns (uint);
    function REGISTER_DELAY() external view returns (uint);
    function TRANSFER_CD() external view returns (uint);
    function agentNFT() external view returns (address);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function whois(address agent) external view returns (uint);
    function oneTimeCodes(address once) external view returns (bool);
    function presign(address agent, bytes32 digest) external view returns (bool);
    function isController(address agent) external view returns (bool);
    function owner() external view returns (address);

    function userInfo(address agent) external view returns (address ref, uint gen);
    function transfer(address from, address to, uint id) external returns (bool);
    function totalSupply() external view returns (uint);
    function getAgent(uint id) external view returns (address, uint, uint, uint, uint[] memory);
    function transferOwnership(address owner) external;
    function addController(address _controller) external;
    function removeController(address _controller) external;
    function rescueERC20(address tokenAddress, address to, uint256 amount) external;
    function adminAdd(address newUser) external returns (uint id);
    function register(bytes memory parentSig, bytes memory onceSig, uint deadline) payable external returns (uint id);
    function sign(bytes32 digest) external;
    function getHashTypedData(bytes32 structHash) external view returns (bytes32);
    function transferCooldown(uint id) external view returns (uint);
}

File 5 of 5 : IERC721Receiver.sol
pragma solidity >=0.8.0;

// SPDX-License-Identifier: MIT

/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
    function onERC721Received(address, address, uint, bytes calldata) external returns (bytes4);
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "interface/=src/interface/",
    "util/=src/util/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"root","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"referrer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"referee","type":"uint256"}],"name":"Register","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"bytes32","name":"digest","type":"bytes32"}],"name":"Sign","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferOwnership","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTER_ONCE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REGISTER_PARENT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"addController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newUser","type":"address"}],"name":"adminAdd","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"agentNFT","outputs":[{"internalType":"contract AgentNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getAgent","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"structHash","type":"bytes32"}],"name":"getHashTypedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isController","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oneTimeCodes","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":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"presign","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"parentSig","type":"bytes"},{"internalType":"bytes","name":"onceSig","type":"bytes"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"register","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"removeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"digest","type":"bytes32"}],"name":"sign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"userInfo","outputs":[{"internalType":"address","name":"ref","type":"address"},{"internalType":"uint256","name":"gen","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whois","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b50604051620033d9380380620033d98339810160408190526200003491620002ec565b6001600160a01b0382166200007f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b604482015260640160405180910390fd5b60408051808201825260068152654167656e637960d01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f79fb09ff8fc931b2f8af592256baf63d59828833262a9c6d6966b00d0137a64a918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f1901815290829052805160209091012060a052600080546001600160a01b0319166001600160a01b0385161781559030906200017c90620002c1565b6001600160a01b039091168152602001604051809103906000f080158015620001a9573d6000803e3d6000fd5b506001600160a01b038116608052600180549192506000918290620001ce9062000324565b91829055506001600160a01b0384811660008181526002602081815260408084208790558684526003918290529283902080546001600160a01b03191685178155429281019290925581018590559051630f632fd360e01b815260048101929092526024820184905292935090841690630f632fd390604401600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50505050817fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d183604051620002ae91815260200190565b60405180910390a250505050506200034c565b6119598062001a8083390190565b80516001600160a01b0381168114620002e757600080fd5b919050565b600080604083850312156200030057600080fd5b6200030b83620002cf565b91506200031b60208401620002cf565b90509250929050565b6000600182016200034557634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a0516116f9620003876000396000818161024a0152610ef301526000818161027e01528181610b03015261113a01526116f96000f3fe6080604052600436106101355760003560e01c80639cd754ba116100ab578063beabacc81161006f578063beabacc814610445578063d2cfa35614610465578063f269c59514610499578063f2fde38b146104b9578063f6a74ed7146104d9578063ff10b580146104f957600080fd5b80639cd754ba14610378578063a1a9b91d146103a8578063a7fc7a07146103d5578063b2118a8d146103f5578063b429afeb1461041557600080fd5b80633fd773e9116100fd5780633fd773e91461026c57806377800c2f146102b8578063799cd333146103035780638da5cb5b146103255780639aae3be3146103455780639b4be7821461036557600080fd5b806318160ddd1461013a5780631959a002146101635780632a5ccc1f146101da5780632de5aaf7146102075780633644e51514610238575b600080fd5b34801561014657600080fd5b5061015060015481565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b506101bb61017e3660046113d8565b6001600160a01b03908116600090815260026020908152604080832054835260039182905280832091820154835290912054600190910154911691565b604080516001600160a01b03909316835260208301919091520161015a565b3480156101e657600080fd5b506101506101f53660046113d8565b60026020526000908152604090205481565b34801561021357600080fd5b506102276102223660046113fa565b61052d565b60405161015a959493929190611413565b34801561024457600080fd5b506101507f000000000000000000000000000000000000000000000000000000000000000081565b34801561027857600080fd5b506102a07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b3480156102c457600080fd5b506102f36102d3366004611480565b600660209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161015a565b34801561030f57600080fd5b5061032361031e3660046113fa565b6105cb565b005b34801561033157600080fd5b506000546102a0906001600160a01b031681565b34801561035157600080fd5b506101506103603660046113fa565b610624565b61015061037336600461154d565b610635565b34801561038457600080fd5b506102f36103933660046113d8565b60056020526000908152604090205460ff1681565b3480156103b457600080fd5b506101506103c33660046113fa565b60046020526000908152604090205481565b3480156103e157600080fd5b506103236103f03660046113d8565b610a65565b34801561040157600080fd5b506103236104103660046115ba565b610ab3565b34801561042157600080fd5b506102f36104303660046113d8565b60076020526000908152604090205460ff1681565b34801561045157600080fd5b506102f36104603660046115ba565b610af6565b34801561047157600080fd5b506101507f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e81565b3480156104a557600080fd5b506101506104b43660046113d8565b610d2c565b3480156104c557600080fd5b506103236104d43660046113d8565b610dcd565b3480156104e557600080fd5b506103236104f43660046113d8565b610e98565b34801561050557600080fd5b506101507f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b081565b600081815260036020818152604080842080546001820154600283015495830154600484018054865181890281018901909752808752899889988998606098976001600160a01b031696959294929390918391908301828280156105b057602002820191906000526020600020905b81548152602001906001019080831161059c575b50505050509050955095509550955095505091939590929450565b336000818152600660209081526040808320858452825291829020805460ff1916600117905590518381527f80aefaab1c400a701ea2159849b146231d2c7be9b71f2b885ea50e55a64667c6910160405180910390a250565b600061062f82610ee3565b92915050565b600081421061067d5760405162461bcd60e51b815260206004820152600f60248201526e65786365656420646561646c696e6560881b60448201526064015b60405180910390fd5b33600090815260026020526040902054156106cf5760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b6044820152606401610674565b604080517f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e60208201523391810191909152600090610727906060015b60405160208183030381529060405280519060200120610ee3565b905060006107358286610f41565b90506001600160a01b0381166107805760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206f6e63652073696760801b6044820152606401610674565b6001600160a01b03811660009081526005602052604090205460ff16156107dd5760405162461bcd60e51b81526020600482015260116024820152701cda59db985d1d5c99481a5cc81d5cd959607a1b6044820152606401610674565b604080517f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b060208201526001600160a01b03831691810191909152606081018590523460808201526000906108349060a00161070c565b9050600087516041036108525761084b8289610f41565b90506108c9565b87516014036108c9575060148701516001600160a01b038116600090815260066020908152604080832085845290915290205460ff166108c95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166109145760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166000908152600260205260408120549081900361096e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081c185c995b9d60921b6044820152606401610674565b600081815260036020819052604090912060048101549091116109c35760405162461bcd60e51b815260206004820152600d60248201526c1b9bc8195b5c1d1e481cdb1bdd609a1b6044820152606401610674565b4261384082600201546109d6919061160c565b1115610a105760405162461bcd60e51b81526020600482015260096024820152686e6f7420726561647960b81b6044820152606401610674565b610a1a338361102b565b6001600160a01b0386166000908152600560205260409020805460ff1916600117905596503415610a5857610a586001600160a01b038416346111d8565b5050505050509392505050565b6000546001600160a01b03163314610a8f5760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314610add5760405162461bcd60e51b81526004016106749061161f565b610af16001600160a01b03841683836112a1565b505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b405760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038316610b965760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220696e76616c6964206164647265737300000000000000006044820152606401610674565b81600003610bdc5760405162461bcd60e51b81526020600482015260136024820152723737ba3434b733903a37903a3930b739b332b960691b6044820152606401610674565b6001600160a01b0384166000908152600260205260409020548214610c135760405162461bcd60e51b81526004016106749061161f565b6000828152600460205260409020544211610c555760405162461bcd60e51b815260206004820152600260248201526118d960f21b6044820152606401610674565b60008281526003602090815260408083206001600160a01b038716845260029092529091205415610cb35760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b80546001600160a01b0319166001600160a01b038581169182178355600091825260026020526040808320869055908716825281205560018082015461ea6091610cfd919061160c565b610d079190611642565b610d11904261160c565b60008481526004602052604090205550600190509392505050565b600080546001600160a01b0316331480610d5557503360009081526007602052604090205460ff165b610d715760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03821660009081526002602052604090205415610dc25760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b61062f82600161102b565b6000546001600160a01b03163314610df75760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038116610e445760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610674565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6000546001600160a01b03163314610ec25760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60405161190160f01b60208201527f0000000000000000000000000000000000000000000000000000000000000000602282015260428101829052600090606201604051602081830303815290604052805190602001209050919050565b600081516041036110225760208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610f92576000935050505061062f565b8060ff16601b14158015610faa57508060ff16601c14155b15610fbb576000935050505061062f565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561100e573d6000803e3d6000fd5b50505060206040510351935050505061062f565b50600092915050565b60006001600160a01b0383166110835760405162461bcd60e51b815260206004820152601960248201527f6e6577206167656e7420696e76616c69642061646472657373000000000000006044820152606401610674565b60016000815461109290611659565b91829055506001600160a01b038416600081815260026020908152604080832085905586835260038252808320858452908320600482018054600181810183559186529390942090920185905581546001600160a01b03191690931781558183015493945091926111029161160c565b600182015542600282015560038101849055604051630f632fd360e01b81526001600160a01b038681166004830152602482018590527f00000000000000000000000000000000000000000000000000000000000000001690630f632fd390604401600060405180830381600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b50505050837fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d1846040516111c891815260200190565b60405180910390a2505092915050565b604080516000808252602082019092526001600160a01b0384169083906040516112029190611672565b60006040518083038185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b5050905080610af15760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608401610674565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916112fd9190611672565b6000604051808303816000865af19150503d806000811461133a576040519150601f19603f3d011682016040523d82523d6000602084013e61133f565b606091505b509150915081801561136957508051158061136957508080602001905181019061136991906116a1565b6113b55760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610674565b5050505050565b80356001600160a01b03811681146113d357600080fd5b919050565b6000602082840312156113ea57600080fd5b6113f3826113bc565b9392505050565b60006020828403121561140c57600080fd5b5035919050565b6001600160a01b03861681526020808201869052604082018590526060820184905260a06080830181905283519083018190526000918481019160c0850190845b8181101561147057845183529383019391830191600101611454565b50909a9950505050505050505050565b6000806040838503121561149357600080fd5b61149c836113bc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126114d157600080fd5b813567ffffffffffffffff808211156114ec576114ec6114aa565b604051601f8301601f19908116603f01168101908282118183101715611514576115146114aa565b8160405283815286602085880101111561152d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561156257600080fd5b833567ffffffffffffffff8082111561157a57600080fd5b611586878388016114c0565b9450602086013591508082111561159c57600080fd5b506115a9868287016114c0565b925050604084013590509250925092565b6000806000606084860312156115cf57600080fd5b6115d8846113bc565b92506115e6602085016113bc565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062f5761062f6115f6565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b808202811582820484141761062f5761062f6115f6565b60006001820161166b5761166b6115f6565b5060010190565b6000825160005b818110156116935760208186018101518583015201611679565b506000920191825250919050565b6000602082840312156116b357600080fd5b815180151581146113f357600080fdfea2646970667358221220644deea1d2a00dc7cc75a0d5ad48fe9bdaf52954ca1e4aad4e88c1dbbebad08464736f6c6343000811003360a060405234801561001057600080fd5b5060405161195938038061195983398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516118a46100b5600039600081816101ee01528181610438015281816104b50152818161057f01528181610623015281816108e80152610ab101526118a46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb46514610268578063b88d4fde1461027b578063c87b56dd1461028e578063e985e9c5146102a157600080fd5b806342842e0e146102105780636352211e1461022357806370a082311461023657806395d89b411461024957600080fd5b80630f632fd3116100d35780630f632fd3146101ad57806318160ddd146101c057806323b872dd146101d65780633b91ee26146101e957600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610157578063095ea7b314610198575b600080fd5b610118610113366004610f44565b6102cf565b60405190151581526020015b60405180910390f35b6040805180820190915260058152641059d95b9d60da1b60208201525b6040516101249190610fb8565b610180610165366004610fcb565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610124565b6101ab6101a6366004610ff9565b610321565b005b6101ab6101bb366004610ff9565b61042d565b6101c86104b1565b604051908152602001610124565b6101ab6101e4366004611025565b61053a565b6101807f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61021e366004611025565b61054b565b610180610231366004610fcb565b610566565b6101c8610244366004611066565b610601565b60408051808201909152600381526244414760e81b602082015261014a565b6101ab610276366004611091565b6106a8565b6101ab610289366004611111565b61075c565b61014a61029c366004610fcb565b6108de565b6101186102af3660046111d5565b600160209081526000928352604080842090915290825290205460ff1681565b60006001600160e01b031982166301ffc9a760e01b148061030057506001600160e01b031982166380ac58cd60e01b145b8061031b57506001600160e01b03198216635b5e139f60e01b145b92915050565b600061032c82610566565b90506001600160a01b03811661037b5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b60448201526064015b60405180910390fd5b6001600160a01b0381163314806103b557506001600160a01b038116600090815260016020908152604080832033845290915290205460ff165b6103d15760405162461bcd60e51b815260040161037290611203565b60008281526020819052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104755760405162461bcd60e51b815260040161037290611203565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105359190611226565b905090565b610546838383336109e2565b505050565b6105468383836040518060200160405280600081525061075c565b604051632de5aaf760e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632de5aaf790602401600060405180830381865afa1580156105ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f6919081019061123f565b509295945050505050565b604051632a5ccc1f60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632a5ccc1f90602401602060405180830381865afa15801561066c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106909190611226565b1561069c57600161069f565b60005b60ff1692915050565b336001600160a01b038316036106f05760405162461bcd60e51b815260206004820152600d60248201526c1cd95b1988185c1c1c9bdd985b609a1b6044820152606401610372565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610768848484336109e2565b823b156108d857604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906107a1903390889087908790600401611319565b6020604051808303816000875af19250505080156107dc575060408051601f3d908101601f191682019092526107d99181019061134c565b60015b610884573d80801561080a576040519150601f19603f3d011682016040523d82523d6000602084013e61080f565b606091505b50805160000361087c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610372565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146108d65760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610372565b505b50505050565b60606000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632de5aaf7876040518263ffffffff1660e01b815260040161093491815260200190565b600060405180830381865afa158015610951573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610979919081019061123f565b50929650909450925090506001600160a01b0384166109cc5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b6044820152606401610372565b6109d886828585610b81565b9695505050505050565b806001600160a01b0316846001600160a01b03161480610a2757506001600160a01b0380851660009081526001602090815260408083209385168352929052205460ff165b80610a4b57506000828152602081905260409020546001600160a01b038281169116145b610a675760405162461bcd60e51b815260040161037290611203565b6000828152602081905260409081902080546001600160a01b0319169055516317d5759960e31b81526001600160a01b0385811660048301528481166024830152604482018490527f0000000000000000000000000000000000000000000000000000000000000000169063beabacc8906064016020604051808303816000875af1158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190611369565b610b3a5760405162461bcd60e51b815260040161037290611203565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b606060405180610120016040528060fd815260200161173260fd9139905080610ba986610cb8565b604051602001610bba929190611386565b604051602081830303815290604052905080610bd585610cb8565b604051602001610be6929190611402565b604051602081830303815290604052905080610c0184610cb8565b604051602001610c12929190611480565b604051602081830303815290604052905080610c2d83610cb8565b604051602001610c3e929190611501565b60405160208183030381529060405290506000610c8b610c5d87610cb8565b610c6684610dc1565b604051602001610c77929190611567565b604051602081830303815290604052610dc1565b905080604051602001610c9e919061162c565b604051602081830303815290604052915050949350505050565b606081600003610cdf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610d095780610cf381611687565b9150610d029050600a836116b6565b9150610ce3565b60008167ffffffffffffffff811115610d2457610d246110ca565b6040519080825280601f01601f191660200182016040528015610d4e576020820181803683370190505b5090505b8415610db957610d636001836116ca565b9150610d70600a866116dd565b610d7b9060306116f1565b60f81b818381518110610d9057610d90611704565b60200101906001600160f81b031916908160001a905350610db2600a866116b6565b9450610d52565b949350505050565b80516060906000819003610de5575050604080516020810190915260008152919050565b60006003610df48360026116f1565b610dfe91906116b6565b610e0990600461171a565b90506000610e188260206116f1565b67ffffffffffffffff811115610e3057610e306110ca565b6040519080825280601f01601f191660200182016040528015610e5a576020820181803683370190505b509050600060405180606001604052806040815260200161182f604091399050600181016020830160005b86811015610ee6576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101610e85565b506003860660018114610f005760028114610f1157610f1d565b613d3d60f01b600119830152610f1d565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981168114610f4157600080fd5b50565b600060208284031215610f5657600080fd5b8135610f6181610f2b565b9392505050565b60005b83811015610f83578181015183820152602001610f6b565b50506000910152565b60008151808452610fa4816020860160208601610f68565b601f01601f19169290920160200192915050565b602081526000610f616020830184610f8c565b600060208284031215610fdd57600080fd5b5035919050565b6001600160a01b0381168114610f4157600080fd5b6000806040838503121561100c57600080fd5b823561101781610fe4565b946020939093013593505050565b60008060006060848603121561103a57600080fd5b833561104581610fe4565b9250602084013561105581610fe4565b929592945050506040919091013590565b60006020828403121561107857600080fd5b8135610f6181610fe4565b8015158114610f4157600080fd5b600080604083850312156110a457600080fd5b82356110af81610fe4565b915060208301356110bf81611083565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611109576111096110ca565b604052919050565b6000806000806080858703121561112757600080fd5b843561113281610fe4565b935060208581013561114381610fe4565b935060408601359250606086013567ffffffffffffffff8082111561116757600080fd5b818801915088601f83011261117b57600080fd5b81358181111561118d5761118d6110ca565b61119f601f8201601f191685016110e0565b915080825289848285010111156111b557600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156111e857600080fd5b82356111f381610fe4565b915060208301356110bf81610fe4565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b60006020828403121561123857600080fd5b5051919050565b600080600080600060a0868803121561125757600080fd5b855161126281610fe4565b8095505060208087015194506040870151935060608701519250608087015167ffffffffffffffff8082111561129757600080fd5b818901915089601f8301126112ab57600080fd5b8151818111156112bd576112bd6110ca565b8060051b91506112ce8483016110e0565b818152918301840191848101908c8411156112e857600080fd5b938501935b83851015611306578451825293850193908501906112ed565b8096505050505050509295509295909350565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906109d890830184610f8c565b60006020828403121561135e57600080fd5b8151610f6181610f2b565b60006020828403121561137b57600080fd5b8151610f6181611083565b60008351611398818460208801610f68565b6503a37b5b2b7160d51b90830190815283516113bb816006840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b60008351611414818460208801610f68565b6703932b332b932b9160c51b9083019081528351611439816008840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c61737360089290910191820152671e913130b9b2911f60c11b6028820152603001949350505050565b60008351611492818460208801610f68565b6a030b3b2b73a2fba34b2b9160ad1b90830190815283516114ba81600b840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b60008351611513818460208801610f68565b7003a34b6b2afb7b32fb1b932b0ba34b7b71607d1b9083019081528351611541816011840160208801610f68565b6c1e17ba32bc3a1f1e17b9bb339f60991b60119290910191820152601e01949350505050565b707b226e616d65223a20224167656e74202360781b81528251600090611594816011850160208801610f68565b7f222c20226465736372697074696f6e223a20224479736f6e2046696e616e63656011918401918201527f204167656e74204e4654222c2022696d616765223a2022646174613a696d6167603182015270194bdcdd99cade1b5b0ed8985cd94d8d0b607a1b60518201528351611611816062840160208801610f68565b61227d60f01b60629290910191820152606401949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161166481601d850160208701610f68565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b60006001820161169957611699611671565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116c5576116c56116a0565b500490565b8181038181111561031b5761031b611671565b6000826116ec576116ec6116a0565b500690565b8082018082111561031b5761031b611671565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761031b5761031b61167156fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212209197ff7a0698aa896f8e5b6cb4742fad9ba259645c55cb3cb02df5dc1732fa6364736f6c634300081100330000000000000000000000009c1da1ea058a2aa38689703b3ca78eab10552101000000000000000000000000f2fa0dc08a0e188bf44fae321b75dab640345720

Deployed Bytecode

0x6080604052600436106101355760003560e01c80639cd754ba116100ab578063beabacc81161006f578063beabacc814610445578063d2cfa35614610465578063f269c59514610499578063f2fde38b146104b9578063f6a74ed7146104d9578063ff10b580146104f957600080fd5b80639cd754ba14610378578063a1a9b91d146103a8578063a7fc7a07146103d5578063b2118a8d146103f5578063b429afeb1461041557600080fd5b80633fd773e9116100fd5780633fd773e91461026c57806377800c2f146102b8578063799cd333146103035780638da5cb5b146103255780639aae3be3146103455780639b4be7821461036557600080fd5b806318160ddd1461013a5780631959a002146101635780632a5ccc1f146101da5780632de5aaf7146102075780633644e51514610238575b600080fd5b34801561014657600080fd5b5061015060015481565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b506101bb61017e3660046113d8565b6001600160a01b03908116600090815260026020908152604080832054835260039182905280832091820154835290912054600190910154911691565b604080516001600160a01b03909316835260208301919091520161015a565b3480156101e657600080fd5b506101506101f53660046113d8565b60026020526000908152604090205481565b34801561021357600080fd5b506102276102223660046113fa565b61052d565b60405161015a959493929190611413565b34801561024457600080fd5b506101507faf78d8e4091ce32aff74875665ed5f83c35da336e9e06b23ee06cc9ff90f665d81565b34801561027857600080fd5b506102a07f000000000000000000000000d7cde8aa87bc5af7a2de2ecbf0f5862e1880bc4081565b6040516001600160a01b03909116815260200161015a565b3480156102c457600080fd5b506102f36102d3366004611480565b600660209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161015a565b34801561030f57600080fd5b5061032361031e3660046113fa565b6105cb565b005b34801561033157600080fd5b506000546102a0906001600160a01b031681565b34801561035157600080fd5b506101506103603660046113fa565b610624565b61015061037336600461154d565b610635565b34801561038457600080fd5b506102f36103933660046113d8565b60056020526000908152604090205460ff1681565b3480156103b457600080fd5b506101506103c33660046113fa565b60046020526000908152604090205481565b3480156103e157600080fd5b506103236103f03660046113d8565b610a65565b34801561040157600080fd5b506103236104103660046115ba565b610ab3565b34801561042157600080fd5b506102f36104303660046113d8565b60076020526000908152604090205460ff1681565b34801561045157600080fd5b506102f36104603660046115ba565b610af6565b34801561047157600080fd5b506101507f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e81565b3480156104a557600080fd5b506101506104b43660046113d8565b610d2c565b3480156104c557600080fd5b506103236104d43660046113d8565b610dcd565b3480156104e557600080fd5b506103236104f43660046113d8565b610e98565b34801561050557600080fd5b506101507f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b081565b600081815260036020818152604080842080546001820154600283015495830154600484018054865181890281018901909752808752899889988998606098976001600160a01b031696959294929390918391908301828280156105b057602002820191906000526020600020905b81548152602001906001019080831161059c575b50505050509050955095509550955095505091939590929450565b336000818152600660209081526040808320858452825291829020805460ff1916600117905590518381527f80aefaab1c400a701ea2159849b146231d2c7be9b71f2b885ea50e55a64667c6910160405180910390a250565b600061062f82610ee3565b92915050565b600081421061067d5760405162461bcd60e51b815260206004820152600f60248201526e65786365656420646561646c696e6560881b60448201526064015b60405180910390fd5b33600090815260026020526040902054156106cf5760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b6044820152606401610674565b604080517f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e60208201523391810191909152600090610727906060015b60405160208183030381529060405280519060200120610ee3565b905060006107358286610f41565b90506001600160a01b0381166107805760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206f6e63652073696760801b6044820152606401610674565b6001600160a01b03811660009081526005602052604090205460ff16156107dd5760405162461bcd60e51b81526020600482015260116024820152701cda59db985d1d5c99481a5cc81d5cd959607a1b6044820152606401610674565b604080517f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b060208201526001600160a01b03831691810191909152606081018590523460808201526000906108349060a00161070c565b9050600087516041036108525761084b8289610f41565b90506108c9565b87516014036108c9575060148701516001600160a01b038116600090815260066020908152604080832085845290915290205460ff166108c95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166109145760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166000908152600260205260408120549081900361096e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081c185c995b9d60921b6044820152606401610674565b600081815260036020819052604090912060048101549091116109c35760405162461bcd60e51b815260206004820152600d60248201526c1b9bc8195b5c1d1e481cdb1bdd609a1b6044820152606401610674565b4261384082600201546109d6919061160c565b1115610a105760405162461bcd60e51b81526020600482015260096024820152686e6f7420726561647960b81b6044820152606401610674565b610a1a338361102b565b6001600160a01b0386166000908152600560205260409020805460ff1916600117905596503415610a5857610a586001600160a01b038416346111d8565b5050505050509392505050565b6000546001600160a01b03163314610a8f5760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314610add5760405162461bcd60e51b81526004016106749061161f565b610af16001600160a01b03841683836112a1565b505050565b6000336001600160a01b037f000000000000000000000000d7cde8aa87bc5af7a2de2ecbf0f5862e1880bc401614610b405760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038316610b965760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220696e76616c6964206164647265737300000000000000006044820152606401610674565b81600003610bdc5760405162461bcd60e51b81526020600482015260136024820152723737ba3434b733903a37903a3930b739b332b960691b6044820152606401610674565b6001600160a01b0384166000908152600260205260409020548214610c135760405162461bcd60e51b81526004016106749061161f565b6000828152600460205260409020544211610c555760405162461bcd60e51b815260206004820152600260248201526118d960f21b6044820152606401610674565b60008281526003602090815260408083206001600160a01b038716845260029092529091205415610cb35760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b80546001600160a01b0319166001600160a01b038581169182178355600091825260026020526040808320869055908716825281205560018082015461ea6091610cfd919061160c565b610d079190611642565b610d11904261160c565b60008481526004602052604090205550600190509392505050565b600080546001600160a01b0316331480610d5557503360009081526007602052604090205460ff165b610d715760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03821660009081526002602052604090205415610dc25760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b61062f82600161102b565b6000546001600160a01b03163314610df75760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038116610e445760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610674565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6000546001600160a01b03163314610ec25760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60405161190160f01b60208201527faf78d8e4091ce32aff74875665ed5f83c35da336e9e06b23ee06cc9ff90f665d602282015260428101829052600090606201604051602081830303815290604052805190602001209050919050565b600081516041036110225760208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610f92576000935050505061062f565b8060ff16601b14158015610faa57508060ff16601c14155b15610fbb576000935050505061062f565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561100e573d6000803e3d6000fd5b50505060206040510351935050505061062f565b50600092915050565b60006001600160a01b0383166110835760405162461bcd60e51b815260206004820152601960248201527f6e6577206167656e7420696e76616c69642061646472657373000000000000006044820152606401610674565b60016000815461109290611659565b91829055506001600160a01b038416600081815260026020908152604080832085905586835260038252808320858452908320600482018054600181810183559186529390942090920185905581546001600160a01b03191690931781558183015493945091926111029161160c565b600182015542600282015560038101849055604051630f632fd360e01b81526001600160a01b038681166004830152602482018590527f000000000000000000000000d7cde8aa87bc5af7a2de2ecbf0f5862e1880bc401690630f632fd390604401600060405180830381600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b50505050837fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d1846040516111c891815260200190565b60405180910390a2505092915050565b604080516000808252602082019092526001600160a01b0384169083906040516112029190611672565b60006040518083038185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b5050905080610af15760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608401610674565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916112fd9190611672565b6000604051808303816000865af19150503d806000811461133a576040519150601f19603f3d011682016040523d82523d6000602084013e61133f565b606091505b509150915081801561136957508051158061136957508080602001905181019061136991906116a1565b6113b55760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610674565b5050505050565b80356001600160a01b03811681146113d357600080fd5b919050565b6000602082840312156113ea57600080fd5b6113f3826113bc565b9392505050565b60006020828403121561140c57600080fd5b5035919050565b6001600160a01b03861681526020808201869052604082018590526060820184905260a06080830181905283519083018190526000918481019160c0850190845b8181101561147057845183529383019391830191600101611454565b50909a9950505050505050505050565b6000806040838503121561149357600080fd5b61149c836113bc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126114d157600080fd5b813567ffffffffffffffff808211156114ec576114ec6114aa565b604051601f8301601f19908116603f01168101908282118183101715611514576115146114aa565b8160405283815286602085880101111561152d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561156257600080fd5b833567ffffffffffffffff8082111561157a57600080fd5b611586878388016114c0565b9450602086013591508082111561159c57600080fd5b506115a9868287016114c0565b925050604084013590509250925092565b6000806000606084860312156115cf57600080fd5b6115d8846113bc565b92506115e6602085016113bc565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062f5761062f6115f6565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b808202811582820484141761062f5761062f6115f6565b60006001820161166b5761166b6115f6565b5060010190565b6000825160005b818110156116935760208186018101518583015201611679565b506000920191825250919050565b6000602082840312156116b357600080fd5b815180151581146113f357600080fdfea2646970667358221220644deea1d2a00dc7cc75a0d5ad48fe9bdaf52954ca1e4aad4e88c1dbbebad08464736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000009c1da1ea058a2aa38689703b3ca78eab10552101000000000000000000000000f2fa0dc08a0e188bf44fae321b75dab640345720

-----Decoded View---------------
Arg [0] : _owner (address): 0x9C1Da1Ea058A2AA38689703B3CA78Eab10552101
Arg [1] : root (address): 0xf2fa0dC08a0e188bf44FaE321B75Dab640345720

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c1da1ea058a2aa38689703b3ca78eab10552101
Arg [1] : 000000000000000000000000f2fa0dc08a0e188bf44fae321b75dab640345720


Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.