ETH Price: $3,161.22 (+1.43%)
Gas: 1 Gwei

Token

DEF (Definitely Memberships)
 

Overview

Max Total Supply

0 Definitely Memberships

Holders

136

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
ashtyn.eth
Balance
1 Definitely Memberships
0xc6b2a700963e479d49cc549865516ab1f4d236e2
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DefinitelyMemberships

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : ERC721.sol
// 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;
    }
}

File 2 of 5 : DefinitelyMemberships.sol
//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];
    }
}

File 3 of 5 : IDefinitelyMemberships.sol
// 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);
}

File 4 of 5 : IDefinitelyMetadata.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.17;

interface IDefinitelyMetadata {
    function tokenURI(uint256 id) external view returns (string memory);
}

File 5 of 5 : Auth.sol
// 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);
    }
}

Settings
{
  "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

Contract ABI

[{"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"}]

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.