ETH Price: $3,414.38 (+2.97%)
Gas: 4.73 Gwei

Contract

0xe1A66A7883578BfaCa0bD312Bf38f8D16C320775
 

Overview

ETH Balance

0.09 ETH

Eth Value

$307.29 (@ $3,414.38/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...190824502024-01-25 8:30:59333 days ago1706171459IN
0xe1A66A78...16C320775
0 ETH0.0006239413.49339207
Set Approval For...167037262023-02-25 7:08:59667 days ago1677308939IN
0xe1A66A78...16C320775
0 ETH0.0004855319.95720096
Transfer From152062482022-07-24 15:56:26883 days ago1658678186IN
0xe1A66A78...16C320775
0 ETH0.000939219.69974131
Transfer From152062382022-07-24 15:54:50883 days ago1658678090IN
0xe1A66A78...16C320775
0 ETH0.0012678413.48356052
Set Approval For...151221062022-07-11 15:25:12896 days ago1657553112IN
0xe1A66A78...16C320775
0 ETH0.0008726435.86838747
Set Approval For...150733182022-07-04 2:20:44904 days ago1656901244IN
0xe1A66A78...16C320775
0 ETH0.0005916712.81880269
Transfer From150600082022-07-02 1:16:11906 days ago1656724571IN
0xe1A66A78...16C320775
0 ETH0.0018462219.63214795
Set Approval For...148558762022-05-27 19:08:06941 days ago1653678486IN
0xe1A66A78...16C320775
0 ETH0.0010213122.0868613
Transfer From144669672022-03-27 7:47:301002 days ago1648367250IN
0xe1A66A78...16C320775
0 ETH0.001622217.25
Set Approval For...144625822022-03-26 15:14:451003 days ago1648307685IN
0xe1A66A78...16C320775
0 ETH0.0011230224.2862578
Set Approval For...143668482022-03-11 17:28:551018 days ago1647019735IN
0xe1A66A78...16C320775
0 ETH0.0021980847.53539474
Set Approval For...143529312022-03-09 13:45:501020 days ago1646833550IN
0xe1A66A78...16C320775
0 ETH0.0008903119.25372987
Transfer From142453082022-02-20 21:11:291037 days ago1645391489IN
0xe1A66A78...16C320775
0 ETH0.0034384139.72885425
Transfer From142452742022-02-20 21:04:391037 days ago1645391079IN
0xe1A66A78...16C320775
0 ETH0.0036554942.23706555
Set Approval For...142409772022-02-20 5:09:341038 days ago1645333774IN
0xe1A66A78...16C320775
0 ETH0.0009653539.67908529
Set Approval For...142381742022-02-19 18:53:141038 days ago1645296794IN
0xe1A66A78...16C320775
0 ETH0.0035295176.32867434
Set Approval For...142296592022-02-18 10:53:541039 days ago1645181634IN
0xe1A66A78...16C320775
0 ETH0.0038514583.29098835
Set Approval For...142296222022-02-18 10:47:141039 days ago1645181234IN
0xe1A66A78...16C320775
0 ETH0.0045375498.12823259
Set Approval For...142281642022-02-18 5:22:061040 days ago1645161726IN
0xe1A66A78...16C320775
0 ETH0.0025219554.53936478
Mint142207542022-02-17 1:48:061041 days ago1645062486IN
0xe1A66A78...16C320775
0 ETH0.0014222653.48077663
Mint142207542022-02-17 1:48:061041 days ago1645062486IN
0xe1A66A78...16C320775
0 ETH0.0014222653.48077663
Mint142207542022-02-17 1:48:061041 days ago1645062486IN
0xe1A66A78...16C320775
0 ETH0.0014222653.48077663
Mint142207532022-02-17 1:48:011041 days ago1645062481IN
0xe1A66A78...16C320775
0 ETH0.0012688447.71186996
Set Approval For...141905812022-02-12 10:04:161045 days ago1644660256IN
0xe1A66A78...16C320775
0 ETH0.0015344133.18308257
Transfer From141615292022-02-07 21:56:071050 days ago1644270967IN
0xe1A66A78...16C320775
0 ETH0.0068342781.606234
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
141461162022-02-05 12:50:571052 days ago1644065457
0xe1A66A78...16C320775
8.3505 ETH
141461162022-02-05 12:50:571052 days ago1644065457
0xe1A66A78...16C320775
0.4395 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BattleApeGameWeapons

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : Weapons NFT V5.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IERC165 {
   
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

pragma solidity ^0.8.0;

interface IERC721 is IERC165 {

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function approve(address to, uint256 tokenId) external;

    function getApproved(uint256 tokenId) external view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) external;

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

pragma solidity ^0.8.0;

interface IERC721Enumerable is IERC721 {

    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

pragma solidity ^0.8.0;

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

pragma solidity ^0.8.0;

library Address {

    function isContract(address account) internal view returns (bool) {

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

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

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

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

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

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    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
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
        
            if (returndata.length > 0) {

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

library SafeMath {
    
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;
        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
       if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

pragma solidity ^0.8.0;

interface IERC721Metadata is IERC721 {

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

pragma solidity ^0.8.0;

interface IERC721Receiver {

    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

pragma solidity ^0.8.0;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;


contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _owners;

    mapping(address => uint256) private _balances;

    mapping(uint256 => address) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

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

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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


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


    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

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

    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

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

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

    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        _approve(address(0), tokenId);

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

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

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

        _approve(address(0), tokenId);

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

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    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("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    mapping(uint256 => uint256) private _ownedTokensIndex;

    uint256[] private _allTokens;

    mapping(uint256 => uint256) private _allTokensIndex;

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = tokenIndex;
        }

        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
       
        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId;
        _allTokensIndex[lastTokenId] = tokenIndex; 

        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _setOwner(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

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



pragma solidity ^0.8.0;

contract BattleApeGameWeapons is ERC721Enumerable, Ownable {

    using Strings for uint256;
    using SafeMath for uint256;

    string public baseURI;
    string public baseExtension = ".json";

    //mint cost
    uint256 public constant PUBLIC_SALE_COST = 0.03 ether;

    //max supply
    uint256 public constant PRIVATE_SALE_MAX_SUPPLY = 500;
    uint256 public constant PUBLIC_SALE_MAX_SUPPLY = 8000;
    uint256 public constant GIVEAWAY_SUPPLY = 388;

    //max mint
    uint256 public privateMintLimit = 10;
    uint256 public maxPrivateMintLimit = 20;
    uint256 public publicPerTransactionMintLimit = 20;
    
    //initialization
    bool public isPrivateSaleStart = false;
    bool public isPublicSaleStart = false;

    mapping(address => bool) public isWhitelisted;
    mapping(address=>uint256) mintedNFTs;

    uint256 private _numAvailableTokens = 8888;
    uint256[8888] private _availableTokens;

    uint256 private privateMinted;
    uint256 private publicMinted;
    uint256 private giveawayMinted;


    constructor() ERC721("Battle Ape Game - Weapons", "AGW") {
        setBaseURI("ipfs://CID/");
    }

    function mint(uint256 _mintAmount) public payable {
        require(isPrivateSaleStart == true || isPublicSaleStart == true, "Neither of the sales is started yet!");
        require(_mintAmount > 0, "need to mint at least 1 NFT");

        if(isPrivateSaleStart == true){
            require(isWhitelisted[msg.sender]==true, "You're not whitelisted!");
            require(_mintAmount <= privateMintLimit, "You can mint in range (1-10) NFT!");
            require(privateMinted.add(_mintAmount)  <= PRIVATE_SALE_MAX_SUPPLY, "max NFT privatesale limit exceeded");
            require(mintedNFTs[msg.sender].add(_mintAmount) <= maxPrivateMintLimit, "You can mint max 10 NFTs!");

            uint256 updatedNumAvailableTokens = _numAvailableTokens; 
            for (uint256 i = 1; i <= _mintAmount; i++) {  
                uint256 newTokenId = useRandomAvailableToken(_mintAmount, i);
                _safeMint(msg.sender, newTokenId);
                updatedNumAvailableTokens--;
            }
            _numAvailableTokens = updatedNumAvailableTokens;
            mintedNFTs[msg.sender]+=_mintAmount;
            privateMinted += _mintAmount;
        }

        else if(isPublicSaleStart == true){
            require(_mintAmount <= publicPerTransactionMintLimit, "You can mint in range (1-20) NFT!");
            require(msg.value >= PUBLIC_SALE_COST.mul(_mintAmount), "insufficient funds");
            require(publicMinted.add(_mintAmount)  <= PUBLIC_SALE_MAX_SUPPLY, "max NFT public sale limit exceeded");

            uint256 updatedNumAvailableTokens = _numAvailableTokens; 
            for (uint256 i = 1; i <= _mintAmount; i++) {  
                uint256 newTokenId = useRandomAvailableToken(_mintAmount, i);
                _safeMint(msg.sender, newTokenId);
                updatedNumAvailableTokens--;
            }
            _numAvailableTokens = updatedNumAvailableTokens;
            mintedNFTs[msg.sender]+=_mintAmount;
            publicMinted += _mintAmount;
        }
        
    }

    function giveawayTokens(address _to, uint256 _mintAmount) external onlyOwner {
        require(giveawayMinted + _mintAmount <= GIVEAWAY_SUPPLY, "This amount is more than max allowed");

        uint256 updatedNumAvailableTokens = _numAvailableTokens; 
            for (uint256 i = 1; i <= _mintAmount; i++) {  
                uint256 newTokenId = useRandomAvailableToken(_mintAmount, i);
                _safeMint(_to, newTokenId);
                updatedNumAvailableTokens--;
            }
            _numAvailableTokens = updatedNumAvailableTokens;
            mintedNFTs[_to]+=_mintAmount;
            giveawayMinted += _mintAmount;
    }

    function useRandomAvailableToken(uint256 _numToFetch, uint256 _i) internal returns (uint256){
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(msg.sender,tx.gasprice,block.number,block.timestamp,blockhash(block.number - 1),_numToFetch,_i
                )
            )
        );

        uint256 randomIndex = randomNum % _numAvailableTokens;

        uint256 valAtIndex = _availableTokens[randomIndex];
        uint256 result;
        if (valAtIndex == 0) {
            result = randomIndex;
        } else {
            result = valAtIndex;
        }

        uint256 lastIndex = _numAvailableTokens - 1;
        if (randomIndex != lastIndex) {
            uint256 lastValInArray = _availableTokens[lastIndex];
            if (lastValInArray == 0) {
                _availableTokens[randomIndex] = lastIndex;
            } else {
                _availableTokens[randomIndex] = lastValInArray;
            }
        }

        _numAvailableTokens--;
        return result;
    }

    // internal
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    //UTILITIES
    function setPrivateSaleStatus(bool _state) public onlyOwner{
        isPrivateSaleStart = _state;
    }

    function setPublicSaleStatus(bool _state) public onlyOwner{
        isPublicSaleStart = _state;
    }

    function addWhitelist(address[] memory _addresses) external onlyOwner {
        for(uint i = 0; i < _addresses.length; i++) {
        isWhitelisted[_addresses[i]] = true;
        }
    }

    function removeWhitelist(address[] memory _addresses) external onlyOwner {
            for(uint i = 0; i < _addresses.length; i++) {
            isWhitelisted[_addresses[i]] = false;
            }
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
        tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    address payable private payee1 = payable(0x0F7961EE81B7cB2B859157E9c0D7b1A1D9D35A5D);

    function withdraw() public onlyOwner {
        require(address(this).balance >= 0,"Contract hasn't enough ethers to transfer!");
        uint part1 = (address(this).balance.mul(5)).div(100);
        payee1.transfer(part1);
        payable(owner()).transfer(address(this).balance);
    }
}

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

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":"GIVEAWAY_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRIVATE_SALE_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"giveawayTokens","outputs":[],"stateMutability":"nonpayable","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":"isPrivateSaleStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPrivateMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","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":[],"name":"privateMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPerTransactionMintLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeWhitelist","outputs":[],"stateMutability":"nonpayable","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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPrivateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600c919062000212565b50600a600d556014600e819055600f556010805461ffff191690556122b86013556122cf80546001600160a01b031916730f7961ee81b7cb2b859157e9c0d7b1a1d9d35a5d1790553480156200007d57600080fd5b50604080518082018252601981527f426174746c65204170652047616d65202d20576561706f6e730000000000000060208083019182528351808501909452600384526241475760e81b908401528151919291620000de9160009162000212565b508051620000f490600190602084019062000212565b505050620001116200010b6200014460201b60201c565b62000148565b60408051808201909152600b81526a697066733a2f2f4349442f60a81b60208201526200013e906200019a565b620002f5565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001f95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200020e90600b90602084019062000212565b5050565b8280546200022090620002b8565b90600052602060002090601f0160209004810192826200024457600085556200028f565b82601f106200025f57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028f57825182559160200191906001019062000272565b506200029d929150620002a1565b5090565b5b808211156200029d5760008155600101620002a2565b600181811c90821680620002cd57607f821691505b60208210811415620002ef57634e487b7160e01b600052602260045260246000fd5b50919050565b612d7080620003056000396000f3fe6080604052600436106102465760003560e01c80635c5ab5b411610139578063b0ec6dff116100b6578063c87b56dd1161007a578063c87b56dd14610678578063ce1e58db14610698578063da3ef23f146106ae578063e985e9c5146106ce578063edac985b14610717578063f2fde38b1461073757600080fd5b8063b0ec6dff146105f7578063b423fe671461060d578063b88d4fde1461062d578063c65721431461064d578063c66828621461066357600080fd5b80638da5cb5b116100fd5780638da5cb5b1461057b57806395d89b4114610599578063a0712d68146105ae578063a22cb465146105c1578063a7754ebe146105e157600080fd5b80635c5ab5b4146104fb5780636352211e146105115780636c0360eb1461053157806370a0823114610546578063715018a61461056657600080fd5b80632bc451cd116101c7578063438b63001161018b578063438b6300146104555780634f6ccce7146104825780635001c98c146104a257806355f804b3146104bc57806357333263146104dc57600080fd5b80632bc451cd146103ba5780632f745c59146103d05780633af32abf146103f05780633ccfd60b1461042057806342842e0e1461043557600080fd5b80630eb58b6e1161020e5780630eb58b6e1461031c57806318160ddd14610345578063232452161461035a57806323b872dd1461037a578063287b038b1461039a57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da5780630b1181d6146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ee565b610757565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610782565b6040516102779190612663565b3480156102ae57600080fd5b506102c26102bd366004612676565b610814565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ab565b6108ae565b005b34801561030857600080fd5b506102fa6103173660046126ab565b6109c4565b34801561032857600080fd5b50610337666a94d74f43000081565b604051908152602001610277565b34801561035157600080fd5b50600854610337565b34801561036657600080fd5b506102fa61037536600461271c565b610af2565b34801561038657600080fd5b506102fa6103953660046127c9565b610b88565b3480156103a657600080fd5b506102fa6103b5366004612815565b610bb9565b3480156103c657600080fd5b50610337600f5481565b3480156103dc57600080fd5b506103376103eb3660046126ab565b610bf6565b3480156103fc57600080fd5b5061026b61040b366004612830565b60116020526000908152604090205460ff1681565b34801561042c57600080fd5b506102fa610c8c565b34801561044157600080fd5b506102fa6104503660046127c9565b610d44565b34801561046157600080fd5b50610475610470366004612830565b610d5f565b604051610277919061284b565b34801561048e57600080fd5b5061033761049d366004612676565b610e01565b3480156104ae57600080fd5b5060105461026b9060ff1681565b3480156104c857600080fd5b506102fa6104d73660046128e7565b610e94565b3480156104e857600080fd5b5060105461026b90610100900460ff1681565b34801561050757600080fd5b50610337600d5481565b34801561051d57600080fd5b506102c261052c366004612676565b610ed1565b34801561053d57600080fd5b50610295610f48565b34801561055257600080fd5b50610337610561366004612830565b610fd6565b34801561057257600080fd5b506102fa61105d565b34801561058757600080fd5b50600a546001600160a01b03166102c2565b3480156105a557600080fd5b50610295611093565b6102fa6105bc366004612676565b6110a2565b3480156105cd57600080fd5b506102fa6105dc366004612930565b611565565b3480156105ed57600080fd5b506103376101f481565b34801561060357600080fd5b5061033761018481565b34801561061957600080fd5b506102fa610628366004612815565b61162a565b34801561063957600080fd5b506102fa610648366004612963565b61166e565b34801561065957600080fd5b50610337611f4081565b34801561066f57600080fd5b506102956116a6565b34801561068457600080fd5b50610295610693366004612676565b6116b3565b3480156106a457600080fd5b50610337600e5481565b3480156106ba57600080fd5b506102fa6106c93660046128e7565b611791565b3480156106da57600080fd5b5061026b6106e93660046129df565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072357600080fd5b506102fa61073236600461271c565b6117ce565b34801561074357600080fd5b506102fa610752366004612830565b611860565b60006001600160e01b0319821663780e9d6360e01b148061077c575061077c826118f8565b92915050565b60606000805461079190612a09565b80601f01602080910402602001604051908101604052809291908181526020018280546107bd90612a09565b801561080a5780601f106107df5761010080835404028352916020019161080a565b820191906000526020600020905b8154815290600101906020018083116107ed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108925760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b982610ed1565b9050806001600160a01b0316836001600160a01b031614156109275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610889565b336001600160a01b0382161480610943575061094381336106e9565b6109b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610889565b6109bf8383611948565b505050565b600a546001600160a01b031633146109ee5760405162461bcd60e51b815260040161088990612a44565b610184816122ce54610a009190612a8f565b1115610a5a5760405162461bcd60e51b8152602060048201526024808201527f5468697320616d6f756e74206973206d6f7265207468616e206d617820616c6c6044820152631bddd95960e21b6064820152608401610889565b60135460015b828111610aa0576000610a7384836119b6565b9050610a7f8582611aef565b82610a8981612aa7565b935050508080610a9890612abe565b915050610a60565b5060138190556001600160a01b03831660009081526012602052604081208054849290610ace908490612a8f565b92505081905550816122ce6000828254610ae89190612a8f565b9091555050505050565b600a546001600160a01b03163314610b1c5760405162461bcd60e51b815260040161088990612a44565b60005b8151811015610b8457600060116000848481518110610b4057610b40612ad9565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610b7c81612abe565b915050610b1f565b5050565b610b923382611b09565b610bae5760405162461bcd60e51b815260040161088990612aef565b6109bf838383611c00565b600a546001600160a01b03163314610be35760405162461bcd60e51b815260040161088990612a44565b6010805460ff1916911515919091179055565b6000610c0183610fd6565b8210610c635760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610889565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cb65760405162461bcd60e51b815260040161088990612a44565b6000610cce6064610cc8476005611dab565b90611e2a565b6122cf546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610d0a573d6000803e3d6000fd5b50600a546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b84573d6000803e3d6000fd5b6109bf8383836040518060200160405280600081525061166e565b60606000610d6c83610fd6565b905060008167ffffffffffffffff811115610d8957610d896126d5565b604051908082528060200260200182016040528015610db2578160200160208202803683370190505b50905060005b82811015610df957610dca8582610bf6565b828281518110610ddc57610ddc612ad9565b602090810291909101015280610df181612abe565b915050610db8565b509392505050565b6000610e0c60085490565b8210610e6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610889565b60088281548110610e8257610e82612ad9565b90600052602060002001549050919050565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b815260040161088990612a44565b8051610b8490600b90602084019061253f565b6000818152600260205260408120546001600160a01b03168061077c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610889565b600b8054610f5590612a09565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8190612a09565b8015610fce5780601f10610fa357610100808354040283529160200191610fce565b820191906000526020600020905b815481529060010190602001808311610fb157829003601f168201915b505050505081565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610889565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110875760405162461bcd60e51b815260040161088990612a44565b6110916000611e87565b565b60606001805461079190612a09565b60105460ff161515600114806110c5575060105460ff6101009091041615156001145b61111d5760405162461bcd60e51b8152602060048201526024808201527f4e656974686572206f66207468652073616c65732069732073746172746564206044820152637965742160e01b6064820152608401610889565b6000811161116d5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610889565b60105460ff161515600114156113a4573360009081526011602052604090205460ff1615156001146111e15760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c6973746564210000000000000000006044820152606401610889565b600d5481111561123d5760405162461bcd60e51b815260206004820152602160248201527f596f752063616e206d696e7420696e2072616e67652028312d313029204e46546044820152602160f81b6064820152608401610889565b6122cc546101f49061124f9083611ed9565b11156112a85760405162461bcd60e51b815260206004820152602260248201527f6d6178204e4654207072697661746573616c65206c696d697420657863656564604482015261195960f21b6064820152608401610889565b600e54336000908152601260205260409020546112c59083611ed9565b11156113135760405162461bcd60e51b815260206004820152601960248201527f596f752063616e206d696e74206d6178203130204e46547321000000000000006044820152606401610889565b60135460015b82811161135957600061132c84836119b6565b90506113383382611aef565b8261134281612aa7565b93505050808061135190612abe565b915050611319565b506013819055336000908152601260205260408120805484929061137e908490612a8f565b92505081905550816122cc60008282546113989190612a8f565b90915550611562915050565b60105460ff6101009091041615156001141561156257600f548111156114165760405162461bcd60e51b815260206004820152602160248201527f596f752063616e206d696e7420696e2072616e67652028312d323029204e46546044820152602160f81b6064820152608401610889565b611427666a94d74f43000082611dab565b34101561146b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610889565b6122cd54611f409061147d9083611ed9565b11156114d65760405162461bcd60e51b815260206004820152602260248201527f6d6178204e4654207075626c69632073616c65206c696d697420657863656564604482015261195960f21b6064820152608401610889565b60135460015b82811161151c5760006114ef84836119b6565b90506114fb3382611aef565b8261150581612aa7565b93505050808061151490612abe565b9150506114dc565b5060138190553360009081526012602052604081208054849290611541908490612a8f565b92505081905550816122cd600082825461155b9190612a8f565b9091555050505b50565b6001600160a01b0382163314156115be5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610889565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116545760405162461bcd60e51b815260040161088990612a44565b601080549115156101000261ff0019909216919091179055565b6116783383611b09565b6116945760405162461bcd60e51b815260040161088990612aef565b6116a084848484611f38565b50505050565b600c8054610f5590612a09565b6000818152600260205260409020546060906001600160a01b03166117325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610889565b600061173c611f6b565b9050600081511161175c576040518060200160405280600081525061178a565b8061176684611f7a565b600c60405160200161177a93929190612b40565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117bb5760405162461bcd60e51b815260040161088990612a44565b8051610b8490600c90602084019061253f565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260040161088990612a44565b60005b8151811015610b845760016011600084848151811061181c5761181c612ad9565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061185881612abe565b9150506117fb565b600a546001600160a01b0316331461188a5760405162461bcd60e51b815260040161088990612a44565b6001600160a01b0381166118ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610889565b61156281611e87565b60006001600160e01b031982166380ac58cd60e01b148061192957506001600160e01b03198216635b5e139f60e01b145b8061077c57506301ffc9a760e01b6001600160e01b031983161461077c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197d82610ed1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080333a43426119c8600183612c04565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600060135482611a329190612c31565b905060006014826122b88110611a4a57611a4a612ad9565b01549050600081611a5c575081611a5f565b50805b60006001601354611a709190612c04565b9050808414611ace5760006014826122b88110611a8f57611a8f612ad9565b0154905080611ab457816014866122b88110611aad57611aad612ad9565b0155611acc565b806014866122b88110611ac957611ac9612ad9565b01555b505b60138054906000611ade83612aa7565b909155509198975050505050505050565b610b84828260405180602001604052806000815250612078565b6000818152600260205260408120546001600160a01b0316611b825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b6000611b8d83610ed1565b9050806001600160a01b0316846001600160a01b03161480611bc85750836001600160a01b0316611bbd84610814565b6001600160a01b0316145b80611bf857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c1382610ed1565b6001600160a01b031614611c7b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610889565b6001600160a01b038216611cdd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610889565b611ce88383836120ab565b611cf3600082611948565b6001600160a01b0383166000908152600360205260408120805460019290611d1c908490612c04565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d4a908490612a8f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082611dba5750600061077c565b6000611dc68385612c45565b905082611dd38583612c64565b1461178a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610889565b6000808211611e7b5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610889565b6000611bf88385612c64565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611ee68385612a8f565b90508381101561178a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610889565b611f43848484611c00565b611f4f84848484612163565b6116a05760405162461bcd60e51b815260040161088990612c78565b6060600b805461079190612a09565b606081611f9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fc85780611fb281612abe565b9150611fc19050600a83612c64565b9150611fa2565b60008167ffffffffffffffff811115611fe357611fe36126d5565b6040519080825280601f01601f19166020018201604052801561200d576020820181803683370190505b5090505b8415611bf857612022600183612c04565b915061202f600a86612c31565b61203a906030612a8f565b60f81b81838151811061204f5761204f612ad9565b60200101906001600160f81b031916908160001a905350612071600a86612c64565b9450612011565b6120828383612261565b61208f6000848484612163565b6109bf5760405162461bcd60e51b815260040161088990612c78565b6001600160a01b0383166121065761210181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612129565b816001600160a01b0316836001600160a01b0316146121295761212983826123af565b6001600160a01b038216612140576109bf8161244c565b826001600160a01b0316826001600160a01b0316146109bf576109bf82826124fb565b60006001600160a01b0384163b1561225657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121a7903390899088908890600401612cca565b6020604051808303816000875af19250505080156121e2575060408051601f3d908101601f191682019092526121df91810190612d07565b60015b61223c573d808015612210576040519150601f19603f3d011682016040523d82523d6000602084013e612215565b606091505b5080516122345760405162461bcd60e51b815260040161088990612c78565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bf8565b506001949350505050565b6001600160a01b0382166122b75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610889565b6000818152600260205260409020546001600160a01b03161561231c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610889565b612328600083836120ab565b6001600160a01b0382166000908152600360205260408120805460019290612351908490612a8f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bc84610fd6565b6123c69190612c04565b600083815260076020526040902054909150808214612419576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245e90600190612c04565b6000838152600960205260408120546008805493945090928490811061248657612486612ad9565b9060005260206000200154905080600883815481106124a7576124a7612ad9565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124df576124df612d24565b6001900381819060005260206000200160009055905550505050565b600061250683610fd6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254b90612a09565b90600052602060002090601f01602090048101928261256d57600085556125b3565b82601f1061258657805160ff19168380011785556125b3565b828001600101855582156125b3579182015b828111156125b3578251825591602001919060010190612598565b506125bf9291506125c3565b5090565b5b808211156125bf57600081556001016125c4565b6001600160e01b03198116811461156257600080fd5b60006020828403121561260057600080fd5b813561178a816125d8565b60005b8381101561262657818101518382015260200161260e565b838111156116a05750506000910152565b6000815180845261264f81602086016020860161260b565b601f01601f19169290920160200192915050565b60208152600061178a6020830184612637565b60006020828403121561268857600080fd5b5035919050565b80356001600160a01b03811681146126a657600080fd5b919050565b600080604083850312156126be57600080fd5b6126c78361268f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612714576127146126d5565b604052919050565b6000602080838503121561272f57600080fd5b823567ffffffffffffffff8082111561274757600080fd5b818501915085601f83011261275b57600080fd5b81358181111561276d5761276d6126d5565b8060051b915061277e8483016126eb565b818152918301840191848101908884111561279857600080fd5b938501935b838510156127bd576127ae8561268f565b8252938501939085019061279d565b98975050505050505050565b6000806000606084860312156127de57600080fd5b6127e78461268f565b92506127f56020850161268f565b9150604084013590509250925092565b803580151581146126a657600080fd5b60006020828403121561282757600080fd5b61178a82612805565b60006020828403121561284257600080fd5b61178a8261268f565b6020808252825182820181905260009190848201906040850190845b8181101561288357835183529284019291840191600101612867565b50909695505050505050565b600067ffffffffffffffff8311156128a9576128a96126d5565b6128bc601f8401601f19166020016126eb565b90508281528383830111156128d057600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128f957600080fd5b813567ffffffffffffffff81111561291057600080fd5b8201601f8101841361292157600080fd5b611bf88482356020840161288f565b6000806040838503121561294357600080fd5b61294c8361268f565b915061295a60208401612805565b90509250929050565b6000806000806080858703121561297957600080fd5b6129828561268f565b93506129906020860161268f565b925060408501359150606085013567ffffffffffffffff8111156129b357600080fd5b8501601f810187136129c457600080fd5b6129d38782356020840161288f565b91505092959194509250565b600080604083850312156129f257600080fd5b6129fb8361268f565b915061295a6020840161268f565b600181811c90821680612a1d57607f821691505b60208210811415612a3e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aa257612aa2612a79565b500190565b600081612ab657612ab6612a79565b506000190190565b6000600019821415612ad257612ad2612a79565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600084516020612b538285838a0161260b565b855191840191612b668184848a0161260b565b8554920191600090600181811c9080831680612b8357607f831692505b858310811415612ba157634e487b7160e01b85526022600452602485fd5b808015612bb55760018114612bc657612bf3565b60ff19851688528388019550612bf3565b60008b81526020902060005b85811015612beb5781548a820152908401908801612bd2565b505083880195505b50939b9a5050505050505050505050565b600082821015612c1657612c16612a79565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612c4057612c40612c1b565b500690565b6000816000190483118215151615612c5f57612c5f612a79565b500290565b600082612c7357612c73612c1b565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612cfd90830184612637565b9695505050505050565b600060208284031215612d1957600080fd5b815161178a816125d8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bf1eb60ae1213b9aeff815cad9739893236ea72083a72fd58478c8d3029f26d564736f6c634300080b0033

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635c5ab5b411610139578063b0ec6dff116100b6578063c87b56dd1161007a578063c87b56dd14610678578063ce1e58db14610698578063da3ef23f146106ae578063e985e9c5146106ce578063edac985b14610717578063f2fde38b1461073757600080fd5b8063b0ec6dff146105f7578063b423fe671461060d578063b88d4fde1461062d578063c65721431461064d578063c66828621461066357600080fd5b80638da5cb5b116100fd5780638da5cb5b1461057b57806395d89b4114610599578063a0712d68146105ae578063a22cb465146105c1578063a7754ebe146105e157600080fd5b80635c5ab5b4146104fb5780636352211e146105115780636c0360eb1461053157806370a0823114610546578063715018a61461056657600080fd5b80632bc451cd116101c7578063438b63001161018b578063438b6300146104555780634f6ccce7146104825780635001c98c146104a257806355f804b3146104bc57806357333263146104dc57600080fd5b80632bc451cd146103ba5780632f745c59146103d05780633af32abf146103f05780633ccfd60b1461042057806342842e0e1461043557600080fd5b80630eb58b6e1161020e5780630eb58b6e1461031c57806318160ddd14610345578063232452161461035a57806323b872dd1461037a578063287b038b1461039a57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da5780630b1181d6146102fc575b600080fd5b34801561025757600080fd5b5061026b6102663660046125ee565b610757565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610782565b6040516102779190612663565b3480156102ae57600080fd5b506102c26102bd366004612676565b610814565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f53660046126ab565b6108ae565b005b34801561030857600080fd5b506102fa6103173660046126ab565b6109c4565b34801561032857600080fd5b50610337666a94d74f43000081565b604051908152602001610277565b34801561035157600080fd5b50600854610337565b34801561036657600080fd5b506102fa61037536600461271c565b610af2565b34801561038657600080fd5b506102fa6103953660046127c9565b610b88565b3480156103a657600080fd5b506102fa6103b5366004612815565b610bb9565b3480156103c657600080fd5b50610337600f5481565b3480156103dc57600080fd5b506103376103eb3660046126ab565b610bf6565b3480156103fc57600080fd5b5061026b61040b366004612830565b60116020526000908152604090205460ff1681565b34801561042c57600080fd5b506102fa610c8c565b34801561044157600080fd5b506102fa6104503660046127c9565b610d44565b34801561046157600080fd5b50610475610470366004612830565b610d5f565b604051610277919061284b565b34801561048e57600080fd5b5061033761049d366004612676565b610e01565b3480156104ae57600080fd5b5060105461026b9060ff1681565b3480156104c857600080fd5b506102fa6104d73660046128e7565b610e94565b3480156104e857600080fd5b5060105461026b90610100900460ff1681565b34801561050757600080fd5b50610337600d5481565b34801561051d57600080fd5b506102c261052c366004612676565b610ed1565b34801561053d57600080fd5b50610295610f48565b34801561055257600080fd5b50610337610561366004612830565b610fd6565b34801561057257600080fd5b506102fa61105d565b34801561058757600080fd5b50600a546001600160a01b03166102c2565b3480156105a557600080fd5b50610295611093565b6102fa6105bc366004612676565b6110a2565b3480156105cd57600080fd5b506102fa6105dc366004612930565b611565565b3480156105ed57600080fd5b506103376101f481565b34801561060357600080fd5b5061033761018481565b34801561061957600080fd5b506102fa610628366004612815565b61162a565b34801561063957600080fd5b506102fa610648366004612963565b61166e565b34801561065957600080fd5b50610337611f4081565b34801561066f57600080fd5b506102956116a6565b34801561068457600080fd5b50610295610693366004612676565b6116b3565b3480156106a457600080fd5b50610337600e5481565b3480156106ba57600080fd5b506102fa6106c93660046128e7565b611791565b3480156106da57600080fd5b5061026b6106e93660046129df565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561072357600080fd5b506102fa61073236600461271c565b6117ce565b34801561074357600080fd5b506102fa610752366004612830565b611860565b60006001600160e01b0319821663780e9d6360e01b148061077c575061077c826118f8565b92915050565b60606000805461079190612a09565b80601f01602080910402602001604051908101604052809291908181526020018280546107bd90612a09565b801561080a5780601f106107df5761010080835404028352916020019161080a565b820191906000526020600020905b8154815290600101906020018083116107ed57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108925760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006108b982610ed1565b9050806001600160a01b0316836001600160a01b031614156109275760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610889565b336001600160a01b0382161480610943575061094381336106e9565b6109b55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610889565b6109bf8383611948565b505050565b600a546001600160a01b031633146109ee5760405162461bcd60e51b815260040161088990612a44565b610184816122ce54610a009190612a8f565b1115610a5a5760405162461bcd60e51b8152602060048201526024808201527f5468697320616d6f756e74206973206d6f7265207468616e206d617820616c6c6044820152631bddd95960e21b6064820152608401610889565b60135460015b828111610aa0576000610a7384836119b6565b9050610a7f8582611aef565b82610a8981612aa7565b935050508080610a9890612abe565b915050610a60565b5060138190556001600160a01b03831660009081526012602052604081208054849290610ace908490612a8f565b92505081905550816122ce6000828254610ae89190612a8f565b9091555050505050565b600a546001600160a01b03163314610b1c5760405162461bcd60e51b815260040161088990612a44565b60005b8151811015610b8457600060116000848481518110610b4057610b40612ad9565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610b7c81612abe565b915050610b1f565b5050565b610b923382611b09565b610bae5760405162461bcd60e51b815260040161088990612aef565b6109bf838383611c00565b600a546001600160a01b03163314610be35760405162461bcd60e51b815260040161088990612a44565b6010805460ff1916911515919091179055565b6000610c0183610fd6565b8210610c635760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610889565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610cb65760405162461bcd60e51b815260040161088990612a44565b6000610cce6064610cc8476005611dab565b90611e2a565b6122cf546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610d0a573d6000803e3d6000fd5b50600a546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610b84573d6000803e3d6000fd5b6109bf8383836040518060200160405280600081525061166e565b60606000610d6c83610fd6565b905060008167ffffffffffffffff811115610d8957610d896126d5565b604051908082528060200260200182016040528015610db2578160200160208202803683370190505b50905060005b82811015610df957610dca8582610bf6565b828281518110610ddc57610ddc612ad9565b602090810291909101015280610df181612abe565b915050610db8565b509392505050565b6000610e0c60085490565b8210610e6f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610889565b60088281548110610e8257610e82612ad9565b90600052602060002001549050919050565b600a546001600160a01b03163314610ebe5760405162461bcd60e51b815260040161088990612a44565b8051610b8490600b90602084019061253f565b6000818152600260205260408120546001600160a01b03168061077c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610889565b600b8054610f5590612a09565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8190612a09565b8015610fce5780601f10610fa357610100808354040283529160200191610fce565b820191906000526020600020905b815481529060010190602001808311610fb157829003601f168201915b505050505081565b60006001600160a01b0382166110415760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610889565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146110875760405162461bcd60e51b815260040161088990612a44565b6110916000611e87565b565b60606001805461079190612a09565b60105460ff161515600114806110c5575060105460ff6101009091041615156001145b61111d5760405162461bcd60e51b8152602060048201526024808201527f4e656974686572206f66207468652073616c65732069732073746172746564206044820152637965742160e01b6064820152608401610889565b6000811161116d5760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e465400000000006044820152606401610889565b60105460ff161515600114156113a4573360009081526011602052604090205460ff1615156001146111e15760405162461bcd60e51b815260206004820152601760248201527f596f75277265206e6f742077686974656c6973746564210000000000000000006044820152606401610889565b600d5481111561123d5760405162461bcd60e51b815260206004820152602160248201527f596f752063616e206d696e7420696e2072616e67652028312d313029204e46546044820152602160f81b6064820152608401610889565b6122cc546101f49061124f9083611ed9565b11156112a85760405162461bcd60e51b815260206004820152602260248201527f6d6178204e4654207072697661746573616c65206c696d697420657863656564604482015261195960f21b6064820152608401610889565b600e54336000908152601260205260409020546112c59083611ed9565b11156113135760405162461bcd60e51b815260206004820152601960248201527f596f752063616e206d696e74206d6178203130204e46547321000000000000006044820152606401610889565b60135460015b82811161135957600061132c84836119b6565b90506113383382611aef565b8261134281612aa7565b93505050808061135190612abe565b915050611319565b506013819055336000908152601260205260408120805484929061137e908490612a8f565b92505081905550816122cc60008282546113989190612a8f565b90915550611562915050565b60105460ff6101009091041615156001141561156257600f548111156114165760405162461bcd60e51b815260206004820152602160248201527f596f752063616e206d696e7420696e2072616e67652028312d323029204e46546044820152602160f81b6064820152608401610889565b611427666a94d74f43000082611dab565b34101561146b5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610889565b6122cd54611f409061147d9083611ed9565b11156114d65760405162461bcd60e51b815260206004820152602260248201527f6d6178204e4654207075626c69632073616c65206c696d697420657863656564604482015261195960f21b6064820152608401610889565b60135460015b82811161151c5760006114ef84836119b6565b90506114fb3382611aef565b8261150581612aa7565b93505050808061151490612abe565b9150506114dc565b5060138190553360009081526012602052604081208054849290611541908490612a8f565b92505081905550816122cd600082825461155b9190612a8f565b9091555050505b50565b6001600160a01b0382163314156115be5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610889565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b031633146116545760405162461bcd60e51b815260040161088990612a44565b601080549115156101000261ff0019909216919091179055565b6116783383611b09565b6116945760405162461bcd60e51b815260040161088990612aef565b6116a084848484611f38565b50505050565b600c8054610f5590612a09565b6000818152600260205260409020546060906001600160a01b03166117325760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610889565b600061173c611f6b565b9050600081511161175c576040518060200160405280600081525061178a565b8061176684611f7a565b600c60405160200161177a93929190612b40565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146117bb5760405162461bcd60e51b815260040161088990612a44565b8051610b8490600c90602084019061253f565b600a546001600160a01b031633146117f85760405162461bcd60e51b815260040161088990612a44565b60005b8151811015610b845760016011600084848151811061181c5761181c612ad9565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061185881612abe565b9150506117fb565b600a546001600160a01b0316331461188a5760405162461bcd60e51b815260040161088990612a44565b6001600160a01b0381166118ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610889565b61156281611e87565b60006001600160e01b031982166380ac58cd60e01b148061192957506001600160e01b03198216635b5e139f60e01b145b8061077c57506301ffc9a760e01b6001600160e01b031983161461077c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061197d82610ed1565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080333a43426119c8600183612c04565b604080516001600160a01b039096166020870152850193909352606084019190915260808301524060a082015260c0810185905260e08101849052610100016040516020818303038152906040528051906020012060001c9050600060135482611a329190612c31565b905060006014826122b88110611a4a57611a4a612ad9565b01549050600081611a5c575081611a5f565b50805b60006001601354611a709190612c04565b9050808414611ace5760006014826122b88110611a8f57611a8f612ad9565b0154905080611ab457816014866122b88110611aad57611aad612ad9565b0155611acc565b806014866122b88110611ac957611ac9612ad9565b01555b505b60138054906000611ade83612aa7565b909155509198975050505050505050565b610b84828260405180602001604052806000815250612078565b6000818152600260205260408120546001600160a01b0316611b825760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610889565b6000611b8d83610ed1565b9050806001600160a01b0316846001600160a01b03161480611bc85750836001600160a01b0316611bbd84610814565b6001600160a01b0316145b80611bf857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c1382610ed1565b6001600160a01b031614611c7b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610889565b6001600160a01b038216611cdd5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610889565b611ce88383836120ab565b611cf3600082611948565b6001600160a01b0383166000908152600360205260408120805460019290611d1c908490612c04565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d4a908490612a8f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600082611dba5750600061077c565b6000611dc68385612c45565b905082611dd38583612c64565b1461178a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610889565b6000808211611e7b5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610889565b6000611bf88385612c64565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611ee68385612a8f565b90508381101561178a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610889565b611f43848484611c00565b611f4f84848484612163565b6116a05760405162461bcd60e51b815260040161088990612c78565b6060600b805461079190612a09565b606081611f9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fc85780611fb281612abe565b9150611fc19050600a83612c64565b9150611fa2565b60008167ffffffffffffffff811115611fe357611fe36126d5565b6040519080825280601f01601f19166020018201604052801561200d576020820181803683370190505b5090505b8415611bf857612022600183612c04565b915061202f600a86612c31565b61203a906030612a8f565b60f81b81838151811061204f5761204f612ad9565b60200101906001600160f81b031916908160001a905350612071600a86612c64565b9450612011565b6120828383612261565b61208f6000848484612163565b6109bf5760405162461bcd60e51b815260040161088990612c78565b6001600160a01b0383166121065761210181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612129565b816001600160a01b0316836001600160a01b0316146121295761212983826123af565b6001600160a01b038216612140576109bf8161244c565b826001600160a01b0316826001600160a01b0316146109bf576109bf82826124fb565b60006001600160a01b0384163b1561225657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906121a7903390899088908890600401612cca565b6020604051808303816000875af19250505080156121e2575060408051601f3d908101601f191682019092526121df91810190612d07565b60015b61223c573d808015612210576040519150601f19603f3d011682016040523d82523d6000602084013e612215565b606091505b5080516122345760405162461bcd60e51b815260040161088990612c78565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bf8565b506001949350505050565b6001600160a01b0382166122b75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610889565b6000818152600260205260409020546001600160a01b03161561231c5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610889565b612328600083836120ab565b6001600160a01b0382166000908152600360205260408120805460019290612351908490612a8f565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600060016123bc84610fd6565b6123c69190612c04565b600083815260076020526040902054909150808214612419576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061245e90600190612c04565b6000838152600960205260408120546008805493945090928490811061248657612486612ad9565b9060005260206000200154905080600883815481106124a7576124a7612ad9565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806124df576124df612d24565b6001900381819060005260206000200160009055905550505050565b600061250683610fd6565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b82805461254b90612a09565b90600052602060002090601f01602090048101928261256d57600085556125b3565b82601f1061258657805160ff19168380011785556125b3565b828001600101855582156125b3579182015b828111156125b3578251825591602001919060010190612598565b506125bf9291506125c3565b5090565b5b808211156125bf57600081556001016125c4565b6001600160e01b03198116811461156257600080fd5b60006020828403121561260057600080fd5b813561178a816125d8565b60005b8381101561262657818101518382015260200161260e565b838111156116a05750506000910152565b6000815180845261264f81602086016020860161260b565b601f01601f19169290920160200192915050565b60208152600061178a6020830184612637565b60006020828403121561268857600080fd5b5035919050565b80356001600160a01b03811681146126a657600080fd5b919050565b600080604083850312156126be57600080fd5b6126c78361268f565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612714576127146126d5565b604052919050565b6000602080838503121561272f57600080fd5b823567ffffffffffffffff8082111561274757600080fd5b818501915085601f83011261275b57600080fd5b81358181111561276d5761276d6126d5565b8060051b915061277e8483016126eb565b818152918301840191848101908884111561279857600080fd5b938501935b838510156127bd576127ae8561268f565b8252938501939085019061279d565b98975050505050505050565b6000806000606084860312156127de57600080fd5b6127e78461268f565b92506127f56020850161268f565b9150604084013590509250925092565b803580151581146126a657600080fd5b60006020828403121561282757600080fd5b61178a82612805565b60006020828403121561284257600080fd5b61178a8261268f565b6020808252825182820181905260009190848201906040850190845b8181101561288357835183529284019291840191600101612867565b50909695505050505050565b600067ffffffffffffffff8311156128a9576128a96126d5565b6128bc601f8401601f19166020016126eb565b90508281528383830111156128d057600080fd5b828260208301376000602084830101529392505050565b6000602082840312156128f957600080fd5b813567ffffffffffffffff81111561291057600080fd5b8201601f8101841361292157600080fd5b611bf88482356020840161288f565b6000806040838503121561294357600080fd5b61294c8361268f565b915061295a60208401612805565b90509250929050565b6000806000806080858703121561297957600080fd5b6129828561268f565b93506129906020860161268f565b925060408501359150606085013567ffffffffffffffff8111156129b357600080fd5b8501601f810187136129c457600080fd5b6129d38782356020840161288f565b91505092959194509250565b600080604083850312156129f257600080fd5b6129fb8361268f565b915061295a6020840161268f565b600181811c90821680612a1d57607f821691505b60208210811415612a3e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612aa257612aa2612a79565b500190565b600081612ab657612ab6612a79565b506000190190565b6000600019821415612ad257612ad2612a79565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600084516020612b538285838a0161260b565b855191840191612b668184848a0161260b565b8554920191600090600181811c9080831680612b8357607f831692505b858310811415612ba157634e487b7160e01b85526022600452602485fd5b808015612bb55760018114612bc657612bf3565b60ff19851688528388019550612bf3565b60008b81526020902060005b85811015612beb5781548a820152908401908801612bd2565b505083880195505b50939b9a5050505050505050505050565b600082821015612c1657612c16612a79565b500390565b634e487b7160e01b600052601260045260246000fd5b600082612c4057612c40612c1b565b500690565b6000816000190483118215151615612c5f57612c5f612a79565b500290565b600082612c7357612c73612c1b565b500490565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612cfd90830184612637565b9695505050505050565b600060208284031215612d1957600080fd5b815161178a816125d8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220bf1eb60ae1213b9aeff815cad9739893236ea72083a72fd58478c8d3029f26d564736f6c634300080b0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.