ETH Price: $2,605.03 (-0.23%)

Relic (RELIC)
 

Overview

TokenID

100000045

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

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:
Relic

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
File 1 of 1 : SJ741.sol
// https://relic.build/
// https://t.me/RelicPortal
// https://twitter.com/relic_SJ741

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// libraries to separate ERC20 and ERC721 events, and certain signature-specific functions
// ERC20 events
library libSJ20 {
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); }
    function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); }
}

// ERC721 events
library libSJ721 {
    event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); }
    function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); }
    function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); }
}

// ERC165 https://eips.ethereum.org/EIPS/eip-721
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// ERC20 https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// ERC721 https://eips.ethereum.org/EIPS/eip-721
interface IERC721 is IERC165 {
    function balanceOf(address account) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    // payable removed for erc20 etherscan compatibility
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface ISJ741 is IERC20, IERC721 {
    // library transfers can not be included in the interface
    // incorporate them directly with library
    // libSJ20.Transfer
    // libSJ20.Approval
    // libSJ721.Transfer
    // libSJ721.Approval
    // libSJ721.ApprovalForAll
    function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256);
    function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool);
    function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool);
}

// ERC721 Token Receiver https://eips.ethereum.org/EIPS/eip-721
interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

contract Relic is ISJ741 {

    string public baseURI = "https://relic.build/image/";
    string internal constant _name = "Relic";
    string internal constant _symbol = "RELIC";

    uint internal constant _decimals = 8;
    uint internal constant _totalIds = 256;
    uint internal constant _totalSupply = _totalIds * 10**_decimals; 
    uint internal constant ONE = 10**_decimals; // 1.0 token(s)
    uint internal constant MAXID = ONE + _totalIds;  // 1.00000001 : 1.00000256 is the range for NFT IDs

    uint32 public minted; // number of unique ID mints
    uint32[] private broken; // broken NFTs stored in limbo list 

    address public dev;
    bool public supportsNFTinterface;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(address => mapping(address => uint)) internal _allowance;
    mapping(uint256 tokenId => address) public ownerOf;
    mapping(uint256 => address) private _nftApprovals;
    mapping(address => uint) internal _balanceOf;
    mapping(address => uint32[]) public ownedNFTs;
    mapping(uint32 => uint256) private idToIndex; 

    uint256 public MINT_COST = 0.15 ether;

    error UnsupportedReceiver();

    modifier onlyDev() {
        require(msg.sender == dev, "Not the developer");
        _;
    }

    constructor(address _dev) {
        //set minted at ONE to ensure correct operation within range of IDs
        minted = uint32(ONE);

        //the message sender receives the entire supply, and is set as "dev"

        // half is mintable via contract directly
        uint256 mintable = _totalSupply / 2;
        _balanceOf[address(this)] = mintable;

        _balanceOf[_dev] = _totalSupply - mintable; 
        dev = _dev;
    }

    function mint() external payable {
        address _this = address(this);
        uint256 _available = balanceOf(_this);
        require(1 <= _available);
        uint256 _cost = 1 * MINT_COST;
        require(msg.value >= _cost);
        _transfer20(_this, msg.sender, ONE);
        payable(dev).transfer(_cost);
        if (msg.value > _cost) {
            payable(msg.sender).transfer(msg.value - _cost);
        }
    }

    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint) { return _decimals; }
    function totalSupply() public pure override returns (uint) { return _totalSupply; }
    function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; }
    function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; }
    function setBaseURI(string memory newBaseURI) public onlyDev {baseURI = newBaseURI;}
    function changeDev(address newDev) public onlyDev {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0))
    // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag
    // don't waste it, as frontends don't typically change classification of contracts
    // probably never to be used.
    function toggelNFTinterface() public onlyDev {supportsNFTinterface = !supportsNFTinterface;}


    function approve(address spender, uint amount) public override returns (bool) {

        // if the amount is greater than one token, and within range of IDs for NFTs 
        // then set NFT approval for the given ID
        if(amount > ONE && amount <= MAXID) {
            address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("SJ741: You are not approved");
            _nftApprovals[amount] = spender; // calling nft approval for the token and spender
            libSJ721.emitApproval(owner, spender, amount);
            return true;
        }
        
        // else set the ERC20 allowance
        // the NFT ID range being set within a limited subset of ONE token(s)
        // allows for non-clashing interactions
        _allowance[msg.sender][spender] = amount;
        libSJ20.emitApproval(msg.sender, spender, amount);
        return true;
    }

    function _transfer741(address from, address to, uint amount) internal virtual {
        
        require(_balanceOf[from] >= amount, "SJ741: transfer amount exceeds balance");
        
        // checking the decimal amount of tokens owned before transaction for both participants
        uint256 fromDecimalsPre = _balanceOf[from] % ONE;
        uint256 toDecimalsPre = _balanceOf[to] % ONE;
        
        // simple erc20 balance operations
        _transfer20(from, to, amount);

        // checking the decimal amount of tokens after transaction for both partcipants
        uint256 fromDecimalsPost = _balanceOf[from] % ONE;
        uint256 toDecimalsPost = _balanceOf[to] % ONE;

        // stores the NFT IDs owned by `from`, enabling NFT management for that address.
        uint32[] storage ownedNFTsArray = ownedNFTs[from];

        // references NFTs marked as "broken", tracking these special state NFTs.
        uint32[] storage brokenIDsArray = broken;

        // if sender has higher decimal count after transaction, then they "roll under" and break an NFT
        if (fromDecimalsPre < fromDecimalsPost) {

            if(ownedNFTsArray.length > 0) { // if the sender has an nft to send

                uint32 tokenId = ownedNFTsArray[0];//selects the user's first NFT from the list

                brokenIDsArray.push(tokenId);//pushes the nft into the "broken list" for limbo NFTs
                _transfer721(from, address(0), tokenId);//transfers the NFT ID ownership to (0) address for stewardship
            }
        }

        // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft 
        if (toDecimalsPre > toDecimalsPost) {

            if(brokenIDsArray.length > 0) { // recover an id from broken list

                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }
            else { // mint new id
                _mint(to);
            }
            
        }
        
        // amount of tokens - amount of whole tokens being processed in int
        uint amountInTokens = amount / ONE;

        // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations
        // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract
        // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected
        if(from == dev) return;


        if(amountInTokens > 0) {

            uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array
            len = amountInTokens < len ? amountInTokens : len;
            // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached
            // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers
            for (uint i = 0; i < len; i++) {
                _transfer721(from, to, ownedNFTsArray[0]); 
            }
            amountInTokens -= len;
            len = brokenIDsArray.length;
            len = amountInTokens < len ? amountInTokens : len;
            
            // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available
            // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance
            for (uint i = 0; i < len; i++) {        
                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }

            _mintBatch(to, amountInTokens - len);

        }
    }

    function _mintBatch(address to, uint256 amount) internal {
        if(amount == 0) return; // Exit if no NFTs to mint

        if(amount == 1) { // Optimize single mint process
            _mint(to);
            return;
        }
        uint32 id = minted; // Start ID from last minted value
        uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to'
        for(uint i = 0; i < amount;) {
            unchecked {
                id++; // Increment ID for each new NFT
            }
            ownerOf[id] = to; // Assign new NFT to owner.
            idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array
            ownedNFTs[to].push(id); // Add new NFT ID to owner's list

            libSJ721.emitTransfer(address(0), to, id); // Emit NFT transfer event

            unchecked {
                ownedLen++; // Increment count of owned NFTs
                i++; // Move to next NFT
            }
        }
        unchecked {
            minted += uint32(amount); // Update total minted count
        }
    }


    function _mint(address to) internal returns(uint32 tokenId){
        unchecked {
            minted++; // Increment the total number of minted tokens
        }
        tokenId = minted; // Assign the newly minted token ID

        ownerOf[tokenId] = to; // Set ownership of the new token to 'to'
        idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list
        ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens
        
        libSJ721.emitTransfer(address(0), to, tokenId); // Emit an event for the token transfer
    }


    // Updates the mappings and arrays managing ownership and index of NFTs after a transfer
    function _updateOwnedNFTs(address from, address to, uint32 tokenId) internal { 
        uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list
        uint32[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from'
        uint256 len = nftArray.length; // Current number of NFTs owned by 'from'
        uint32 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token
        
        nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'
        
        if(len - 1 != 0){ 
            idToIndex[lastTokenId] = index; // Update the index of the swapped token
        } 
    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token
    }

    // Executes a simple ERC20 token transfer.
    function _transfer20(address from, address to, uint256 amount) internal {
        _balanceOf[from] -= amount; // Deduct the amount from the sender's balance
        unchecked {
            _balanceOf[to] += amount; // Add the amount to the recipient's balance
        }
        libSJ20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721(address from, address to, uint32 tokenId) internal virtual {
        require(from == ownerOf[tokenId], "SJ741: Incorrect owner"); // Ensure 'from' is the current owner
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures
        libSJ721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }


    // only erc20 calls this
    // if amount is a token id owned my the caller send as an NFT
    // else transfer741
    function transfer(address to, uint amount) public override returns (bool) {
        if(ownerOf[amount] == msg.sender) {
            _transfer721(msg.sender, to, uint32(amount));
            _transfer20(msg.sender, to, ONE);
            return true;
        }
        _transfer741(msg.sender, to, amount);
        return true;
    }

    // erc20 and erc721 call this
    function transferFrom(address from, address to, uint amount) public override returns (bool) {

        //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE)
        if(amount > ONE && amount <= MAXID) {
            require(
                //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs 
                msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
                );

            _transfer721(from, to, uint32(amount));
            _transfer20(from, to, ONE);
            return true;
        }

        _spendAllowance(from, msg.sender, amount);
        _transfer741(from, to, amount);
        return true;

    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
            );
        _transfer721(from, to, uint32(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "SJ741: You don't have the right"
            );
        _transfer721(from, to, uint32(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    function _spendAllowance(address owner, address spender, uint amount) internal virtual {
        require(_allowance[owner][spender] >= amount, "SJ741: insufficient allowance");
        _allowance[owner][spender] -= amount;
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (ownerOf[tokenId] == address(0)) revert();
        return _nftApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _operatorApprovals[msg.sender][operator] = approved;
        libSJ721.emitApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(tokenId <= MAXID, "SJ741: invalid id");
        if (bytes(baseURI).length == 0) {return "";}

        uint256 seed = uint256(keccak256(abi.encodePacked(tokenId)));
        // we have 5 images with increasing rarity
        string memory image;

        uint256 index = seed % 100;
        if (index < 40) {
            image = "common.png";
        } else if (index < 70) {
            image = "uncommon.png";
        } else if (index < 90) {
            image = "rare.png";
        } else if (index < 97) {
            image = "epic.png";
        } else {
            image = "mythic.png";
        }
        return string(abi.encodePacked(baseURI, image));
    }

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

    function withdraw() external onlyDev {
        payable(dev).transfer(address(this).balance);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return
            // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20
            // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific
            (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165
            interfaceId == 0x36372b07;   // ERC165 interface ID for ERC20
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_dev","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","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":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","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":"supportsNFTinterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052601a60809081527f68747470733a2f2f72656c69632e6275696c642f696d6167652f00000000000060a0525f906200003d9082620001e2565b50670214e8348c4f0000600b5534801562000056575f80fd5b50604051620025dd380380620025dd8339810160408190526200007991620002aa565b620000876008600a620003e8565b6001805463ffffffff191663ffffffff929092169190911790555f6002620000b26008600a620003e8565b620000c090610100620003f5565b620000cc91906200040f565b305f9081526008602081905260409091208290559091508190620000f290600a620003e8565b6200010090610100620003f5565b6200010c91906200042f565b6001600160a01b039092165f8181526008602052604090209290925550600380546001600160a01b031916909117905562000445565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200016b57607f821691505b6020821081036200018a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001dd575f81815260208120601f850160051c81016020861015620001b85750805b601f850160051c820191505b81811015620001d957828155600101620001c4565b5050505b505050565b81516001600160401b03811115620001fe57620001fe62000142565b62000216816200020f845462000156565b8462000190565b602080601f8311600181146200024c575f8415620002345750858301515b5f19600386901b1c1916600185901b178555620001d9565b5f85815260208120601f198616915b828110156200027c578886015182559484019460019091019084016200025b565b50858210156200029a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620002bb575f80fd5b81516001600160a01b0381168114620002d2575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200032d57815f1904821115620003115762000311620002d9565b808516156200031f57918102915b93841c9390800290620002f2565b509250929050565b5f826200034557506001620003e2565b816200035357505f620003e2565b81600181146200036c5760028114620003775762000397565b6001915050620003e2565b60ff8411156200038b576200038b620002d9565b50506001821b620003e2565b5060208310610133831016604e8410600b8410161715620003bc575081810a620003e2565b620003c88383620002ed565b805f1904821115620003de57620003de620002d9565b0290505b92915050565b5f620002d2838362000335565b8082028115828204841417620003e257620003e2620002d9565b5f826200042a57634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115620003e257620003e2620002d9565b61218a80620004535f395ff3fe6080604052600436106101af575f3560e01c80636bcef9a6116100e7578063a563833b11610087578063c662e48111610062578063c662e481146104d3578063c87b56dd146104e8578063dd62ed3e14610507578063e985e9c51461054b575f80fd5b8063a563833b14610481578063a9059cbb146104a1578063b88d4fde146104c0575f80fd5b806388a8c95c116100c257806388a8c95c146103f757806391cca3db1461041657806395d89b4114610435578063a22cb46514610462575f80fd5b80636bcef9a61461039b5780636c0360eb146103af57806370a08231146103c3575f80fd5b806323b872dd1161015257806342842e0e1161012d57806342842e0e146103195780634f02c4201461032c57806355f804b3146103485780636352211e14610367575f80fd5b806323b872dd146102d3578063313ce567146102f25780633ccfd60b14610305575f80fd5b8063095ea7b31161018d578063095ea7b3146102545780631249c58b1461027357806318160ddd1461027d5780631a72b87d1461029f575f80fd5b806301ffc9a7146101b357806306fdde03146101e7578063081812fc1461021d575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004611a5a565b61056a565b60405190151581526020015b60405180910390f35b3480156101f2575f80fd5b5060408051808201909152600581526452656c696360d81b60208201525b6040516101de9190611ac2565b348015610228575f80fd5b5061023c610237366004611ad4565b6105d1565b6040516001600160a01b0390911681526020016101de565b34801561025f575f80fd5b506101d261026e366004611b01565b61060b565b61027b610737565b005b348015610288575f80fd5b50610291610801565b6040519081526020016101de565b3480156102aa575f80fd5b506102be6102b9366004611b01565b61081f565b60405163ffffffff90911681526020016101de565b3480156102de575f80fd5b506101d26102ed366004611b29565b610863565b3480156102fd575f80fd5b506008610291565b348015610310575f80fd5b5061027b61093c565b61027b610327366004611b29565b61099f565b348015610337575f80fd5b506001546102be9063ffffffff1681565b348015610353575f80fd5b5061027b610362366004611be9565b610add565b348015610372575f80fd5b5061023c610381366004611ad4565b60066020525f90815260409020546001600160a01b031681565b3480156103a6575f80fd5b5061027b610b16565b3480156103ba575f80fd5b50610210610b61565b3480156103ce575f80fd5b506102916103dd366004611c36565b6001600160a01b03165f9081526008602052604090205490565b348015610402575f80fd5b5061027b610411366004611c36565b610bec565b348015610421575f80fd5b5060035461023c906001600160a01b031681565b348015610440575f80fd5b5060408051808201909152600581526452454c494360d81b6020820152610210565b34801561046d575f80fd5b5061027b61047c366004611c4f565b610c38565b34801561048c575f80fd5b506003546101d290600160a01b900460ff1681565b3480156104ac575f80fd5b506101d26104bb366004611b01565b610c71565b61027b6104ce366004611c88565b610cbf565b3480156104de575f80fd5b50610291600b5481565b3480156104f3575f80fd5b50610210610502366004611ad4565b610dea565b348015610512575f80fd5b50610291610521366004611cff565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610556575f80fd5b506101d2610565366004611cff565b610fc9565b6003545f90600160a01b900460ff16801561059557506380ac58cd60e01b6001600160e01b03198316145b806105b057506301ffc9a760e01b6001600160e01b03198316145b806105cb57506336372b0760e01b6001600160e01b03198316145b92915050565b5f818152600660205260408120546001600160a01b03166105f0575f80fd5b505f908152600760205260409020546001600160a01b031690565b5f6106186008600a611e15565b8211801561063e57506101006106306008600a611e15565b61063a9190611e20565b8211155b156106fe575f828152600660205260409020546001600160a01b0316338114801590610671575061066f8133610fc9565b155b156106c35760405162461bcd60e51b815260206004820152601b60248201527f534a3734313a20596f7520617265206e6f7420617070726f766564000000000060448201526064015b60405180910390fd5b5f83815260076020526040902080546001600160a01b0319166001600160a01b0386161790556106f4818585610ff6565b60019150506105cb565b335f8181526005602090815260408083206001600160a01b0388168452909152902083905561072e90848461103c565b50600192915050565b305f818152600860205260409020546001811015610753575f80fd5b5f600b5460016107639190611e33565b905080341015610771575f80fd5b61078783336107826008600a611e15565b61108e565b6003546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156107be573d5f803e3d5ffd5b50803411156107fc57336108fc6107d58334611e4a565b6040518115909202915f818181858888f193505050501580156107fa573d5f803e3d5ffd5b505b505050565b5f61080e6008600a611e15565b61081a90610100611e33565b905090565b6009602052815f5260405f208181548110610838575f80fd5b905f5260205f209060089182820401919006600402915091509054906101000a900463ffffffff1681565b5f6108706008600a611e15565b8211801561089657506101006108886008600a611e15565b6108929190611e20565b8211155b1561091b57336001600160a01b03851614806108cb57506108b6826105d1565b6001600160a01b0316336001600160a01b0316145b806108db57506108db8433610fc9565b6108f75760405162461bcd60e51b81526004016106ba90611e5d565b6109028484846110e2565b61091384846107826008600a611e15565b506001610935565b6109268433846111a8565b61093184848461125c565b5060015b9392505050565b6003546001600160a01b031633146109665760405162461bcd60e51b81526004016106ba90611e94565b6003546040516001600160a01b03909116904780156108fc02915f818181858888f1935050505015801561099c573d5f803e3d5ffd5b50565b336001600160a01b03841614806109cf57506109ba816105d1565b6001600160a01b0316336001600160a01b0316145b806109df57506109df8333610fc9565b6109fb5760405162461bcd60e51b81526004016106ba90611e5d565b610a068383836110e2565b610a1783836107826008600a611e15565b6001600160a01b0382163b15801590610abf5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab29190611ebf565b6001600160e01b03191614155b156107fc576040516301d6c93560e61b815260040160405180910390fd5b6003546001600160a01b03163314610b075760405162461bcd60e51b81526004016106ba90611e94565b5f610b128282611f5f565b5050565b6003546001600160a01b03163314610b405760405162461bcd60e51b81526004016106ba90611e94565b6003805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610b6d90611eda565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9990611eda565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b505050505081565b6003546001600160a01b03163314610c165760405162461bcd60e51b81526004016106ba90611e94565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f8181526004602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610b1290838361162e565b5f81815260066020526040812054336001600160a01b0390911603610cb457610c9b3384846110e2565b610cac33846107826008600a611e15565b5060016105cb565b61072e33848461125c565b336001600160a01b0385161480610cef5750610cda826105d1565b6001600160a01b0316336001600160a01b0316145b80610cff5750610cff8433610fc9565b610d1b5760405162461bcd60e51b81526004016106ba90611e5d565b610d268484846110e2565b610d3784846107826008600a611e15565b6001600160a01b0383163b15801590610dcc5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610d7f90339089908890889060040161201b565b6020604051808303815f875af1158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190611ebf565b6001600160e01b03191614155b156107fa576040516301d6c93560e61b815260040160405180910390fd5b6060610100610dfb6008600a611e15565b610e059190611e20565b821115610e485760405162461bcd60e51b815260206004820152601160248201527014d28dcd0c4e881a5b9d985b1a59081a59607a1b60448201526064016106ba565b5f8054610e5490611eda565b90505f03610e6f57505060408051602081019091525f815290565b5f82604051602001610e8391815260200190565b60408051601f198184030181529190528051602090910120905060605f610eab60648461206b565b90506028811015610ee0576040518060400160405280600a815260200169636f6d6d6f6e2e706e6760b01b8152509150610f9d565b6046811015610f15576040518060400160405280600c81526020016b756e636f6d6d6f6e2e706e6760a01b8152509150610f9d565b605a811015610f465760405180604001604052806008815260200167726172652e706e6760c01b8152509150610f9d565b6061811015610f775760405180604001604052806008815260200167657069632e706e6760c01b8152509150610f9d565b6040518060400160405280600a8152602001696d79746869632e706e6760b01b81525091505b5f82604051602001610fb092919061207e565b6040516020818303038152906040529350505050919050565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161108191815260200190565b60405180910390a3505050565b6001600160a01b0383165f90815260086020526040812080548392906110b5908490611e4a565b90915550506001600160a01b0382165f9081526008602052604090208054820190556107fc838383611675565b63ffffffff81165f908152600660205260409020546001600160a01b0384811691161461114a5760405162461bcd60e51b815260206004820152601660248201527529a51b9a189d1024b731b7b93932b1ba1037bbb732b960511b60448201526064016106ba565b63ffffffff81165f90815260076020908152604080832080546001600160a01b0319908116909155600690925290912080549091166001600160a01b0384161790556111978383836116ba565b6107fc83838363ffffffff16611858565b6001600160a01b038084165f9081526005602090815260408083209386168352929052205481111561121c5760405162461bcd60e51b815260206004820152601d60248201527f534a3734313a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ba565b6001600160a01b038084165f90815260056020908152604080832093861683529290529081208054839290611252908490611e4a565b9091555050505050565b6001600160a01b0383165f908152600860205260409020548111156112d25760405162461bcd60e51b815260206004820152602660248201527f534a3734313a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106ba565b5f6112df6008600a611e15565b6001600160a01b0385165f90815260086020526040902054611301919061206b565b90505f6113106008600a611e15565b6001600160a01b0385165f90815260086020526040902054611332919061206b565b905061133f85858561108e565b5f61134c6008600a611e15565b6001600160a01b0387165f9081526008602052604090205461136e919061206b565b90505f61137d6008600a611e15565b6001600160a01b0387165f9081526008602052604090205461139f919061206b565b6001600160a01b0388165f90815260096020526040902090915060028386101561144757815415611447575f825f815481106113dd576113dd612101565b5f9182526020808320600880840490910154865460018101885587865292852091830490910180546007948516600490810261010090810a90940463ffffffff908116969095160290920a8481029302199091169190911790559150611445908b90836110e2565b505b828511156114f2578054156114e7576114a65f89836001858054905061146d9190611e4a565b8154811061147d5761147d612101565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff166110e2565b808054806114b6576114b6612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556114f2565b6114f08861189e565b505b5f6114ff6008600a611e15565b6115099089612129565b6003549091506001600160a01b03908116908b160361152e5750505050505050505050565b80156116225782548082106115435780611545565b815b90505f5b8181101561157a576115688c8c875f8154811061147d5761147d612101565b806115728161213c565b915050611549565b506115858183611e4a565b83549092509050808210611599578061159b565b815b90505f5b8181101561160c576115be5f8c866001888054905061146d9190611e4a565b838054806115ce576115ce612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055806116048161213c565b91505061159f565b506116208a61161b8385611e4a565b611941565b505b50505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611081911515815260200190565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161108191815260200190565b63ffffffff81165f908152600a60209081526040808320546001600160a01b03871684526009909252822080549192909190826116f8600184611e4a565b8154811061170857611708612101565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508083858154811061174157611741612101565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055508280548061178257611782612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556117b9600183611e4a565b156117d65763ffffffff81165f908152600a602052604090208490555b6001600160a01b0386165f81815260096020908152604082208054600180820183558285529284206008820401805460079092166004026101000a63ffffffff81810219909316928c16029190911790559290915290546118379190611e4a565b63ffffffff9095165f908152600a6020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001805463ffffffff19811663ffffffff9182168301821690811783555f81815260066020908152604080832080546001600160a01b0319166001600160a01b038916908117909155835260098083528184208054868652600a8552928520839055908352958101865594825281206008850401805460079095166004026101000a938402199094169282029290921790925561193c908383611858565b919050565b805f0361194c575050565b8060010361195d576107fc8261189e565b6001546001600160a01b0383165f9081526009602052604081205463ffffffff90921691905b83811015611a1f57600192830163ffffffff8181165f81815260066020908152604080832080546001600160a01b0319166001600160a01b038d16908117909155600a8352818420899055835260098252822080549889018155825281206008880401805460079098166004026101000a93840219909716928202929092179095559093611a1391908790611858565b60019182019101611983565b50506001805463ffffffff19811663ffffffff9182169490940116929092179091555050565b6001600160e01b03198116811461099c575f80fd5b5f60208284031215611a6a575f80fd5b813561093581611a45565b5f5b83811015611a8f578181015183820152602001611a77565b50505f910152565b5f8151808452611aae816020860160208601611a75565b601f01601f19169290920160200192915050565b602081525f6109356020830184611a97565b5f60208284031215611ae4575f80fd5b5035919050565b80356001600160a01b038116811461193c575f80fd5b5f8060408385031215611b12575f80fd5b611b1b83611aeb565b946020939093013593505050565b5f805f60608486031215611b3b575f80fd5b611b4484611aeb565b9250611b5260208501611aeb565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611b9057611b90611b62565b604051601f8501601f19908116603f01168101908282118183101715611bb857611bb8611b62565b81604052809350858152868686011115611bd0575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611bf9575f80fd5b813567ffffffffffffffff811115611c0f575f80fd5b8201601f81018413611c1f575f80fd5b611c2e84823560208401611b76565b949350505050565b5f60208284031215611c46575f80fd5b61093582611aeb565b5f8060408385031215611c60575f80fd5b611c6983611aeb565b915060208301358015158114611c7d575f80fd5b809150509250929050565b5f805f8060808587031215611c9b575f80fd5b611ca485611aeb565b9350611cb260208601611aeb565b925060408501359150606085013567ffffffffffffffff811115611cd4575f80fd5b8501601f81018713611ce4575f80fd5b611cf387823560208401611b76565b91505092959194509250565b5f8060408385031215611d10575f80fd5b611d1983611aeb565b9150611d2760208401611aeb565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115611d7e57815f1904821115611d6457611d64611d30565b80851615611d7157918102915b93841c9390800290611d49565b509250929050565b5f82611d94575060016105cb565b81611da057505f6105cb565b81600181146106f45760028103611dcd5760ff841115611dc257611dc2611d30565b50506001821b6105cb565b5060208310610133831016604e8410600b8410161715611df0575081810a6105cb565b611dfa8383611d44565b805f1904821115611e0d57611e0d611d30565b029392505050565b5f6109358383611d86565b808201808211156105cb576105cb611d30565b80820281158282048414176105cb576105cb611d30565b818103818111156105cb576105cb611d30565b6020808252601f908201527f534a3734313a20596f7520646f6e277420686176652074686520726967687400604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f60208284031215611ecf575f80fd5b815161093581611a45565b600181811c90821680611eee57607f821691505b602082108103611f0c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156107fc575f81815260208120601f850160051c81016020861015611f385750805b601f850160051c820191505b81811015611f5757828155600101611f44565b505050505050565b815167ffffffffffffffff811115611f7957611f79611b62565b611f8d81611f878454611eda565b84611f12565b602080601f831160018114611fc0575f8415611fa95750858301515b5f19600386901b1c1916600185901b178555611f57565b5f85815260208120601f198616915b82811015611fee57888601518255948401946001909101908401611fcf565b508582101561200b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061204d90830184611a97565b9695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261207957612079612057565b500690565b5f80845461208b81611eda565b600182811680156120a357600181146120b8576120e4565b60ff19841687528215158302870194506120e4565b885f526020805f205f5b858110156120db5781548a8201529084019082016120c2565b50505082870194505b5050505083516120f8818360208801611a75565b01949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f8261213757612137612057565b500490565b5f6001820161214d5761214d611d30565b506001019056fea26469706673582212208e6a3b1ebf46dd56910062c7b8bc50685dcd94507bc7d525f0cf2fa9767692e864736f6c63430008140033000000000000000000000000cf3676bbf2e70527418bdd1bd5d6f54a25fcb48b

Deployed Bytecode

0x6080604052600436106101af575f3560e01c80636bcef9a6116100e7578063a563833b11610087578063c662e48111610062578063c662e481146104d3578063c87b56dd146104e8578063dd62ed3e14610507578063e985e9c51461054b575f80fd5b8063a563833b14610481578063a9059cbb146104a1578063b88d4fde146104c0575f80fd5b806388a8c95c116100c257806388a8c95c146103f757806391cca3db1461041657806395d89b4114610435578063a22cb46514610462575f80fd5b80636bcef9a61461039b5780636c0360eb146103af57806370a08231146103c3575f80fd5b806323b872dd1161015257806342842e0e1161012d57806342842e0e146103195780634f02c4201461032c57806355f804b3146103485780636352211e14610367575f80fd5b806323b872dd146102d3578063313ce567146102f25780633ccfd60b14610305575f80fd5b8063095ea7b31161018d578063095ea7b3146102545780631249c58b1461027357806318160ddd1461027d5780631a72b87d1461029f575f80fd5b806301ffc9a7146101b357806306fdde03146101e7578063081812fc1461021d575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004611a5a565b61056a565b60405190151581526020015b60405180910390f35b3480156101f2575f80fd5b5060408051808201909152600581526452656c696360d81b60208201525b6040516101de9190611ac2565b348015610228575f80fd5b5061023c610237366004611ad4565b6105d1565b6040516001600160a01b0390911681526020016101de565b34801561025f575f80fd5b506101d261026e366004611b01565b61060b565b61027b610737565b005b348015610288575f80fd5b50610291610801565b6040519081526020016101de565b3480156102aa575f80fd5b506102be6102b9366004611b01565b61081f565b60405163ffffffff90911681526020016101de565b3480156102de575f80fd5b506101d26102ed366004611b29565b610863565b3480156102fd575f80fd5b506008610291565b348015610310575f80fd5b5061027b61093c565b61027b610327366004611b29565b61099f565b348015610337575f80fd5b506001546102be9063ffffffff1681565b348015610353575f80fd5b5061027b610362366004611be9565b610add565b348015610372575f80fd5b5061023c610381366004611ad4565b60066020525f90815260409020546001600160a01b031681565b3480156103a6575f80fd5b5061027b610b16565b3480156103ba575f80fd5b50610210610b61565b3480156103ce575f80fd5b506102916103dd366004611c36565b6001600160a01b03165f9081526008602052604090205490565b348015610402575f80fd5b5061027b610411366004611c36565b610bec565b348015610421575f80fd5b5060035461023c906001600160a01b031681565b348015610440575f80fd5b5060408051808201909152600581526452454c494360d81b6020820152610210565b34801561046d575f80fd5b5061027b61047c366004611c4f565b610c38565b34801561048c575f80fd5b506003546101d290600160a01b900460ff1681565b3480156104ac575f80fd5b506101d26104bb366004611b01565b610c71565b61027b6104ce366004611c88565b610cbf565b3480156104de575f80fd5b50610291600b5481565b3480156104f3575f80fd5b50610210610502366004611ad4565b610dea565b348015610512575f80fd5b50610291610521366004611cff565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205490565b348015610556575f80fd5b506101d2610565366004611cff565b610fc9565b6003545f90600160a01b900460ff16801561059557506380ac58cd60e01b6001600160e01b03198316145b806105b057506301ffc9a760e01b6001600160e01b03198316145b806105cb57506336372b0760e01b6001600160e01b03198316145b92915050565b5f818152600660205260408120546001600160a01b03166105f0575f80fd5b505f908152600760205260409020546001600160a01b031690565b5f6106186008600a611e15565b8211801561063e57506101006106306008600a611e15565b61063a9190611e20565b8211155b156106fe575f828152600660205260409020546001600160a01b0316338114801590610671575061066f8133610fc9565b155b156106c35760405162461bcd60e51b815260206004820152601b60248201527f534a3734313a20596f7520617265206e6f7420617070726f766564000000000060448201526064015b60405180910390fd5b5f83815260076020526040902080546001600160a01b0319166001600160a01b0386161790556106f4818585610ff6565b60019150506105cb565b335f8181526005602090815260408083206001600160a01b0388168452909152902083905561072e90848461103c565b50600192915050565b305f818152600860205260409020546001811015610753575f80fd5b5f600b5460016107639190611e33565b905080341015610771575f80fd5b61078783336107826008600a611e15565b61108e565b6003546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156107be573d5f803e3d5ffd5b50803411156107fc57336108fc6107d58334611e4a565b6040518115909202915f818181858888f193505050501580156107fa573d5f803e3d5ffd5b505b505050565b5f61080e6008600a611e15565b61081a90610100611e33565b905090565b6009602052815f5260405f208181548110610838575f80fd5b905f5260205f209060089182820401919006600402915091509054906101000a900463ffffffff1681565b5f6108706008600a611e15565b8211801561089657506101006108886008600a611e15565b6108929190611e20565b8211155b1561091b57336001600160a01b03851614806108cb57506108b6826105d1565b6001600160a01b0316336001600160a01b0316145b806108db57506108db8433610fc9565b6108f75760405162461bcd60e51b81526004016106ba90611e5d565b6109028484846110e2565b61091384846107826008600a611e15565b506001610935565b6109268433846111a8565b61093184848461125c565b5060015b9392505050565b6003546001600160a01b031633146109665760405162461bcd60e51b81526004016106ba90611e94565b6003546040516001600160a01b03909116904780156108fc02915f818181858888f1935050505015801561099c573d5f803e3d5ffd5b50565b336001600160a01b03841614806109cf57506109ba816105d1565b6001600160a01b0316336001600160a01b0316145b806109df57506109df8333610fc9565b6109fb5760405162461bcd60e51b81526004016106ba90611e5d565b610a068383836110e2565b610a1783836107826008600a611e15565b6001600160a01b0382163b15801590610abf5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab29190611ebf565b6001600160e01b03191614155b156107fc576040516301d6c93560e61b815260040160405180910390fd5b6003546001600160a01b03163314610b075760405162461bcd60e51b81526004016106ba90611e94565b5f610b128282611f5f565b5050565b6003546001600160a01b03163314610b405760405162461bcd60e51b81526004016106ba90611e94565b6003805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610b6d90611eda565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9990611eda565b8015610be45780601f10610bbb57610100808354040283529160200191610be4565b820191905f5260205f20905b815481529060010190602001808311610bc757829003601f168201915b505050505081565b6003546001600160a01b03163314610c165760405162461bcd60e51b81526004016106ba90611e94565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f8181526004602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610b1290838361162e565b5f81815260066020526040812054336001600160a01b0390911603610cb457610c9b3384846110e2565b610cac33846107826008600a611e15565b5060016105cb565b61072e33848461125c565b336001600160a01b0385161480610cef5750610cda826105d1565b6001600160a01b0316336001600160a01b0316145b80610cff5750610cff8433610fc9565b610d1b5760405162461bcd60e51b81526004016106ba90611e5d565b610d268484846110e2565b610d3784846107826008600a611e15565b6001600160a01b0383163b15801590610dcc5750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610d7f90339089908890889060040161201b565b6020604051808303815f875af1158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190611ebf565b6001600160e01b03191614155b156107fa576040516301d6c93560e61b815260040160405180910390fd5b6060610100610dfb6008600a611e15565b610e059190611e20565b821115610e485760405162461bcd60e51b815260206004820152601160248201527014d28dcd0c4e881a5b9d985b1a59081a59607a1b60448201526064016106ba565b5f8054610e5490611eda565b90505f03610e6f57505060408051602081019091525f815290565b5f82604051602001610e8391815260200190565b60408051601f198184030181529190528051602090910120905060605f610eab60648461206b565b90506028811015610ee0576040518060400160405280600a815260200169636f6d6d6f6e2e706e6760b01b8152509150610f9d565b6046811015610f15576040518060400160405280600c81526020016b756e636f6d6d6f6e2e706e6760a01b8152509150610f9d565b605a811015610f465760405180604001604052806008815260200167726172652e706e6760c01b8152509150610f9d565b6061811015610f775760405180604001604052806008815260200167657069632e706e6760c01b8152509150610f9d565b6040518060400160405280600a8152602001696d79746869632e706e6760b01b81525091505b5f82604051602001610fb092919061207e565b6040516020818303038152906040529350505050919050565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205460ff1690565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161108191815260200190565b60405180910390a3505050565b6001600160a01b0383165f90815260086020526040812080548392906110b5908490611e4a565b90915550506001600160a01b0382165f9081526008602052604090208054820190556107fc838383611675565b63ffffffff81165f908152600660205260409020546001600160a01b0384811691161461114a5760405162461bcd60e51b815260206004820152601660248201527529a51b9a189d1024b731b7b93932b1ba1037bbb732b960511b60448201526064016106ba565b63ffffffff81165f90815260076020908152604080832080546001600160a01b0319908116909155600690925290912080549091166001600160a01b0384161790556111978383836116ba565b6107fc83838363ffffffff16611858565b6001600160a01b038084165f9081526005602090815260408083209386168352929052205481111561121c5760405162461bcd60e51b815260206004820152601d60248201527f534a3734313a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016106ba565b6001600160a01b038084165f90815260056020908152604080832093861683529290529081208054839290611252908490611e4a565b9091555050505050565b6001600160a01b0383165f908152600860205260409020548111156112d25760405162461bcd60e51b815260206004820152602660248201527f534a3734313a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016106ba565b5f6112df6008600a611e15565b6001600160a01b0385165f90815260086020526040902054611301919061206b565b90505f6113106008600a611e15565b6001600160a01b0385165f90815260086020526040902054611332919061206b565b905061133f85858561108e565b5f61134c6008600a611e15565b6001600160a01b0387165f9081526008602052604090205461136e919061206b565b90505f61137d6008600a611e15565b6001600160a01b0387165f9081526008602052604090205461139f919061206b565b6001600160a01b0388165f90815260096020526040902090915060028386101561144757815415611447575f825f815481106113dd576113dd612101565b5f9182526020808320600880840490910154865460018101885587865292852091830490910180546007948516600490810261010090810a90940463ffffffff908116969095160290920a8481029302199091169190911790559150611445908b90836110e2565b505b828511156114f2578054156114e7576114a65f89836001858054905061146d9190611e4a565b8154811061147d5761147d612101565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff166110e2565b808054806114b6576114b6612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556114f2565b6114f08861189e565b505b5f6114ff6008600a611e15565b6115099089612129565b6003549091506001600160a01b03908116908b160361152e5750505050505050505050565b80156116225782548082106115435780611545565b815b90505f5b8181101561157a576115688c8c875f8154811061147d5761147d612101565b806115728161213c565b915050611549565b506115858183611e4a565b83549092509050808210611599578061159b565b815b90505f5b8181101561160c576115be5f8c866001888054905061146d9190611e4a565b838054806115ce576115ce612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a02191690559055806116048161213c565b91505061159f565b506116208a61161b8385611e4a565b611941565b505b50505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611081911515815260200190565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161108191815260200190565b63ffffffff81165f908152600a60209081526040808320546001600160a01b03871684526009909252822080549192909190826116f8600184611e4a565b8154811061170857611708612101565b905f5260205f2090600891828204019190066004029054906101000a900463ffffffff1690508083858154811061174157611741612101565b905f5260205f2090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055508280548061178257611782612115565b5f8281526020902060085f1990920191820401805463ffffffff600460078516026101000a021916905590556117b9600183611e4a565b156117d65763ffffffff81165f908152600a602052604090208490555b6001600160a01b0386165f81815260096020908152604082208054600180820183558285529284206008820401805460079092166004026101000a63ffffffff81810219909316928c16029190911790559290915290546118379190611e4a565b63ffffffff9095165f908152600a6020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001805463ffffffff19811663ffffffff9182168301821690811783555f81815260066020908152604080832080546001600160a01b0319166001600160a01b038916908117909155835260098083528184208054868652600a8552928520839055908352958101865594825281206008850401805460079095166004026101000a938402199094169282029290921790925561193c908383611858565b919050565b805f0361194c575050565b8060010361195d576107fc8261189e565b6001546001600160a01b0383165f9081526009602052604081205463ffffffff90921691905b83811015611a1f57600192830163ffffffff8181165f81815260066020908152604080832080546001600160a01b0319166001600160a01b038d16908117909155600a8352818420899055835260098252822080549889018155825281206008880401805460079098166004026101000a93840219909716928202929092179095559093611a1391908790611858565b60019182019101611983565b50506001805463ffffffff19811663ffffffff9182169490940116929092179091555050565b6001600160e01b03198116811461099c575f80fd5b5f60208284031215611a6a575f80fd5b813561093581611a45565b5f5b83811015611a8f578181015183820152602001611a77565b50505f910152565b5f8151808452611aae816020860160208601611a75565b601f01601f19169290920160200192915050565b602081525f6109356020830184611a97565b5f60208284031215611ae4575f80fd5b5035919050565b80356001600160a01b038116811461193c575f80fd5b5f8060408385031215611b12575f80fd5b611b1b83611aeb565b946020939093013593505050565b5f805f60608486031215611b3b575f80fd5b611b4484611aeb565b9250611b5260208501611aeb565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff80841115611b9057611b90611b62565b604051601f8501601f19908116603f01168101908282118183101715611bb857611bb8611b62565b81604052809350858152868686011115611bd0575f80fd5b858560208301375f602087830101525050509392505050565b5f60208284031215611bf9575f80fd5b813567ffffffffffffffff811115611c0f575f80fd5b8201601f81018413611c1f575f80fd5b611c2e84823560208401611b76565b949350505050565b5f60208284031215611c46575f80fd5b61093582611aeb565b5f8060408385031215611c60575f80fd5b611c6983611aeb565b915060208301358015158114611c7d575f80fd5b809150509250929050565b5f805f8060808587031215611c9b575f80fd5b611ca485611aeb565b9350611cb260208601611aeb565b925060408501359150606085013567ffffffffffffffff811115611cd4575f80fd5b8501601f81018713611ce4575f80fd5b611cf387823560208401611b76565b91505092959194509250565b5f8060408385031215611d10575f80fd5b611d1983611aeb565b9150611d2760208401611aeb565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115611d7e57815f1904821115611d6457611d64611d30565b80851615611d7157918102915b93841c9390800290611d49565b509250929050565b5f82611d94575060016105cb565b81611da057505f6105cb565b81600181146106f45760028103611dcd5760ff841115611dc257611dc2611d30565b50506001821b6105cb565b5060208310610133831016604e8410600b8410161715611df0575081810a6105cb565b611dfa8383611d44565b805f1904821115611e0d57611e0d611d30565b029392505050565b5f6109358383611d86565b808201808211156105cb576105cb611d30565b80820281158282048414176105cb576105cb611d30565b818103818111156105cb576105cb611d30565b6020808252601f908201527f534a3734313a20596f7520646f6e277420686176652074686520726967687400604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f60208284031215611ecf575f80fd5b815161093581611a45565b600181811c90821680611eee57607f821691505b602082108103611f0c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156107fc575f81815260208120601f850160051c81016020861015611f385750805b601f850160051c820191505b81811015611f5757828155600101611f44565b505050505050565b815167ffffffffffffffff811115611f7957611f79611b62565b611f8d81611f878454611eda565b84611f12565b602080601f831160018114611fc0575f8415611fa95750858301515b5f19600386901b1c1916600185901b178555611f57565b5f85815260208120601f198616915b82811015611fee57888601518255948401946001909101908401611fcf565b508582101561200b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061204d90830184611a97565b9695505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261207957612079612057565b500690565b5f80845461208b81611eda565b600182811680156120a357600181146120b8576120e4565b60ff19841687528215158302870194506120e4565b885f526020805f205f5b858110156120db5781548a8201529084019082016120c2565b50505082870194505b5050505083516120f8818360208801611a75565b01949350505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f8261213757612137612057565b500490565b5f6001820161214d5761214d611d30565b506001019056fea26469706673582212208e6a3b1ebf46dd56910062c7b8bc50685dcd94507bc7d525f0cf2fa9767692e864736f6c63430008140033

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

000000000000000000000000cf3676bbf2e70527418bdd1bd5d6f54a25fcb48b

-----Decoded View---------------
Arg [0] : _dev (address): 0xCF3676bBF2e70527418BDD1bd5d6F54A25fcb48B

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf3676bbf2e70527418bdd1bd5d6f54a25fcb48b


Loading...
Loading
Loading...
Loading
[ 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.