Overview
ETH Balance
ETH Value
$0.00Latest 25 from a total of 2,905 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Register | 18504671 | 271 days ago | IN | 0 ETH | 0.00000122 | ||||
| Register | 18504671 | 271 days ago | IN | 0 ETH | 0.00000121 | ||||
| Register | 18122820 | 283 days ago | IN | 0 ETH | 0.00004969 | ||||
| Register | 18122348 | 283 days ago | IN | 0 ETH | 0.00002096 | ||||
| Register | 15724789 | 347 days ago | IN | 0 ETH | 0.00000202 | ||||
| Register | 15724789 | 347 days ago | IN | 0 ETH | 0.00000195 | ||||
| Register | 15724789 | 347 days ago | IN | 0 ETH | 0.00000405 | ||||
| Register | 15724789 | 347 days ago | IN | 0 ETH | 0.00000208 | ||||
| Register | 15414766 | 355 days ago | IN | 0 ETH | 0.00000426 | ||||
| Register | 15414766 | 355 days ago | IN | 0 ETH | 0.00000297 | ||||
| Register | 15414766 | 355 days ago | IN | 0 ETH | 0.00000236 | ||||
| Register | 15414766 | 355 days ago | IN | 0 ETH | 0.00000198 | ||||
| Register | 15414766 | 355 days ago | IN | 0 ETH | 0.00000216 | ||||
| Register | 15408783 | 355 days ago | IN | 0 ETH | 0.00000276 | ||||
| Register | 15019036 | 365 days ago | IN | 0 ETH | 0.00001035 | ||||
| Register | 14972293 | 366 days ago | IN | 0 ETH | 0.00001154 | ||||
| Register | 14879152 | 369 days ago | IN | 0 ETH | 0.00007513 | ||||
| Register | 14828616 | 370 days ago | IN | 0 ETH | 0.00002485 | ||||
| Register | 14782681 | 371 days ago | IN | 0 ETH | 0.00001444 | ||||
| Register | 14688549 | 373 days ago | IN | 0 ETH | 0.00000969 | ||||
| Register | 14687367 | 373 days ago | IN | 0 ETH | 0.0000106 | ||||
| Register | 14658945 | 374 days ago | IN | 0 ETH | 0.00002064 | ||||
| Register | 14652091 | 374 days ago | IN | 0 ETH | 0.00001013 | ||||
| Register | 14650538 | 374 days ago | IN | 0 ETH | 0.00001033 | ||||
| Register | 14635573 | 375 days ago | IN | 0 ETH | 0.00001379 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 28318735 | 1 hr ago | 0 ETH | ||||
| 28318726 | 1 hr ago | 0 ETH | ||||
| 28318718 | 1 hr ago | 0 ETH | ||||
| 28318708 | 1 hr ago | 0 ETH | ||||
| 28318700 | 1 hr ago | 0 ETH | ||||
| 28287464 | 21 hrs ago | 0 ETH | ||||
| 28281163 | 25 hrs ago | 0 ETH | ||||
| 28281154 | 25 hrs ago | 0 ETH | ||||
| 28281145 | 25 hrs ago | 0 ETH | ||||
| 28281105 | 25 hrs ago | 0 ETH | ||||
| 28281092 | 25 hrs ago | 0 ETH | ||||
| 28269629 | 32 hrs ago | 0 ETH | ||||
| 28243544 | 2 days ago | 0 ETH | ||||
| 28243528 | 2 days ago | 0 ETH | ||||
| 28243517 | 2 days ago | 0 ETH | ||||
| 28243506 | 2 days ago | 0 ETH | ||||
| 28243498 | 2 days ago | 0 ETH | ||||
| 28230660 | 2 days ago | 0 ETH | ||||
| 28222669 | 2 days ago | 0 ETH | ||||
| 28222669 | 2 days ago | 0 ETH | ||||
| 28199029 | 3 days ago | 0 ETH | ||||
| 28199011 | 3 days ago | 0 ETH | ||||
| 28199011 | 3 days ago | 0 ETH | ||||
| 28198980 | 3 days ago | 0 ETH | ||||
| 28198961 | 3 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Agency
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
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);
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
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
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.