Contract 0xb73eD4E6FEeB1a785Df4443DF67bf7ED1F4904fc 4

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
 
Txn Hash
Method
Block
From
To
Value
0x7838ad5593b65d42a8af44951d7441043fbe060f962b86277be7969efa56cf50Transfer From158308652022-10-26 7:50:5931 days 4 hrs ago0xf7019ba0c90ef0fb8d3c997e275ab3054657de59 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00066437 11.31638468
0x97dff6de54c23c61aedc513a3e2ac87f6447fc1ca3106d35b9f897bb03c2d9feSet Approval For...157624932022-10-16 18:33:5940 days 18 hrs ago0x994fa017cb2d3748477f07d3b62fa6d567252712 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00058048 12.445767
0xe282e51ca0035454134bd229e75dcbb45777068e2b3660bc36ff2957b2e49ca2Safe Transfer Fr...157624802022-10-16 18:31:2340 days 18 hrs ago0x70a54dafe13f0e104314c9150c018e229785681b IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.0007841 12.73638409
0x34150f2f3792ebac56d13bd968295bfa10ee834b1cc4e8e4b7e8cc564dc500a8Set Approval For...157424902022-10-13 23:32:2343 days 13 hrs ago0x8074b456aefdbe3d3596cd2e9c10bccfb2a4275b IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00040635 16.37678246
0x58f71c245e3a5187fed9d280aa8748e6a3e061ceea3acbc034d4f9e828c8b62fSet Approval For...157370892022-10-13 5:24:4744 days 7 hrs ago0xd9d89e7359defa3fdd13d00d9fde0fb783a3dd61 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.0006562 14.06936785
0x35f325c95c844e4e7af328dd8b7eb9dde11065d085b14819248c52a47aa4aee7Set Approval For...157369822022-10-13 5:03:2344 days 7 hrs ago0xb3be9a9ffa1cdd5c148ee764a992d26bd1f03a7a IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00080669 17.2647621
0x7f5e21c5d3f01854c86f14592aad1f286e35c3d4344301511792823499bcc82fSafe Transfer Fr...157346232022-10-12 21:10:1144 days 15 hrs agoFake_Phishing7023 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00086499 18.2458575
0x0541ea46793a687d23bd3c85757c884b5f35c2c3326d6e55510536135c0aa45bSafe Transfer Fr...157346232022-10-12 21:10:1144 days 15 hrs agoFake_Phishing7023 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00126458 18.2458575
0xf4401341bb2e2fd90ac76fc3a655792070508c2dee2b7181499d4e41725b1bdfSet Approval For...157346212022-10-12 21:09:4744 days 15 hrs ago0x2b243ccfab28695e8b43c12210845b95b33daf42 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00079596 17.03502575
0x037fd307a6e12a94c565eafe0e7e8c00f81f2aee0aeeb41bbe080e116c52c848Set Approval For...156288002022-09-28 2:17:3559 days 10 hrs ago0x07811850248b12a05e1b6f532ee1b15da01d4f19 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.0005886 12.6198145
0xc633945240e78d789a960665d8287a2641592798f194636725af46c9eabd8686Set Approval For...156223132022-09-27 4:28:5960 days 8 hrs ago0x5041be2816ab2583b34520bd6df78456b70b1428 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00041127 8.81788217
0x77a90466132918f33f055f794ae68246ae553fa5e5f3072765a086840ec41ca5Set Approval For...156204922022-09-26 22:23:1160 days 14 hrs agoENS Name highsamurai.eth IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00059636 12.78630753
0x21cd7dcd84b78bcd4fb116a1075abb9e6fed582e2bc9e4a419c5408d17b0d2c5Set Approval For...154235742022-08-27 20:05:3090 days 16 hrs agoENS Name jonezyartwork.eth IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00049747 10.66598889
0x01f09e6dbb77603c7a105afd9be603eacb8ffcbd97ff5708feb780999504625fSet Approval For...154113572022-08-25 21:08:0292 days 15 hrs ago0x4beecb0e14ef20c47536bcc39af5a7992bcd9267 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00045978 9.8579177
0xc8cc48020d37c36ec6542b513e15f1865ba2f85450b118746225e130fe2e41f0Set Approval For...154062832022-08-25 1:27:1393 days 11 hrs ago0x7b2e6e86d67176207cf898ce6445224b905ae7f4 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00041191 8.8317099
0x8e82c948c758d376dfcd7de4357d1de212fb7149ede7c89ff500b3d455d249c6Set Approval For...153869932022-08-21 23:50:4596 days 12 hrs ago0x077832c7f6e8dc979595062f9cd85b77aa3f75c5 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.0003062 6.56515248
0x1a5b4412a0e1d1950ed0277343db3bfef0230b71562577783e6d997da975d507Set Approval For...153624142022-08-18 2:33:04100 days 10 hrs ago0x38fef205b860125af8e96e3b73a23b414074f103 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00024274 9.78307976
0x7eba2a4e86a260632ac1c692394b2e07f2c24baed3a6c5679b410a01558ca047Set Approval For...153133552022-08-10 8:42:35108 days 4 hrs ago0x5e7f609cc3a7f0d3281267d36044418e58b8b7cc IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00050748 10.88066695
0x8bd7d0e4c0bdd01263d47bcb4a9cec3344da0b98eba2f7d30f15138af5ed2229Set Approval For...153133452022-08-10 8:40:38108 days 4 hrs agoENS Name mr-g.eth IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00046734 10.0201009
0x11c036ce2935d1a294a09b25ef2ace6b749326b6f0af201abf5fe9922fa8e1afTransfer From153055872022-08-09 3:23:32109 days 9 hrs ago0x375c8be95978bd235420150281ce1a77c8aece09 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00052248 8.89963153
0x15c226b73ac54046da20a670f445513e3dd280c77fc69d52d44e6fec6be3618cSet Approval For...152718902022-08-03 21:30:44114 days 15 hrs agoENS Name ljapunov.eth IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00056602 12.11390285
0x89f787a80675d8a394de99e0e0ac6db348a43487fd8a6cef35a23db89073c0b9Set Approval For...152059142022-07-24 14:45:06124 days 22 hrs ago0x5f14c4199951124aec2ea2252e61c3f94ffd2fa2 IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00066928 14.34970516
0x9df500d06943d92534f2eb86f7578871ab215d91981c7f8f8d094247da7b3e64Set Approval For...151930152022-07-22 14:48:50126 days 22 hrs ago0x8074b456aefdbe3d3596cd2e9c10bccfb2a4275b IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.000966 20.67418957
0x29f4f40b7cfc374f887ee83872397e3d1b981683a925caa0ffd6b1d013f48d33Transfer From151930062022-07-22 14:46:37126 days 22 hrs ago0x8074b456aefdbe3d3596cd2e9c10bccfb2a4275b IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.00077592 16.71930466
0xb6000f0f5860c110dfe59d40182244c27f234287d7fcc4b5cc30511f7c9c56efTransfer From151930032022-07-22 14:45:49126 days 22 hrs ago0x8074b456aefdbe3d3596cd2e9c10bccfb2a4275b IN  0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0 Ether0.0006951 14.97778492
[ Download CSV Export 
Latest 22 internal transactions
Parent Txn Hash Block From To Value
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x85624f3810bd0d4fc05120dcaf83315973dd56330.6423802 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x2750748d43fe09db80103b6c45245ab03681dc6c0.2294215 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fcENS Name chowder.eth0.1376529 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xcc7c8e5a327b7410260bc1a449904c386024814b0.11471075 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fcENS Name nftpoppa.eth0.16059505 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xaf45179e538164e0e45fe582bc8f47701aa412970.2753058 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xa20dc2c1025f9564fdd8925731ac72d776ffaf3d0.2753058 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xcac934b4ff871ec2d33b54b9387866ca7ed3d1520.8259174 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xacea32c4b01e899551312175131b1254fa87251b0.0917686 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x57ef04387b2c75bccbb03cbb0c139b55f6b226c40.6882645 Ether
0x02f18568084a87d1ed72260ce050cd2c3e37df534893074516a3e35c37456f5c132262552021-09-14 21:26:22437 days 15 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x1b81e535f48f6f66f6c6a3c0e6e6e05a749ee0991.1471075 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x85624f3810bd0d4fc05120dcaf83315973dd563320.6650787 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x2750748d43fe09db80103b6c45245ab03681dc6c7.38038525 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fcENS Name chowder.eth4.42823115 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xcc7c8e5a327b7410260bc1a449904c386024814b3.69019262 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fcENS Name nftpoppa.eth5.16626967 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xaf45179e538164e0e45fe582bc8f47701aa412978.8564623 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xa20dc2c1025f9564fdd8925731ac72d776ffaf3d8.8564623 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xcac934b4ff871ec2d33b54b9387866ca7ed3d15226.5693869 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0xacea32c4b01e899551312175131b1254fa87251b2.9521541 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x57ef04387b2c75bccbb03cbb0c139b55f6b226c422.14115575 Ether
0x8ffdd652c8798b65e3b987e78c59ca8e7373046dea4c3904eec837aa93e343b9132084692021-09-12 3:21:33440 days 9 hrs ago 0xb73ed4e6feeb1a785df4443df67bf7ed1f4904fc0x1b81e535f48f6f66f6c6a3c0e6e6e05a749ee09936.90192625 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GalacticEmpire

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : GalacticEmpire.sol
pragma solidity ^0.8.0;
//SPDX-License-Identifier: MIT

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract GalacticEmpire is ERC721, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    uint256 private constant _maxTokens = 11111;
    uint256 private _maxPresaleTokens = 1211;
    uint256 private constant _maxMint = 20;
    uint256 private constant _maxPresaleMint = 7;
    uint256 public constant _price = 77770000000000000; // 0.07777 ETH
    bool private _presaleActive = false;
    bool private _saleActive = false;

    string public _prefixURI;

    constructor() ERC721("GalacticEmpire", "GE") {}

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

    function setMaxPresaleTokens(uint256 quantity) public onlyOwner {
        _maxPresaleTokens = quantity;
    }

    function setBaseURI(string memory _uri) public onlyOwner {
        _prefixURI = _uri;
    }

    function totalSupply() public view returns (uint256) {
        return _tokenIds.current();
    }

    function togglePreSale() public onlyOwner {
        _presaleActive = !_presaleActive;
    }

    function toggleSale() public onlyOwner {
        _saleActive = !_saleActive;
        _presaleActive = false;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId));

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

    function mintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(_saleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);

        require(msg.value >= amount * _price);

        for (uint256 i = 0; i < amount; i++) {
            _mintItem(msg.sender);
        }
    }

    function presaleMintItems(uint256 amount) public payable {
        require(amount <= _maxPresaleMint);
        require(_presaleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxPresaleTokens);

        require(msg.value >= amount * _price);

        for (uint256 i = 0; i < amount; i++) {
            _mintItem(msg.sender);
        }
    }

    function _mintItem(address to) internal returns (uint256) {
        _tokenIds.increment();

        uint256 id = _tokenIds.current();
        _mint(to, id);

        return id;
    }

    function reserve(uint256 quantity, address to) public onlyOwner {
        for(uint i = _tokenIds.current(); i < quantity; i++) {
            if (i < _maxTokens) {
                _tokenIds.increment();
                _safeMint(to, i + 1);
            }
        }
    }

    function withdraw() public payable onlyOwner {
        uint256 total = address(this).balance;
        uint256 one = total * 250;
        uint256 two = total * 150;
        uint256 three = total * 20;
        uint256 four = total * 180;
        uint256 five = total * 60;
        uint256 six = total * 60;
        uint256 seven = total * 35;
        uint256 eight = total * 25;
        uint256 nine = total * 30;
        uint256 ten = total * 50;
        uint256 eleven = total * 140;

        require(payable(0x1b81e535f48f6F66f6C6a3c0e6E6e05a749EE099).send(one / 1000));
        require(payable(0x57ef04387B2C75bcCbb03CbB0c139b55F6b226c4).send(two / 1000));
        require(payable(0xAcEA32c4b01e899551312175131b1254Fa87251b).send(three / 1000));
        require(payable(0xCaC934B4Ff871EC2D33B54b9387866Ca7Ed3D152).send(four / 1000));
        require(payable(0xa20Dc2C1025F9564fDd8925731Ac72d776Ffaf3D).send(five / 1000));
        require(payable(0xaF45179E538164e0e45Fe582bc8F47701aA41297).send(six / 1000));
        require(payable(0xfA02f156c508DF8bC2fFd1fd34Ac7Fa4A598b6b5).send(seven / 1000));
        require(payable(0xcc7c8E5a327B7410260BC1A449904C386024814B).send(eight / 1000));
        require(payable(0x387950f231F0AD9519627f9efAa4cac60abA40d9).send(nine / 1000));
        require(payable(0x2750748D43FE09dB80103b6C45245aB03681dC6c).send(ten / 1000));
        require(payable(0x85624F3810BD0D4fC05120dCaF83315973dD5633).send(eleven / 1000));
    }
}

File 2 of 12 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    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 owner address to token count
    mapping(address => uint256) private _balances;

    // 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 Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    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 ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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())) : "";
    }

    /**
     * @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 = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: 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), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_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), "ERC721: 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), "ERC721: 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), "ERC721: 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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @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), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - 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 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @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 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  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 {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _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(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: 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 {}
}

File 3 of 12 : Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT

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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 12 : Strings.sol
// SPDX-License-Identifier: MIT

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 6 of 12 : IERC721.sol
// SPDX-License-Identifier: MIT

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 7 of 12 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 8 of 12 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

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 9 of 12 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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 10 of 12 : Context.sol
// SPDX-License-Identifier: MIT

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 11 of 12 : ERC165.sol
// SPDX-License-Identifier: MIT

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 12 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT

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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","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":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presaleMintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"reserve","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMaxPresaleTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"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":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526104bb6008556000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055503480156200004d57600080fd5b506040518060400160405280600e81526020017f47616c6163746963456d706972650000000000000000000000000000000000008152506040518060400160405280600281526020017f47450000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000d2929190620001e2565b508060019080519060200190620000eb929190620001e2565b5050506200010e620001026200011460201b60201c565b6200011c60201b60201c565b620002f7565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f09062000292565b90600052602060002090601f01602090048101928262000214576000855562000260565b82601f106200022f57805160ff191683800117855562000260565b8280016001018555821562000260579182015b828111156200025f57825182559160200191906001019062000242565b5b5090506200026f919062000273565b5090565b5b808211156200028e57600081600090555060010162000274565b5090565b60006002820490506001821680620002ab57607f821691505b60208210811415620002c257620002c1620002c8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613a8c80620003076000396000f3fe60806040526004361061019c5760003560e01c80636352211e116100ec57806395d89b411161008a578063c87b56dd11610064578063c87b56dd1461054f578063ca3cb5221461058c578063e985e9c5146105a3578063f2fde38b146105e05761019c565b806395d89b41146104d2578063a22cb465146104fd578063b88d4fde146105265761019c565b806372537189116100c6578063725371891461043c5780637d8966e4146104655780638da5cb5b1461047c57806391860f78146104a75761019c565b80636352211e146103ab57806370a08231146103e8578063715018a6146104255761019c565b806318160ddd116101595780633ccfd60b116101335780633ccfd60b1461033357806342842e0e1461033d5780635367de6a1461036657806355f804b3146103825761019c565b806318160ddd146102b4578063235b6ea1146102df57806323b872dd1461030a5761019c565b806301ffc9a7146101a157806303339bcb146101de57806306fdde0314610207578063081812fc14610232578063095ea7b31461026f5780630b4b987814610298575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612ac3565b610609565b6040516101d59190612f51565b60405180910390f35b3480156101ea57600080fd5b5061020560048036038101906102009190612b7f565b6106eb565b005b34801561021357600080fd5b5061021c6107c1565b6040516102299190612f6c565b60405180910390f35b34801561023e57600080fd5b5061025960048036038101906102549190612b56565b610853565b6040516102669190612eea565b60405180910390f35b34801561027b57600080fd5b5061029660048036038101906102919190612a87565b6108d8565b005b6102b260048036038101906102ad9190612b56565b6109f0565b005b3480156102c057600080fd5b506102c9610a8c565b6040516102d6919061316e565b60405180910390f35b3480156102eb57600080fd5b506102f4610a9d565b604051610301919061316e565b60405180910390f35b34801561031657600080fd5b50610331600480360381019061032c9190612981565b610aa9565b005b61033b610b09565b005b34801561034957600080fd5b50610364600480360381019061035f9190612981565b611068565b005b610380600480360381019061037b9190612b56565b611088565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612b15565b611124565b005b3480156103b757600080fd5b506103d260048036038101906103cd9190612b56565b6111ba565b6040516103df9190612eea565b60405180910390f35b3480156103f457600080fd5b5061040f600480360381019061040a919061291c565b61126c565b60405161041c919061316e565b60405180910390f35b34801561043157600080fd5b5061043a611324565b005b34801561044857600080fd5b50610463600480360381019061045e9190612b56565b6113ac565b005b34801561047157600080fd5b5061047a611432565b005b34801561048857600080fd5b506104916114f5565b60405161049e9190612eea565b60405180910390f35b3480156104b357600080fd5b506104bc61151f565b6040516104c99190612f6c565b60405180910390f35b3480156104de57600080fd5b506104e76115ad565b6040516104f49190612f6c565b60405180910390f35b34801561050957600080fd5b50610524600480360381019061051f9190612a4b565b61163f565b005b34801561053257600080fd5b5061054d600480360381019061054891906129d0565b6117c0565b005b34801561055b57600080fd5b5061057660048036038101906105719190612b56565b611822565b6040516105839190612f6c565b60405180910390f35b34801561059857600080fd5b506105a1611893565b005b3480156105af57600080fd5b506105ca60048036038101906105c59190612945565b61193b565b6040516105d79190612f51565b60405180910390f35b3480156105ec57600080fd5b506106076004803603810190610602919061291c565b6119cf565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106d457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106e457506106e382611ac7565b5b9050919050565b6106f3611b31565b73ffffffffffffffffffffffffffffffffffffffff166107116114f5565b73ffffffffffffffffffffffffffffffffffffffff1614610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e906130ee565b60405180910390fd5b60006107736007611b39565b90505b828110156107bc57612b678110156107a9576107926007611b47565b6107a8826001836107a39190613253565b611b5d565b5b80806107b490613481565b915050610776565b505050565b6060600080546107d09061341e565b80601f01602080910402602001604051908101604052809291908181526020018280546107fc9061341e565b80156108495780601f1061081e57610100808354040283529160200191610849565b820191906000526020600020905b81548152906001019060200180831161082c57829003601f168201915b5050505050905090565b600061085e82611b7b565b61089d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610894906130ce565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e3826111ba565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b9061312e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610973611b31565b73ffffffffffffffffffffffffffffffffffffffff1614806109a257506109a18161099c611b31565b61193b565b5b6109e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d89061304e565b60405180910390fd5b6109eb8383611be7565b505050565b60078111156109fe57600080fd5b600960009054906101000a900460ff16610a1757600080fd5b6000610a236007611b39565b90506008548282610a349190613253565b1115610a3f57600080fd5b6701144b67282ea00082610a5391906132da565b341015610a5f57600080fd5b60005b82811015610a8757610a7333611ca0565b508080610a7f90613481565b915050610a62565b505050565b6000610a986007611b39565b905090565b6701144b67282ea00081565b610aba610ab4611b31565b82611ccd565b610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af09061314e565b60405180910390fd5b610b04838383611dab565b505050565b610b11611b31565b73ffffffffffffffffffffffffffffffffffffffff16610b2f6114f5565b73ffffffffffffffffffffffffffffffffffffffff1614610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c906130ee565b60405180910390fd5b6000479050600060fa82610b9991906132da565b90506000609683610baa91906132da565b90506000601484610bbb91906132da565b9050600060b485610bcc91906132da565b90506000603c86610bdd91906132da565b90506000603c87610bee91906132da565b90506000602388610bff91906132da565b90506000601989610c1091906132da565b90506000601e8a610c2191906132da565b9050600060328b610c3291906132da565b90506000608c8c610c4391906132da565b9050731b81e535f48f6f66f6c6a3c0e6e6e05a749ee09973ffffffffffffffffffffffffffffffffffffffff166108fc6103e88d610c8191906132a9565b9081150290604051600060405180830381858888f19350505050610ca457600080fd5b7357ef04387b2c75bccbb03cbb0c139b55f6b226c473ffffffffffffffffffffffffffffffffffffffff166108fc6103e88c610ce091906132a9565b9081150290604051600060405180830381858888f19350505050610d0357600080fd5b73acea32c4b01e899551312175131b1254fa87251b73ffffffffffffffffffffffffffffffffffffffff166108fc6103e88b610d3f91906132a9565b9081150290604051600060405180830381858888f19350505050610d6257600080fd5b73cac934b4ff871ec2d33b54b9387866ca7ed3d15273ffffffffffffffffffffffffffffffffffffffff166108fc6103e88a610d9e91906132a9565b9081150290604051600060405180830381858888f19350505050610dc157600080fd5b73a20dc2c1025f9564fdd8925731ac72d776ffaf3d73ffffffffffffffffffffffffffffffffffffffff166108fc6103e889610dfd91906132a9565b9081150290604051600060405180830381858888f19350505050610e2057600080fd5b73af45179e538164e0e45fe582bc8f47701aa4129773ffffffffffffffffffffffffffffffffffffffff166108fc6103e888610e5c91906132a9565b9081150290604051600060405180830381858888f19350505050610e7f57600080fd5b73fa02f156c508df8bc2ffd1fd34ac7fa4a598b6b573ffffffffffffffffffffffffffffffffffffffff166108fc6103e887610ebb91906132a9565b9081150290604051600060405180830381858888f19350505050610ede57600080fd5b73cc7c8e5a327b7410260bc1a449904c386024814b73ffffffffffffffffffffffffffffffffffffffff166108fc6103e886610f1a91906132a9565b9081150290604051600060405180830381858888f19350505050610f3d57600080fd5b73387950f231f0ad9519627f9efaa4cac60aba40d973ffffffffffffffffffffffffffffffffffffffff166108fc6103e885610f7991906132a9565b9081150290604051600060405180830381858888f19350505050610f9c57600080fd5b732750748d43fe09db80103b6c45245ab03681dc6c73ffffffffffffffffffffffffffffffffffffffff166108fc6103e884610fd891906132a9565b9081150290604051600060405180830381858888f19350505050610ffb57600080fd5b7385624f3810bd0d4fc05120dcaf83315973dd563373ffffffffffffffffffffffffffffffffffffffff166108fc6103e88361103791906132a9565b9081150290604051600060405180830381858888f1935050505061105a57600080fd5b505050505050505050505050565b611083838383604051806020016040528060008152506117c0565b505050565b601481111561109657600080fd5b600960019054906101000a900460ff166110af57600080fd5b60006110bb6007611b39565b9050612b6782826110cc9190613253565b11156110d757600080fd5b6701144b67282ea000826110eb91906132da565b3410156110f757600080fd5b60005b8281101561111f5761110b33611ca0565b50808061111790613481565b9150506110fa565b505050565b61112c611b31565b73ffffffffffffffffffffffffffffffffffffffff1661114a6114f5565b73ffffffffffffffffffffffffffffffffffffffff16146111a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611197906130ee565b60405180910390fd5b80600a90805190602001906111b6929190612740565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a9061308e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d49061306e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61132c611b31565b73ffffffffffffffffffffffffffffffffffffffff1661134a6114f5565b73ffffffffffffffffffffffffffffffffffffffff16146113a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611397906130ee565b60405180910390fd5b6113aa6000612007565b565b6113b4611b31565b73ffffffffffffffffffffffffffffffffffffffff166113d26114f5565b73ffffffffffffffffffffffffffffffffffffffff1614611428576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141f906130ee565b60405180910390fd5b8060088190555050565b61143a611b31565b73ffffffffffffffffffffffffffffffffffffffff166114586114f5565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a5906130ee565b60405180910390fd5b600960019054906101000a900460ff1615600960016101000a81548160ff0219169083151502179055506000600960006101000a81548160ff021916908315150217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a805461152c9061341e565b80601f01602080910402602001604051908101604052809291908181526020018280546115589061341e565b80156115a55780601f1061157a576101008083540402835291602001916115a5565b820191906000526020600020905b81548152906001019060200180831161158857829003601f168201915b505050505081565b6060600180546115bc9061341e565b80601f01602080910402602001604051908101604052809291908181526020018280546115e89061341e565b80156116355780601f1061160a57610100808354040283529160200191611635565b820191906000526020600020905b81548152906001019060200180831161161857829003601f168201915b5050505050905090565b611647611b31565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ac9061300e565b60405180910390fd5b80600560006116c2611b31565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661176f611b31565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117b49190612f51565b60405180910390a35050565b6117d16117cb611b31565b83611ccd565b611810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118079061314e565b60405180910390fd5b61181c848484846120cd565b50505050565b606061182d82611b7b565b61183657600080fd5b6000611840612129565b90506000815111611860576040518060200160405280600081525061188b565b8061186a846121bb565b60405160200161187b929190612ebb565b6040516020818303038152906040525b915050919050565b61189b611b31565b73ffffffffffffffffffffffffffffffffffffffff166118b96114f5565b73ffffffffffffffffffffffffffffffffffffffff161461190f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611906906130ee565b60405180910390fd5b600960009054906101000a900460ff1615600960006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d7611b31565b73ffffffffffffffffffffffffffffffffffffffff166119f56114f5565b73ffffffffffffffffffffffffffffffffffffffff1614611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a42906130ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab290612fae565b60405180910390fd5b611ac481612007565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b611b77828260405180602001604052806000815250612368565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c5a836111ba565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611cac6007611b47565b6000611cb86007611b39565b9050611cc483826123c3565b80915050919050565b6000611cd882611b7b565b611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e9061302e565b60405180910390fd5b6000611d22836111ba565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d9157508373ffffffffffffffffffffffffffffffffffffffff16611d7984610853565b73ffffffffffffffffffffffffffffffffffffffff16145b80611da25750611da1818561193b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611dcb826111ba565b73ffffffffffffffffffffffffffffffffffffffff1614611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e189061310e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8890612fee565b60405180910390fd5b611e9c838383612591565b611ea7600082611be7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef79190613334565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f4e9190613253565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120d8848484611dab565b6120e484848484612596565b612123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211a90612f8e565b60405180910390fd5b50505050565b6060600a80546121389061341e565b80601f01602080910402602001604051908101604052809291908181526020018280546121649061341e565b80156121b15780601f10612186576101008083540402835291602001916121b1565b820191906000526020600020905b81548152906001019060200180831161219457829003601f168201915b5050505050905090565b60606000821415612203576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612363565b600082905060005b6000821461223557808061221e90613481565b915050600a8261222e91906132a9565b915061220b565b60008167ffffffffffffffff811115612277577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122a95781602001600182028036833780820191505090505b5090505b6000851461235c576001826122c29190613334565b9150600a856122d191906134ca565b60306122dd9190613253565b60f81b818381518110612319577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561235591906132a9565b94506122ad565b8093505050505b919050565b61237283836123c3565b61237f6000848484612596565b6123be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b590612f8e565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242a906130ae565b60405180910390fd5b61243c81611b7b565b1561247c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247390612fce565b60405180910390fd5b61248860008383612591565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124d89190613253565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b60006125b78473ffffffffffffffffffffffffffffffffffffffff1661272d565b15612720578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125e0611b31565b8786866040518563ffffffff1660e01b81526004016126029493929190612f05565b602060405180830381600087803b15801561261c57600080fd5b505af192505050801561264d57506040513d601f19601f8201168201806040525081019061264a9190612aec565b60015b6126d0573d806000811461267d576040519150601f19603f3d011682016040523d82523d6000602084013e612682565b606091505b506000815114156126c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126bf90612f8e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612725565b600190505b949350505050565b600080823b905060008111915050919050565b82805461274c9061341e565b90600052602060002090601f01602090048101928261276e57600085556127b5565b82601f1061278757805160ff19168380011785556127b5565b828001600101855582156127b5579182015b828111156127b4578251825591602001919060010190612799565b5b5090506127c291906127c6565b5090565b5b808211156127df5760008160009055506001016127c7565b5090565b60006127f66127f1846131ae565b613189565b90508281526020810184848401111561280e57600080fd5b6128198482856133dc565b509392505050565b600061283461282f846131df565b613189565b90508281526020810184848401111561284c57600080fd5b6128578482856133dc565b509392505050565b60008135905061286e816139fa565b92915050565b60008135905061288381613a11565b92915050565b60008135905061289881613a28565b92915050565b6000815190506128ad81613a28565b92915050565b600082601f8301126128c457600080fd5b81356128d48482602086016127e3565b91505092915050565b600082601f8301126128ee57600080fd5b81356128fe848260208601612821565b91505092915050565b60008135905061291681613a3f565b92915050565b60006020828403121561292e57600080fd5b600061293c8482850161285f565b91505092915050565b6000806040838503121561295857600080fd5b60006129668582860161285f565b92505060206129778582860161285f565b9150509250929050565b60008060006060848603121561299657600080fd5b60006129a48682870161285f565b93505060206129b58682870161285f565b92505060406129c686828701612907565b9150509250925092565b600080600080608085870312156129e657600080fd5b60006129f48782880161285f565b9450506020612a058782880161285f565b9350506040612a1687828801612907565b925050606085013567ffffffffffffffff811115612a3357600080fd5b612a3f878288016128b3565b91505092959194509250565b60008060408385031215612a5e57600080fd5b6000612a6c8582860161285f565b9250506020612a7d85828601612874565b9150509250929050565b60008060408385031215612a9a57600080fd5b6000612aa88582860161285f565b9250506020612ab985828601612907565b9150509250929050565b600060208284031215612ad557600080fd5b6000612ae384828501612889565b91505092915050565b600060208284031215612afe57600080fd5b6000612b0c8482850161289e565b91505092915050565b600060208284031215612b2757600080fd5b600082013567ffffffffffffffff811115612b4157600080fd5b612b4d848285016128dd565b91505092915050565b600060208284031215612b6857600080fd5b6000612b7684828501612907565b91505092915050565b60008060408385031215612b9257600080fd5b6000612ba085828601612907565b9250506020612bb18582860161285f565b9150509250929050565b612bc481613368565b82525050565b612bd38161337a565b82525050565b6000612be482613210565b612bee8185613226565b9350612bfe8185602086016133eb565b612c07816135b7565b840191505092915050565b6000612c1d8261321b565b612c278185613237565b9350612c378185602086016133eb565b612c40816135b7565b840191505092915050565b6000612c568261321b565b612c608185613248565b9350612c708185602086016133eb565b80840191505092915050565b6000612c89603283613237565b9150612c94826135c8565b604082019050919050565b6000612cac602683613237565b9150612cb782613617565b604082019050919050565b6000612ccf601c83613237565b9150612cda82613666565b602082019050919050565b6000612cf2602483613237565b9150612cfd8261368f565b604082019050919050565b6000612d15601983613237565b9150612d20826136de565b602082019050919050565b6000612d38602c83613237565b9150612d4382613707565b604082019050919050565b6000612d5b603883613237565b9150612d6682613756565b604082019050919050565b6000612d7e602a83613237565b9150612d89826137a5565b604082019050919050565b6000612da1602983613237565b9150612dac826137f4565b604082019050919050565b6000612dc4602083613237565b9150612dcf82613843565b602082019050919050565b6000612de7602c83613237565b9150612df28261386c565b604082019050919050565b6000612e0a600583613248565b9150612e15826138bb565b600582019050919050565b6000612e2d602083613237565b9150612e38826138e4565b602082019050919050565b6000612e50602983613237565b9150612e5b8261390d565b604082019050919050565b6000612e73602183613237565b9150612e7e8261395c565b604082019050919050565b6000612e96603183613237565b9150612ea1826139ab565b604082019050919050565b612eb5816133d2565b82525050565b6000612ec78285612c4b565b9150612ed38284612c4b565b9150612ede82612dfd565b91508190509392505050565b6000602082019050612eff6000830184612bbb565b92915050565b6000608082019050612f1a6000830187612bbb565b612f276020830186612bbb565b612f346040830185612eac565b8181036060830152612f468184612bd9565b905095945050505050565b6000602082019050612f666000830184612bca565b92915050565b60006020820190508181036000830152612f868184612c12565b905092915050565b60006020820190508181036000830152612fa781612c7c565b9050919050565b60006020820190508181036000830152612fc781612c9f565b9050919050565b60006020820190508181036000830152612fe781612cc2565b9050919050565b6000602082019050818103600083015261300781612ce5565b9050919050565b6000602082019050818103600083015261302781612d08565b9050919050565b6000602082019050818103600083015261304781612d2b565b9050919050565b6000602082019050818103600083015261306781612d4e565b9050919050565b6000602082019050818103600083015261308781612d71565b9050919050565b600060208201905081810360008301526130a781612d94565b9050919050565b600060208201905081810360008301526130c781612db7565b9050919050565b600060208201905081810360008301526130e781612dda565b9050919050565b6000602082019050818103600083015261310781612e20565b9050919050565b6000602082019050818103600083015261312781612e43565b9050919050565b6000602082019050818103600083015261314781612e66565b9050919050565b6000602082019050818103600083015261316781612e89565b9050919050565b60006020820190506131836000830184612eac565b92915050565b60006131936131a4565b905061319f8282613450565b919050565b6000604051905090565b600067ffffffffffffffff8211156131c9576131c8613588565b5b6131d2826135b7565b9050602081019050919050565b600067ffffffffffffffff8211156131fa576131f9613588565b5b613203826135b7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061325e826133d2565b9150613269836133d2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561329e5761329d6134fb565b5b828201905092915050565b60006132b4826133d2565b91506132bf836133d2565b9250826132cf576132ce61352a565b5b828204905092915050565b60006132e5826133d2565b91506132f0836133d2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613329576133286134fb565b5b828202905092915050565b600061333f826133d2565b915061334a836133d2565b92508282101561335d5761335c6134fb565b5b828203905092915050565b6000613373826133b2565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156134095780820151818401526020810190506133ee565b83811115613418576000848401525b50505050565b6000600282049050600182168061343657607f821691505b6020821081141561344a57613449613559565b5b50919050565b613459826135b7565b810181811067ffffffffffffffff8211171561347857613477613588565b5b80604052505050565b600061348c826133d2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156134bf576134be6134fb565b5b600182019050919050565b60006134d5826133d2565b91506134e0836133d2565b9250826134f0576134ef61352a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613a0381613368565b8114613a0e57600080fd5b50565b613a1a8161337a565b8114613a2557600080fd5b50565b613a3181613386565b8114613a3c57600080fd5b50565b613a48816133d2565b8114613a5357600080fd5b5056fea26469706673582212202936fca3fdae27e90b52cb51828018114b58740b4fc0e6944b26c7af6f13669764736f6c63430008040033

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.