Contract 0x1090144d6F2B77e127620fD5503be12f45B8d6C3

 
Txn Hash
Method
Block
From
To
Value
0x053f9885f059303fbd5d5631f6016ee16165acecaf2fed9998ec5afbb52eaea0Set Approval For...156186712022-09-26 16:15:232 days 22 hrs ago0x39a1e9f424de5cc66df8cc5cc48c0b2185b63e45 IN  Zelenskiy NFT: ZFT Token0 Ether0.00107534 23.17905479
0xed472c53ba85f62a5100442b187a7507760271cdc4194a8a37bfff0ee5661d8dTransfer From154661262022-09-03 15:21:0525 days 23 hrs ago0x319cb1228ffdbe69d797ee325c8472c0728c51d8 IN  Zelenskiy NFT: ZFT Token0 Ether0.00023575 6.04085563
0x2f64480acb8f3cab4de642bb5539792f84340d9f4fff505d456e883fc90633e1Transfer From154641192022-09-03 7:46:1526 days 7 hrs ago0x9af161b31162122faf7067e7178f7aa7f772669b IN  Zelenskiy NFT: ZFT Token0 Ether0.00020733 5.72347588
0xd09f57b881b9fc1f73d73310cbacd0a524505cdae6f1fc7b24617dce7fcec7cdSet Approval For...154483472022-08-31 19:04:0428 days 19 hrs ago0x51ecd4b9a430c3992883b58ba45538624681c0b3 IN  Zelenskiy NFT: ZFT Token0 Ether0.00278358 60
0x98ed030d490be01b0429ece226105c56d8292428d1e16901765feab5953d879fSet Approval For...154274952022-08-28 11:20:1432 days 3 hrs ago0x5c0158f52c8defd22dae87079bd09cb23d07b4f6 IN  Zelenskiy NFT: ZFT Token0 Ether0.00019136 4.1248454
0x0a87f4b6a99da629b15d3e0ce689d3e459c2efb2d595a58237c2d86893c08cf3Set Approval For...154234072022-08-27 19:23:3232 days 19 hrs ago0xe66b6d018de700e0cbedd7be4a66fd632ee3bd80 IN  Zelenskiy NFT: ZFT Token0 Ether0.0002662 5.73806591
0x3bd02697b35d876e71b95640c1a696c5f1cbf27125e89ebfbb90fa36f4924718Set Approval For...154029512022-08-24 12:34:5136 days 2 hrs ago0x11585854bbf1467284c0139a0fccbcbe270e3319 IN  Zelenskiy NFT: ZFT Token0 Ether0.00046403 10.00229928
0x23938cf0fca7a94c72670fc8f8178cd30963b4085b0763e5aa9a1e9a0ed22466Safe Transfer Fr...153901722022-08-22 12:16:4038 days 2 hrs ago0x2d64744c0836ba36d618a2f09d329bff603ffaed IN  Zelenskiy NFT: ZFT Token0 Ether0.00044233 10.55790268
0x741a10a964e8ad9b6c0fc8bb32183576c130a39111d470c3b8a57f816e2672dfSet Approval For...153893312022-08-22 8:52:0138 days 5 hrs ago0x092c2778cc3af10a52f873a8709186e609069a57 IN  Zelenskiy NFT: ZFT Token0 Ether0.00070654 15.22952081
0x89baed4f83123587ed24a7ae2dbad5c4aa5dc257cfa730720eb1bfceae59ece3Safe Transfer Fr...153871072022-08-22 0:18:0738 days 14 hrs ago0xc14ebde43fe8bbf9a6483f0026bfce092b7fc1cd IN  Zelenskiy NFT: ZFT Token0 Ether0.00040322 9.62708998
0xbe8b56ef1aebb19c77424344f1b17fcd60851dfdfd055edd2a924edd316b29bcSet Approval For...153650812022-08-18 12:46:1442 days 2 hrs ago0x69ca67a9a604935eff588f29ee6c6d74178772b8 IN  Zelenskiy NFT: ZFT Token0 Ether0.00035715 7.69852624
0x62119344f28d32a91f90540e005d6695dcedd9d03ccee6919711ea5139f7cf91Set Approval For...153406022022-08-14 15:33:3345 days 23 hrs ago0x25295fecc605d449758ce5ec967bfcf78d38765d IN  Zelenskiy NFT: ZFT Token0 Ether0.00075225 16.21484655
0xe3a501bb2531d0f8779441f21d70c490af49cd76f168958d584ed6a4bf795023Set Approval For...153359202022-08-13 22:02:1146 days 16 hrs ago0x5eceae0951bad4bf9e596d76de0436161d44e0a3 IN  Zelenskiy NFT: ZFT Token0 Ether0.00046452 10.01275403
0x1309e7064a8bd06cc183e27e0c85f07e57f7687487bb545d16f2d59db1234e3dSet Approval For...153321822022-08-13 7:45:3447 days 7 hrs ago0x1742318819737a736ed544bbd67ebbefc59b49d6 IN  Zelenskiy NFT: ZFT Token0 Ether0.00037782 8.14398907
0x2da9a9ca5a37574e84c2569e61a21fb538de68c4aa6ccc05e9293cb133922dbfSet Approval For...153319732022-08-13 7:00:4847 days 7 hrs ago0xc54d7b91b7686039a544156d8cbe435dfa0f52ae IN  Zelenskiy NFT: ZFT Token0 Ether0.00036395 7.84507601
0x3554cc6252781bb7bf606f390992659e767b731b0435b07dcaa5afa271a64726Set Approval For...153264882022-08-12 10:27:2248 days 4 hrs ago0x41b6aa9e833d7d051b34cf7d1e87ebbcaf12bd4a IN  Zelenskiy NFT: ZFT Token0 Ether0.00065202 14.0544784
0x8f9e24bf73fa8f0a82bdcc9ef0b0830ec0a450645bbcdda80837256770058ae1Set Approval For...153140822022-08-10 11:30:0150 days 3 hrs ago0xe17c5168c04ad629282d1437c4f61929dd883295 IN  Zelenskiy NFT: ZFT Token0 Ether0.00067362 14.51989924
0x5d1b3661c241b1968f4cfbfbd2aad80387fcf733b524db03921dedee0f21c94fSet Approval For...153008412022-08-08 9:49:3452 days 4 hrs ago0x248b57c383356f9b50f4c5b98e300f6296915384 IN  Zelenskiy NFT: ZFT Token0 Ether0.0004666 10.05765762
0x31fed852ceda0a67cfb5797cf95932b40ef8174c346f5e7ddf8e93d5cb3e1f48Set Approval For...152873132022-08-06 7:09:4554 days 7 hrs ago0x330bcc0f0841d7f708fe482a79943edb359c130a IN  Zelenskiy NFT: ZFT Token0 Ether0.00040033 8.62921701
0xf705abdfa138ed00abebc80b70bab8314db9940c259e44ede2d1ad9c81f110bbSet Approval For...152835052022-08-05 16:49:3154 days 21 hrs ago0x13f13b0074617ee2294c19cc379b3ae09d260623 IN  Zelenskiy NFT: ZFT Token0 Ether0.00104948 22.62168483
0xed19a861f971072e72e15b5d624577eb271a9ac3e72eb03047228dd2bb5754e4Transfer Ownersh...152191582022-07-26 16:25:3864 days 22 hrs agoZelenskiyNFT: Deployer IN  Zelenskiy NFT: ZFT Token0 Ether0.00074888 25.93450404
0x6e8d9b78eb106f0c47e7f918035594d3d23d91978b0b6db44c7540e24a751cb2Transfer From152066682022-07-24 17:39:1366 days 21 hrs ago0x1742318819737a736ed544bbd67ebbefc59b49d6 IN  Zelenskiy NFT: ZFT Token0 Ether0.00103277 26.46374464
0x608558a06e00278bb48637c74d71d23f633efd505da4d21533e4b2fbcbfc8198Transfer From151996502022-07-23 15:11:1967 days 23 hrs ago0xcbc2591f958c3d9ade9be8287a76816e59792cb0 IN  Zelenskiy NFT: ZFT Token0 Ether0.00069203 19.10325396
0x038bcfb11e075c2b07730f3064674cb569999fbf75148e50ff3fc934595bafb9Set Approval For...151986772022-07-23 11:35:1368 days 3 hrs ago0xb03a143afdc5bc8735903743001fd4698beeafe6 IN  Zelenskiy NFT: ZFT Token0 Ether0.00036741 7.90522858
0x1bed4b031a3ccd5df7aa02487bb631510609053396351916bd995ac1fd4fa66dSet Approval For...151899682022-07-22 3:17:4569 days 11 hrs ago0xb03a143afdc5bc8735903743001fd4698beeafe6 IN  Zelenskiy NFT: ZFT Token0 Ether0.00079731 30
[ Download CSV Export 

OVERVIEW

A ChariFi & NFT project on Ethereum network.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZelenskiyNFT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion
File 1 of 13 : ZelenskiyNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./ERC721X.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract ZelenskiyNFT is ERC721X, Ownable {

    enum RevealStatus{
        MINT,
        REVEAL,
        REVEALED
    }

    struct PayableAddress {
        address payable addr;
        uint256 share;
    }

    event Paid(address indexed _from, uint256 _value, uint8 _whitelist);
    event Charity(address indexed _to, uint256 _value, bytes data);
    event Withdrawal(address indexed _to, uint256 _value, bytes data);
    event UriChange(string newURI);
    event WhitelistStatusChange(bool status);
    event MintStopped(bool status);
    event NewRoot(bytes32 root);
    event Payout(uint256 amount);
    event Refund(address indexed _to, uint256 amount, bytes data);
    event MintTimeSet(uint _start, uint _end);
    event LockTimerStarted(uint _start, uint _end);
    event AdminMinted(uint256 amount);
    event Distribution(uint256 _value, address _to, uint256 _amount);
    event Deposit(uint256 _value, address _from);

    uint256 public constant priceDefault = 0.2 ether;
    uint256 public constant priceWhitelist = 0.15 ether;

    uint256 public constant amountWhitelist = 1;
    uint256 public constant amountDefault = 3;

    uint256 public constant maxTotalSupply = 1000;
    uint256 public constant communityMintSupply = 500;
    uint256 private communitySold = 0;

    string private theBaseURI = "https://zelenskiynft.mypinata.cloud/ipfs/QmVHUj9uM7HxK5xSi2vbip9ySXYkLBEPWecQeJcbVKzBmH/";

    uint256 private charitySum = 0;
    uint256 private teamSum = 0;
    uint256 private saleSum = 0;

    mapping(address => uint256) private mints;
    mapping(address => bool) private whitelistClaimed;
    mapping(address => bool) private communityWhitelistClaimed;

    bytes32 private root;
    bytes32 private communityRoot;
    bool private communityRootIsSet = false;
    bool private rootIsSet = false;

    RevealStatus private revealStatus = RevealStatus.REVEAL;

    uint public constant whitelistStartTime = 1653598800;
    uint public constant whitelistEndTime = 1653600600;
    uint public constant publicMintStartTime = 1653601500;
    uint public constant whitelist2StartTime = 1654189200;

    address public constant communityWallet = 0xb03a143afdC5bc8735903743001fd4698BEEafe6;
    address public constant multisigOwnerWallet = 0x15E6733Be8401d33b4Cf542411d400c823DF6187;

    bool private mintStopped = false;

    bool private adminMinted = false;

    uint private functionLockTime = 0;

    bool private lockReturns = false;

    address public constant charityUA   = 0x3A0106911013eca7A0675d8F1ba7F404eD973cAb;
    address public constant charityEU   = 0x78042877DF422a9769E0fE1748FEf35d4A4718a0;
    address public constant liquidity   = 0x7A6B855D613C136098de4FEd8725DF7A7c2f7F5c;
    address public constant marketing   = 0x777C680b055cF6E97506B42DDeF4063061d7a5b4;
    address public constant development = 0xaE987CfFaf8149EFff92546ca399D41b4Da6c57B;
    address public constant team        = 0xBedc8cDC12047465690cbc358C69b2ea671217ac;

    constructor() ERC721X("Zelenskiy NFT", "ZFT") {}

    modifier ownerIsMultisig() {
        require(owner() == multisigOwnerWallet, "Owner is not multisignature wallet");
        _;
    }

    modifier whitelist2Started(){
        require(block.timestamp >= whitelist2StartTime, "Whitelist2 not started yet");
        _;
    }

    modifier whitelistActive() {
        require(whitelistStartTime != 0 && whitelistEndTime != 0, "Mint start time is not set");
        require(block.timestamp >= whitelistStartTime && block.timestamp <= whitelistEndTime, "Mint not started yet");
        _;
    }

    modifier whitelistEnded() {
        require(whitelistStartTime != 0 && whitelistEndTime != 0, "Mint start time is not set");
        require(block.timestamp >= whitelistEndTime, "Public mint not started yet");
        _;
    }

    modifier publicMintStarted() {
        require(block.timestamp >= publicMintStartTime, "Public mint not started yet");
        _;
    }

    // Mint remainder of collection to list on opensea
    function mintRemainder(uint256 amount) public {
        _mintRemainder(amount);
    }

    function buy(uint256 amount, bytes32[] calldata _proof) public payable whitelistActive {
        require(msg.sender == tx.origin, "payment not allowed from contract");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof, root, leaf), "Address not in whitelist");
        require(whitelistClaimed[msg.sender] == false, "Whitelist already claimed");
        
        require(amount <= amountWhitelist, "too much for whitelist");
        require(mints[msg.sender] + amount <= amountWhitelist, "too much for whitelist");
        
        require(nextId + amount <= maxTotalSupply, "Maximum supply reached");
        uint256 price;
        price = priceWhitelist;

        require(msg.value >= price * amount, "Not enough eth");

        if(msg.value > price * amount){
            uint256 refundAmount = msg.value - price * amount;
            (bool sent, bytes memory data) = msg.sender.call{value: refundAmount}("refund");
            require(sent, "Refund failed");
            emit Refund(msg.sender, refundAmount, data);
        }
        
        mints[msg.sender] += amount;

        saleSum += price * amount;

        whitelistClaimed[msg.sender] = true;

        _mint(msg.sender, amount);
    }

    function buyDefault(uint256 amount) public payable whitelistEnded {
        require(mintStopped == true, "Mint is stopped");
        require(msg.sender == tx.origin, "payment not allowed from this contract");
        require(mints[msg.sender] + amount <= amountDefault, "too much mints for this wallet");

        require(nextId + amount <= maxTotalSupply - communityMintSupply, "Maximum supply reached");
        uint256 price;
        price = priceDefault;

        require(msg.value >= price * amount, "Not enough eth");

        if(msg.value > price * amount){
            uint256 refundAmount = msg.value - price * amount;
            (bool sent, bytes memory data) = msg.sender.call{value: refundAmount}("refund");
            require(sent, "Refund failed");
            emit Refund(msg.sender, refundAmount, data);
        }

        mints[msg.sender] += amount;

        saleSum += price * amount;

        _mint(msg.sender, amount);
    }

    function communityClaim(bytes32[] calldata _proof) public payable whitelist2Started {
        require(msg.sender == tx.origin, "payment not allowed from this contract");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_proof, communityRoot, leaf), "Address not in whitelist");
        require(communityWhitelistClaimed[msg.sender] == false, "Whitelist already claimed");

        require(communitySold <= 500, "Maximum community mint reached");

        mints[msg.sender] += 1;
        communityWhitelistClaimed[msg.sender] = true;

        communitySold += 1;

        _mint(msg.sender, 1);
    }

    function setCommunityRoot(bytes32 _newRoot) public onlyOwner ownerIsMultisig {
        communityRoot = _newRoot;
        emit NewRoot(_newRoot);
    }

    function getCommunitySold() public view returns(uint256) {
        return communitySold;
    }

    // Mint to previous contract buyers
    function distribution(address to, uint256 amount, uint256 value) public payable onlyOwner {
        require(lockReturns == false, "Return locked");
        emit Distribution(value, to, amount);
       _mint(to, amount);
    }

    function setLockReturns() public onlyOwner {
        lockReturns = true; 
    }

    function setBaseURI(string memory newBaseURI) public onlyOwner {
        require(revealStatus != RevealStatus.REVEALED, "URI modifications after reveal are prohibited");
        theBaseURI = newBaseURI;
        emit UriChange(newBaseURI);
        if(revealStatus == RevealStatus.MINT){
            revealStatus = RevealStatus.REVEAL;
        }else{
            revealStatus = RevealStatus.REVEALED;
        }
    }

    function _baseURI() internal view override returns (string memory) {
        return theBaseURI;
    }

    function sendEther(address payable addr, uint256 amount, bool isCharity) private {
        (bool sent, bytes memory data) = addr.call{value: amount}("");
        require(sent, "Failed to send ether");
        if(isCharity){
            emit Charity(addr, amount, data);
            charitySum += amount;
        }else{
            emit Withdrawal(addr, amount, data);
            teamSum += amount;
        }
    }

    function pay() public onlyOwner whitelistEnded ownerIsMultisig {
        if(functionLockTime == 0){
            functionLockTime = block.timestamp;
            emit LockTimerStarted(functionLockTime, functionLockTime + 48 hours);
            return;
        }else{
            require(block.timestamp >= functionLockTime + 48 hours, "48 hours not passed yet");
            functionLockTime = 0;
        }
        uint256 balance = address(this).balance;
        emit Payout(balance);
        

        sendEther(payable(charityUA), balance/2, true);
        sendEther(payable(charityEU), balance/10, true);
        
        sendEther(payable(liquidity), balance*5/100, false);
        sendEther(payable(marketing), balance/5, false);
        sendEther(payable(development), balance/10, false);
        sendEther(payable(team), balance*5/100, false);
    }

    function getEthOnContract() public view returns (uint256) {
        return address(this).balance;
    }

    function checkAddressInWhiteList(bytes32[] calldata _proof) view public returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        return MerkleProof.verify(_proof, root, leaf);
    }

    function getWhitelistStatus() view public returns (bool) {
        return block.timestamp >= whitelistStartTime && block.timestamp <= whitelistEndTime;
    }

    function getCharitySum() view public returns (uint256) {
        return charitySum;
    }

    function getTeamSum() view public returns (uint256) {
        return teamSum;
    }

    function setRoot(bytes32 _newRoot) public onlyOwner ownerIsMultisig {
        require(rootIsSet == false, "Root already set");
        rootIsSet = true;
        root = _newRoot;
        emit NewRoot(_newRoot);
    }

    function storeEth() public payable {
        require(msg.sender == communityWallet, "Wrong address");
    }

    function checkWallet(address _from) private pure returns (bool) {
        return _from == charityUA ||
            _from == charityEU ||
            _from == liquidity ||
            _from == marketing ||
            _from == development ||
            _from == team;
    }

    fallback() external payable {
        if(checkWallet(msg.sender)){
            emit Deposit(msg.value, msg.sender);
            return;
        }
        require(!mintStopped, "Mint stopped");
        require(msg.value >= 0.2 ether, "Not enough ether");
        uint256 amount = 0;

        if(msg.value == priceDefault){
            amount = 1;
        }else if(msg.value > priceDefault*2 && msg.value <= priceDefault*3){
            amount = 2;
        }else if(msg.value >= priceDefault*3){
            amount = 3;
        }
        buyDefault(amount);
    }

    receive() external payable {
        if(checkWallet(msg.sender)){
            emit Deposit(msg.value, msg.sender);
            return;
        }
        require(!mintStopped, "Mint stopped");
        require(msg.value >= priceDefault, "Not enough ether");
        uint256 amount = 0;

        if(msg.value == priceDefault){
            amount = 1;
        }else if(msg.value > priceDefault*2 && msg.value <= priceDefault*3){
            amount = 2;
        }else if(msg.value >= priceDefault*3){
            amount = 3;
        }
        buyDefault(amount);
    }

    function stopMint() public onlyOwner ownerIsMultisig {
        if(functionLockTime == 0){
            functionLockTime = block.timestamp;
            emit LockTimerStarted(functionLockTime, functionLockTime + 1 hours);
            return;
        }else{
            require(block.timestamp >= functionLockTime + 1 hours, "Hour not passed yet");
            mintStopped = true;
            functionLockTime = 0;
            emit MintStopped(true);
        }
    }

    function getCommunityMintAmount() public view returns(uint256) {
        return communitySold;
    }
}

File 2 of 13 : ERC721X.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension and the Enumerable extension
 *
 * @dev Only allows token IDs are minted serially starting from token ID 1
 *
 * @dev Does not support burning tokens or in any way changing the ownership of a token
 *      to address(0)
 */
contract ERC721X is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to owner address
  mapping(uint256 => address) private _owners;

  // Mapping from token ID to approved address
  mapping(uint256 => address) private _tokenApprovals;

  // Mapping from owner to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  /**
   * @dev Returns next token ID to be mint
   */
  uint256 public nextId = 1;

  address public constant remainderWallet = 0xb03a143afdC5bc8735903743001fd4698BEEafe6;

  /**
   * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. It
   *      also sets a `maxTotalSupply` variable to cap the tokens to ever be created
   */
  constructor(string memory name_, string memory symbol_) {
    _name = name_;
    _symbol = symbol_;
  }

  /**
   * @dev See {IERC165-supportsInterface}.
   */
  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
    return
      interfaceId == type(IERC721).interfaceId ||
      interfaceId == type(IERC721Metadata).interfaceId ||
      interfaceId == type(IERC721Enumerable).interfaceId ||
      super.supportsInterface(interfaceId);
  }

  /**
   * @dev See {IERC721-balanceOf}.
   */
  function balanceOf(address owner) public view virtual override returns (uint256) {
    require(owner != address(0), "ERC721X: balance query for the zero address");

    uint256 count = 0;

    for(uint256 i = 1; _exists(i); i++) {
      if(_owners[i] == owner) {
        count++;
      }
      if(_owners[i] == address(0) && owner == remainderWallet){
        count++;
      }
    }

    return count;
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    require(_exists(tokenId), "ERC721X: owner query for nonexistent token");

    return _owners[tokenId] == address(0) ? remainderWallet : _owners[tokenId];
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
  }

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public virtual override {
    address owner = ownerOf(tokenId);
    require(to != owner, "ERC721X: approval to current owner");

    require(
      _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
      "ERC721X: approve caller is not owner nor approved for all"
    );

    _approve(to, tokenId);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view virtual override returns (address) {
    require(_exists(tokenId), "ERC721X: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public virtual override {
    _setApprovalForAll(_msgSender(), operator, approved);
  }

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    //solhint-disable-next-line max-line-length
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721X: transfer caller is not owner nor approved");

    _transfer(from, to, tokenId);
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    safeTransferFrom(from, to, tokenId, "");
  }

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public virtual override {
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721X: transfer caller is not owner nor approved");
    _safeTransfer(from, to, tokenId, _data);
  }

  /**
   * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
   * are aware of the ERC721 protocol to prevent tokens from being forever locked.
   *
   * `_data` is additional data, it has no specified format and it is sent in call to `to`.
   *
   * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
   * implement alternative mechanisms to perform token transfer, such as signature-based.
   *
   * Requirements:
   *
   * - `from` cannot be the zero address.
   * - `to` cannot be the zero address.
   * - `tokenId` token must exist and be owned by `from`.
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeTransfer(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) internal virtual {
    _transfer(from, to, tokenId);
    require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721X: transfer to non ERC721Receiver implementer");
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`).
   */
  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return tokenId != 0 && tokenId < nextId;
  }

  /**
   * @dev Returns whether `spender` is allowed to manage `tokenId`.
   *
   * Requirements:
   *
   * - `tokenId` must exist.
   */
  function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
    require(_exists(tokenId), "ERC721X: operator query for nonexistent token");
    address owner = ownerOf(tokenId);
    return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
  }

  function _mintRemainder(uint256 amount) internal {
    for(uint256 i = 0; i < amount; i++){
      emit Transfer(address(0), remainderWallet, nextId+i);
    }
    nextId += amount;
  }

  /**
   * @dev Safely mints the token with next consecutive ID and transfers it to `to`. Setting
   *      `amount` to `true` will mint another nft.
   *
   * Requirements:
   *
   * - `tokenId` must not exist.
   * - `maxTotalSupply` maximum total supply has not been reached
   * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(address to, uint256 amount) internal virtual {
    _safeMint(to, amount, "");
  }

  /**
   * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
   * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
   */
  function _safeMint(
    address to,
    uint256 amount,
    bytes memory _data
  ) internal virtual {
    _mint(to, amount);

    uint256 n = amount;

    for(uint256 i = 0; i < n; i++) {
      require(
        _checkOnERC721Received(address(0), to, nextId - i - 1, _data),
        "ERC721X: transfer to non ERC721Receiver implementer"
      );
    }
  }

  /**
   * @dev Mints the token with next consecutive ID and transfers it to `to`. Setting
   *      `amount` to `true` will mint another nft.
   *
   * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `maxTotalSupply` maximum total supply has not been reached
   *
   * Emits a {Transfer} event.
   */
  function _mint(address to, uint256 amount) internal virtual {
    // The below calculations do not depend on user input and
    // are very hard to overflow (nextId must be >= 2^256-2 for
    // that to happen) so using `unchecked` as a means of saving
    // gas is safe here
    unchecked {
      require(to != address(0), "ERC721X: mint to the zero address");

      uint256 n = amount;

      for(uint256 i = 0; i < n; i++) {
        _beforeTokenTransfer(address(0), to, nextId + i);
        emit Transfer(address(0), to, nextId + i);
        _owners[nextId + i] = to;
      }

      nextId += n;
    }
  }
   /*  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {
    // The below calculations are very hard to overflow (nextId must
    // be = 2^256-1 for that to happen) so using `unchecked` as
    // a means of saving gas is safe here
    unchecked {
      require(
        ownerOf(tokenId) == from,
        "ERC721X: transfer of token that is not own"
      );
      require(to != address(0), "ERC721X: transfer to the zero address");

      _beforeTokenTransfer(from, to, tokenId);

      // Clear approvals from the previous owner
      _approve(address(0), tokenId);
      _owners[tokenId] = to;

      emit Transfer(from, to, tokenId);
    }
  }

  /**
   * @dev Approve `to` to operate on `tokenId`
   *
   * Emits a {Approval} event.
   */
  function _approve(address to, uint256 tokenId) internal virtual {
    _tokenApprovals[tokenId] = to;
    emit Approval(ownerOf(tokenId), to, tokenId);
  }

  /**
   * @dev Approve `operator` to operate on all of `owner` tokens
   *
   * Emits a {ApprovalForAll} event.
   */
  function _setApprovalForAll(
    address owner,
    address operator,
    bool approved
  ) internal virtual {
    require(owner != operator, "ERC721X: approve to caller");
    _operatorApprovals[owner][operator] = approved;
    emit ApprovalForAll(owner, operator, approved);
  }

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
        return retval == IERC721Receiver.onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721X: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before any token transfer. This includes minting
   * and burning.
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   * - When `to` is zero, ``from``'s `tokenId` will be burned.
   * - `from` and `to` are never both zero.
   *
   * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {}

  /**
   * @dev See {IEnumerableERC721-totalSupply}.
   */
  function totalSupply() external view returns (uint256) {
    return nextId - 1;
  }

  /**
   * @dev See {IEnumerableERC721-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) external view returns (uint256) {
    require(_exists(index + 1), "ERC721X: global index out of bounds");

    return index + 1;
  }

  /**
   * @dev See {IEnumerableERC721-tokenOfOwnerByIndex}.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256) {
    require(owner != address(0), "ERC721X: balance query for the zero address");

    uint256 count = 0;
    uint256 i = 1;

    for(; _exists(i) && count < index + 1; i++) {
      if(_owners[i] == owner) {
        count++;
        if(_owners[i + 1] == address(0) && count < index + 1 && _exists(i + 1)) {
          count++;
          i++;
        }
      }
    }

    if(count == index + 1) return i - 1;
    else revert("ERC721X: owner index out of bounds");
  }
}

File 3 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 4 of 13 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 13 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 6 of 13 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        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(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 7 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 9 of 13 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 10 of 13 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 11 of 13 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 13 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "byzantium",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminMinted","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":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Charity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"_from","type":"address"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Distribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"}],"name":"LockTimerStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MintStopped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_end","type":"uint256"}],"name":"MintTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"NewRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"_whitelist","type":"uint8"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Payout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Refund","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"UriChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"WhitelistStatusChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Withdrawal","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"amountDefault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"amountWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","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":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyDefault","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"charityEU","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityUA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"checkAddressInWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"communityClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"communityMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"development","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"distribution","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCharitySum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommunityMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCommunitySold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthOnContract","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTeamSum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"liquidity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintRemainder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"multisigOwnerWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"priceDefault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainderWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","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":"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setCommunityRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLockReturns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newRoot","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"storeEth","outputs":[],"stateMutability":"payable","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":[],"name":"team","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelist2StartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6001600555600060075561010060405260586080818152906200413960a039805162000034916008916020909101906200018f565b5060006009819055600a819055600b8190556011805464ffffffffff1916620100001790556012556013805460ff191690553480156200007357600080fd5b50604080518082018252600d81527f5a656c656e736b6979204e46540000000000000000000000000000000000000060208083019182528351808501909452600384527f5a46540000000000000000000000000000000000000000000000000000000000908401528151919291620000ee916000916200018f565b508051620001049060019060208401906200018f565b505050620001336200012462000139640100000000026401000000009004565b6401000000006200013d810204565b6200028a565b3390565b60068054600160a060020a03838116600160a060020a0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019d9062000235565b90600052602060002090601f016020900481019282620001c157600085556200020c565b82601f10620001dc57805160ff19168380011785556200020c565b828001600101855582156200020c579182015b828111156200020c578251825591602001919060010190620001ef565b506200021a9291506200021e565b5090565b5b808211156200021a57600081556001016200021f565b6002810460018216806200024a57607f821691505b60208210810362000284577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b613e9f806200029a6000396000f3fe6080604052600436106103a2576000357c0100000000000000000000000000000000000000000000000000000000900480637a0767d0116101ee578063c4a9329e1161011f578063d9ebc352116100bd578063e985e9c51161008c578063e985e9c514610b21578063ebdfd72214610b6a578063f2fde38b14610b82578063f91dbf5114610ba25761052d565b8063d9ebc35214610aaa578063dab5f34014610ad2578063dcba94f514610af2578063e164e9ed14610b0e5761052d565b8063d1224f08116100f9578063d1224f081461068d578063d290ae5e14610a69578063d3cf00a314610a7d578063d558296514610a955761052d565b8063c4a9329e14610a29578063c7574839146105e5578063c87b56dd14610a495761052d565b80638da5cb5b1161018c5780639c76b14b116101665780639c76b14b146109b4578063a22cb465146109d4578063a3569a79146109f4578063b88d4fde14610a095761052d565b80638da5cb5b146109695780639292caaf1461098757806395d89b411461099f5761052d565b806383d88c96116101c857806383d88c961461090457806385f2aef214610919578063887129d61461094157806388bccf28146109545761052d565b80637a0767d01461089f5780637b929c27146108b457806381d1f938146108dc5761052d565b80632fff1796116102d357806357277b9211610271578063682a2e1011610240578063682a2e10146108325780636ec0578a1461084a57806370a082311461086a578063715018a61461088a5761052d565b806357277b92146107e15780635a19b4db146107e957806361b8ce8c146107fc5780636352211e146108125761052d565b806342842e0e116102ad57806342842e0e1461076c5780634f6ccce71461078c5780635074f301146107ac57806355f804b3146107c15761052d565b80632fff179614610715578063394bfa6b146107315780633e1c908e146107595761052d565b80631b9265b81161034057806325c1f1671161031a57806325c1f167146106a25780632ab4d052146106b75780632d3e474a146106cd5780632f745c59146106f55761052d565b80631b9265b81461065857806323b872dd1461066d578063245b01aa1461068d5761052d565b8063095ea7b31161037c578063095ea7b3146105c557806309ac3b00146105e557806318160ddd1461060d5780631a686502146106305761052d565b806301ffc9a71461053657806306fdde031461056b578063081812fc1461058d5761052d565b3661052d576103b033610bb8565b156103ef57604080513481523360208201527f4bcc17093cdf51079c755de089be5a85e70fa374ec656c194480fbdcda224a53910160405180910390a1005b6011546301000000900460ff16156104515760405160e560020a62461bcd02815260206004820152600c60248201527f4d696e742073746f70706564000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6702c68af0bb1400003410156104ac5760405160e560020a62461bcd02815260206004820152601060248201527f4e6f7420656e6f756768206574686572000000000000000000000000000000006044820152606401610448565b60006702c68af0bb14000034036104c557506001610522565b6104d86702c68af0bb1400006002613660565b341180156104f857506104f46702c68af0bb1400006003613660565b3411155b1561050557506002610522565b6105186702c68af0bb1400006003613660565b3410610522575060035b61052b81610ca3565b005b6103b033610bb8565b34801561054257600080fd5b50610556610551366004613695565b611057565b60405190151581526020015b60405180910390f35b34801561057757600080fd5b50610580611126565b604051610562919061370a565b34801561059957600080fd5b506105ad6105a836600461371d565b6111b8565b604051600160a060020a039091168152602001610562565b3480156105d157600080fd5b5061052b6105e0366004613752565b611254565b3480156105f157600080fd5b506105ad73b03a143afdc5bc8735903743001fd4698beeafe681565b34801561061957600080fd5b5061062261138b565b604051908152602001610562565b34801561063c57600080fd5b506105ad737a6b855d613c136098de4fed8725df7a7c2f7f5c81565b34801561066457600080fd5b5061052b6113a1565b34801561067957600080fd5b5061052b61068836600461377c565b61165e565b34801561069957600080fd5b50600754610622565b3480156106ae57600080fd5b50600954610622565b3480156106c357600080fd5b506106226103e881565b3480156106d957600080fd5b506105ad73777c680b055cf6e97506b42ddef4063061d7a5b481565b34801561070157600080fd5b50610622610710366004613752565b611692565b34801561072157600080fd5b50610622670214e8348c4f000081565b34801561073d57600080fd5b506105ad7315e6733be8401d33b4cf542411d400c823df618781565b61052b61076736600461371d565b610ca3565b34801561077857600080fd5b5061052b61078736600461377c565b611837565b34801561079857600080fd5b506106226107a736600461371d565b611852565b3480156107b857600080fd5b50610622600181565b3480156107cd57600080fd5b5061052b6107dc366004613847565b6118e2565b61052b611a3d565b61052b6107f73660046138db565b611aa3565b34801561080857600080fd5b5061062260055481565b34801561081e57600080fd5b506105ad61082d36600461371d565b611fea565b34801561083e57600080fd5b50610622636298ec9081565b34801561085657600080fd5b5061052b61086536600461371d565b6120bf565b34801561087657600080fd5b50610622610885366004613927565b6120c8565b34801561089657600080fd5b5061052b6121a2565b3480156108ab57600080fd5b506105566121d9565b3480156108c057600080fd5b506105ad73ae987cffaf8149efff92546ca399d41b4da6c57b81565b3480156108e857600080fd5b506105ad733a0106911013eca7a0675d8f1ba7f404ed973cab81565b34801561091057600080fd5b5061052b6121f6565b34801561092557600080fd5b506105ad73bedc8cdc12047465690cbc358c69b2ea671217ac81565b61052b61094f366004613942565b612232565b34801561096057600080fd5b50600a54610622565b34801561097557600080fd5b50600654600160a060020a03166105ad565b34801561099357600080fd5b5061062263628fea5081565b3480156109ab57600080fd5b50610580612308565b3480156109c057600080fd5b5061052b6109cf36600461371d565b612317565b3480156109e057600080fd5b5061052b6109ef366004613975565b6123d0565b348015610a0057600080fd5b50610622600381565b348015610a1557600080fd5b5061052b610a243660046139b1565b6123db565b348015610a3557600080fd5b50610556610a44366004613a2d565b612416565b348015610a5557600080fd5b50610580610a6436600461371d565b612497565b348015610a7557600080fd5b503031610622565b348015610a8957600080fd5b5061062263628ff4dc81565b348015610aa157600080fd5b5061052b612573565b348015610ab657600080fd5b506105ad7378042877df422a9769e0fe1748fef35d4a4718a081565b348015610ade57600080fd5b5061052b610aed36600461371d565b6126d8565b348015610afe57600080fd5b506106226702c68af0bb14000081565b61052b610b1c366004613a2d565b6127f6565b348015610b2d57600080fd5b50610556610b3c366004613a6f565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b348015610b7657600080fd5b5061062263628ff15881565b348015610b8e57600080fd5b5061052b610b9d366004613927565b612a55565b348015610bae57600080fd5b506106226101f481565b6000600160a060020a038216733a0106911013eca7a0675d8f1ba7f404ed973cab1480610c015750600160a060020a0382167378042877df422a9769e0fe1748fef35d4a4718a0145b80610c285750600160a060020a038216737a6b855d613c136098de4fed8725df7a7c2f7f5c145b80610c4f5750600160a060020a03821673777c680b055cf6e97506b42ddef4063061d7a5b4145b80610c765750600160a060020a03821673ae987cffaf8149efff92546ca399d41b4da6c57b145b80610c9d5750600160a060020a03821673bedc8cdc12047465690cbc358c69b2ea671217ac145b92915050565b63628ff158421015610cfa5760405160e560020a62461bcd02815260206004820152601b60248201527f5075626c6963206d696e74206e6f7420737461727465642079657400000000006044820152606401610448565b6011546301000000900460ff161515600114610d5b5760405160e560020a62461bcd02815260206004820152600f60248201527f4d696e742069732073746f7070656400000000000000000000000000000000006044820152606401610448565b333214610d7d5760405160e560020a62461bcd02815260040161044890613aa2565b336000908152600c6020526040902054600390610d9b908390613aff565b1115610dec5760405160e560020a62461bcd02815260206004820152601e60248201527f746f6f206d756368206d696e747320666f7220746869732077616c6c657400006044820152606401610448565b610dfa6101f46103e8613b17565b81600554610e089190613aff565b1115610e595760405160e560020a62461bcd02815260206004820152601660248201527f4d6178696d756d20737570706c792072656163686564000000000000000000006044820152606401610448565b6702c68af0bb140000610e6c8282613660565b341015610ebe5760405160e560020a62461bcd02815260206004820152600e60248201527f4e6f7420656e6f756768206574680000000000000000000000000000000000006044820152606401610448565b610ec88282613660565b341115611003576000610edb8383613660565b610ee59034613b17565b905060008033600160a060020a031683604051610f25907f726566756e640000000000000000000000000000000000000000000000000000815260060190565b60006040518083038185875af1925050503d8060008114610f62576040519150601f19603f3d011682016040523d82523d6000602084013e610f67565b606091505b509150915081610fbc5760405160e560020a62461bcd02815260206004820152600d60248201527f526566756e64206661696c6564000000000000000000000000000000000000006044820152606401610448565b33600160a060020a03167ff31f998394417c30993c15334c5a7008d1d564c61d3c703bc19976c8d81f05db8483604051610ff7929190613b2e565b60405180910390a25050505b336000908152600c602052604081208054849290611022908490613aff565b9091555061103290508282613660565b600b60008282546110439190613aff565b9091555061105390503383612b0a565b5050565b6000600160e060020a031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806110ba5750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806110ee5750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610c9d57507f01ffc9a700000000000000000000000000000000000000000000000000000000600160e060020a0319831614610c9d565b60606000805461113590613b47565b80601f016020809104026020016040519081016040528092919081815260200182805461116190613b47565b80156111ae5780601f10611183576101008083540402835291602001916111ae565b820191906000526020600020905b81548152906001019060200180831161119157829003601f168201915b5050505050905090565b60006111c382612c21565b6112385760405160e560020a62461bcd02815260206004820152602d60248201527f455243373231583a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e000000000000000000000000000000000000006064820152608401610448565b50600090815260036020526040902054600160a060020a031690565b600061125f82611fea565b905080600160a060020a031683600160a060020a0316036112eb5760405160e560020a62461bcd02815260206004820152602260248201527f455243373231583a20617070726f76616c20746f2063757272656e74206f776e60448201527f65720000000000000000000000000000000000000000000000000000000000006064820152608401610448565b33600160a060020a038216148061130757506113078133610b3c565b61137c5760405160e560020a62461bcd02815260206004820152603960248201527f455243373231583a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610448565b6113868383612c35565b505050565b6000600160055461139c9190613b17565b905090565b600654600160a060020a031633146113ce5760405160e560020a62461bcd02815260040161044890613b84565b63628ff1584210156114255760405160e560020a62461bcd02815260206004820152601b60248201527f5075626c6963206d696e74206e6f7420737461727465642079657400000000006044820152606401610448565b7315e6733be8401d33b4cf542411d400c823df618761144c600654600160a060020a031690565b600160a060020a0316146114755760405160e560020a62461bcd02815260040161044890613bb9565b6012546000036114cf574260128190557f9268f698229a43dedc4a8717e7c0f33ee7f1525f0d36e7b149e54d2c1942f6e2906114b4816202a300613aff565b604080519283526020830191909152015b60405180910390a1565b6012546114df906202a300613aff565b4210156115315760405160e560020a62461bcd02815260206004820152601760248201527f343820686f757273206e6f7420706173736564207965740000000000000000006044820152606401610448565b60006012556040513031808252907f22427047e1a674a9aff59700a2c8d00ea96e017ddf9236690bdedf1f21f28d9d9060200160405180910390a1611596733a0106911013eca7a0675d8f1ba7f404ed973cab61158f600284613c2f565b6001612cb0565b6115b97378042877df422a9769e0fe1748fef35d4a4718a061158f600a84613c2f565b6115ef737a6b855d613c136098de4fed8725df7a7c2f7f5c60646115de846005613660565b6115e89190613c2f565b6000612cb0565b61161273777c680b055cf6e97506b42ddef4063061d7a5b46115e8600584613c2f565b61163573ae987cffaf8149efff92546ca399d41b4da6c57b6115e8600a84613c2f565b61165a73bedc8cdc12047465690cbc358c69b2ea671217ac60646115de846005613660565b505b565b6116683382612e1f565b6116875760405160e560020a62461bcd02815260040161044890613c43565b611386838383612f19565b6000600160a060020a0383166116bd5760405160e560020a62461bcd02815260040161044890613ca0565b600060015b6116cb81612c21565b80156116e057506116dd846001613aff565b82105b156117a157600081815260026020526040902054600160a060020a0380871691160361178f578161171081613cfd565b925060009050600281611724846001613aff565b8152602081019190915260400160002054600160a060020a03161480156117545750611751846001613aff565b82105b801561176e575061176e611769826001613aff565b612c21565b1561178f578161177d81613cfd565b925050808061178b90613cfd565b9150505b8061179981613cfd565b9150506116c2565b6117ac846001613aff565b82036117c6576117bd600182613b17565b92505050610c9d565b60405160e560020a62461bcd02815260206004820152602260248201527f455243373231583a206f776e657220696e646578206f7574206f6620626f756e60448201527f64730000000000000000000000000000000000000000000000000000000000006064820152608401610448565b611386838383604051806020016040528060008152506123db565b6000611862611769836001613aff565b6118d75760405160e560020a62461bcd02815260206004820152602360248201527f455243373231583a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e647300000000000000000000000000000000000000000000000000000000006064820152608401610448565b610c9d826001613aff565b600654600160a060020a0316331461190f5760405160e560020a62461bcd02815260040161044890613b84565b600260115462010000900460ff16600281111561192e5761192e613d16565b036119a45760405160e560020a62461bcd02815260206004820152602d60248201527f555249206d6f64696669636174696f6e732061667465722072657665616c206160448201527f72652070726f68696269746564000000000000000000000000000000000000006064820152608401610448565b80516119b79060089060208401906135ae565b507ff6ab6a5243b9265de8368f8e4f340b777415e04cc57121fca7e3fa01e58c78b2816040516119e7919061370a565b60405180910390a1600060115462010000900460ff166002811115611a0e57611a0e613d16565b03611a29576011805462ff000019166201000017905561165a565b506011805462ff0000191662020000179055565b3373b03a143afdc5bc8735903743001fd4698beeafe61461165c5760405160e560020a62461bcd02815260206004820152600d60248201527f57726f6e672061646472657373000000000000000000000000000000000000006044820152606401610448565b63628fea504210158015611abb575063628ff1584211155b611b0a5760405160e560020a62461bcd02815260206004820152601460248201527f4d696e74206e6f742073746172746564207965740000000000000000000000006044820152606401610448565b333214611b825760405160e560020a62461bcd02815260206004820152602160248201527f7061796d656e74206e6f7420616c6c6f7765642066726f6d20636f6e7472616360448201527f74000000000000000000000000000000000000000000000000000000000000006064820152608401610448565b6040516c0100000000000000000000000033026020820152600090603401604051602081830303815290604052805190602001209050611bf983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f54915084905061309e565b611c485760405160e560020a62461bcd02815260206004820152601860248201527f41646472657373206e6f7420696e2077686974656c69737400000000000000006044820152606401610448565b336000908152600d602052604090205460ff1615611cab5760405160e560020a62461bcd02815260206004820152601960248201527f57686974656c69737420616c726561647920636c61696d6564000000000000006044820152606401610448565b6001841115611cff5760405160e560020a62461bcd02815260206004820152601660248201527f746f6f206d75636820666f722077686974656c697374000000000000000000006044820152606401610448565b336000908152600c6020526040902054600190611d1d908690613aff565b1115611d6e5760405160e560020a62461bcd02815260206004820152601660248201527f746f6f206d75636820666f722077686974656c697374000000000000000000006044820152606401610448565b6103e884600554611d7f9190613aff565b1115611dd05760405160e560020a62461bcd02815260206004820152601660248201527f4d6178696d756d20737570706c792072656163686564000000000000000000006044820152606401610448565b670214e8348c4f0000611de38582613660565b341015611e355760405160e560020a62461bcd02815260206004820152600e60248201527f4e6f7420656e6f756768206574680000000000000000000000000000000000006044820152606401610448565b611e3f8582613660565b341115611f7a576000611e528683613660565b611e5c9034613b17565b905060008033600160a060020a031683604051611e9c907f726566756e640000000000000000000000000000000000000000000000000000815260060190565b60006040518083038185875af1925050503d8060008114611ed9576040519150601f19603f3d011682016040523d82523d6000602084013e611ede565b606091505b509150915081611f335760405160e560020a62461bcd02815260206004820152600d60248201527f526566756e64206661696c6564000000000000000000000000000000000000006044820152606401610448565b33600160a060020a03167ff31f998394417c30993c15334c5a7008d1d564c61d3c703bc19976c8d81f05db8483604051611f6e929190613b2e565b60405180910390a25050505b336000908152600c602052604081208054879290611f99908490613aff565b90915550611fa990508582613660565b600b6000828254611fba9190613aff565b9091555050336000818152600d60205260409020805460ff19166001179055611fe39086612b0a565b5050505050565b6000611ff582612c21565b61206a5760405160e560020a62461bcd02815260206004820152602a60248201527f455243373231583a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e000000000000000000000000000000000000000000006064820152608401610448565b600082815260026020526040902054600160a060020a0316156120a457600082815260026020526040902054600160a060020a0316610c9d565b73b03a143afdc5bc8735903743001fd4698beeafe692915050565b61165a816130b4565b6000600160a060020a0382166120f35760405160e560020a62461bcd02815260040161044890613ca0565b600060015b61210181612c21565b1561219b57600081815260026020526040902054600160a060020a03808616911603612135578161213181613cfd565b9250505b600081815260026020526040902054600160a060020a03161580156121765750600160a060020a03841673b03a143afdc5bc8735903743001fd4698beeafe6145b15612189578161218581613cfd565b9250505b8061219381613cfd565b9150506120f8565b5092915050565b600654600160a060020a031633146121cf5760405160e560020a62461bcd02815260040161044890613b84565b61165c600061313b565b600063628fea50421015801561139c57505063628ff15842111590565b600654600160a060020a031633146122235760405160e560020a62461bcd02815260040161044890613b84565b6013805460ff19166001179055565b600654600160a060020a0316331461225f5760405160e560020a62461bcd02815260040161044890613b84565b60135460ff16156122b55760405160e560020a62461bcd02815260206004820152600d60248201527f52657475726e206c6f636b6564000000000000000000000000000000000000006044820152606401610448565b60408051828152600160a060020a03851660208201529081018390527fb6bcab815b7a952b8759f2f92fc9981dc1156f6c11bf4dc7e9cb3036495e653a9060600160405180910390a16113868383612b0a565b60606001805461113590613b47565b600654600160a060020a031633146123445760405160e560020a62461bcd02815260040161044890613b84565b7315e6733be8401d33b4cf542411d400c823df618761236b600654600160a060020a031690565b600160a060020a0316146123945760405160e560020a62461bcd02815260040161044890613bb9565b60108190556040518181527fcabf8550b9a306922529d9991dece81a1afb5b2d237560460464667de07cfbc9906020015b60405180910390a150565b61105333838361319a565b6123e53383612e1f565b6124045760405160e560020a62461bcd02815260040161044890613c43565b6124108484848461326b565b50505050565b6040516c0100000000000000000000000033026020820152600090819060340160405160208183030381529060405280519060200120905061248f84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600f54915084905061309e565b949350505050565b60606124a282612c21565b6125175760405160e560020a62461bcd02815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610448565b60006125216132a1565b90506000815111612541576040518060200160405280600081525061256c565b8061254b846132b0565b60405160200161255c929190613d2f565b6040516020818303038152906040525b9392505050565b600654600160a060020a031633146125a05760405160e560020a62461bcd02815260040161044890613b84565b7315e6733be8401d33b4cf542411d400c823df61876125c7600654600160a060020a031690565b600160a060020a0316146125f05760405160e560020a62461bcd02815260040161044890613bb9565b60125460000361262e574260128190557f9268f698229a43dedc4a8717e7c0f33ee7f1525f0d36e7b149e54d2c1942f6e2906114b481610e10613aff565b60125461263d90610e10613aff565b42101561268f5760405160e560020a62461bcd02815260206004820152601360248201527f486f7572206e6f742070617373656420796574000000000000000000000000006044820152606401610448565b6011805463ff000000191663010000001790556000601255604051600181527fbc0f7acaff8b73cba04dfbe72320fc77f019cbc71282745c98fad286a0805f0c906020016114c5565b600654600160a060020a031633146127055760405160e560020a62461bcd02815260040161044890613b84565b7315e6733be8401d33b4cf542411d400c823df618761272c600654600160a060020a031690565b600160a060020a0316146127555760405160e560020a62461bcd02815260040161044890613bb9565b601154610100900460ff16156127b05760405160e560020a62461bcd02815260206004820152601060248201527f526f6f7420616c726561647920736574000000000000000000000000000000006044820152606401610448565b6011805461ff001916610100179055600f8190556040517fcabf8550b9a306922529d9991dece81a1afb5b2d237560460464667de07cfbc9906123c59083815260200190565b636298ec9042101561284d5760405160e560020a62461bcd02815260206004820152601a60248201527f57686974656c69737432206e6f742073746172746564207965740000000000006044820152606401610448565b33321461286f5760405160e560020a62461bcd02815260040161044890613aa2565b6040516c01000000000000000000000000330260208201526000906034016040516020818303038152906040528051906020012090506128e683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601054915084905061309e565b6129355760405160e560020a62461bcd02815260206004820152601860248201527f41646472657373206e6f7420696e2077686974656c69737400000000000000006044820152606401610448565b336000908152600e602052604090205460ff16156129985760405160e560020a62461bcd02815260206004820152601960248201527f57686974656c69737420616c726561647920636c61696d6564000000000000006044820152606401610448565b6101f460075411156129ef5760405160e560020a62461bcd02815260206004820152601e60248201527f4d6178696d756d20636f6d6d756e697479206d696e74207265616368656400006044820152606401610448565b336000908152600c60205260408120805460019290612a0f908490613aff565b9091555050336000908152600e60205260408120805460ff191660019081179091556007805491929091612a44908490613aff565b909155506113869050336001612b0a565b600654600160a060020a03163314612a825760405160e560020a62461bcd02815260040161044890613b84565b600160a060020a038116612b015760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610448565b61165a8161313b565b600160a060020a038216612b895760405160e560020a62461bcd02815260206004820152602160248201527f455243373231583a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610448565b8060005b81811015612c135760055460405190820190600160a060020a038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460055481016000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038616179055600101612b8d565b506005805490910190555050565b60008115801590610c9d5750506005541190565b6000818152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091558190612c7782611fea565b600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008084600160a060020a03168460405160006040518083038185875af1925050503d8060008114612cfe576040519150601f19603f3d011682016040523d82523d6000602084013e612d03565b606091505b509150915081612d585760405160e560020a62461bcd02815260206004820152601460248201527f4661696c656420746f2073656e642065746865720000000000000000000000006044820152606401610448565b8215612dbe5784600160a060020a03167fa643712ad33544faa76eb9b49caa66b6eb5c22b406795b4a2fdcb6fca021c5bf8583604051612d99929190613b2e565b60405180910390a28360096000828254612db39190613aff565b90915550611fe39050565b84600160a060020a03167f180489ed98391c12b0b024acb7dcd85ce43619bcf0780aeca68aa3dd44651a5d8583604051612df9929190613b2e565b60405180910390a283600a6000828254612e139190613aff565b90915550505050505050565b6000612e2a82612c21565b612e9f5760405160e560020a62461bcd02815260206004820152602d60248201527f455243373231583a206f70657261746f7220717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e000000000000000000000000000000000000006064820152608401610448565b6000612eaa83611fea565b905080600160a060020a031684600160a060020a03161480612ee5575083600160a060020a0316612eda846111b8565b600160a060020a0316145b8061248f5750600160a060020a0380821660009081526004602090815260408083209388168352929052205460ff1661248f565b82600160a060020a0316612f2c82611fea565b600160a060020a031614612fab5760405160e560020a62461bcd02815260206004820152602a60248201527f455243373231583a207472616e73666572206f6620746f6b656e20746861742060448201527f6973206e6f74206f776e000000000000000000000000000000000000000000006064820152608401610448565b600160a060020a03821661302a5760405160e560020a62461bcd02815260206004820152602560248201527f455243373231583a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610448565b613035600082612c35565b600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826130ab8584613404565b14949350505050565b60005b8181101561312057806005546130cd9190613aff565b60405173b03a143afdc5bc8735903743001fd4698beeafe6906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48061311881613cfd565b9150506130b7565b5080600560008282546131339190613aff565b909155505050565b60068054600160a060020a0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b81600160a060020a031683600160a060020a0316036131fe5760405160e560020a62461bcd02815260206004820152601a60248201527f455243373231583a20617070726f766520746f2063616c6c65720000000000006044820152606401610448565b600160a060020a03838116600081815260046020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613276848484612f19565b61328284848484613478565b6124105760405160e560020a62461bcd02815260040161044890613d86565b60606008805461113590613b47565b6060816000036132f357505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561331d578061330781613cfd565b91506133169050600a83613c2f565b91506132f7565b60008167ffffffffffffffff811115613338576133386137b8565b6040519080825280601f01601f191660200182016040528015613362576020820181803683370190505b5090505b841561248f57613377600183613b17565b9150613384600a86613de3565b61338f906030613aff565b7f0100000000000000000000000000000000000000000000000000000000000000028183815181106133c3576133c3613df7565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506133fd600a86613c2f565b9450613366565b600081815b845181101561347057600085828151811061342657613426613df7565b6020026020010151905080831161344c576000838152602082905260409020925061345d565b600081815260208490526040902092505b508061346881613cfd565b915050613409565b509392505050565b6000600160a060020a0384163b156135a3576040517f150b7a02000000000000000000000000000000000000000000000000000000008152600160a060020a0385169063150b7a02906134d5903390899088908890600401613e10565b6020604051808303816000875af1925050508015613510575060408051601f3d908101601f1916820190925261350d91810190613e4c565b60015b613570573d80801561353e576040519150601f19603f3d011682016040523d82523d6000602084013e613543565b606091505b5080516000036135685760405160e560020a62461bcd02815260040161044890613d86565b805181602001fd5b600160e060020a0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061248f565b506001949350505050565b8280546135ba90613b47565b90600052602060002090601f0160209004810192826135dc5760008555613622565b82601f106135f557805160ff1916838001178555613622565b82800160010185558215613622579182015b82811115613622578251825591602001919060010190613607565b5061362e929150613632565b5090565b5b8082111561362e5760008155600101613633565b60e060020a634e487b7102600052601160045260246000fd5b600081600019048311821515161561367a5761367a613647565b500290565b600160e060020a03198116811461165a57600080fd5b6000602082840312156136a757600080fd5b813561256c8161367f565b60005b838110156136cd5781810151838201526020016136b5565b838111156124105750506000910152565b600081518084526136f68160208601602086016136b2565b601f01601f19169290920160200192915050565b60208152600061256c60208301846136de565b60006020828403121561372f57600080fd5b5035919050565b8035600160a060020a038116811461374d57600080fd5b919050565b6000806040838503121561376557600080fd5b61376e83613736565b946020939093013593505050565b60008060006060848603121561379157600080fd5b61379a84613736565b92506137a860208501613736565b9150604084013590509250925092565b60e060020a634e487b7102600052604160045260246000fd5b600067ffffffffffffffff808411156137ec576137ec6137b8565b604051601f8501601f19908116603f01168101908282118183101715613814576138146137b8565b8160405280935085815286868601111561382d57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561385957600080fd5b813567ffffffffffffffff81111561387057600080fd5b8201601f8101841361388157600080fd5b61248f848235602084016137d1565b60008083601f8401126138a257600080fd5b50813567ffffffffffffffff8111156138ba57600080fd5b60208301915083602080830285010111156138d457600080fd5b9250929050565b6000806000604084860312156138f057600080fd5b83359250602084013567ffffffffffffffff81111561390e57600080fd5b61391a86828701613890565b9497909650939450505050565b60006020828403121561393957600080fd5b61256c82613736565b60008060006060848603121561395757600080fd5b61396084613736565b95602085013595506040909401359392505050565b6000806040838503121561398857600080fd5b61399183613736565b9150602083013580151581146139a657600080fd5b809150509250929050565b600080600080608085870312156139c757600080fd5b6139d085613736565b93506139de60208601613736565b925060408501359150606085013567ffffffffffffffff811115613a0157600080fd5b8501601f81018713613a1257600080fd5b613a21878235602084016137d1565b91505092959194509250565b60008060208385031215613a4057600080fd5b823567ffffffffffffffff811115613a5757600080fd5b613a6385828601613890565b90969095509350505050565b60008060408385031215613a8257600080fd5b613a8b83613736565b9150613a9960208401613736565b90509250929050565b60208082526026908201527f7061796d656e74206e6f7420616c6c6f7765642066726f6d207468697320636f60408201527f6e74726163740000000000000000000000000000000000000000000000000000606082015260800190565b60008219821115613b1257613b12613647565b500190565b600082821015613b2957613b29613647565b500390565b82815260406020820152600061248f60408301846136de565b600281046001821680613b5b57607f821691505b602082108103613b7e5760e060020a634e487b7102600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f4f776e6572206973206e6f74206d756c74697369676e61747572652077616c6c60408201527f6574000000000000000000000000000000000000000000000000000000000000606082015260800190565b60e060020a634e487b7102600052601260045260246000fd5b600082613c3e57613c3e613c16565b500490565b60208082526032908201527f455243373231583a207472616e736665722063616c6c6572206973206e6f742060408201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606082015260800190565b6020808252602b908201527f455243373231583a2062616c616e636520717565727920666f7220746865207a60408201527f65726f2061646472657373000000000000000000000000000000000000000000606082015260800190565b600060018201613d0f57613d0f613647565b5060010190565b60e060020a634e487b7102600052602160045260246000fd5b60008351613d418184602088016136b2565b835190830190613d558183602088016136b2565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60208082526033908201527f455243373231583a207472616e7366657220746f206e6f6e204552433732315260408201527f6563656976657220696d706c656d656e74657200000000000000000000000000606082015260800190565b600082613df257613df2613c16565b500690565b60e060020a634e487b7102600052603260045260246000fd5b6000600160a060020a03808716835280861660208401525083604083015260806060830152613e4260808301846136de565b9695505050505050565b600060208284031215613e5e57600080fd5b815161256c8161367f56fea264697066735822122025e7d1483aef58baed21923942e77a4271f83b907743b3ab7997d96e0d999e4264736f6c634300080d003368747470733a2f2f7a656c656e736b69796e66742e6d7970696e6174612e636c6f75642f697066732f516d5648556a39754d3748784b35785369327662697039795358596b4c42455057656351654a6362564b7a426d482f

Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.