ETH Price: $2,868.11 (-2.49%)

Contract

0x3a666DbA5DDE8dAABFaAf2A931ac41f55f1Ac6b4

Overview

ETH Balance

Linea Mainnet LogoLinea Mainnet LogoLinea Mainnet Logo0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Register185046712025-04-29 8:39:30271 days ago1745915970IN
Dyson Finance: Agency
0 ETH0.000001220.0481548
Register185046712025-04-29 8:39:30271 days ago1745915970IN
Dyson Finance: Agency
0 ETH0.000001210.04789217
Register181228202025-04-17 10:32:57283 days ago1744885977IN
Dyson Finance: Agency
0 ETH0.000049690.23375203
Register181223482025-04-17 10:14:08283 days ago1744884848IN
Dyson Finance: Agency
0 ETH0.000020960.09130853
Register157247892025-02-12 7:20:00347 days ago1739344800IN
Dyson Finance: Agency
0 ETH0.000002020.08001388
Register157247892025-02-12 7:20:00347 days ago1739344800IN
Dyson Finance: Agency
0 ETH0.000001950.07695763
Register157247892025-02-12 7:20:00347 days ago1739344800IN
Dyson Finance: Agency
0 ETH0.000004050.16
Register157247892025-02-12 7:20:00347 days ago1739344800IN
Dyson Finance: Agency
0 ETH0.000002080.08226479
Register154147662025-02-04 10:15:55355 days ago1738664155IN
Dyson Finance: Agency
0 ETH0.000004260.168
Register154147662025-02-04 10:15:55355 days ago1738664155IN
Dyson Finance: Agency
0 ETH0.000002970.11734212
Register154147662025-02-04 10:15:55355 days ago1738664155IN
Dyson Finance: Agency
0 ETH0.000002360.09301062
Register154147662025-02-04 10:15:55355 days ago1738664155IN
Dyson Finance: Agency
0 ETH0.000001980.0782305
Register154147662025-02-04 10:15:55355 days ago1738664155IN
Dyson Finance: Agency
0 ETH0.000002160.08529095
Register154087832025-02-04 6:47:46355 days ago1738651666IN
Dyson Finance: Agency
0 ETH0.000002760.10907468
Register150190362025-01-25 11:14:30365 days ago1737803670IN
Dyson Finance: Agency
0 ETH0.000010350.04509675
Register149722932025-01-24 6:44:30366 days ago1737701070IN
Dyson Finance: Agency
0 ETH0.000011540.05433671
Register148791522025-01-21 22:44:02369 days ago1737499442IN
Dyson Finance: Agency
0 ETH0.000075130.35347632
Register148286162025-01-20 17:27:36370 days ago1737394056IN
Dyson Finance: Agency
0 ETH0.000024850.10822854
Register147826812025-01-19 15:00:37371 days ago1737298837IN
Dyson Finance: Agency
0 ETH0.000014440.06797924
Register146885492025-01-17 7:16:49373 days ago1737098209IN
Dyson Finance: Agency
0 ETH0.000009690.04559556
Register146873672025-01-17 6:36:19373 days ago1737095779IN
Dyson Finance: Agency
0 ETH0.00001060.0461883
Register146589452025-01-16 13:18:21374 days ago1737033501IN
Dyson Finance: Agency
0 ETH0.000020640.09713798
Register146520912025-01-16 9:23:27374 days ago1737019407IN
Dyson Finance: Agency
0 ETH0.000010130.04768205
Register146505382025-01-16 8:31:18374 days ago1737016278IN
Dyson Finance: Agency
0 ETH0.000010330.04501383
Register146355732025-01-15 23:50:06375 days ago1736985006IN
Dyson Finance: Agency
0 ETH0.000013790.06005144
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
283187352026-01-26 3:03:501 hr ago1769396630
Dyson Finance: Agency
0 ETH
283187262026-01-26 3:03:281 hr ago1769396608
Dyson Finance: Agency
0 ETH
283187182026-01-26 3:03:101 hr ago1769396590
Dyson Finance: Agency
0 ETH
283187082026-01-26 3:02:461 hr ago1769396566
Dyson Finance: Agency
0 ETH
283187002026-01-26 3:02:281 hr ago1769396548
Dyson Finance: Agency
0 ETH
282874642026-01-25 6:52:1221 hrs ago1769323932
Dyson Finance: Agency
0 ETH
282811632026-01-25 2:57:2625 hrs ago1769309846
Dyson Finance: Agency
0 ETH
282811542026-01-25 2:57:0425 hrs ago1769309824
Dyson Finance: Agency
0 ETH
282811452026-01-25 2:56:4425 hrs ago1769309804
Dyson Finance: Agency
0 ETH
282811052026-01-25 2:55:1825 hrs ago1769309718
Dyson Finance: Agency
0 ETH
282810922026-01-25 2:54:5225 hrs ago1769309692
Dyson Finance: Agency
0 ETH
282696292026-01-24 19:28:5232 hrs ago1769282932
Dyson Finance: Agency
0 ETH
282435442026-01-24 2:53:402 days ago1769223220
Dyson Finance: Agency
0 ETH
282435282026-01-24 2:53:082 days ago1769223188
Dyson Finance: Agency
0 ETH
282435172026-01-24 2:52:462 days ago1769223166
Dyson Finance: Agency
0 ETH
282435062026-01-24 2:52:242 days ago1769223144
Dyson Finance: Agency
0 ETH
282434982026-01-24 2:52:042 days ago1769223124
Dyson Finance: Agency
0 ETH
282306602026-01-23 18:45:422 days ago1769193942
Dyson Finance: Agency
0 ETH
282226692026-01-23 13:53:262 days ago1769176406
Dyson Finance: Agency
0 ETH
282226692026-01-23 13:53:262 days ago1769176406
Dyson Finance: Agency
0 ETH
281990292026-01-22 23:50:503 days ago1769125850
Dyson Finance: Agency
0 ETH
281990112026-01-22 23:50:123 days ago1769125812
Dyson Finance: Agency
0 ETH
281990112026-01-22 23:50:123 days ago1769125812
Dyson Finance: Agency
0 ETH
281989802026-01-22 23:49:083 days ago1769125748
Dyson Finance: Agency
0 ETH
281989612026-01-22 23:48:303 days ago1769125710
Dyson Finance: Agency
0 ETH
View All Internal Transactions
Cross-Chain Transactions
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:
london EvmVersion
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);
        }
    }

}

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))
                    }
                }
            }
        }
    }

}

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');
    }
}

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);
}

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/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",
  "viaIR": false,
  "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"}]

60c06040523480156200001157600080fd5b50604051620033d9380380620033d98339810160408190526200003491620002ec565b6001600160a01b0382166200007f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b21037bbb732b960991b604482015260640160405180910390fd5b60408051808201825260068152654167656e637960d01b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f79fb09ff8fc931b2f8af592256baf63d59828833262a9c6d6966b00d0137a64a918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f1901815290829052805160209091012060a052600080546001600160a01b0319166001600160a01b0385161781559030906200017c90620002c1565b6001600160a01b039091168152602001604051809103906000f080158015620001a9573d6000803e3d6000fd5b506001600160a01b038116608052600180549192506000918290620001ce9062000324565b91829055506001600160a01b0384811660008181526002602081815260408084208790558684526003918290529283902080546001600160a01b03191685178155429281019290925581018590559051630f632fd360e01b815260048101929092526024820184905292935090841690630f632fd390604401600060405180830381600087803b1580156200026257600080fd5b505af115801562000277573d6000803e3d6000fd5b50505050817fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d183604051620002ae91815260200190565b60405180910390a250505050506200034c565b6119598062001a8083390190565b80516001600160a01b0381168114620002e757600080fd5b919050565b600080604083850312156200030057600080fd5b6200030b83620002cf565b91506200031b60208401620002cf565b90509250929050565b6000600182016200034557634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a0516116f9620003876000396000818161024a0152610ef301526000818161027e01528181610b03015261113a01526116f96000f3fe6080604052600436106101355760003560e01c80639cd754ba116100ab578063beabacc81161006f578063beabacc814610445578063d2cfa35614610465578063f269c59514610499578063f2fde38b146104b9578063f6a74ed7146104d9578063ff10b580146104f957600080fd5b80639cd754ba14610378578063a1a9b91d146103a8578063a7fc7a07146103d5578063b2118a8d146103f5578063b429afeb1461041557600080fd5b80633fd773e9116100fd5780633fd773e91461026c57806377800c2f146102b8578063799cd333146103035780638da5cb5b146103255780639aae3be3146103455780639b4be7821461036557600080fd5b806318160ddd1461013a5780631959a002146101635780632a5ccc1f146101da5780632de5aaf7146102075780633644e51514610238575b600080fd5b34801561014657600080fd5b5061015060015481565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b506101bb61017e3660046113d8565b6001600160a01b03908116600090815260026020908152604080832054835260039182905280832091820154835290912054600190910154911691565b604080516001600160a01b03909316835260208301919091520161015a565b3480156101e657600080fd5b506101506101f53660046113d8565b60026020526000908152604090205481565b34801561021357600080fd5b506102276102223660046113fa565b61052d565b60405161015a959493929190611413565b34801561024457600080fd5b506101507f000000000000000000000000000000000000000000000000000000000000000081565b34801561027857600080fd5b506102a07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b3480156102c457600080fd5b506102f36102d3366004611480565b600660209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161015a565b34801561030f57600080fd5b5061032361031e3660046113fa565b6105cb565b005b34801561033157600080fd5b506000546102a0906001600160a01b031681565b34801561035157600080fd5b506101506103603660046113fa565b610624565b61015061037336600461154d565b610635565b34801561038457600080fd5b506102f36103933660046113d8565b60056020526000908152604090205460ff1681565b3480156103b457600080fd5b506101506103c33660046113fa565b60046020526000908152604090205481565b3480156103e157600080fd5b506103236103f03660046113d8565b610a65565b34801561040157600080fd5b506103236104103660046115ba565b610ab3565b34801561042157600080fd5b506102f36104303660046113d8565b60076020526000908152604090205460ff1681565b34801561045157600080fd5b506102f36104603660046115ba565b610af6565b34801561047157600080fd5b506101507f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e81565b3480156104a557600080fd5b506101506104b43660046113d8565b610d2c565b3480156104c557600080fd5b506103236104d43660046113d8565b610dcd565b3480156104e557600080fd5b506103236104f43660046113d8565b610e98565b34801561050557600080fd5b506101507f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b081565b600081815260036020818152604080842080546001820154600283015495830154600484018054865181890281018901909752808752899889988998606098976001600160a01b031696959294929390918391908301828280156105b057602002820191906000526020600020905b81548152602001906001019080831161059c575b50505050509050955095509550955095505091939590929450565b336000818152600660209081526040808320858452825291829020805460ff1916600117905590518381527f80aefaab1c400a701ea2159849b146231d2c7be9b71f2b885ea50e55a64667c6910160405180910390a250565b600061062f82610ee3565b92915050565b600081421061067d5760405162461bcd60e51b815260206004820152600f60248201526e65786365656420646561646c696e6560881b60448201526064015b60405180910390fd5b33600090815260026020526040902054156106cf5760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b6044820152606401610674565b604080517f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e60208201523391810191909152600090610727906060015b60405160208183030381529060405280519060200120610ee3565b905060006107358286610f41565b90506001600160a01b0381166107805760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206f6e63652073696760801b6044820152606401610674565b6001600160a01b03811660009081526005602052604090205460ff16156107dd5760405162461bcd60e51b81526020600482015260116024820152701cda59db985d1d5c99481a5cc81d5cd959607a1b6044820152606401610674565b604080517f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b060208201526001600160a01b03831691810191909152606081018590523460808201526000906108349060a00161070c565b9050600087516041036108525761084b8289610f41565b90506108c9565b87516014036108c9575060148701516001600160a01b038116600090815260066020908152604080832085845290915290205460ff166108c95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166109145760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166000908152600260205260408120549081900361096e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081c185c995b9d60921b6044820152606401610674565b600081815260036020819052604090912060048101549091116109c35760405162461bcd60e51b815260206004820152600d60248201526c1b9bc8195b5c1d1e481cdb1bdd609a1b6044820152606401610674565b4261384082600201546109d6919061160c565b1115610a105760405162461bcd60e51b81526020600482015260096024820152686e6f7420726561647960b81b6044820152606401610674565b610a1a338361102b565b6001600160a01b0386166000908152600560205260409020805460ff1916600117905596503415610a5857610a586001600160a01b038416346111d8565b5050505050509392505050565b6000546001600160a01b03163314610a8f5760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314610add5760405162461bcd60e51b81526004016106749061161f565b610af16001600160a01b03841683836112a1565b505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b405760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038316610b965760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220696e76616c6964206164647265737300000000000000006044820152606401610674565b81600003610bdc5760405162461bcd60e51b81526020600482015260136024820152723737ba3434b733903a37903a3930b739b332b960691b6044820152606401610674565b6001600160a01b0384166000908152600260205260409020548214610c135760405162461bcd60e51b81526004016106749061161f565b6000828152600460205260409020544211610c555760405162461bcd60e51b815260206004820152600260248201526118d960f21b6044820152606401610674565b60008281526003602090815260408083206001600160a01b038716845260029092529091205415610cb35760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b80546001600160a01b0319166001600160a01b038581169182178355600091825260026020526040808320869055908716825281205560018082015461ea6091610cfd919061160c565b610d079190611642565b610d11904261160c565b60008481526004602052604090205550600190509392505050565b600080546001600160a01b0316331480610d5557503360009081526007602052604090205460ff165b610d715760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03821660009081526002602052604090205415610dc25760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b61062f82600161102b565b6000546001600160a01b03163314610df75760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038116610e445760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610674565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6000546001600160a01b03163314610ec25760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60405161190160f01b60208201527f0000000000000000000000000000000000000000000000000000000000000000602282015260428101829052600090606201604051602081830303815290604052805190602001209050919050565b600081516041036110225760208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610f92576000935050505061062f565b8060ff16601b14158015610faa57508060ff16601c14155b15610fbb576000935050505061062f565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561100e573d6000803e3d6000fd5b50505060206040510351935050505061062f565b50600092915050565b60006001600160a01b0383166110835760405162461bcd60e51b815260206004820152601960248201527f6e6577206167656e7420696e76616c69642061646472657373000000000000006044820152606401610674565b60016000815461109290611659565b91829055506001600160a01b038416600081815260026020908152604080832085905586835260038252808320858452908320600482018054600181810183559186529390942090920185905581546001600160a01b03191690931781558183015493945091926111029161160c565b600182015542600282015560038101849055604051630f632fd360e01b81526001600160a01b038681166004830152602482018590527f00000000000000000000000000000000000000000000000000000000000000001690630f632fd390604401600060405180830381600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b50505050837fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d1846040516111c891815260200190565b60405180910390a2505092915050565b604080516000808252602082019092526001600160a01b0384169083906040516112029190611672565b60006040518083038185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b5050905080610af15760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608401610674565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916112fd9190611672565b6000604051808303816000865af19150503d806000811461133a576040519150601f19603f3d011682016040523d82523d6000602084013e61133f565b606091505b509150915081801561136957508051158061136957508080602001905181019061136991906116a1565b6113b55760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610674565b5050505050565b80356001600160a01b03811681146113d357600080fd5b919050565b6000602082840312156113ea57600080fd5b6113f3826113bc565b9392505050565b60006020828403121561140c57600080fd5b5035919050565b6001600160a01b03861681526020808201869052604082018590526060820184905260a06080830181905283519083018190526000918481019160c0850190845b8181101561147057845183529383019391830191600101611454565b50909a9950505050505050505050565b6000806040838503121561149357600080fd5b61149c836113bc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126114d157600080fd5b813567ffffffffffffffff808211156114ec576114ec6114aa565b604051601f8301601f19908116603f01168101908282118183101715611514576115146114aa565b8160405283815286602085880101111561152d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561156257600080fd5b833567ffffffffffffffff8082111561157a57600080fd5b611586878388016114c0565b9450602086013591508082111561159c57600080fd5b506115a9868287016114c0565b925050604084013590509250925092565b6000806000606084860312156115cf57600080fd5b6115d8846113bc565b92506115e6602085016113bc565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062f5761062f6115f6565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b808202811582820484141761062f5761062f6115f6565b60006001820161166b5761166b6115f6565b5060010190565b6000825160005b818110156116935760208186018101518583015201611679565b506000920191825250919050565b6000602082840312156116b357600080fd5b815180151581146113f357600080fdfea2646970667358221220bda6530bbff01d089c37a484d3917c5c2f18de17e3f4e1f5902347f2f745442364736f6c6343000811003360a060405234801561001057600080fd5b5060405161195938038061195983398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516118a46100b5600039600081816101ee01528181610438015281816104b50152818161057f01528181610623015281816108e80152610ab101526118a46000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c806342842e0e11610097578063a22cb46511610066578063a22cb46514610268578063b88d4fde1461027b578063c87b56dd1461028e578063e985e9c5146102a157600080fd5b806342842e0e146102105780636352211e1461022357806370a082311461023657806395d89b411461024957600080fd5b80630f632fd3116100d35780630f632fd3146101ad57806318160ddd146101c057806323b872dd146101d65780633b91ee26146101e957600080fd5b806301ffc9a71461010557806306fdde031461012d578063081812fc14610157578063095ea7b314610198575b600080fd5b610118610113366004610f44565b6102cf565b60405190151581526020015b60405180910390f35b6040805180820190915260058152641059d95b9d60da1b60208201525b6040516101249190610fb8565b610180610165366004610fcb565b6000602081905290815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610124565b6101ab6101a6366004610ff9565b610321565b005b6101ab6101bb366004610ff9565b61042d565b6101c86104b1565b604051908152602001610124565b6101ab6101e4366004611025565b61053a565b6101807f000000000000000000000000000000000000000000000000000000000000000081565b6101ab61021e366004611025565b61054b565b610180610231366004610fcb565b610566565b6101c8610244366004611066565b610601565b60408051808201909152600381526244414760e81b602082015261014a565b6101ab610276366004611091565b6106a8565b6101ab610289366004611111565b61075c565b61014a61029c366004610fcb565b6108de565b6101186102af3660046111d5565b600160209081526000928352604080842090915290825290205460ff1681565b60006001600160e01b031982166301ffc9a760e01b148061030057506001600160e01b031982166380ac58cd60e01b145b8061031b57506001600160e01b03198216635b5e139f60e01b145b92915050565b600061032c82610566565b90506001600160a01b03811661037b5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b60448201526064015b60405180910390fd5b6001600160a01b0381163314806103b557506001600160a01b038116600090815260016020908152604080832033845290915290205460ff165b6103d15760405162461bcd60e51b815260040161037290611203565b60008281526020819052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104755760405162461bcd60e51b815260040161037290611203565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105359190611226565b905090565b610546838383336109e2565b505050565b6105468383836040518060200160405280600081525061075c565b604051632de5aaf760e01b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632de5aaf790602401600060405180830381865afa1580156105ce573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105f6919081019061123f565b509295945050505050565b604051632a5ccc1f60e01b81526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690632a5ccc1f90602401602060405180830381865afa15801561066c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106909190611226565b1561069c57600161069f565b60005b60ff1692915050565b336001600160a01b038316036106f05760405162461bcd60e51b815260206004820152600d60248201526c1cd95b1988185c1c1c9bdd985b609a1b6044820152606401610372565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610768848484336109e2565b823b156108d857604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906107a1903390889087908790600401611319565b6020604051808303816000875af19250505080156107dc575060408051601f3d908101601f191682019092526107d99181019061134c565b60015b610884573d80801561080a576040519150601f19603f3d011682016040523d82523d6000602084013e61080f565b606091505b50805160000361087c5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610372565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146108d65760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b6044820152606401610372565b505b50505050565b60606000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632de5aaf7876040518263ffffffff1660e01b815260040161093491815260200190565b600060405180830381865afa158015610951573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610979919081019061123f565b50929650909450925090506001600160a01b0384166109cc5760405162461bcd60e51b815260206004820152600f60248201526e1d1bdad95b881b9bdd08195e1a5cdd608a1b6044820152606401610372565b6109d886828585610b81565b9695505050505050565b806001600160a01b0316846001600160a01b03161480610a2757506001600160a01b0380851660009081526001602090815260408083209385168352929052205460ff165b80610a4b57506000828152602081905260409020546001600160a01b038281169116145b610a675760405162461bcd60e51b815260040161037290611203565b6000828152602081905260409081902080546001600160a01b0319169055516317d5759960e31b81526001600160a01b0385811660048301528481166024830152604482018490527f0000000000000000000000000000000000000000000000000000000000000000169063beabacc8906064016020604051808303816000875af1158015610afa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1e9190611369565b610b3a5760405162461bcd60e51b815260040161037290611203565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b606060405180610120016040528060fd815260200161173260fd9139905080610ba986610cb8565b604051602001610bba929190611386565b604051602081830303815290604052905080610bd585610cb8565b604051602001610be6929190611402565b604051602081830303815290604052905080610c0184610cb8565b604051602001610c12929190611480565b604051602081830303815290604052905080610c2d83610cb8565b604051602001610c3e929190611501565b60405160208183030381529060405290506000610c8b610c5d87610cb8565b610c6684610dc1565b604051602001610c77929190611567565b604051602081830303815290604052610dc1565b905080604051602001610c9e919061162c565b604051602081830303815290604052915050949350505050565b606081600003610cdf5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610d095780610cf381611687565b9150610d029050600a836116b6565b9150610ce3565b60008167ffffffffffffffff811115610d2457610d246110ca565b6040519080825280601f01601f191660200182016040528015610d4e576020820181803683370190505b5090505b8415610db957610d636001836116ca565b9150610d70600a866116dd565b610d7b9060306116f1565b60f81b818381518110610d9057610d90611704565b60200101906001600160f81b031916908160001a905350610db2600a866116b6565b9450610d52565b949350505050565b80516060906000819003610de5575050604080516020810190915260008152919050565b60006003610df48360026116f1565b610dfe91906116b6565b610e0990600461171a565b90506000610e188260206116f1565b67ffffffffffffffff811115610e3057610e306110ca565b6040519080825280601f01601f191660200182016040528015610e5a576020820181803683370190505b509050600060405180606001604052806040815260200161182f604091399050600181016020830160005b86811015610ee6576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101610e85565b506003860660018114610f005760028114610f1157610f1d565b613d3d60f01b600119830152610f1d565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981168114610f4157600080fd5b50565b600060208284031215610f5657600080fd5b8135610f6181610f2b565b9392505050565b60005b83811015610f83578181015183820152602001610f6b565b50506000910152565b60008151808452610fa4816020860160208601610f68565b601f01601f19169290920160200192915050565b602081526000610f616020830184610f8c565b600060208284031215610fdd57600080fd5b5035919050565b6001600160a01b0381168114610f4157600080fd5b6000806040838503121561100c57600080fd5b823561101781610fe4565b946020939093013593505050565b60008060006060848603121561103a57600080fd5b833561104581610fe4565b9250602084013561105581610fe4565b929592945050506040919091013590565b60006020828403121561107857600080fd5b8135610f6181610fe4565b8015158114610f4157600080fd5b600080604083850312156110a457600080fd5b82356110af81610fe4565b915060208301356110bf81611083565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611109576111096110ca565b604052919050565b6000806000806080858703121561112757600080fd5b843561113281610fe4565b935060208581013561114381610fe4565b935060408601359250606086013567ffffffffffffffff8082111561116757600080fd5b818801915088601f83011261117b57600080fd5b81358181111561118d5761118d6110ca565b61119f601f8201601f191685016110e0565b915080825289848285010111156111b557600080fd5b808484018584013760008482840101525080935050505092959194509250565b600080604083850312156111e857600080fd5b82356111f381610fe4565b915060208301356110bf81610fe4565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b60006020828403121561123857600080fd5b5051919050565b600080600080600060a0868803121561125757600080fd5b855161126281610fe4565b8095505060208087015194506040870151935060608701519250608087015167ffffffffffffffff8082111561129757600080fd5b818901915089601f8301126112ab57600080fd5b8151818111156112bd576112bd6110ca565b8060051b91506112ce8483016110e0565b818152918301840191848101908c8411156112e857600080fd5b938501935b83851015611306578451825293850193908501906112ed565b8096505050505050509295509295909350565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906109d890830184610f8c565b60006020828403121561135e57600080fd5b8151610f6181610f2b565b60006020828403121561137b57600080fd5b8151610f6181611083565b60008351611398818460208801610f68565b6503a37b5b2b7160d51b90830190815283516113bb816006840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b60008351611414818460208801610f68565b6703932b332b932b9160c51b9083019081528351611439816008840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c61737360089290910191820152671e913130b9b2911f60c11b6028820152603001949350505050565b60008351611492818460208801610f68565b6a030b3b2b73a2fba34b2b9160ad1b90830190815283516114ba81600b840160208801610f68565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b60008351611513818460208801610f68565b7003a34b6b2afb7b32fb1b932b0ba34b7b71607d1b9083019081528351611541816011840160208801610f68565b6c1e17ba32bc3a1f1e17b9bb339f60991b60119290910191820152601e01949350505050565b707b226e616d65223a20224167656e74202360781b81528251600090611594816011850160208801610f68565b7f222c20226465736372697074696f6e223a20224479736f6e2046696e616e63656011918401918201527f204167656e74204e4654222c2022696d616765223a2022646174613a696d6167603182015270194bdcdd99cade1b5b0ed8985cd94d8d0b607a1b60518201528351611611816062840160208801610f68565b61227d60f01b60629290910191820152606401949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161166481601d850160208701610f68565b91909101601d0192915050565b634e487b7160e01b600052601160045260246000fd5b60006001820161169957611699611671565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116c5576116c56116a0565b500490565b8181038181111561031b5761031b611671565b6000826116ec576116ec6116a0565b500690565b8082018082111561031b5761031b611671565b634e487b7160e01b600052603260045260246000fd5b808202811582820484141761031b5761031b61167156fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220f5fcf76fa925578fbaf6aa12666120d446a7b2405e12345b03fe62ed340f6a7464736f6c634300081100330000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a00000000000000000000000035eb04fcc69ea4dab370c95e53b1814830116a70

Deployed Bytecode

0x6080604052600436106101355760003560e01c80639cd754ba116100ab578063beabacc81161006f578063beabacc814610445578063d2cfa35614610465578063f269c59514610499578063f2fde38b146104b9578063f6a74ed7146104d9578063ff10b580146104f957600080fd5b80639cd754ba14610378578063a1a9b91d146103a8578063a7fc7a07146103d5578063b2118a8d146103f5578063b429afeb1461041557600080fd5b80633fd773e9116100fd5780633fd773e91461026c57806377800c2f146102b8578063799cd333146103035780638da5cb5b146103255780639aae3be3146103455780639b4be7821461036557600080fd5b806318160ddd1461013a5780631959a002146101635780632a5ccc1f146101da5780632de5aaf7146102075780633644e51514610238575b600080fd5b34801561014657600080fd5b5061015060015481565b6040519081526020015b60405180910390f35b34801561016f57600080fd5b506101bb61017e3660046113d8565b6001600160a01b03908116600090815260026020908152604080832054835260039182905280832091820154835290912054600190910154911691565b604080516001600160a01b03909316835260208301919091520161015a565b3480156101e657600080fd5b506101506101f53660046113d8565b60026020526000908152604090205481565b34801561021357600080fd5b506102276102223660046113fa565b61052d565b60405161015a959493929190611413565b34801561024457600080fd5b506101507f46c850339cf58e96eeaedcddaf0b4fe9ee3dda6d93d93be00fc274c5c4445c0b81565b34801561027857600080fd5b506102a07f000000000000000000000000f01b81b244cc524f52960dbbd0ea784fc436c89881565b6040516001600160a01b03909116815260200161015a565b3480156102c457600080fd5b506102f36102d3366004611480565b600660209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161015a565b34801561030f57600080fd5b5061032361031e3660046113fa565b6105cb565b005b34801561033157600080fd5b506000546102a0906001600160a01b031681565b34801561035157600080fd5b506101506103603660046113fa565b610624565b61015061037336600461154d565b610635565b34801561038457600080fd5b506102f36103933660046113d8565b60056020526000908152604090205460ff1681565b3480156103b457600080fd5b506101506103c33660046113fa565b60046020526000908152604090205481565b3480156103e157600080fd5b506103236103f03660046113d8565b610a65565b34801561040157600080fd5b506103236104103660046115ba565b610ab3565b34801561042157600080fd5b506102f36104303660046113d8565b60076020526000908152604090205460ff1681565b34801561045157600080fd5b506102f36104603660046115ba565b610af6565b34801561047157600080fd5b506101507f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e81565b3480156104a557600080fd5b506101506104b43660046113d8565b610d2c565b3480156104c557600080fd5b506103236104d43660046113d8565b610dcd565b3480156104e557600080fd5b506103236104f43660046113d8565b610e98565b34801561050557600080fd5b506101507f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b081565b600081815260036020818152604080842080546001820154600283015495830154600484018054865181890281018901909752808752899889988998606098976001600160a01b031696959294929390918391908301828280156105b057602002820191906000526020600020905b81548152602001906001019080831161059c575b50505050509050955095509550955095505091939590929450565b336000818152600660209081526040808320858452825291829020805460ff1916600117905590518381527f80aefaab1c400a701ea2159849b146231d2c7be9b71f2b885ea50e55a64667c6910160405180910390a250565b600061062f82610ee3565b92915050565b600081421061067d5760405162461bcd60e51b815260206004820152600f60248201526e65786365656420646561646c696e6560881b60448201526064015b60405180910390fd5b33600090815260026020526040902054156106cf5760405162461bcd60e51b8152602060048201526012602482015271185b1c9958591e481c9959da5cdd195c995960721b6044820152606401610674565b604080517f988d03ad424450a0aded4580fe482a39ed9b8388b3a462a03c93cbc4261e704e60208201523391810191909152600090610727906060015b60405160208183030381529060405280519060200120610ee3565b905060006107358286610f41565b90506001600160a01b0381166107805760405162461bcd60e51b815260206004820152601060248201526f696e76616c6964206f6e63652073696760801b6044820152606401610674565b6001600160a01b03811660009081526005602052604090205460ff16156107dd5760405162461bcd60e51b81526020600482015260116024820152701cda59db985d1d5c99481a5cc81d5cd959607a1b6044820152606401610674565b604080517f86874b46c44c60994107f0c70fd47fadde3640eab8bd21bc69dcb5aeab7de3b060208201526001600160a01b03831691810191909152606081018590523460808201526000906108349060a00161070c565b9050600087516041036108525761084b8289610f41565b90506108c9565b87516014036108c9575060148701516001600160a01b038116600090815260066020908152604080832085845290915290205460ff166108c95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166109145760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420706172656e742073696760701b6044820152606401610674565b6001600160a01b0381166000908152600260205260408120549081900361096e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a59081c185c995b9d60921b6044820152606401610674565b600081815260036020819052604090912060048101549091116109c35760405162461bcd60e51b815260206004820152600d60248201526c1b9bc8195b5c1d1e481cdb1bdd609a1b6044820152606401610674565b4261384082600201546109d6919061160c565b1115610a105760405162461bcd60e51b81526020600482015260096024820152686e6f7420726561647960b81b6044820152606401610674565b610a1a338361102b565b6001600160a01b0386166000908152600560205260409020805460ff1916600117905596503415610a5857610a586001600160a01b038416346111d8565b5050505050509392505050565b6000546001600160a01b03163314610a8f5760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b6000546001600160a01b03163314610add5760405162461bcd60e51b81526004016106749061161f565b610af16001600160a01b03841683836112a1565b505050565b6000336001600160a01b037f000000000000000000000000f01b81b244cc524f52960dbbd0ea784fc436c8981614610b405760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038316610b965760405162461bcd60e51b815260206004820152601860248201527f7472616e7366657220696e76616c6964206164647265737300000000000000006044820152606401610674565b81600003610bdc5760405162461bcd60e51b81526020600482015260136024820152723737ba3434b733903a37903a3930b739b332b960691b6044820152606401610674565b6001600160a01b0384166000908152600260205260409020548214610c135760405162461bcd60e51b81526004016106749061161f565b6000828152600460205260409020544211610c555760405162461bcd60e51b815260206004820152600260248201526118d960f21b6044820152606401610674565b60008281526003602090815260408083206001600160a01b038716845260029092529091205415610cb35760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b80546001600160a01b0319166001600160a01b038581169182178355600091825260026020526040808320869055908716825281205560018082015461ea6091610cfd919061160c565b610d079190611642565b610d11904261160c565b60008481526004602052604090205550600190509392505050565b600080546001600160a01b0316331480610d5557503360009081526007602052604090205460ff165b610d715760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03821660009081526002602052604090205415610dc25760405162461bcd60e51b81526020600482015260086024820152671bd8d8dd5c1a595960c21b6044820152606401610674565b61062f82600161102b565b6000546001600160a01b03163314610df75760405162461bcd60e51b81526004016106749061161f565b6001600160a01b038116610e445760405162461bcd60e51b81526020600482015260146024820152736f776e65722063616e6e6f74206265207a65726f60601b6044820152606401610674565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527fcfaaa26691e16e66e73290fc725eee1a6b4e0e693a1640484937aac25ffb55a49060200160405180910390a150565b6000546001600160a01b03163314610ec25760405162461bcd60e51b81526004016106749061161f565b6001600160a01b03166000908152600760205260409020805460ff19169055565b60405161190160f01b60208201527f46c850339cf58e96eeaedcddaf0b4fe9ee3dda6d93d93be00fc274c5c4445c0b602282015260428101829052600090606201604051602081830303815290604052805190602001209050919050565b600081516041036110225760208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610f92576000935050505061062f565b8060ff16601b14158015610faa57508060ff16601c14155b15610fbb576000935050505061062f565b60408051600081526020810180835288905260ff831691810191909152606081018490526080810183905260019060a0016020604051602081039080840390855afa15801561100e573d6000803e3d6000fd5b50505060206040510351935050505061062f565b50600092915050565b60006001600160a01b0383166110835760405162461bcd60e51b815260206004820152601960248201527f6e6577206167656e7420696e76616c69642061646472657373000000000000006044820152606401610674565b60016000815461109290611659565b91829055506001600160a01b038416600081815260026020908152604080832085905586835260038252808320858452908320600482018054600181810183559186529390942090920185905581546001600160a01b03191690931781558183015493945091926111029161160c565b600182015542600282015560038101849055604051630f632fd360e01b81526001600160a01b038681166004830152602482018590527f000000000000000000000000f01b81b244cc524f52960dbbd0ea784fc436c8981690630f632fd390604401600060405180830381600087803b15801561117e57600080fd5b505af1158015611192573d6000803e3d6000fd5b50505050837fe23550ce55546f73f971a932ee4b14cd8070fc95c7da57ac7e4337476b5604d1846040516111c891815260200190565b60405180910390a2505092915050565b604080516000808252602082019092526001600160a01b0384169083906040516112029190611672565b60006040518083038185875af1925050503d806000811461123f576040519150601f19603f3d011682016040523d82523d6000602084013e611244565b606091505b5050905080610af15760405162461bcd60e51b815260206004820152602360248201527f7472616e7366657248656c7065723a20455448207472616e73666572206661696044820152621b195960ea1b6064820152608401610674565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916112fd9190611672565b6000604051808303816000865af19150503d806000811461133a576040519150601f19603f3d011682016040523d82523d6000602084013e61133f565b606091505b509150915081801561136957508051158061136957508080602001905181019061136991906116a1565b6113b55760405162461bcd60e51b815260206004820152601f60248201527f7472616e7366657248656c7065723a207472616e73666572206661696c6564006044820152606401610674565b5050505050565b80356001600160a01b03811681146113d357600080fd5b919050565b6000602082840312156113ea57600080fd5b6113f3826113bc565b9392505050565b60006020828403121561140c57600080fd5b5035919050565b6001600160a01b03861681526020808201869052604082018590526060820184905260a06080830181905283519083018190526000918481019160c0850190845b8181101561147057845183529383019391830191600101611454565b50909a9950505050505050505050565b6000806040838503121561149357600080fd5b61149c836113bc565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126114d157600080fd5b813567ffffffffffffffff808211156114ec576114ec6114aa565b604051601f8301601f19908116603f01168101908282118183101715611514576115146114aa565b8160405283815286602085880101111561152d57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561156257600080fd5b833567ffffffffffffffff8082111561157a57600080fd5b611586878388016114c0565b9450602086013591508082111561159c57600080fd5b506115a9868287016114c0565b925050604084013590509250925092565b6000806000606084860312156115cf57600080fd5b6115d8846113bc565b92506115e6602085016113bc565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062f5761062f6115f6565b6020808252600990820152683337b93134b23232b760b91b604082015260600190565b808202811582820484141761062f5761062f6115f6565b60006001820161166b5761166b6115f6565b5060010190565b6000825160005b818110156116935760208186018101518583015201611679565b506000920191825250919050565b6000602082840312156116b357600080fd5b815180151581146113f357600080fdfea2646970667358221220bda6530bbff01d089c37a484d3917c5c2f18de17e3f4e1f5902347f2f745442364736f6c63430008110033

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

0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a00000000000000000000000035eb04fcc69ea4dab370c95e53b1814830116a70

-----Decoded View---------------
Arg [0] : _owner (address): 0x7e6d097A7D948454eA253d3610bD93bB9c508B3a
Arg [1] : root (address): 0x35eb04Fcc69Ea4DaB370c95E53b1814830116A70

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007e6d097a7d948454ea253d3610bd93bb9c508b3a
Arg [1] : 00000000000000000000000035eb04fcc69ea4dab370c95e53b1814830116a70


Block Transaction Gas Used Reward
view all blocks sequenced

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

OVERVIEW

The Agency contract is responsible for managing the Membership Tree, as well as handling the registration and distribution of AgentNFTs that represent Membership.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.