ERC-721
Overview
Max Total Supply
0 Definitely Memberships
Holders
136
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 Definitely MembershipsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DefinitelyMemberships
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.17; /** ...:--==***#@%%- ..: -*@@@@@@@@@@@@@#*: -:::-=+*#%@@@@@@*-=@@@@@@@@@@@#+=: .::---:. +#@@@@@@@@@@@@@%*+-. -@@@@@@+.. .-+*%@@@@@@@@@@@#- -@@@@@@@@@@%#*=:. :@@@@@@@#%@@@@@%: =#@@@@@@@@@@@@@@@@@@@%. %@@@@@@-.. *@@@@@@@@@@@@%*. -@@@@@@@@@#*+=--=#@@@@@% +@@@@@@%*#%@@@%*=-.. .@@@@@@@%%*+=: :*@@@@@@* .@@@@@@.*@@@@@@@@@@@@*+- =%@@@@% =@@@@@@. *@@@@@%:@@@@@@*==-:. =@@@@@: .@@@@@@= =@@@@@@%.*@@@@@= ..::--=+*=+*+=@@@@= #@@@@@* .+@@@@@@@* .+@@@@@#%%@@@@@@@@#+:. =#@@= @@@@@% :*@@@@@@@*: .#@@@@@@@@@@@@@%#: --- :@@@@%. -%@@@@@@@+. +@@@@@%#*+=:. +@@@%=*@@@@@@@*: =*: :*#+%@@@@%*=. :+##*=:. */ import {ERC721} from "solmate/tokens/ERC721.sol"; import {Auth} from "./lib/Auth.sol"; import {IDefinitelyMemberships} from "./interfaces/IDefinitelyMemberships.sol"; import {IDefinitelyMetadata} from "./interfaces/IDefinitelyMetadata.sol"; /** * @title * Definitely Memberships * * @author * DEF DAO * * @notice * A membership token for DEF DAO in the form of a ERC721 NFT. * * Features: * - Non-transferrable tokens. This can be bypassed by a membership transfer contract to * allow for social recovery if necessary. * - Approved contracts for issuing memberships. This allows different issuing * mechanisms e.g. invites, props, funding etc. at the same time. * - Approved contracts for revoking memberships. * - Approved contracts for transferring memberships. * - A separate upgradable metadata contract. * - Per token metadata overriding. * */ contract DefinitelyMemberships is IDefinitelyMemberships, ERC721, Auth { /* ------------------------------------------------------------------------ S T O R A G E ------------------------------------------------------------------------ */ /* ERC-721 ------------------------------------------------------------- */ /// @dev Tracks ERC-721 token ids uint256 private _nextMembershipId = 1; /* ISSUING MEMBERSHIPS ------------------------------------------------- */ /// @dev Contracts that are allowed to issue memberships mapping(address => bool) private _allowedMembershipIssuingContracts; /// @dev Maps a token id to the block number it was issued at for "insight" score mapping(uint256 => uint256) private _memberSinceBlock; /* REVOKING MEMBERSHIPS ------------------------------------------------ */ /// @dev Contracts that are allowed to revoke memberships mapping(address => bool) private _allowedMembershipRevokingContracts; /// @dev Prevents an address from becoming an owner of this token mapping(address => bool) private _denyList; /* TRANSFERRING MEMBERSHIPS -------------------------------------------- */ /// @dev Contracts that are allowed to transfer memberships between accounts mapping(address => bool) private _allowedMembershipTransferContracts; bool public globalTransferLocked; /* METADATA ------------------------------------------------------------ */ /// @dev A fallback metadata address for all tokens that don't specify an override address private _defaultMetadata; /// @dev Allows a specific token ID to use it's own metadata address mapping(uint256 => address) private _tokenMetadataOverrideAddress; /* ------------------------------------------------------------------------ E V E N T S ------------------------------------------------------------------------ */ /* INIT ---------------------------------------------------------------- */ event DefinitelyShipping(); /* ISSUING MEMBERSHIPS ------------------------------------------------- */ event MembershipIssuingContractAdded(address indexed contractAddress); event MembershipIssuingContractRemoved(address indexed contractAddress); event MembershipIssued(uint256 indexed id, address indexed newOwner); /* REVOKING MEMBERSHIPS ------------------------------------------------ */ event MembershipRevokingContractAdded(address indexed contractAddress); event MembershipRevokingContractRemoved(address indexed contractAddress); event MembershipRevoked(uint256 indexed id, address indexed prevOwner); event AddedToDenyList(address indexed account); event RemovedFromDenyList(address indexed account); /* TRANSFERRING MEMBERSHIPS -------------------------------------------- */ event MembershipTransferContractAdded(address indexed contractAddress); event MembershipTransferContractRemoved(address indexed contractAddress); event TransferLockSet(bool indexed isTransferLocked); /* METADATA ------------------------------------------------------------ */ event DefaultMetadataUpdated(address indexed metadata); event MetadataOverridden(uint256 indexed id, address indexed metadata); event MetadataResetToDefault(uint256 indexed id); /* ------------------------------------------------------------------------ E R R O R S ------------------------------------------------------------------------ */ error NotAuthorizedToIssueMembership(); error NotAuthorizedToRevokeMembership(); error NotAuthorizedToTransferMembership(); error NotDefMember(); error AlreadyDefMember(); error NotOwnerOfToken(); error OnDenyList(); error CannotTransferToZeroAddress(); /* ------------------------------------------------------------------------ M O D I F I E R S ------------------------------------------------------------------------ */ /// @dev Reverts if not a member modifier onlyDefMember() { if (_balanceOf[msg.sender] < 1) revert NotDefMember(); _; } /// @dev Reverts if `account` is already a member modifier whenNotDefMember(address account) { if (_balanceOf[account] > 0) revert AlreadyDefMember(); _; } /// @dev Reverts if `account` is on the deny list modifier whenNotOnDenyList(address account) { if (_denyList[account]) revert OnDenyList(); _; } /// @dev Reverts if not an allowed minting contract modifier onlyMembershipIssuingContract() { if (!_allowedMembershipIssuingContracts[msg.sender]) { revert NotAuthorizedToIssueMembership(); } _; } /// @dev Reverts if not the allowed membership revoking modifier onlyMembershipRevokingContract() { if (!_allowedMembershipRevokingContracts[msg.sender]) { revert NotAuthorizedToRevokeMembership(); } _; } /// @dev Reverts if not the allowed membership transfer contract modifier onlyMembershipTransferContract() { if (!_allowedMembershipTransferContracts[msg.sender]) { revert NotAuthorizedToTransferMembership(); } _; } /* ------------------------------------------------------------------------ I N I T ------------------------------------------------------------------------ */ /** * @param owner_ Contract owner address */ constructor(address owner_) ERC721("DEF", "Definitely Memberships") Auth(owner_) { emit DefinitelyShipping(); globalTransferLocked = true; emit TransferLockSet(true); } /* ------------------------------------------------------------------------ I S S U I N G M E M B E R S H I P S ------------------------------------------------------------------------ */ /** * @notice * Allows another contract to issue a membership token to someone * * @dev * Reverts if: * - the caller is not an approved issuing contract * - `to` is already a member * - `to` is on the deny list * * @param to Address to issue a membership NFT to */ function issueMembership(address to) external override onlyMembershipIssuingContract whenNotDefMember(to) whenNotOnDenyList(to) { _mint(to, _nextMembershipId); _memberSinceBlock[_nextMembershipId] = block.number; emit MembershipIssued(_nextMembershipId, to); unchecked { ++_nextMembershipId; } } /* ------------------------------------------------------------------------ R E V O K I N G M E M B E R S H I P S ------------------------------------------------------------------------ */ /** * @notice * Revokes a membership by burning a token * * @dev * This allows some level of governance for when a membership should be revoked. * Optionally adds the address to the deny list so they cannot be issued a new * membership in the future. * * Reverts if: * - the caller is not an approved revoking contract * * @param id The token id of the membership to revoke * @param addToDenyList Whether to add the current owner to the deny list */ function revokeMembership(uint256 id, bool addToDenyList) external onlyMembershipRevokingContract { address prevOwner = _ownerOf[id]; if (addToDenyList) _setDenyListStatus(prevOwner, true); _burn(id); emit MembershipRevoked(id, prevOwner); } /** * @notice * Adds an address to the deny list * * @dev * This allows some level of governance for when an address should be added * to the deny list. * * Reverts if: * - the caller is not an approved revoking contract * * @param account The account to add to the deny list */ function addAddressToDenyList(address account) public onlyMembershipRevokingContract { _setDenyListStatus(account, true); } /** * @notice * Removes an address from the deny list * * @dev * This allows some level of governance for when an address should be removed * from the deny list. * * Reverts if: * - the caller is not an approved revoking contract * * @param account The account to remove from the deny list */ function removeAddressFromDenyList(address account) external onlyMembershipRevokingContract { _setDenyListStatus(account, false); } /** * @dev * Internal function to manage deny list status and emit relevant events * * @param account The account to set the deny list status for * @param isDenied Whether the account should be on the deny list or not */ function _setDenyListStatus(address account, bool isDenied) internal { _denyList[account] = isDenied; if (isDenied) emit AddedToDenyList(account); if (!isDenied) emit RemovedFromDenyList(account); } /* ------------------------------------------------------------------------ T R A N S F E R R I N G M E M B E R S H I P S ------------------------------------------------------------------------ */ /** * @notice * Allows an account to bypass the transfer lock mechanic and transfer a membership * * @dev * This allows for some level of governance around when to actually allow a * membership transfer to happen. * * Reverts if: * - the caller is not an approved transfer contract * * @param id The token id of the membership being transferred * @param to The new owner of the membership token */ function transferMembership(uint256 id, address to) external onlyMembershipTransferContract { if (to == address(0)) revert CannotTransferToZeroAddress(); address from = _ownerOf[id]; unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } /* ------------------------------------------------------------------------ T R A N S F E R L O C K ------------------------------------------------------------------------ */ /** * @notice * Overridden `transferFrom` to prevent membership transfer if transfers are locked * * @dev * If a transfer is required while `globalTransferLocked` is true, use an approved * membership transfer contract instead */ function transferFrom( address from, address to, uint256 id ) public virtual override { if (globalTransferLocked) revert NotAuthorizedToTransferMembership(); super.transferFrom(from, to, id); } /* ------------------------------------------------------------------------ M E T A D A T A ------------------------------------------------------------------------ */ /** * @notice * Allows a token holder to set a new metadata address for tokenURI customization * * @param id The token to override metadata for * @param metadata The new metadata contract address for this token */ function overrideMetadataForToken(uint256 id, address metadata) external { if (_ownerOf[id] != msg.sender) revert NotOwnerOfToken(); _tokenMetadataOverrideAddress[id] = address(metadata); emit MetadataOverridden(id, metadata); } /** * @notice * Allows a token holder to use the default metadata address for their token * * @param id The token that should use the default metadata contract */ function resetMetadataForToken(uint256 id) external { delete _tokenMetadataOverrideAddress[id]; emit MetadataResetToDefault(id); } /* ------------------------------------------------------------------------ E R C - 7 2 1 ------------------------------------------------------------------------ */ /** * @notice * Burn your membership token * * @param id The token you want to burn */ function burn(uint256 id) external { if (_ownerOf[id] != msg.sender) revert NotOwnerOfToken(); _burn(id); } /** * @notice * ERC-721 tokenURI returns the metadata for a given token * * @dev * Returns the metadata override if present, or fall back to the default metadata address * * @param id The token id to get metadata for */ function tokenURI(uint256 id) public view virtual override returns (string memory) { address metadataOverride = _tokenMetadataOverrideAddress[id]; return IDefinitelyMetadata( metadataOverride != address(0) ? metadataOverride : _defaultMetadata ).tokenURI(id); } /* ------------------------------------------------------------------------ A D M I N ------------------------------------------------------------------------ */ /** * @notice * Adds a new membership issuing contract * * @dev * The new contract will be able to mint membership tokens to people who aren't already * members, and who aren't on the deny list. There are no other restrictions so the issuing * contract must implement additional checks if necessary * * @param addr A membership issuing contract address */ function addMembershipIssuingContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipIssuingContracts[addr] = true; emit MembershipIssuingContractAdded(addr); } /** * @notice * Removes an existing membership issuing contract * * @dev * This will prevent the contract from calling `issueMembership` * * @param addr A membership issuing contract address */ function removeMembershipIssuingContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipIssuingContracts[addr] = false; emit MembershipIssuingContractRemoved(addr); } /** * @notice * Adds a new membership revoking contract * * @dev * The new contract will be able to burn tokens effectively revoking membership * * @param addr A membership revoking contract address */ function addMembershipRevokingContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipRevokingContracts[addr] = true; emit MembershipRevokingContractAdded(addr); } /** * @notice * Removes an existing membership revoking contract * * @dev * This will prevent the contract from calling `revokeMembership` * * @param addr A membership revoking contract address */ function removeMembershipRevokingContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipRevokingContracts[addr] = false; emit MembershipRevokingContractRemoved(addr); } /** * @notice * Adds a new membership transfer contract * * @dev * The new contract will be able to bypass the transfer lock mechanic and transfer tokens * * @param addr A membership transfer contract address */ function addMembershipTransferContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipTransferContracts[addr] = true; emit MembershipTransferContractAdded(addr); } /** * @notice * Removes an existing membership transfer contract * * @dev * This will prevent the contract from calling `transferMembership` * * @param addr A membership transfer contract address */ function removeMembershipTransferContract(address addr) external onlyOwnerOrAdmin { _allowedMembershipTransferContracts[addr] = false; emit MembershipTransferContractRemoved(addr); } /** * @notice * Updates the fallback metadata used for all tokens that haven't set an override * * @param addr A metadata contract address */ function setDefaultMetadata(address addr) external onlyOwnerOrAdmin { _defaultMetadata = address(addr); emit DefaultMetadataUpdated(addr); } /** * @notice * Updates the global transfer lock flag to lock/unlock standard ERC721 transfers * * @param locked If global direct ERC721 transfers should be prevented */ function setGlobalTransferLock(bool locked) external onlyOwnerOrAdmin { globalTransferLocked = locked; emit TransferLockSet(locked); } /* ------------------------------------------------------------------------ P U B L I C G E T T E R S ------------------------------------------------------------------------ */ /** * @notice Checks if an account is part of DEF with a simple balance check */ function isDefMember(address account) external view returns (bool) { return _balanceOf[account] > 0; } /** * @notice * Checks if an account is on the DEF deny list * * @dev * If the account is on the deny list then they will not be allowed to become a member * until they are removed from the deny list by a revoking contract. */ function isOnDenyList(address account) external view returns (bool) { return _denyList[account]; } /** * @notice Returns the block number for when the token was issued */ function memberSinceBlock(uint256 id) external view returns (uint256) { return _memberSinceBlock[id]; } /** * @notice Gets the metadata address for a given token */ function metadataAddressForToken(uint256 id) external view returns (address) { address metadataOverride = _tokenMetadataOverrideAddress[id]; return metadataOverride != address(0) ? metadataOverride : _defaultMetadata; } /** * @notice Gets the fallback metadata contract address */ function defaultMetadataAddress() external view returns (address) { return _defaultMetadata; } /** * @notice Checks if an address is allowed to issue memberships */ function allowedMembershipIssuingContract(address addr) external view returns (bool) { return _allowedMembershipIssuingContracts[addr]; } /** * @notice Checks if an address is allowed to revoke memberships */ function allowedMembershipRevokingContract(address addr) external view returns (bool) { return _allowedMembershipRevokingContracts[addr]; } /** * @notice Checks if an address is allowed to transfer memberships */ function allowedMembershipTransferContract(address addr) external view returns (bool) { return _allowedMembershipTransferContracts[addr]; } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.17; interface IDefinitelyMemberships { function issueMembership(address to) external; function revokeMembership(uint256 id, bool addToDenyList) external; function addAddressToDenyList(address account) external; function removeAddressFromDenyList(address account) external; function transferMembership(uint256 id, address to) external; function overrideMetadataForToken(uint256 id, address metadata) external; function resetMetadataForToken(uint256 id) external; function isDefMember(address account) external view returns (bool); function isOnDenyList(address account) external view returns (bool); function memberSinceBlock(uint256 id) external view returns (uint256); function defaultMetadataAddress() external view returns (address); function metadataAddressForToken(uint256 id) external view returns (address); function allowedMembershipIssuingContract(address addr) external view returns (bool); function allowedMembershipRevokingContract(address addr) external view returns (bool); function allowedMembershipTransferContract(address addr) external view returns (bool); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.17; interface IDefinitelyMetadata { function tokenURI(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: Unlicense pragma solidity ^0.8.17; /** * @author DEF DAO * @title Simple owner and admin authentication * @notice Allows the management of a contract by using simple ownership and admin modifiers. */ abstract contract Auth { /* ------------------------------------------------------------------------ S T O R A G E ------------------------------------------------------------------------ */ /// @notice Current owner of the contract address public owner; /// @notice Current admins of the contract mapping(address => bool) public admins; /* ------------------------------------------------------------------------ E V E N T S ------------------------------------------------------------------------ */ /** * @notice When the contract owner is updated * @param user The account that updated the new owner * @param newOwner The new owner of the contract */ event OwnerUpdated(address indexed user, address indexed newOwner); /** * @notice When an admin is added to the contract * @param user The account that added the new admin * @param newAdmin The admin that was added */ event AdminAdded(address indexed user, address indexed newAdmin); /** * @notice When an admin is removed from the contract * @param user The account that removed an admin * @param prevAdmin The admin that got removed */ event AdminRemoved(address indexed user, address indexed prevAdmin); /* ------------------------------------------------------------------------ M O D I F I E R S ------------------------------------------------------------------------ */ /** * @dev Only the owner can call */ modifier onlyOwner() { require(msg.sender == owner, "UNAUTHORIZED"); _; } /** * @dev Only an admin can call */ modifier onlyAdmin() { require(admins[msg.sender], "UNAUTHORIZED"); _; } /** * @dev Only the owner or an admin can call */ modifier onlyOwnerOrAdmin() { require((msg.sender == owner || admins[msg.sender]), "UNAUTHORIZED"); _; } /* ------------------------------------------------------------------------ I N I T ------------------------------------------------------------------------ */ /** * @dev Sets the initial owner and a first admin upon creation. * @param owner_ The initial owner of the contract */ constructor(address owner_) { owner = owner_; emit OwnerUpdated(address(0), owner_); } /* ------------------------------------------------------------------------ A D M I N ------------------------------------------------------------------------ */ /** * @notice Transfers ownership of the contract to `newOwner` * @dev Can only be called by the current owner or an admin * @param newOwner The new owner of the contract */ function setOwner(address newOwner) public virtual onlyOwnerOrAdmin { owner = newOwner; emit OwnerUpdated(msg.sender, newOwner); } /** * @notice Adds `newAdmin` as an admin of the contract * @dev Can only be called by the current owner or an admin * @param newAdmin A new admin of the contract */ function addAdmin(address newAdmin) public virtual onlyOwnerOrAdmin { admins[newAdmin] = true; emit AdminAdded(msg.sender, newAdmin); } /** * @notice Removes `prevAdmin` as an admin of the contract * @dev Can only be called by the current owner or an admin * @param prevAdmin The admin to remove */ function removeAdmin(address prevAdmin) public virtual onlyOwnerOrAdmin { admins[prevAdmin] = false; emit AdminRemoved(msg.sender, prevAdmin); } }
{ "remappings": [ "def/=packages/contracts/src/", "ds-test/=packages/contracts/lib/ds-test/src/", "forge-std/=packages/contracts/lib/forge-std/src/", "murky/=packages/contracts/lib/murky/src/", "openzeppelin-contracts/=packages/contracts/lib/openzeppelin-contracts/", "openzeppelin/=packages/contracts/lib/openzeppelin-contracts/", "solmate/=packages/contracts/lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyDefMember","type":"error"},{"inputs":[],"name":"CannotTransferToZeroAddress","type":"error"},{"inputs":[],"name":"NotAuthorizedToIssueMembership","type":"error"},{"inputs":[],"name":"NotAuthorizedToRevokeMembership","type":"error"},{"inputs":[],"name":"NotAuthorizedToTransferMembership","type":"error"},{"inputs":[],"name":"NotDefMember","type":"error"},{"inputs":[],"name":"NotOwnerOfToken","type":"error"},{"inputs":[],"name":"OnDenyList","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToDenyList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"prevAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"metadata","type":"address"}],"name":"DefaultMetadataUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"DefinitelyShipping","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"MembershipIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipIssuingContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipIssuingContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"}],"name":"MembershipRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipRevokingContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipRevokingContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipTransferContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"MembershipTransferContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"metadata","type":"address"}],"name":"MetadataOverridden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"MetadataResetToDefault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedFromDenyList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"isTransferLocked","type":"bool"}],"name":"TransferLockSet","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAddressToDenyList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addMembershipIssuingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addMembershipRevokingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addMembershipTransferContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allowedMembershipIssuingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allowedMembershipRevokingContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"allowedMembershipTransferContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultMetadataAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalTransferLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isDefMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOnDenyList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"issueMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"memberSinceBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"metadataAddressForToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"metadata","type":"address"}],"name":"overrideMetadataForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAddressFromDenyList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"prevAdmin","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeMembershipIssuingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeMembershipRevokingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeMembershipTransferContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"resetMetadataForToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bool","name":"addToDenyList","type":"bool"}],"name":"revokeMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setDefaultMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setGlobalTransferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"transferMembership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016008553480156200001657600080fd5b506040516200223b3803806200223b833981016040819052620000399162000164565b80604051806040016040528060038152602001622222a360e91b8152506040518060400160405280601681526020017f446566696e6974656c79204d656d62657273686970730000000000000000000081525081600090816200009d91906200023b565b506001620000ac82826200023b565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506040517f0c47bb88983ea3a9ee231885fcd177cefc0a5d8d699a8c6d1797352f5b1c9ed390600090a1600e805460ff191660019081179091556040517f2e9f3b412c55aa6b409461b0ba4ebda518eab71cc77b10ba4c1646441bad9c2490600090a25062000307565b6000602082840312156200017757600080fd5b81516001600160a01b03811681146200018f57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001c157607f821691505b602082108103620001e257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023657600081815260208120601f850160051c81016020861015620002115750805b601f850160051c820191505b8181101562000232578281556001016200021d565b5050505b505050565b81516001600160401b0381111562000257576200025762000196565b6200026f81620002688454620001ac565b84620001e8565b602080601f831160018114620002a757600084156200028e5750858301515b600019600386901b1c1916600185901b17855562000232565b600085815260208120601f198616915b82811015620002d857888601518255948401946001909101908401620002b7565b5085821015620002f75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611f2480620003176000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806371c153ee11610151578063b88d4fde116100c3578063dfa6c5cd11610087578063dfa6c5cd1461060a578063e985e9c514610620578063efdc3cd11461064e578063f6029dbf14610661578063f817242d14610674578063ffceb7f41461068757600080fd5b8063b88d4fde146105ab578063b9b6ab97146105be578063c87b56dd146105d1578063d023f8f6146105e4578063d454dfaf146105f757600080fd5b80638f3c7894116101155780638f3c78941461051357806395d89b4114610526578063a22cb4651461052e578063a30774e014610541578063aa30d23c1461056c578063b299efef1461057f57600080fd5b806371c153ee146104a7578063752d5477146104ba5780637ae9743b146104cd57806381df1565146104ed5780638da5cb5b1461050057600080fd5b806342966c68116101ea5780635da08c61116101ae5780635da08c61146104275780636352211e1461043a578063678423721461044d5780636ed301ca14610460578063704802751461047357806370a082311461048657600080fd5b806342966c681461038c578063429b62e51461039f578063501feb31146103c25780635521143e146103ee5780635aba7f811461041a57600080fd5b80631785f53c116102315780631785f53c146103145780631f4c3fad1461032757806323b872dd1461033a57806335c2a0261461034d57806342842e0e1461037957600080fd5b806301ffc9a71461026e57806306fdde0314610296578063081812fc146102ab578063095ea7b3146102ec57806313af403514610301575b600080fd5b61028161027c366004611ad5565b61069a565b60405190151581526020015b60405180910390f35b61029e6106ec565b60405161028d9190611b16565b6102d46102b9366004611b49565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b6102ff6102fa366004611b79565b61077a565b005b6102ff61030f366004611ba3565b610861565b6102ff610322366004611ba3565b6108f1565b6102ff610335366004611ba3565b61097f565b6102ff610348366004611bbe565b610a15565b61028161035b366004611ba3565b6001600160a01b03166000908152600d602052604090205460ff1690565b6102ff610387366004611bbe565b610a49565b6102ff61039a366004611b49565b610b3c565b6102816103ad366004611ba3565b60076020526000908152604090205460ff1681565b6102816103d0366004611ba3565b6001600160a01b031660009081526009602052604090205460ff1690565b6102816103fc366004611ba3565b6001600160a01b03166000908152600b602052604090205460ff1690565b600e546102819060ff1681565b6102ff610435366004611ba3565b610b7f565b6102d4610448366004611b49565b610c0f565b6102d461045b366004611b49565b610c66565b6102ff61046e366004611c0a565b610ca2565b6102ff610481366004611ba3565b610d23565b610499610494366004611ba3565b610db4565b60405190815260200161028d565b6102ff6104b5366004611c25565b610e17565b6102ff6104c8366004611ba3565b610ea7565b6104996104db366004611b49565b6000908152600a602052604090205490565b6102ff6104fb366004611ba3565b610ee2565b6006546102d4906001600160a01b031681565b6102ff610521366004611ba3565b610f6f565b61029e610fff565b6102ff61053c366004611c51565b61100c565b61028161054f366004611ba3565b6001600160a01b0316600090815260036020526040902054151590565b6102ff61057a366004611c7b565b611078565b61028161058d366004611ba3565b6001600160a01b03166000908152600c602052604090205460ff1690565b6102ff6105b9366004611c9e565b611115565b6102ff6105cc366004611b49565b6111fd565b61029e6105df366004611b49565b611243565b6102ff6105f2366004611ba3565b6112ed565b6102ff610605366004611c25565b61137a565b600e5461010090046001600160a01b03166102d4565b61028161062e366004611d39565b600560209081526000928352604080842090915290825290205460ff1681565b6102ff61065c366004611ba3565b611456565b6102ff61066f366004611ba3565b6114e3565b6102ff610682366004611ba3565b6115eb565b6102ff610695366004611ba3565b611626565b60006301ffc9a760e01b6001600160e01b0319831614806106cb57506380ac58cd60e01b6001600160e01b03198316145b806106e65750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546106f990611d63565b80601f016020809104026020016040519081016040528092919081815260200182805461072590611d63565b80156107725780601f1061074757610100808354040283529160200191610772565b820191906000526020600020905b81548152906001019060200180831161075557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806107c357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108055760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633148061088957503360009081526007602052604090205460ff165b6108a55760405162461bcd60e51b81526004016107fc90611d9d565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6006546001600160a01b031633148061091957503360009081526007602052604090205460ff165b6109355760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b6006546001600160a01b03163314806109a757503360009081526007602052604090205460ff165b6109c35760405162461bcd60e51b81526004016107fc90611d9d565b600e8054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f4fcfdc14a2d7c38e14011015845a12e4985a6b2da818f5d3e0f281663054dd1d90600090a250565b600e5460ff1615610a39576040516319e7856f60e31b815260040160405180910390fd5b610a448383836116b6565b505050565b610a54838383610a15565b6001600160a01b0382163b1580610afd5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611dc3565b6001600160e01b031916145b610a445760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016107fc565b6000818152600260205260409020546001600160a01b03163314610b735760405163130213c560e21b815260040160405180910390fd5b610b7c8161186b565b50565b6006546001600160a01b0316331480610ba757503360009081526007602052604090205460ff165b610bc35760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517f2396516b8f39182e7de226453aeab91a95e0dc15148cca8d22862bfdca973ab79190a250565b6000818152600260205260409020546001600160a01b031680610c615760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016107fc565b919050565b6000818152600f60205260408120546001600160a01b031680610c9957600e5461010090046001600160a01b0316610c9b565b805b9392505050565b6006546001600160a01b0316331480610cca57503360009081526007602052604090205460ff165b610ce65760405162461bcd60e51b81526004016107fc90611d9d565b600e805460ff19168215159081179091556040517f2e9f3b412c55aa6b409461b0ba4ebda518eab71cc77b10ba4c1646441bad9c2490600090a250565b6006546001600160a01b0316331480610d4b57503360009081526007602052604090205460ff165b610d675760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b60006001600160a01b038216610dfb5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016107fc565b506001600160a01b031660009081526003602052604090205490565b6000828152600260205260409020546001600160a01b03163314610e4e5760405163130213c560e21b815260040160405180910390fd5b6000828152600f602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917f5fa4ff331be271950c4451780717a1084b0e1f34fda67dc4b733e0f0227ce7ed9190a35050565b336000908152600b602052604090205460ff16610ed75760405163744c61cf60e01b815260040160405180910390fd5b610b7c816001611926565b6006546001600160a01b0316331480610f0a57503360009081526007602052604090205460ff165b610f265760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600b6020526040808220805460ff19169055517f6a2565c094d34ef4282ff1dd80f1923f8cc11bec9d47f7f10bc242782ae21eb39190a250565b6006546001600160a01b0316331480610f9757503360009081526007602052604090205460ff165b610fb35760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f1b8ed20b3ef89189e34db0bbd25235411f4b19eade0d80e906bc7fe9fe11b5e39190a250565b600180546106f990611d63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600b602052604090205460ff166110a85760405163744c61cf60e01b815260040160405180910390fd5b6000828152600260205260409020546001600160a01b031681156110d1576110d1816001611926565b6110da8361186b565b6040516001600160a01b0382169084907fe0fd1a23de299d57e22d2f21e65b192237ef36c4c8a96af320596376ee4e463390600090a3505050565b611120858585610a15565b6001600160a01b0384163b15806111b75750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111689033908a90899089908990600401611de0565b6020604051808303816000875af1158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190611dc3565b6001600160e01b031916145b6111f65760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016107fc565b5050505050565b6000818152600f602052604080822080546001600160a01b03191690555182917fc3df6f8202cccdab16b825d5610eff51b6f18621f34bd7dc1672ede671dc47b291a250565b6000818152600f60205260409020546060906001600160a01b03168061127957600e5461010090046001600160a01b031661127b565b805b6001600160a01b031663c87b56dd846040518263ffffffff1660e01b81526004016112a891815260200190565b600060405180830381865afa1580156112c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9b9190810190611e4a565b6006546001600160a01b031633148061131557503360009081526007602052604090205460ff165b6113315760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fa01b61973d92908da17583fb8624c7d5aa201a4a7a84504001b0aa46c2bc89c29190a250565b336000908152600d602052604090205460ff166113aa576040516319e7856f60e31b815260040160405180910390fd5b6001600160a01b0381166113d1576040516337af64f560e11b815260040160405180910390fd5b600082815260026020908152604080832080546001600160a01b039081168086526003855283862080546000190190559086168086528386208054600101905587865282546001600160a01b0319908116821790935560049094528285208054909216909155905190928592918491600080516020611ef883398151915291a4505050565b6006546001600160a01b031633148061147e57503360009081526007602052604090205460ff165b61149a5760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517fc83d0207a8597a7d0720d8b88a26d14cf790396c65bb2d26d1f92d7e54f8441c9190a250565b3360009081526009602052604090205460ff166115135760405163e5c29bf960e01b815260040160405180910390fd5b6001600160a01b03811660009081526003602052604090205481901561154c57604051632e35a2d360e01b815260040160405180910390fd5b6001600160a01b0382166000908152600c6020526040902054829060ff1615611588576040516334d6b50360e01b815260040160405180910390fd5b611594836008546119c6565b600880546000908152600a6020526040808220439055915491516001600160a01b03861692917f6107862cd596ec59a636fe781d2a973383cd99ee80d759285dfc9189e3c2e68591a3505060088054600101905550565b336000908152600b602052604090205460ff1661161b5760405163744c61cf60e01b815260040160405180910390fd5b610b7c816000611926565b6006546001600160a01b031633148061164e57503360009081526007602052604090205460ff165b61166a5760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f2d2a969627910a58cde268c6256ada6c5b473541597bfc3e180d7282948416cc9190a250565b6000818152600260205260409020546001600160a01b0384811691161461170c5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016107fc565b6001600160a01b0382166117565760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016107fc565b336001600160a01b038416148061179057506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806117b157506000818152600460205260409020546001600160a01b031633145b6117ee5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016107fc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b0319908116831790915560049092528483208054909216909155925184939291600080516020611ef883398151915291a4505050565b6000818152600260205260409020546001600160a01b0316806118bd5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016107fc565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020611ef8833981519152908390a45050565b6001600160a01b0382166000908152600c60205260409020805460ff19168215801591909117909155611988576040516001600160a01b038316907fe2ae7b09acdfab2df73a8174ca23c87ed094f49fc18e20c6dbfae1d92adea2de90600090a25b806119c2576040516001600160a01b038316907fbe76cf0c643d5640d5402bb6858d29393f3bcc6a307e3898526e7f42eac9705b90600090a25b5050565b6001600160a01b038216611a105760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016107fc565b6000818152600260205260409020546001600160a01b031615611a665760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107fc565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020611ef8833981519152908290a45050565b6001600160e01b031981168114610b7c57600080fd5b600060208284031215611ae757600080fd5b8135610c9b81611abf565b60005b83811015611b0d578181015183820152602001611af5565b50506000910152565b6020815260008251806020840152611b35816040850160208701611af2565b601f01601f19169190910160400192915050565b600060208284031215611b5b57600080fd5b5035919050565b80356001600160a01b0381168114610c6157600080fd5b60008060408385031215611b8c57600080fd5b611b9583611b62565b946020939093013593505050565b600060208284031215611bb557600080fd5b610c9b82611b62565b600080600060608486031215611bd357600080fd5b611bdc84611b62565b9250611bea60208501611b62565b9150604084013590509250925092565b80358015158114610c6157600080fd5b600060208284031215611c1c57600080fd5b610c9b82611bfa565b60008060408385031215611c3857600080fd5b82359150611c4860208401611b62565b90509250929050565b60008060408385031215611c6457600080fd5b611c6d83611b62565b9150611c4860208401611bfa565b60008060408385031215611c8e57600080fd5b82359150611c4860208401611bfa565b600080600080600060808688031215611cb657600080fd5b611cbf86611b62565b9450611ccd60208701611b62565b935060408601359250606086013567ffffffffffffffff80821115611cf157600080fd5b818801915088601f830112611d0557600080fd5b813581811115611d1457600080fd5b896020828501011115611d2657600080fd5b9699959850939650602001949392505050565b60008060408385031215611d4c57600080fd5b611d5583611b62565b9150611c4860208401611b62565b600181811c90821680611d7757607f821691505b602082108103611d9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600060208284031215611dd557600080fd5b8151610c9b81611abf565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611e5c57600080fd5b815167ffffffffffffffff80821115611e7457600080fd5b818401915084601f830112611e8857600080fd5b815181811115611e9a57611e9a611e34565b604051601f8201601f19908116603f01168101908382118183101715611ec257611ec2611e34565b81604052828152876020848701011115611edb57600080fd5b611eec836020830160208801611af2565b97965050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c6343000811000a000000000000000000000000c7f3c5a56336cd6e85eb77b577e4215c68a7a87a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c806371c153ee11610151578063b88d4fde116100c3578063dfa6c5cd11610087578063dfa6c5cd1461060a578063e985e9c514610620578063efdc3cd11461064e578063f6029dbf14610661578063f817242d14610674578063ffceb7f41461068757600080fd5b8063b88d4fde146105ab578063b9b6ab97146105be578063c87b56dd146105d1578063d023f8f6146105e4578063d454dfaf146105f757600080fd5b80638f3c7894116101155780638f3c78941461051357806395d89b4114610526578063a22cb4651461052e578063a30774e014610541578063aa30d23c1461056c578063b299efef1461057f57600080fd5b806371c153ee146104a7578063752d5477146104ba5780637ae9743b146104cd57806381df1565146104ed5780638da5cb5b1461050057600080fd5b806342966c68116101ea5780635da08c61116101ae5780635da08c61146104275780636352211e1461043a578063678423721461044d5780636ed301ca14610460578063704802751461047357806370a082311461048657600080fd5b806342966c681461038c578063429b62e51461039f578063501feb31146103c25780635521143e146103ee5780635aba7f811461041a57600080fd5b80631785f53c116102315780631785f53c146103145780631f4c3fad1461032757806323b872dd1461033a57806335c2a0261461034d57806342842e0e1461037957600080fd5b806301ffc9a71461026e57806306fdde0314610296578063081812fc146102ab578063095ea7b3146102ec57806313af403514610301575b600080fd5b61028161027c366004611ad5565b61069a565b60405190151581526020015b60405180910390f35b61029e6106ec565b60405161028d9190611b16565b6102d46102b9366004611b49565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161028d565b6102ff6102fa366004611b79565b61077a565b005b6102ff61030f366004611ba3565b610861565b6102ff610322366004611ba3565b6108f1565b6102ff610335366004611ba3565b61097f565b6102ff610348366004611bbe565b610a15565b61028161035b366004611ba3565b6001600160a01b03166000908152600d602052604090205460ff1690565b6102ff610387366004611bbe565b610a49565b6102ff61039a366004611b49565b610b3c565b6102816103ad366004611ba3565b60076020526000908152604090205460ff1681565b6102816103d0366004611ba3565b6001600160a01b031660009081526009602052604090205460ff1690565b6102816103fc366004611ba3565b6001600160a01b03166000908152600b602052604090205460ff1690565b600e546102819060ff1681565b6102ff610435366004611ba3565b610b7f565b6102d4610448366004611b49565b610c0f565b6102d461045b366004611b49565b610c66565b6102ff61046e366004611c0a565b610ca2565b6102ff610481366004611ba3565b610d23565b610499610494366004611ba3565b610db4565b60405190815260200161028d565b6102ff6104b5366004611c25565b610e17565b6102ff6104c8366004611ba3565b610ea7565b6104996104db366004611b49565b6000908152600a602052604090205490565b6102ff6104fb366004611ba3565b610ee2565b6006546102d4906001600160a01b031681565b6102ff610521366004611ba3565b610f6f565b61029e610fff565b6102ff61053c366004611c51565b61100c565b61028161054f366004611ba3565b6001600160a01b0316600090815260036020526040902054151590565b6102ff61057a366004611c7b565b611078565b61028161058d366004611ba3565b6001600160a01b03166000908152600c602052604090205460ff1690565b6102ff6105b9366004611c9e565b611115565b6102ff6105cc366004611b49565b6111fd565b61029e6105df366004611b49565b611243565b6102ff6105f2366004611ba3565b6112ed565b6102ff610605366004611c25565b61137a565b600e5461010090046001600160a01b03166102d4565b61028161062e366004611d39565b600560209081526000928352604080842090915290825290205460ff1681565b6102ff61065c366004611ba3565b611456565b6102ff61066f366004611ba3565b6114e3565b6102ff610682366004611ba3565b6115eb565b6102ff610695366004611ba3565b611626565b60006301ffc9a760e01b6001600160e01b0319831614806106cb57506380ac58cd60e01b6001600160e01b03198316145b806106e65750635b5e139f60e01b6001600160e01b03198316145b92915050565b600080546106f990611d63565b80601f016020809104026020016040519081016040528092919081815260200182805461072590611d63565b80156107725780601f1061074757610100808354040283529160200191610772565b820191906000526020600020905b81548152906001019060200180831161075557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806107c357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108055760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633148061088957503360009081526007602052604090205460ff165b6108a55760405162461bcd60e51b81526004016107fc90611d9d565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6006546001600160a01b031633148061091957503360009081526007602052604090205460ff165b6109355760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260076020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a350565b6006546001600160a01b03163314806109a757503360009081526007602052604090205460ff165b6109c35760405162461bcd60e51b81526004016107fc90611d9d565b600e8054610100600160a81b0319166101006001600160a01b038416908102919091179091556040517f4fcfdc14a2d7c38e14011015845a12e4985a6b2da818f5d3e0f281663054dd1d90600090a250565b600e5460ff1615610a39576040516319e7856f60e31b815260040160405180910390fd5b610a448383836116b6565b505050565b610a54838383610a15565b6001600160a01b0382163b1580610afd5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af19190611dc3565b6001600160e01b031916145b610a445760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016107fc565b6000818152600260205260409020546001600160a01b03163314610b735760405163130213c560e21b815260040160405180910390fd5b610b7c8161186b565b50565b6006546001600160a01b0316331480610ba757503360009081526007602052604090205460ff165b610bc35760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600d6020526040808220805460ff19166001179055517f2396516b8f39182e7de226453aeab91a95e0dc15148cca8d22862bfdca973ab79190a250565b6000818152600260205260409020546001600160a01b031680610c615760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016107fc565b919050565b6000818152600f60205260408120546001600160a01b031680610c9957600e5461010090046001600160a01b0316610c9b565b805b9392505050565b6006546001600160a01b0316331480610cca57503360009081526007602052604090205460ff165b610ce65760405162461bcd60e51b81526004016107fc90611d9d565b600e805460ff19168215159081179091556040517f2e9f3b412c55aa6b409461b0ba4ebda518eab71cc77b10ba4c1646441bad9c2490600090a250565b6006546001600160a01b0316331480610d4b57503360009081526007602052604090205460ff165b610d675760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260076020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a350565b60006001600160a01b038216610dfb5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b60448201526064016107fc565b506001600160a01b031660009081526003602052604090205490565b6000828152600260205260409020546001600160a01b03163314610e4e5760405163130213c560e21b815260040160405180910390fd5b6000828152600f602052604080822080546001600160a01b0319166001600160a01b0385169081179091559051909184917f5fa4ff331be271950c4451780717a1084b0e1f34fda67dc4b733e0f0227ce7ed9190a35050565b336000908152600b602052604090205460ff16610ed75760405163744c61cf60e01b815260040160405180910390fd5b610b7c816001611926565b6006546001600160a01b0316331480610f0a57503360009081526007602052604090205460ff165b610f265760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600b6020526040808220805460ff19169055517f6a2565c094d34ef4282ff1dd80f1923f8cc11bec9d47f7f10bc242782ae21eb39190a250565b6006546001600160a01b0316331480610f9757503360009081526007602052604090205460ff165b610fb35760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260096020526040808220805460ff19166001179055517f1b8ed20b3ef89189e34db0bbd25235411f4b19eade0d80e906bc7fe9fe11b5e39190a250565b600180546106f990611d63565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b336000908152600b602052604090205460ff166110a85760405163744c61cf60e01b815260040160405180910390fd5b6000828152600260205260409020546001600160a01b031681156110d1576110d1816001611926565b6110da8361186b565b6040516001600160a01b0382169084907fe0fd1a23de299d57e22d2f21e65b192237ef36c4c8a96af320596376ee4e463390600090a3505050565b611120858585610a15565b6001600160a01b0384163b15806111b75750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906111689033908a90899089908990600401611de0565b6020604051808303816000875af1158015611187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ab9190611dc3565b6001600160e01b031916145b6111f65760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b60448201526064016107fc565b5050505050565b6000818152600f602052604080822080546001600160a01b03191690555182917fc3df6f8202cccdab16b825d5610eff51b6f18621f34bd7dc1672ede671dc47b291a250565b6000818152600f60205260409020546060906001600160a01b03168061127957600e5461010090046001600160a01b031661127b565b805b6001600160a01b031663c87b56dd846040518263ffffffff1660e01b81526004016112a891815260200190565b600060405180830381865afa1580156112c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c9b9190810190611e4a565b6006546001600160a01b031633148061131557503360009081526007602052604090205460ff165b6113315760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b038116600081815260096020526040808220805460ff19169055517fa01b61973d92908da17583fb8624c7d5aa201a4a7a84504001b0aa46c2bc89c29190a250565b336000908152600d602052604090205460ff166113aa576040516319e7856f60e31b815260040160405180910390fd5b6001600160a01b0381166113d1576040516337af64f560e11b815260040160405180910390fd5b600082815260026020908152604080832080546001600160a01b039081168086526003855283862080546000190190559086168086528386208054600101905587865282546001600160a01b0319908116821790935560049094528285208054909216909155905190928592918491600080516020611ef883398151915291a4505050565b6006546001600160a01b031633148061147e57503360009081526007602052604090205460ff165b61149a5760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600d6020526040808220805460ff19169055517fc83d0207a8597a7d0720d8b88a26d14cf790396c65bb2d26d1f92d7e54f8441c9190a250565b3360009081526009602052604090205460ff166115135760405163e5c29bf960e01b815260040160405180910390fd5b6001600160a01b03811660009081526003602052604090205481901561154c57604051632e35a2d360e01b815260040160405180910390fd5b6001600160a01b0382166000908152600c6020526040902054829060ff1615611588576040516334d6b50360e01b815260040160405180910390fd5b611594836008546119c6565b600880546000908152600a6020526040808220439055915491516001600160a01b03861692917f6107862cd596ec59a636fe781d2a973383cd99ee80d759285dfc9189e3c2e68591a3505060088054600101905550565b336000908152600b602052604090205460ff1661161b5760405163744c61cf60e01b815260040160405180910390fd5b610b7c816000611926565b6006546001600160a01b031633148061164e57503360009081526007602052604090205460ff165b61166a5760405162461bcd60e51b81526004016107fc90611d9d565b6001600160a01b0381166000818152600b6020526040808220805460ff19166001179055517f2d2a969627910a58cde268c6256ada6c5b473541597bfc3e180d7282948416cc9190a250565b6000818152600260205260409020546001600160a01b0384811691161461170c5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b60448201526064016107fc565b6001600160a01b0382166117565760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016107fc565b336001600160a01b038416148061179057506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806117b157506000818152600460205260409020546001600160a01b031633145b6117ee5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064016107fc565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b0319908116831790915560049092528483208054909216909155925184939291600080516020611ef883398151915291a4505050565b6000818152600260205260409020546001600160a01b0316806118bd5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016107fc565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020611ef8833981519152908390a45050565b6001600160a01b0382166000908152600c60205260409020805460ff19168215801591909117909155611988576040516001600160a01b038316907fe2ae7b09acdfab2df73a8174ca23c87ed094f49fc18e20c6dbfae1d92adea2de90600090a25b806119c2576040516001600160a01b038316907fbe76cf0c643d5640d5402bb6858d29393f3bcc6a307e3898526e7f42eac9705b90600090a25b5050565b6001600160a01b038216611a105760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b60448201526064016107fc565b6000818152600260205260409020546001600160a01b031615611a665760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b60448201526064016107fc565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020611ef8833981519152908290a45050565b6001600160e01b031981168114610b7c57600080fd5b600060208284031215611ae757600080fd5b8135610c9b81611abf565b60005b83811015611b0d578181015183820152602001611af5565b50506000910152565b6020815260008251806020840152611b35816040850160208701611af2565b601f01601f19169190910160400192915050565b600060208284031215611b5b57600080fd5b5035919050565b80356001600160a01b0381168114610c6157600080fd5b60008060408385031215611b8c57600080fd5b611b9583611b62565b946020939093013593505050565b600060208284031215611bb557600080fd5b610c9b82611b62565b600080600060608486031215611bd357600080fd5b611bdc84611b62565b9250611bea60208501611b62565b9150604084013590509250925092565b80358015158114610c6157600080fd5b600060208284031215611c1c57600080fd5b610c9b82611bfa565b60008060408385031215611c3857600080fd5b82359150611c4860208401611b62565b90509250929050565b60008060408385031215611c6457600080fd5b611c6d83611b62565b9150611c4860208401611bfa565b60008060408385031215611c8e57600080fd5b82359150611c4860208401611bfa565b600080600080600060808688031215611cb657600080fd5b611cbf86611b62565b9450611ccd60208701611b62565b935060408601359250606086013567ffffffffffffffff80821115611cf157600080fd5b818801915088601f830112611d0557600080fd5b813581811115611d1457600080fd5b896020828501011115611d2657600080fd5b9699959850939650602001949392505050565b60008060408385031215611d4c57600080fd5b611d5583611b62565b9150611c4860208401611b62565b600181811c90821680611d7757607f821691505b602082108103611d9757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b600060208284031215611dd557600080fd5b8151610c9b81611abf565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215611e5c57600080fd5b815167ffffffffffffffff80821115611e7457600080fd5b818401915084601f830112611e8857600080fd5b815181811115611e9a57611e9a611e34565b604051601f8201601f19908116603f01168101908382118183101715611ec257611ec2611e34565b81604052828152876020848701011115611edb57600080fd5b611eec836020830160208801611af2565b97965050505050505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa164736f6c6343000811000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c7f3c5a56336cd6e85eb77b577e4215c68a7a87a
-----Decoded View---------------
Arg [0] : owner_ (address): 0xc7F3c5A56336Cd6E85eb77b577e4215c68a7a87a
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c7f3c5a56336cd6e85eb77b577e4215c68a7a87a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.