ERC-721
Overview
Max Total Supply
13 MOTO
Holders
6
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MOTOLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MotoDEXnft
Compiler Version
v0.8.2+commit.661d1103
Optimization Enabled:
Yes with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.2; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; /// @custom:security-contact [email protected] contract MotoDEXnft is ERC721, ERC721Enumerable, ERC721URIStorage, Pausable, Ownable, ERC721Burnable { using SafeMath for uint256; // moto: uint8 public constant RED_BULLER = 0; uint8 public constant ZEBRA_GRRR = 1; uint8 public constant ROBO_HORSE = 2; uint8 public constant METAL_EYES = 3; uint8 public constant BROWN_KILLER = 4; uint8 public constant CRAZY_LINE = 5; uint8 public constant MAGIC_BOX = 6; uint8 public constant HEALTH_PILL_5 = 7; uint8 public constant HEALTH_PILL_10 = 8; uint8 public constant HEALTH_PILL_30 = 9; uint8 public constant HEALTH_PILL_50 = 10; // tracks: uint8 public constant TRACK_LONDON = 100; uint8 public constant TRACK_DUBAI = 101; uint8 public constant TRACK_ABU_DHABI = 102; uint8 public constant TRACK_BEIJIN = 103; uint8 public constant TRACK_MOSCOW = 104; uint8 public constant TRACK_MELBURN = 105; uint8 public constant TRACK_PETERBURG = 106; uint8 public constant TRACK_TAIPEI = 107; uint8 public constant TRACK_PISA = 108; uint8 public constant TRACK_ISLAMABAD = 109; address public gameServer; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; mapping(uint256 => uint8) typeForId; mapping(uint256 => uint8) healthForId; mapping(uint8 => string) uriForType; mapping(uint8 => uint256) counterForType; mapping(uint8 => uint256) limitForType; mapping(uint8 => uint256) priceForType; uint8[] public players; AggregatorV3Interface internal priceFeed; function getLatestPrice() public view returns (uint256, uint8) { (,int256 price,,,) = priceFeed.latestRoundData(); uint8 decimals = priceFeed.decimals(); return (uint256(price), decimals); } constructor(uint256 networkId, address _gameServer) ERC721("motoDEXnft", "MOTO") { gameServer = _gameServer; players = [RED_BULLER,ZEBRA_GRRR,ROBO_HORSE,METAL_EYES,BROWN_KILLER,CRAZY_LINE]; uriForType[RED_BULLER] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/RedBuller"; uriForType[ZEBRA_GRRR] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/ZebraGrrrr"; uriForType[ROBO_HORSE] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/RoboHorse"; uriForType[METAL_EYES] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/MetalEyes"; uriForType[BROWN_KILLER] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/BrownKiller"; uriForType[CRAZY_LINE] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/CrazyLine"; uriForType[MAGIC_BOX] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/MagicBox"; uriForType[TRACK_LONDON] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/London"; uriForType[TRACK_DUBAI] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Dubai"; uriForType[TRACK_ABU_DHABI] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/AbuDhabi"; uriForType[TRACK_BEIJIN] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Beijing"; uriForType[TRACK_MOSCOW] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Moscow"; uriForType[TRACK_MELBURN] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Melburn"; uriForType[TRACK_PETERBURG] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Peterburg"; uriForType[TRACK_TAIPEI] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Taipei"; uriForType[TRACK_PISA] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Pisa"; uriForType[TRACK_ISLAMABAD] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/Islamabad"; uriForType[HEALTH_PILL_5] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/HealthCapsule5"; uriForType[HEALTH_PILL_10] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/HealthCapsule10"; uriForType[HEALTH_PILL_30] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/HealthCapsule30"; uriForType[HEALTH_PILL_50] = "https://openbisea.mypinata.cloud/ipfs/QmTxriTHJFZb3jK3RyBGZoXNr8BBFyXWo526x1n1krKbUJ/HealthCapsule50"; // limitForType[RED_BULLER] = 1000; // limitForType[ZEBRA_GRRR] = 500; // limitForType[ROBO_HORSE] = 200; // limitForType[METAL_EYES] = 50; // limitForType[BROWN_KILLER] = 30; // limitForType[CRAZY_LINE] = 10; // limitForType[MAGIC_BOX] = 88; limitForType[TRACK_LONDON] = 3; limitForType[TRACK_DUBAI] = 3; limitForType[TRACK_ABU_DHABI] = 3; limitForType[TRACK_BEIJIN] = 3; limitForType[TRACK_MOSCOW] = 3; limitForType[TRACK_MELBURN] = 3; limitForType[TRACK_PETERBURG] = 3; limitForType[TRACK_TAIPEI] = 3; limitForType[TRACK_PISA] = 3; limitForType[TRACK_ISLAMABAD] = 3; priceForType[RED_BULLER] = 500000000000000000; // $0.5 priceForType[ZEBRA_GRRR] = 700000000000000000; // $0.7 priceForType[ROBO_HORSE] = 1000000000000000000; // $1 priceForType[METAL_EYES] = 2000000000000000000; // $2 priceForType[BROWN_KILLER] = 3000000000000000000; // $3 priceForType[CRAZY_LINE] = 5000000000000000000; // $5 priceForType[MAGIC_BOX] = 2000000000000000000; // $2 priceForType[TRACK_LONDON] = 50000000000000000000; // $50 priceForType[TRACK_DUBAI] = 50000000000000000000; // $50 priceForType[TRACK_ABU_DHABI] = 50000000000000000000; // $50 priceForType[TRACK_BEIJIN] = 50000000000000000000; // $50 priceForType[TRACK_MOSCOW] = 50000000000000000000; // $50 priceForType[TRACK_MELBURN] = 50000000000000000000; // $50 priceForType[TRACK_PETERBURG] = 50000000000000000000; // $50 priceForType[TRACK_TAIPEI] = 50000000000000000000; // $50 priceForType[TRACK_PISA] = 50000000000000000000; // $50 priceForType[TRACK_ISLAMABAD] = 50000000000000000000; // $50 if (networkId == 1) { priceFeed = AggregatorV3Interface(0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419); // ETH mainnet } if (networkId == 42) { priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331);// ETH kovan } if (networkId == 56) { priceFeed = AggregatorV3Interface(0x0567F2323251f0Aab15c8dFb1967E4e8A7D42aeE);// BCS mainnet } if (networkId == 97) { priceFeed = AggregatorV3Interface(0x2514895c72f50D8bd4B4F9b1110F0D6bD2c97526);// BCS testnet } if (networkId == 80001) { priceFeed = AggregatorV3Interface(0xd0D5e3DB44DE05E9F294BB0a3bEEaF030DE24Ada);// Matic testnet } if (networkId == 137) { priceFeed = AggregatorV3Interface(0xAB594600376Ec9fD91F8e885dADF0CE036862dE0);// Matic mainnet } } function setUriForType(string memory uri, uint8 typeNft) public onlyOwner { uriForType[typeNft] = uri; } function setLimitForType(uint256 limit, uint8 typeNft) public onlyOwner { limitForType[typeNft] = limit; } function setPriceForType(uint256 price, uint8 typeNft) public onlyOwner { priceForType[typeNft] = price; } function setHealthForId(uint256 tokenId, uint8 health) public { require(msg.sender == gameServer,'MotoDEXnft: only server account can change health'); healthForId[tokenId] = health; } function setGameServer(address _gameServer) public onlyOwner { gameServer = _gameServer; } function getPriceForType(uint8 typeNft) public view returns (uint256) { return priceForType[typeNft]; } function getLimitForType(uint8 typeNft) public view returns (uint256) { return limitForType[typeNft]; } function getUriForType(uint8 typeNft) public view returns (string memory) { return uriForType[typeNft]; } function getHealthForId(uint256 tokenId) public view returns (uint8) { return healthForId[tokenId]; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _increasePrice(uint8 typeNft) private { uint256 currentPrice = priceForType[typeNft]; uint256 index = 100; if (typeNft >= TRACK_LONDON) index = 10; if (typeNft >= HEALTH_PILL_5 && typeNft <= HEALTH_PILL_30) index = 1000; priceForType[typeNft] = currentPrice.add(currentPrice.div(index)); } function safeMint(address to, string memory uri) public onlyOwner { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, uri); } function _safeMintType(address to, string memory uri, uint8 typeNft, bool needURI) private { uint256 counter = counterForType[typeNft]; counterForType[typeNft] = counter + 1; if (limitForType[typeNft] > 0) require(counter + 1 < limitForType[typeNft], "MotoDEXnft: counter reach end of limit"); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); if (needURI) _setTokenURI(tokenId, uri); typeForId[tokenId] = typeNft; _increasePrice(typeNft); } function safeMintType(address to, string memory uri, uint8 typeNft) public onlyOwner { _safeMintType(to, uri, typeNft, true); } function safeMintTypeBatch(address to, uint8 typeNft, int8 count) public onlyOwner { for(int8 x=0;x<count;x++) { _safeMintType(to, "", typeNft, false); } } function valueInMainCoin(uint8 typeNft) public view returns (uint256) { uint256 priceMainToUSDreturned; uint8 decimals; (priceMainToUSDreturned,decimals) = getLatestPrice(); uint256 valueToCompare = priceForType[typeNft].div(priceMainToUSDreturned.div(10 ** decimals)); return valueToCompare; } function random() private view returns(uint){ return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp, players))) % players.length; } event Purchase(address indexed from, uint256 value, uint8 typeNft, uint8 finalTypeNft); function purchase (uint8 typeNft) payable public { require(msg.value > valueInMainCoin(typeNft).sub(10000), "MotoDEXnft: wrong value to send"); uint8 finalTypeNft = typeNft; if (typeNft == MAGIC_BOX) { finalTypeNft = uint8(random()); } address payable owner = payable(owner()); owner.transfer(msg.value); _safeMintType(msg.sender, "", finalTypeNft, false); emit Purchase(msg.sender,msg.value,typeNft,finalTypeNft); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } // The following functions are overrides required by Solidity. function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { bytes memory tempEmptyStringTest = bytes(super.tokenURI(tokenId)); if (tempEmptyStringTest.length == 0) return uriForType[typeForId[tokenId]]; else return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) 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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("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 {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "../../../utils/Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ 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]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @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` cannot be the zero address. * - `to` cannot be the zero address. * * 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 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); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721URIStorage.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) 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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "byzantium", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"networkId","type":"uint256"},{"internalType":"address","name":"_gameServer","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"typeNft","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"finalTypeNft","type":"uint8"}],"name":"Purchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"BROWN_KILLER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CRAZY_LINE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEALTH_PILL_10","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEALTH_PILL_30","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEALTH_PILL_5","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HEALTH_PILL_50","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAGIC_BOX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METAL_EYES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RED_BULLER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROBO_HORSE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_ABU_DHABI","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_BEIJIN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_DUBAI","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_ISLAMABAD","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_LONDON","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_MELBURN","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_MOSCOW","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_PETERBURG","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_PISA","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRACK_TAIPEI","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZEBRA_GRRR","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gameServer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHealthForId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"getLimitForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"getPriceForType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"getUriForType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"safeMintType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"typeNft","type":"uint8"},{"internalType":"int8","name":"count","type":"int8"}],"name":"safeMintTypeBatch","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":"address","name":"_gameServer","type":"address"}],"name":"setGameServer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"health","type":"uint8"}],"name":"setHealthForId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"setLimitForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"setPriceForType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"setUriForType","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"typeNft","type":"uint8"}],"name":"valueInMainCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620057a3380380620057a3833981016040819052620000349162000f6c565b604080518082018252600a81527f6d6f746f4445586e66740000000000000000000000000000000000000000000060208083019182528351808501909452600484527f4d4f544f00000000000000000000000000000000000000000000000000000000908401528151919291620000ae9160009162000e23565b508051620000c490600190602084019062000e23565b5050600b805460ff1916905550620000f7620000e864010000000062000dc5810204565b64010000000062000dc9810204565b600c8054600160a060020a031916600160a060020a0383161790556040805160c08101825260008152600160208201526002918101919091526003606082015260046080820152600560a08201526200015590601490600662000eb2565b506040518060800160405280605e815260200162005100605e913960008052601060209081528151620001ac927f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb0192019062000e23565b506040518060800160405280605f81526020016200562f605f9139600160005260106020908152815162000204927f8c6065603763fec3f5742441d3833f3f43b982453612d76adb39a885e3006b5f92019062000e23565b506040518060800160405280605e8152602001620052e0605e913960026000526010602090815281516200025c927f853b2fefe141400fef543280f93d98bd49996069f632d0d20236afeeed8e46a292019062000e23565b506040518060800160405280605e81526020016200568e605e91396003600052601060209081528151620002b4927fb3edd0d534d647cffdae9f1294f11ad21f3fcf2814bea44c92bbb8d384a57d9e92019062000e23565b50604051806080016040528060608152602001620051b96060913960046000526010602090815281516200030c927f1588ac671d87f82adc0e6ae8ab009c0de98f92a20243897597e566bc59b9c12692019062000e23565b506040518060800160405280605e8152602001620055d1605e9139600560005260106020908152815162000364927f61a7346ab5ebdac457db2a901eaf1b805239b6049a1b2f34bab85e2e274f39cb92019062000e23565b506040518060800160405280605d815260200162005574605d91396006600052601060209081528151620003bc927f20edfb71820f6f00f6a84ccfefb91587cd9f849f8349b0a3182a4795899d9cd992019062000e23565b506040518060800160405280605b815260200162004feb605b9139606460005260106020908152815162000414927fe9d0669b9da863441f6bb27634f5f3174e814c6c2560049a32059809eaee4d3092019062000e23565b506040518060800160405280605a8152602001620053f4605a913960656000526010602090815281516200046c927f1a30bfa582bf4431ebf1419d9ec10e3201700dc6bb1a0194584cd35c1484dd7392019062000e23565b506040518060800160405280605d81526020016200533e605d91396066600052601060209081528151620004c4927fc9452d6cbb60266b08a9aef3b299d70b96431bef3d67b1299ab99f9a4308906492019062000e23565b506040518060800160405280605c815260200162005747605c913960676000526010602090815281516200051c927f8f19c39cb0c871181927b789426de5cf0e94008e859798917f3712f43a779ec292019062000e23565b506040518060800160405280605b8152602001620056ec605b9139606860005260106020908152815162000574927fc8ce448063c9e5a6b43073728264d2428df8d8a93701bf64cc3f44cb98ec51c192019062000e23565b506040518060800160405280605c815260200162005046605c91396069600052601060209081528151620005cc927fb9048c25203738e40c431d6c21774300f680891df5e27e84b9a9d09b2e789b1d92019062000e23565b506040518060800160405280605e8152602001620050a2605e9139606a60005260106020908152815162000624927fdf4b9723903dda41ca812aacebaa20e352f39b83b5e78e4df91d889f765ff0da92019062000e23565b506040518060800160405280605b81526020016200515e605b9139606b6000526010602090815281516200067c927f1a784a6e8c013524695e2dbcfb92ea4dcfae971b5a422d78bc3207bbdfd5739292019062000e23565b506040518060800160405280605981526020016200539b60599139606c600052601060209081528151620006d4927f543188908ede30152fd6ce4b1301b63516caeacac07a76a068f870d82643439492019062000e23565b506040518060800160405280605e81526020016200544e605e9139606d6000526010602090815281516200072c927f8fb9f7ad67e7fdf7f033195139a8bd75cc78bcf28414562336cccb9118cec71792019062000e23565b506040518060a00160405280606381526020016200527d60639139600760005260106020908152815162000784927f4ef6145e44e4298293af15ae5f84f922a836b1d6db608fd5008f32a528b312a992019062000e23565b506040518060a001604052806064815260200162005219606491396008600052601060209081528151620007dc927f5f04e77c60ed37290f5789e2e9c5d396103f3c4b14614065cbb4c8362609d5a592019062000e23565b506040518060a0016040528060648152602001620054ac60649139600960005260106020908152815162000834927fa8197f9f3066d467dba941614f445cf878e0beb059ed920f6258667ed2470eb892019062000e23565b506040518060a00160405280606481526020016200551060649139600a6000526010602090815281516200088c927fbbe6df1631c6a5c37158096bc15825d83d22eaca9ac1e829be6dfcdebed1d2d792019062000e23565b5060037fafdb7d34c0b242fb43217084c074a4c7381ed086dc3b5069e5476d42f69ac1d08190557f14f847c80cc70decc79cc04ac569e0754f82a9fdce189c8ac1480a7f7a03cac38190557fbe4c42bab4eef426ddb1d777cb655476344f6952d1d559dde2ae44a268f954888190557fe877ecfe9ab67b306ad367781217a3a7a3c9636e279a6ce4291146e2458a675f8190557fd15187201dad7650e20bbc3eababeabd2bda40ffd8647ad82911dddc902e984b8190557fa10806ae3c36fc88783a27e6f43b7e56ab341a2ae82ee0fd6501ebfc7b3a2f788190557f807566f71fef35efe4088bad83742f017f086b50946c61dde0bfef56b8d2bbc38190557fa4daaada7730ba677e1af1b6ce63e872570989c345fc7889830a861d7edc03f48190557fb2a5c59e9ef73bca01ceced5dda45aa3a9619aeac99129484c969494675460c38190557fc0f4da88ff97f431b563c4191bdb9689eb1a87e263eb2d915c32562d1fcb11635560136020526706f05b59d3b200007f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c556709b6e64a8ec600007f4155c2f711f2cdd34f8262ab8fb9b7020a700fe7b6948222152f7670d1fdf34d55670de0b6b3a76400007f0b9d2c0c271bb30544eb78c59bdaebdae2728e5f65814c07768a0abe90ed192355671bc16d674ec800007f0d2a6872ef858a7f8ead18dc4f3f2e8d35c853d47e2816cbb9cdd49202554e0c8190556729a2241af62c00007f01413ff7a3b1d5b6c016c061d48e2c7014700c777a29fcd068fff04265813d5d55674563918244f400007ff4b2859895858d6aa26d656e4999d552f6a869b74c43bba7d2a941c4d22c3559557f709d0e3cf89777a1e1f9c99632e4494f29b0327befd0df15e277a12d94825795556802b5e3af16b18800007f4dd49deac3273cacecedf8d725adb3fa3b6bccbf14930b620a2649e4ba5e15498190557fe6ef3fb1592fd638b1dc0c67042cafceecd93ec5e9ab38496003ac4b2ff79cae8190557fd9d745972cd14f627a3f393d8fc448474343be29a2de463cbe959f5f58d1f4278190557f8911ae874128e515cc1a3760d3cb4d95572eb51a2b41bdbdd3d113991f34f9438190557f9d63fd4168e4816d6f9c6d608c8b897b8829f76fc15713c4470b423067bc1d818190557f7df26a85d6028ebfdbf482393ded53378ea74cd627ee7ffd721be8b2278435968190557fcb721b1e91d346a0413d2db060d21a8bc465c09a3bf67586ffa2a832cc83dfbb8190557fadaf24efab732215ef2d2da1e0b579c079f835f2991aa63fec195b61e32e024d8190557f93018175e7114e67528e78d2648f285d1e8f3709ecdaa72a55d7746ae8059145819055606d6000527ff63a9b79b832f61fd4c80f81e709000ee2ad88b876154184a9bddd5ecdc9817055600182141562000cc65760158054600160a060020a031916735f4ec3df9cbd43714fe2740f5e3616155c5b84191790555b81602a141562000cf75760158054600160a060020a031916739326bfa02add2366b30bacb125260af6410313311790555b816038141562000d285760158054600160a060020a031916730567f2323251f0aab15c8dfb1967e4e8a7d42aee1790555b816061141562000d595760158054600160a060020a031916732514895c72f50d8bd4b4f9b1110f0d6bd2c975261790555b8162013881141562000d8c5760158054600160a060020a03191673d0d5e3db44de05e9f294bb0a3beeaf030de24ada1790555b816089141562000dbd5760158054600160a060020a03191673ab594600376ec9fd91f8e885dadf0ce036862de01790555b505062000fff565b3390565b600b8054600160a060020a0383811661010081810261010060a860020a031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000e319062000fa9565b90600052602060002090601f01602090048101928262000e55576000855562000ea0565b82601f1062000e7057805160ff191683800117855562000ea0565b8280016001018555821562000ea0579182015b8281111562000ea057825182559160200191906001019062000e83565b5062000eae92915062000f55565b5090565b82805482825590600052602060002090601f0160209004810192821562000ea05791602002820160005b8382111562000f1c57835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000edc565b801562000f4b5782816101000a81549060ff021916905560010160208160000104928301926001030262000f1c565b505062000eae9291505b5b8082111562000eae576000815560010162000f56565b6000806040838503121562000f7f578182fd5b82516020840151909250600160a060020a038116811462000f9e578182fd5b809150509250929050565b60028104600182168062000fbe57607f821691505b6020821081141562000ff9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b613fdc806200100f6000396000f3fe6080604052600436106103a65760003560e060020a9004806370a08231116101eb578063a45e6c5511610111578063d2818e4d116100a4578063edf5695211610073578063edf5695214610a64578063f2fde38b14610a79578063f707d8c614610a99578063f71d96cb14610aae576103a6565b8063d2818e4d146109d1578063d4c85dfa146109e6578063e0e2894414610a06578063e985e9c514610a1b576103a6565b8063c87b56dd116100e0578063c87b56dd1461095c578063ca5b58841461097c578063cf332d5d1461099c578063d204c45e146109b1576103a6565b8063a45e6c55146108d7578063b3bd6a2714610907578063b88d4fde14610927578063c53e2a7814610947576103a6565b80638da5cb5b1161018957806395d89b411161015857806395d89b411461087857806399517c741461088d578063a1fe2396146108a2578063a22cb465146108b7576103a6565b80638da5cb5b146107e35780638e15f47314610807578063919b748314610833578063935a3c2714610848576103a6565b8063755a9274116101c5578063755a92741461078f5780638456cb59146107a457806389a3cbd1146107b95780638afc87b8146107ce576103a6565b806370a082311461073a578063715018a61461075a5780637348c0631461076f576103a6565b80633ca1abad116102d0578063479d26ec1161026e5780635724e3fe1161023d5780635724e3fe146106b25780635c975abb146106d25780636352211e146106ea5780636b7629af1461070a576103a6565b8063479d26ec146106535780634a58e1f9146106685780634f6ccce71461067d578063556724c31461069d576103a6565b806342842e0e116102aa57806342842e0e146105d357806342966c68146105f3578063431d1726146106135780634642187814610633576103a6565b80633ca1abad146105945780633f4ba83a146105a95780634236d81c146105be576103a6565b806312bdc7711161034857806329cd564c1161031757806329cd564c1461052c5780632f745c591461054c5780633298df761461056c5780633422183f1461057f576103a6565b806312bdc771146104b857806318160ddd146104d857806322c31c83146104f757806323b872dd1461050c576103a6565b806306fdde031161038457806306fdde0314610429578063081812fc1461044b578063095ea7b3146104835780630a149b62146104a3576103a6565b806301ffc9a7146103ab5780630319430c146103e057806306d3fd0f14610407575b600080fd5b3480156103b757600080fd5b506103cb6103c63660046131f5565b610ace565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103f5606681565b60405160ff90911681526020016103d7565b34801561041357600080fd5b5061042761042236600461312b565b610ae1565b005b34801561043557600080fd5b5061043e610b2f565b6040516103d79190613c26565b34801561045757600080fd5b5061046b610466366004613272565b610bc1565b604051600160a060020a0390911681526020016103d7565b34801561048f57600080fd5b5061042761049e36600461318b565b610c5d565b3480156104af57600080fd5b506103f5606881565b3480156104c457600080fd5b5061043e6104d33660046132ae565b610d90565b3480156104e457600080fd5b506008545b6040519081526020016103d7565b34801561050357600080fd5b506103f5600481565b34801561051857600080fd5b50610427610527366004612ff1565b610e36565b34801561053857600080fd5b50600c5461046b90600160a060020a031681565b34801561055857600080fd5b506104e961056736600461318b565b610e6b565b61042761057a3660046132ae565b610f16565b34801561058b57600080fd5b506103f5600781565b3480156105a057600080fd5b506103f5606c81565b3480156105b557600080fd5b5061042761104d565b3480156105ca57600080fd5b506103f5606d81565b3480156105df57600080fd5b506104276105ee366004612ff1565b61108a565b3480156105ff57600080fd5b5061042761060e366004613272565b6110a5565b34801561061f57600080fd5b506104e961062e3660046132ae565b61112f565b34801561063f57600080fd5b5061042761064e36600461328a565b61117d565b34801561065f57600080fd5b506103f5606981565b34801561067457600080fd5b506103f5600281565b34801561068957600080fd5b506104e9610698366004613272565b6111c4565b3480156106a957600080fd5b506103f5606b81565b3480156106be57600080fd5b506104276106cd36600461322d565b61127c565b3480156106de57600080fd5b50600b5460ff166103cb565b3480156106f657600080fd5b5061046b610705366004613272565b6112d2565b34801561071657600080fd5b506104e96107253660046132ae565b60ff1660009081526013602052604090205490565b34801561074657600080fd5b506104e9610755366004612fa5565b611360565b34801561076657600080fd5b506104276113fd565b34801561077b57600080fd5b5061042761078a36600461328a565b61143a565b34801561079b57600080fd5b506103f5606a81565b3480156107b057600080fd5b50610427611481565b3480156107c557600080fd5b506103f5600181565b3480156107da57600080fd5b506103f5600381565b3480156107ef57600080fd5b5061046b600b546101009004600160a060020a031690565b34801561081357600080fd5b5061081c6114bc565b6040805192835260ff9091166020830152016103d7565b34801561083f57600080fd5b506103f5600681565b34801561085457600080fd5b506104e96108633660046132ae565b60ff1660009081526012602052604090205490565b34801561088457600080fd5b5061043e6115e6565b34801561089957600080fd5b506103f5600981565b3480156108ae57600080fd5b506103f5606481565b3480156108c357600080fd5b506104276108d23660046130a5565b6115f5565b3480156108e357600080fd5b506103f56108f2366004613272565b6000908152600f602052604090205460ff1690565b34801561091357600080fd5b50610427610922366004612fa5565b611604565b34801561093357600080fd5b5061042761094236600461302c565b611666565b34801561095357600080fd5b506103f5606581565b34801561096857600080fd5b5061043e610977366004613272565b6116a1565b34801561098857600080fd5b506104276109973660046131b4565b611780565b3480156109a857600080fd5b506103f5606781565b3480156109bd57600080fd5b506104276109cc3660046130df565b6117f2565b3480156109dd57600080fd5b506103f5600881565b3480156109f257600080fd5b50610427610a0136600461328a565b611854565b348015610a1257600080fd5b506103f5600081565b348015610a2757600080fd5b506103cb610a36366004612fbf565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a7057600080fd5b506103f5600a81565b348015610a8557600080fd5b50610427610a94366004612fa5565b6118f9565b348015610aa557600080fd5b506103f5600581565b348015610aba57600080fd5b506103f5610ac9366004613272565b6119b4565b6000610ad9826119e8565b90505b919050565b600b54600160a060020a03610100909104163314610b1d5760405160e560020a62461bcd028152600401610b1490613c96565b60405180910390fd5b610b2a8383836001611a26565b505050565b606060008054610b3e90613eb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb0565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000610bcc82611b5d565b610c415760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b14565b50600090815260046020526040902054600160a060020a031690565b6000610c68826112d2565b905080600160a060020a031683600160a060020a03161415610cf55760405160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b14565b33600160a060020a0382161480610d115750610d118133610a36565b610d865760405160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b14565b610b2a8383611b7a565b60ff81166000908152601060205260409020805460609190610db190613eb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613eb0565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b50505050509050919050565b610e41335b82611bf5565b610e605760405160e560020a62461bcd028152600401610b1490613ccb565b610b2a838383611cf3565b6000610e7683611360565b8210610eed5760405160e560020a62461bcd02815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b14565b50600160a060020a03919091166000908152600660209081526040808320938352929052205490565b610f2b612710610f258361112f565b90611ede565b3411610f7c5760405160e560020a62461bcd02815260206004820152601f60248201527f4d6f746f4445586e66743a2077726f6e672076616c756520746f2073656e64006044820152606401610b14565b8060ff811660061415610f9457610f91611ef1565b90505b6000610fad600b546101009004600160a060020a031690565b604051909150600160a060020a038216903480156108fc02916000818181858888f19350505050158015610fe5573d6000803e3d6000fd5b506110023360405180602001604052806000815250846000611a26565b6040805134815260ff8581166020830152841681830152905133917f73e671c9734532d5ee1dd14c84d0fc071a3fb20fc994426819ee1cca0c3b39f2919081900360600190a2505050565b600b54600160a060020a036101009091041633146110805760405160e560020a62461bcd028152600401610b1490613c96565b611088611f32565b565b610b2a83838360405180602001604052806000815250611666565b6110ae33610e3b565b6111235760405160e560020a62461bcd02815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610b14565b61112c81611fd1565b50565b600080600061113c6114bc565b9092509050600061117461115b61115484600a613d9c565b8590611fda565b60ff871660009081526013602052604090205490611fda565b95945050505050565b600b54600160a060020a036101009091041633146111b05760405160e560020a62461bcd028152600401610b1490613c96565b60ff16600090815260136020526040902055565b60006111cf60085490565b82106112465760405160e560020a62461bcd02815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b14565b6008828154811061126a5760e060020a634e487b7102600052603260045260246000fd5b90600052602060002001549050919050565b600b54600160a060020a036101009091041633146112af5760405160e560020a62461bcd028152600401610b1490613c96565b60ff811660009081526010602090815260409091208351610b2a92850190612e0e565b600081815260026020526040812054600160a060020a031680610ad95760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b14565b6000600160a060020a0382166113e15760405160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b14565b50600160a060020a031660009081526003602052604090205490565b600b54600160a060020a036101009091041633146114305760405160e560020a62461bcd028152600401610b1490613c96565b6110886000611fe6565b600b54600160a060020a0361010090910416331461146d5760405160e560020a62461bcd028152600401610b1490613c96565b60ff16600090815260126020526040902055565b600b54600160a060020a036101009091041633146114b45760405160e560020a62461bcd028152600401610b1490613c96565b61108861204d565b6000806000601560009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a06040518083038186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154a91906132ca565b5050509150506000601560009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156115a357600080fd5b505afa1580156115b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115db9190613319565b919350909150509091565b606060018054610b3e90613eb0565b6116003383836120d8565b5050565b600b54600160a060020a036101009091041633146116375760405160e560020a62461bcd028152600401610b1490613c96565b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6116703383611bf5565b61168f5760405160e560020a62461bcd028152600401610b1490613ccb565b61169b848484846121aa565b50505050565b606060006116ae836121e0565b9050805160001415611769576000838152600e602090815260408083205460ff1683526010909152902080546116e390613eb0565b80601f016020809104026020016040519081016040528092919081815260200182805461170f90613eb0565b801561175c5780601f106117315761010080835404028352916020019161175c565b820191906000526020600020905b81548152906001019060200180831161173f57829003601f168201915b5050505050915050610adc565b611772836121e0565b915050610adc565b50919050565b600b54600160a060020a036101009091041633146117b35760405160e560020a62461bcd028152600401610b1490613c96565b60005b8160000b8160000b121561169b576117e08460405180602001604052806000815250856000611a26565b806117ea81613ee8565b9150506117b6565b600b54600160a060020a036101009091041633146118255760405160e560020a62461bcd028152600401610b1490613c96565b6000611830600d5490565b9050611840600d80546001019055565b61184a838261235f565b610b2a8183612379565b600c54600160a060020a031633146118d75760405160e560020a62461bcd02815260206004820152603160248201527f4d6f746f4445586e66743a206f6e6c7920736572766572206163636f756e742060448201527f63616e206368616e6765206865616c74680000000000000000000000000000006064820152608401610b14565b6000918252600f6020526040909120805460ff191660ff909216919091179055565b600b54600160a060020a0361010090910416331461192c5760405160e560020a62461bcd028152600401610b1490613c96565b600160a060020a0381166119ab5760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b14565b61112c81611fe6565b601481815481106119c457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000600160e060020a031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610ad95750610ad982612416565b60ff8216600090815260116020526040902054611a44816001613d28565b60ff841660009081526011602090815260408083209390935560129052205415611afc5760ff8316600090815260126020526040902054611a86826001613d28565b10611afc5760405160e560020a62461bcd02815260206004820152602660248201527f4d6f746f4445586e66743a20636f756e74657220726561636820656e64206f6660448201527f206c696d697400000000000000000000000000000000000000000000000000006064820152608401610b14565b6000611b07600d5490565b9050611b17600d80546001019055565b611b21868261235f565b8215611b3157611b318186612379565b6000818152600e60205260409020805460ff191660ff8616179055611b55846124b1565b505050505050565b600090815260026020526040902054600160a060020a0316151590565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091558190611bbc826112d2565b600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0082611b5d565b611c755760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b14565b6000611c80836112d2565b905080600160a060020a031684600160a060020a03161480611cbb575083600160a060020a0316611cb084610bc1565b600160a060020a0316145b80611ceb5750600160a060020a0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b82600160a060020a0316611d06826112d2565b600160a060020a031614611d855760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b14565b600160a060020a038216611e035760405160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b14565b611e0e838383612523565b611e19600082611b7a565b600160a060020a0383166000908152600360205260408120805460019290611e42908490613e6d565b9091555050600160a060020a0382166000908152600360205260408120805460019290611e70908490613d28565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611eea8284613e6d565b9392505050565b60148054604051600092611f0b9144914291602001613390565b60408051601f198184030181529190528051602090910120611f2d9190613f22565b905090565b600b5460ff16611f875760405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b14565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051600160a060020a03909116815260200160405180910390a1565b61112c81612584565b6000611eea8284613d40565b600b8054600160a060020a0383811661010081810274ffffffffffffffffffffffffffffffffffffffff001985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff16156120a35760405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb43390565b81600160a060020a031683600160a060020a0316141561213d5760405160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b14565b600160a060020a03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121b5848484611cf3565b6121c1848484846125c4565b61169b5760405160e560020a62461bcd028152600401610b1490613c39565b60606121eb82611b5d565b6122605760405160e560020a62461bcd02815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006064820152608401610b14565b6000828152600a60205260408120805461227990613eb0565b80601f01602080910402602001604051908101604052809291908181526020018280546122a590613eb0565b80156122f25780601f106122c7576101008083540402835291602001916122f2565b820191906000526020600020905b8154815290600101906020018083116122d557829003601f168201915b50505050509050600061231060408051602081019091526000815290565b905080516000141561232457509050610adc565b81511561235657808260405160200161233e929190613361565b60405160208183030381529060405292505050610adc565b611ceb84612706565b6116008282604051806020016040528060008152506127ee565b61238282611b5d565b6123f75760405160e560020a62461bcd02815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610b14565b6000828152600a602090815260409091208251610b2a92840190612e0e565b6000600160e060020a031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806124795750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610ad957507f01ffc9a700000000000000000000000000000000000000000000000000000000600160e060020a0319831614610ad9565b60ff81166000818152601360205260409020549060649081116124d25750600a5b600760ff8416108015906124ea5750600960ff841611155b156124f457506103e85b6125086125018383611fda565b8390612824565b60ff9093166000908152601360205260409020929092555050565b600b5460ff16156125795760405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b610b2a838383612830565b61258d816128ed565b6000818152600a6020526040902080546125a690613eb0565b15905061112c576000818152600a6020526040812061112c91612e92565b6000600160a060020a0384163b156126fb576040517f150b7a02000000000000000000000000000000000000000000000000000000008152600160a060020a0385169063150b7a0290612621903390899088908890600401613bea565b602060405180830381600087803b15801561263b57600080fd5b505af192505050801561266b575060408051601f3d908101601f1916820190925261266891810190613211565b60015b6126c8573d808015612699576040519150601f19603f3d011682016040523d82523d6000602084013e61269e565b606091505b5080516126c05760405160e560020a62461bcd028152600401610b1490613c39565b805181602001fd5b600160e060020a0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611ceb565b506001949350505050565b606061271182611b5d565b6127865760405160e560020a62461bcd02815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b14565b600061279d60408051602081019091526000815290565b905060008151116127bd5760405180602001604052806000815250611eea565b806127c7846129a1565b6040516020016127d8929190613361565b6040516020818303038152906040529392505050565b6127f88383612af9565b61280560008484846125c4565b610b2a5760405160e560020a62461bcd028152600401610b1490613c39565b6000611eea8284613d28565b600160a060020a03831661288b5761288681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6128ae565b81600160a060020a031683600160a060020a0316146128ae576128ae8382612c4b565b600160a060020a0382166128ca576128c581612ce8565b610b2a565b82600160a060020a031682600160a060020a031614610b2a57610b2a8282612dca565b60006128f8826112d2565b905061290681600084612523565b612911600083611b7a565b600160a060020a038116600090815260036020526040812080546001929061293a908490613e6d565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916905551839190600160a060020a038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060816129e2575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610adc565b8160005b8115612a0c57806129f681613f07565b9150612a059050600a83613d40565b91506129e6565b60008167ffffffffffffffff811115612a385760e060020a634e487b7102600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a62576020820181803683370190505b5090505b8415611ceb57612a77600183613e6d565b9150612a84600a86613f22565b612a8f906030613d28565b60f860020a02818381518110612ab85760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612af2600a86613d40565b9450612a66565b600160a060020a038216612b525760405160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b14565b612b5b81611b5d565b15612bab5760405160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b14565b612bb760008383612523565b600160a060020a0382166000908152600360205260408120805460019290612be0908490613d28565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612c5884611360565b612c629190613e6d565b600083815260076020526040902054909150808214612cb557600160a060020a03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b506000918252600760209081526040808420849055600160a060020a039094168352600681528383209183525290812055565b600854600090612cfa90600190613e6d565b60008381526009602052604081205460088054939450909284908110612d335760e060020a634e487b7102600052603260045260246000fd5b906000526020600020015490508060088381548110612d655760e060020a634e487b7102600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dae5760e060020a634e487b7102600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612dd583611360565b600160a060020a039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e1a90613eb0565b90600052602060002090601f016020900481019282612e3c5760008555612e82565b82601f10612e5557805160ff1916838001178555612e82565b82800160010185558215612e82579182015b82811115612e82578251825591602001919060010190612e67565b50612e8e929150612eca565b5090565b508054612e9e90613eb0565b6000825580601f10612eb0575061112c565b601f01602090049060005260206000209081019061112c91905b5b80821115612e8e5760008155600101612ecb565b600067ffffffffffffffff80841115612efa57612efa613f68565b604051601f8501601f19908116603f01168101908282118183101715612f2257612f22613f68565b81604052809350858152868686011115612f3b57600080fd5b858560208301376000602087830101525050509392505050565b8035600160a060020a0381168114610adc57600080fd5b600082601f830112612f7c578081fd5b611eea83833560208501612edf565b805169ffffffffffffffffffff81168114610adc57600080fd5b600060208284031215612fb6578081fd5b611eea82612f55565b60008060408385031215612fd1578081fd5b612fda83612f55565b9150612fe860208401612f55565b90509250929050565b600080600060608486031215613005578081fd5b61300e84612f55565b925061301c60208501612f55565b9150604084013590509250925092565b60008060008060808587031215613041578081fd5b61304a85612f55565b935061305860208601612f55565b925060408501359150606085013567ffffffffffffffff81111561307a578182fd5b8501601f8101871361308a578182fd5b61309987823560208401612edf565b91505092959194509250565b600080604083850312156130b7578182fd5b6130c083612f55565b9150602083013580151581146130d4578182fd5b809150509250929050565b600080604083850312156130f1578182fd5b6130fa83612f55565b9150602083013567ffffffffffffffff811115613115578182fd5b61312185828601612f6c565b9150509250929050565b60008060006060848603121561313f578283fd5b61314884612f55565b9250602084013567ffffffffffffffff811115613163578283fd5b61316f86828701612f6c565b925050604084013561318081613f97565b809150509250925092565b6000806040838503121561319d578182fd5b6131a683612f55565b946020939093013593505050565b6000806000606084860312156131c8578283fd5b6131d184612f55565b925060208401356131e181613f97565b9150604084013580820b8114613180578182fd5b600060208284031215613206578081fd5b8135611eea81613f81565b600060208284031215613222578081fd5b8151611eea81613f81565b6000806040838503121561323f578182fd5b823567ffffffffffffffff811115613255578283fd5b61326185828601612f6c565b92505060208301356130d481613f97565b600060208284031215613283578081fd5b5035919050565b6000806040838503121561329c578182fd5b8235915060208301356130d481613f97565b6000602082840312156132bf578081fd5b8135611eea81613f97565b600080600080600060a086880312156132e1578283fd5b6132ea86612f8b565b945060208601519350604086015192506060860151915061330d60808701612f8b565b90509295509295909350565b60006020828403121561332a578081fd5b8151611eea81613f97565b6000815180845261334d816020860160208601613e84565b601f01601f19169290920160200192915050565b60008351613373818460208801613e84565b835190830190613387818360208801613e84565b01949350505050565b600084825260208481840152604080840185546133b38760009081526020902090565b855b82601f8201101561370257815460ff80821686526101008083048216898801526201000083048216888801526301000000830482166060880152640100000000830482166080880152650100000000008304821660a088015266010000000000008304821660c08801526701000000000000008304821660e08801526801000000000000000083048216908701526901000000000000000000820481166101208701526a0100000000000000000000820481166101408701526b010000000000000000000000820481166101608701526c01000000000000000000000000820481166101808701526d0100000000000000000000000000820481166101a08701526e010000000000000000000000000000820481166101c08701526f01000000000000000000000000000000820481166101e08701527001000000000000000000000000000000008204811661020087015271010000000000000000000000000000000000820481166102208701527201000000000000000000000000000000000000820481166102408701527301000000000000000000000000000000000000008204811661026087015274010000000000000000000000000000000000000000820481166102808701527501000000000000000000000000000000000000000000820481166102a0870152760100000000000000000000000000000000000000000000820481166102c087015277010000000000000000000000000000000000000000000000820481166102e0870152780100000000000000000000000000000000000000000000000082048116610300870152790100000000000000000000000000000000000000000000000000820481166103208701527a010000000000000000000000000000000000000000000000000000820481166103408701527b010000000000000000000000000000000000000000000000000000008204811661036087015260e060020a820481166103808701527d010000000000000000000000000000000000000000000000000000000000820481166103a08701527e01000000000000000000000000000000000000000000000000000000000000820481166103c087015260f860020a909104166103e08501526104009093019260019091019085016133b5565b815494508281101561371c5760ff85168452928501926001015b8281101561373657610100850460ff168452928501926001015b828110156137515762010000850460ff168452928501926001015b8281101561376d576301000000850460ff168452928501926001015b8281101561378a57640100000000850460ff168452928501926001015b828110156137a85765010000000000850460ff168452928501926001015b828110156137c7576601000000000000850460ff168452928501926001015b828110156137e757670100000000000000850460ff168452928501926001015b828110156138085768010000000000000000850460ff168452928501926001015b8281101561382a576901000000000000000000850460ff168452928501926001015b8281101561384d576a0100000000000000000000850460ff168452928501926001015b82811015613871576b010000000000000000000000850460ff168452928501926001015b82811015613896576c01000000000000000000000000850460ff168452928501926001015b828110156138bc576d0100000000000000000000000000850460ff168452928501926001015b828110156138e3576e010000000000000000000000000000850460ff168452928501926001015b8281101561390b576f01000000000000000000000000000000850460ff168452928501926001015b8281101561393457700100000000000000000000000000000000850460ff168452928501926001015b8281101561395e5771010000000000000000000000000000000000850460ff168452928501926001015b82811015613989577201000000000000000000000000000000000000850460ff168452928501926001015b828110156139b557730100000000000000000000000000000000000000850460ff168452928501926001015b828110156139e25774010000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a10577501000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a3f57760100000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a6f5777010000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613aa0577801000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613ad257790100000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b05577a010000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b39577b01000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b555760e060020a850460ff168452928501926001015b82811015613b8b577d010000000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613bc2577e01000000000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613bdb5760f860020a850460ff168452928501925b50919998505050505050505050565b6000600160a060020a03808716835280861660208401525083604083015260806060830152613c1c6080830184613335565b9695505050505050565b600060208252611eea6020830184613335565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60008219821115613d3b57613d3b613f36565b500190565b600082613d4f57613d4f613f4f565b500490565b80825b6001808611613d665750613d93565b818704821115613d7857613d78613f36565b80861615613d8557918102915b506002909404938002613d57565b94509492505050565b6000611eea60001960ff851684600082613db857506001611eea565b81613dc557506000611eea565b8160018114613ddb5760028114613de557613e12565b6001915050611eea565b60ff841115613df657613df6613f36565b8360020a915084821115613e0c57613e0c613f36565b50611eea565b5060208310610133831016604e8410600b8410161715613e45575081810a83811115613e4057613e40613f36565b611eea565b613e528484846001613d54565b808604821115613e6457613e64613f36565b02949350505050565b600082821015613e7f57613e7f613f36565b500390565b60005b83811015613e9f578181015183820152602001613e87565b8381111561169b5750506000910152565b600281046001821680613ec457607f821691505b6020821081141561177a5760e060020a634e487b7102600052602260045260246000fd5b600081810b607f811415613efe57613efe613f36565b60010192915050565b6000600019821415613f1b57613f1b613f36565b5060010190565b600082613f3157613f31613f4f565b500690565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052601260045260246000fd5b60e060020a634e487b7102600052604160045260246000fd5b600160e060020a03198116811461112c57600080fd5b60ff8116811461112c57600080fdfea26469706673582212206caaf7b7d6eddd0a1de9235e8ac38dc7d4a0f0095eeb46bb27cbdf5fac48480264736f6c6343000802003368747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4c6f6e646f6e68747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4d656c6275726e68747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f50657465726275726768747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f52656442756c6c657268747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f54616970656968747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f42726f776e4b696c6c657268747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4865616c746843617073756c65313068747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4865616c746843617073756c653568747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f526f626f486f72736568747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f416275446861626968747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f5069736168747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f447562616968747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f49736c616d6162616468747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4865616c746843617073756c65333068747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4865616c746843617073756c65353068747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4d61676963426f7868747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4372617a794c696e6568747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f5a65627261477272727268747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4d6574616c4579657368747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4d6f73636f7768747470733a2f2f6f70656e62697365612e6d7970696e6174612e636c6f75642f697066732f516d5478726954484a465a62336a4b33527942475a6f584e72384242467958576f35323678316e316b724b62554a2f4265696a696e6700000000000000000000000000000000000000000000000000000000000000890000000000000000000000009917a225d8e40ed471598ec1cf5470b0406eee85
Deployed Bytecode
0x6080604052600436106103a65760003560e060020a9004806370a08231116101eb578063a45e6c5511610111578063d2818e4d116100a4578063edf5695211610073578063edf5695214610a64578063f2fde38b14610a79578063f707d8c614610a99578063f71d96cb14610aae576103a6565b8063d2818e4d146109d1578063d4c85dfa146109e6578063e0e2894414610a06578063e985e9c514610a1b576103a6565b8063c87b56dd116100e0578063c87b56dd1461095c578063ca5b58841461097c578063cf332d5d1461099c578063d204c45e146109b1576103a6565b8063a45e6c55146108d7578063b3bd6a2714610907578063b88d4fde14610927578063c53e2a7814610947576103a6565b80638da5cb5b1161018957806395d89b411161015857806395d89b411461087857806399517c741461088d578063a1fe2396146108a2578063a22cb465146108b7576103a6565b80638da5cb5b146107e35780638e15f47314610807578063919b748314610833578063935a3c2714610848576103a6565b8063755a9274116101c5578063755a92741461078f5780638456cb59146107a457806389a3cbd1146107b95780638afc87b8146107ce576103a6565b806370a082311461073a578063715018a61461075a5780637348c0631461076f576103a6565b80633ca1abad116102d0578063479d26ec1161026e5780635724e3fe1161023d5780635724e3fe146106b25780635c975abb146106d25780636352211e146106ea5780636b7629af1461070a576103a6565b8063479d26ec146106535780634a58e1f9146106685780634f6ccce71461067d578063556724c31461069d576103a6565b806342842e0e116102aa57806342842e0e146105d357806342966c68146105f3578063431d1726146106135780634642187814610633576103a6565b80633ca1abad146105945780633f4ba83a146105a95780634236d81c146105be576103a6565b806312bdc7711161034857806329cd564c1161031757806329cd564c1461052c5780632f745c591461054c5780633298df761461056c5780633422183f1461057f576103a6565b806312bdc771146104b857806318160ddd146104d857806322c31c83146104f757806323b872dd1461050c576103a6565b806306fdde031161038457806306fdde0314610429578063081812fc1461044b578063095ea7b3146104835780630a149b62146104a3576103a6565b806301ffc9a7146103ab5780630319430c146103e057806306d3fd0f14610407575b600080fd5b3480156103b757600080fd5b506103cb6103c63660046131f5565b610ace565b60405190151581526020015b60405180910390f35b3480156103ec57600080fd5b506103f5606681565b60405160ff90911681526020016103d7565b34801561041357600080fd5b5061042761042236600461312b565b610ae1565b005b34801561043557600080fd5b5061043e610b2f565b6040516103d79190613c26565b34801561045757600080fd5b5061046b610466366004613272565b610bc1565b604051600160a060020a0390911681526020016103d7565b34801561048f57600080fd5b5061042761049e36600461318b565b610c5d565b3480156104af57600080fd5b506103f5606881565b3480156104c457600080fd5b5061043e6104d33660046132ae565b610d90565b3480156104e457600080fd5b506008545b6040519081526020016103d7565b34801561050357600080fd5b506103f5600481565b34801561051857600080fd5b50610427610527366004612ff1565b610e36565b34801561053857600080fd5b50600c5461046b90600160a060020a031681565b34801561055857600080fd5b506104e961056736600461318b565b610e6b565b61042761057a3660046132ae565b610f16565b34801561058b57600080fd5b506103f5600781565b3480156105a057600080fd5b506103f5606c81565b3480156105b557600080fd5b5061042761104d565b3480156105ca57600080fd5b506103f5606d81565b3480156105df57600080fd5b506104276105ee366004612ff1565b61108a565b3480156105ff57600080fd5b5061042761060e366004613272565b6110a5565b34801561061f57600080fd5b506104e961062e3660046132ae565b61112f565b34801561063f57600080fd5b5061042761064e36600461328a565b61117d565b34801561065f57600080fd5b506103f5606981565b34801561067457600080fd5b506103f5600281565b34801561068957600080fd5b506104e9610698366004613272565b6111c4565b3480156106a957600080fd5b506103f5606b81565b3480156106be57600080fd5b506104276106cd36600461322d565b61127c565b3480156106de57600080fd5b50600b5460ff166103cb565b3480156106f657600080fd5b5061046b610705366004613272565b6112d2565b34801561071657600080fd5b506104e96107253660046132ae565b60ff1660009081526013602052604090205490565b34801561074657600080fd5b506104e9610755366004612fa5565b611360565b34801561076657600080fd5b506104276113fd565b34801561077b57600080fd5b5061042761078a36600461328a565b61143a565b34801561079b57600080fd5b506103f5606a81565b3480156107b057600080fd5b50610427611481565b3480156107c557600080fd5b506103f5600181565b3480156107da57600080fd5b506103f5600381565b3480156107ef57600080fd5b5061046b600b546101009004600160a060020a031690565b34801561081357600080fd5b5061081c6114bc565b6040805192835260ff9091166020830152016103d7565b34801561083f57600080fd5b506103f5600681565b34801561085457600080fd5b506104e96108633660046132ae565b60ff1660009081526012602052604090205490565b34801561088457600080fd5b5061043e6115e6565b34801561089957600080fd5b506103f5600981565b3480156108ae57600080fd5b506103f5606481565b3480156108c357600080fd5b506104276108d23660046130a5565b6115f5565b3480156108e357600080fd5b506103f56108f2366004613272565b6000908152600f602052604090205460ff1690565b34801561091357600080fd5b50610427610922366004612fa5565b611604565b34801561093357600080fd5b5061042761094236600461302c565b611666565b34801561095357600080fd5b506103f5606581565b34801561096857600080fd5b5061043e610977366004613272565b6116a1565b34801561098857600080fd5b506104276109973660046131b4565b611780565b3480156109a857600080fd5b506103f5606781565b3480156109bd57600080fd5b506104276109cc3660046130df565b6117f2565b3480156109dd57600080fd5b506103f5600881565b3480156109f257600080fd5b50610427610a0136600461328a565b611854565b348015610a1257600080fd5b506103f5600081565b348015610a2757600080fd5b506103cb610a36366004612fbf565b600160a060020a03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a7057600080fd5b506103f5600a81565b348015610a8557600080fd5b50610427610a94366004612fa5565b6118f9565b348015610aa557600080fd5b506103f5600581565b348015610aba57600080fd5b506103f5610ac9366004613272565b6119b4565b6000610ad9826119e8565b90505b919050565b600b54600160a060020a03610100909104163314610b1d5760405160e560020a62461bcd028152600401610b1490613c96565b60405180910390fd5b610b2a8383836001611a26565b505050565b606060008054610b3e90613eb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6a90613eb0565b8015610bb75780601f10610b8c57610100808354040283529160200191610bb7565b820191906000526020600020905b815481529060010190602001808311610b9a57829003601f168201915b5050505050905090565b6000610bcc82611b5d565b610c415760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b14565b50600090815260046020526040902054600160a060020a031690565b6000610c68826112d2565b905080600160a060020a031683600160a060020a03161415610cf55760405160e560020a62461bcd02815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b14565b33600160a060020a0382161480610d115750610d118133610a36565b610d865760405160e560020a62461bcd02815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b14565b610b2a8383611b7a565b60ff81166000908152601060205260409020805460609190610db190613eb0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90613eb0565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b50505050509050919050565b610e41335b82611bf5565b610e605760405160e560020a62461bcd028152600401610b1490613ccb565b610b2a838383611cf3565b6000610e7683611360565b8210610eed5760405160e560020a62461bcd02815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b14565b50600160a060020a03919091166000908152600660209081526040808320938352929052205490565b610f2b612710610f258361112f565b90611ede565b3411610f7c5760405160e560020a62461bcd02815260206004820152601f60248201527f4d6f746f4445586e66743a2077726f6e672076616c756520746f2073656e64006044820152606401610b14565b8060ff811660061415610f9457610f91611ef1565b90505b6000610fad600b546101009004600160a060020a031690565b604051909150600160a060020a038216903480156108fc02916000818181858888f19350505050158015610fe5573d6000803e3d6000fd5b506110023360405180602001604052806000815250846000611a26565b6040805134815260ff8581166020830152841681830152905133917f73e671c9734532d5ee1dd14c84d0fc071a3fb20fc994426819ee1cca0c3b39f2919081900360600190a2505050565b600b54600160a060020a036101009091041633146110805760405160e560020a62461bcd028152600401610b1490613c96565b611088611f32565b565b610b2a83838360405180602001604052806000815250611666565b6110ae33610e3b565b6111235760405160e560020a62461bcd02815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f766564000000000000000000000000000000006064820152608401610b14565b61112c81611fd1565b50565b600080600061113c6114bc565b9092509050600061117461115b61115484600a613d9c565b8590611fda565b60ff871660009081526013602052604090205490611fda565b95945050505050565b600b54600160a060020a036101009091041633146111b05760405160e560020a62461bcd028152600401610b1490613c96565b60ff16600090815260136020526040902055565b60006111cf60085490565b82106112465760405160e560020a62461bcd02815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b14565b6008828154811061126a5760e060020a634e487b7102600052603260045260246000fd5b90600052602060002001549050919050565b600b54600160a060020a036101009091041633146112af5760405160e560020a62461bcd028152600401610b1490613c96565b60ff811660009081526010602090815260409091208351610b2a92850190612e0e565b600081815260026020526040812054600160a060020a031680610ad95760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b14565b6000600160a060020a0382166113e15760405160e560020a62461bcd02815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b14565b50600160a060020a031660009081526003602052604090205490565b600b54600160a060020a036101009091041633146114305760405160e560020a62461bcd028152600401610b1490613c96565b6110886000611fe6565b600b54600160a060020a0361010090910416331461146d5760405160e560020a62461bcd028152600401610b1490613c96565b60ff16600090815260126020526040902055565b600b54600160a060020a036101009091041633146114b45760405160e560020a62461bcd028152600401610b1490613c96565b61108861204d565b6000806000601560009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a06040518083038186803b15801561151257600080fd5b505afa158015611526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154a91906132ca565b5050509150506000601560009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156115a357600080fd5b505afa1580156115b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115db9190613319565b919350909150509091565b606060018054610b3e90613eb0565b6116003383836120d8565b5050565b600b54600160a060020a036101009091041633146116375760405160e560020a62461bcd028152600401610b1490613c96565b600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6116703383611bf5565b61168f5760405160e560020a62461bcd028152600401610b1490613ccb565b61169b848484846121aa565b50505050565b606060006116ae836121e0565b9050805160001415611769576000838152600e602090815260408083205460ff1683526010909152902080546116e390613eb0565b80601f016020809104026020016040519081016040528092919081815260200182805461170f90613eb0565b801561175c5780601f106117315761010080835404028352916020019161175c565b820191906000526020600020905b81548152906001019060200180831161173f57829003601f168201915b5050505050915050610adc565b611772836121e0565b915050610adc565b50919050565b600b54600160a060020a036101009091041633146117b35760405160e560020a62461bcd028152600401610b1490613c96565b60005b8160000b8160000b121561169b576117e08460405180602001604052806000815250856000611a26565b806117ea81613ee8565b9150506117b6565b600b54600160a060020a036101009091041633146118255760405160e560020a62461bcd028152600401610b1490613c96565b6000611830600d5490565b9050611840600d80546001019055565b61184a838261235f565b610b2a8183612379565b600c54600160a060020a031633146118d75760405160e560020a62461bcd02815260206004820152603160248201527f4d6f746f4445586e66743a206f6e6c7920736572766572206163636f756e742060448201527f63616e206368616e6765206865616c74680000000000000000000000000000006064820152608401610b14565b6000918252600f6020526040909120805460ff191660ff909216919091179055565b600b54600160a060020a0361010090910416331461192c5760405160e560020a62461bcd028152600401610b1490613c96565b600160a060020a0381166119ab5760405160e560020a62461bcd02815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b14565b61112c81611fe6565b601481815481106119c457600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b6000600160e060020a031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610ad95750610ad982612416565b60ff8216600090815260116020526040902054611a44816001613d28565b60ff841660009081526011602090815260408083209390935560129052205415611afc5760ff8316600090815260126020526040902054611a86826001613d28565b10611afc5760405160e560020a62461bcd02815260206004820152602660248201527f4d6f746f4445586e66743a20636f756e74657220726561636820656e64206f6660448201527f206c696d697400000000000000000000000000000000000000000000000000006064820152608401610b14565b6000611b07600d5490565b9050611b17600d80546001019055565b611b21868261235f565b8215611b3157611b318186612379565b6000818152600e60205260409020805460ff191660ff8616179055611b55846124b1565b505050505050565b600090815260026020526040902054600160a060020a0316151590565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091558190611bbc826112d2565b600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c0082611b5d565b611c755760405160e560020a62461bcd02815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b14565b6000611c80836112d2565b905080600160a060020a031684600160a060020a03161480611cbb575083600160a060020a0316611cb084610bc1565b600160a060020a0316145b80611ceb5750600160a060020a0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b82600160a060020a0316611d06826112d2565b600160a060020a031614611d855760405160e560020a62461bcd02815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b14565b600160a060020a038216611e035760405160e560020a62461bcd028152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b14565b611e0e838383612523565b611e19600082611b7a565b600160a060020a0383166000908152600360205260408120805460019290611e42908490613e6d565b9091555050600160a060020a0382166000908152600360205260408120805460019290611e70908490613d28565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611eea8284613e6d565b9392505050565b60148054604051600092611f0b9144914291602001613390565b60408051601f198184030181529190528051602090910120611f2d9190613f22565b905090565b600b5460ff16611f875760405160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b14565b600b805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051600160a060020a03909116815260200160405180910390a1565b61112c81612584565b6000611eea8284613d40565b600b8054600160a060020a0383811661010081810274ffffffffffffffffffffffffffffffffffffffff001985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b5460ff16156120a35760405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b600b805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb43390565b81600160a060020a031683600160a060020a0316141561213d5760405160e560020a62461bcd02815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b14565b600160a060020a03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6121b5848484611cf3565b6121c1848484846125c4565b61169b5760405160e560020a62461bcd028152600401610b1490613c39565b60606121eb82611b5d565b6122605760405160e560020a62461bcd02815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f722060448201527f6e6f6e6578697374656e7420746f6b656e0000000000000000000000000000006064820152608401610b14565b6000828152600a60205260408120805461227990613eb0565b80601f01602080910402602001604051908101604052809291908181526020018280546122a590613eb0565b80156122f25780601f106122c7576101008083540402835291602001916122f2565b820191906000526020600020905b8154815290600101906020018083116122d557829003601f168201915b50505050509050600061231060408051602081019091526000815290565b905080516000141561232457509050610adc565b81511561235657808260405160200161233e929190613361565b60405160208183030381529060405292505050610adc565b611ceb84612706565b6116008282604051806020016040528060008152506127ee565b61238282611b5d565b6123f75760405160e560020a62461bcd02815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201527f6578697374656e7420746f6b656e0000000000000000000000000000000000006064820152608401610b14565b6000828152600a602090815260409091208251610b2a92840190612e0e565b6000600160e060020a031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806124795750600160e060020a031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610ad957507f01ffc9a700000000000000000000000000000000000000000000000000000000600160e060020a0319831614610ad9565b60ff81166000818152601360205260409020549060649081116124d25750600a5b600760ff8416108015906124ea5750600960ff841611155b156124f457506103e85b6125086125018383611fda565b8390612824565b60ff9093166000908152601360205260409020929092555050565b600b5460ff16156125795760405160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b14565b610b2a838383612830565b61258d816128ed565b6000818152600a6020526040902080546125a690613eb0565b15905061112c576000818152600a6020526040812061112c91612e92565b6000600160a060020a0384163b156126fb576040517f150b7a02000000000000000000000000000000000000000000000000000000008152600160a060020a0385169063150b7a0290612621903390899088908890600401613bea565b602060405180830381600087803b15801561263b57600080fd5b505af192505050801561266b575060408051601f3d908101601f1916820190925261266891810190613211565b60015b6126c8573d808015612699576040519150601f19603f3d011682016040523d82523d6000602084013e61269e565b606091505b5080516126c05760405160e560020a62461bcd028152600401610b1490613c39565b805181602001fd5b600160e060020a0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050611ceb565b506001949350505050565b606061271182611b5d565b6127865760405160e560020a62461bcd02815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b14565b600061279d60408051602081019091526000815290565b905060008151116127bd5760405180602001604052806000815250611eea565b806127c7846129a1565b6040516020016127d8929190613361565b6040516020818303038152906040529392505050565b6127f88383612af9565b61280560008484846125c4565b610b2a5760405160e560020a62461bcd028152600401610b1490613c39565b6000611eea8284613d28565b600160a060020a03831661288b5761288681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6128ae565b81600160a060020a031683600160a060020a0316146128ae576128ae8382612c4b565b600160a060020a0382166128ca576128c581612ce8565b610b2a565b82600160a060020a031682600160a060020a031614610b2a57610b2a8282612dca565b60006128f8826112d2565b905061290681600084612523565b612911600083611b7a565b600160a060020a038116600090815260036020526040812080546001929061293a908490613e6d565b9091555050600082815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916905551839190600160a060020a038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6060816129e2575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610adc565b8160005b8115612a0c57806129f681613f07565b9150612a059050600a83613d40565b91506129e6565b60008167ffffffffffffffff811115612a385760e060020a634e487b7102600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a62576020820181803683370190505b5090505b8415611ceb57612a77600183613e6d565b9150612a84600a86613f22565b612a8f906030613d28565b60f860020a02818381518110612ab85760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612af2600a86613d40565b9450612a66565b600160a060020a038216612b525760405160e560020a62461bcd02815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b14565b612b5b81611b5d565b15612bab5760405160e560020a62461bcd02815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b14565b612bb760008383612523565b600160a060020a0382166000908152600360205260408120805460019290612be0908490613d28565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612c5884611360565b612c629190613e6d565b600083815260076020526040902054909150808214612cb557600160a060020a03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b506000918252600760209081526040808420849055600160a060020a039094168352600681528383209183525290812055565b600854600090612cfa90600190613e6d565b60008381526009602052604081205460088054939450909284908110612d335760e060020a634e487b7102600052603260045260246000fd5b906000526020600020015490508060088381548110612d655760e060020a634e487b7102600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612dae5760e060020a634e487b7102600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612dd583611360565b600160a060020a039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612e1a90613eb0565b90600052602060002090601f016020900481019282612e3c5760008555612e82565b82601f10612e5557805160ff1916838001178555612e82565b82800160010185558215612e82579182015b82811115612e82578251825591602001919060010190612e67565b50612e8e929150612eca565b5090565b508054612e9e90613eb0565b6000825580601f10612eb0575061112c565b601f01602090049060005260206000209081019061112c91905b5b80821115612e8e5760008155600101612ecb565b600067ffffffffffffffff80841115612efa57612efa613f68565b604051601f8501601f19908116603f01168101908282118183101715612f2257612f22613f68565b81604052809350858152868686011115612f3b57600080fd5b858560208301376000602087830101525050509392505050565b8035600160a060020a0381168114610adc57600080fd5b600082601f830112612f7c578081fd5b611eea83833560208501612edf565b805169ffffffffffffffffffff81168114610adc57600080fd5b600060208284031215612fb6578081fd5b611eea82612f55565b60008060408385031215612fd1578081fd5b612fda83612f55565b9150612fe860208401612f55565b90509250929050565b600080600060608486031215613005578081fd5b61300e84612f55565b925061301c60208501612f55565b9150604084013590509250925092565b60008060008060808587031215613041578081fd5b61304a85612f55565b935061305860208601612f55565b925060408501359150606085013567ffffffffffffffff81111561307a578182fd5b8501601f8101871361308a578182fd5b61309987823560208401612edf565b91505092959194509250565b600080604083850312156130b7578182fd5b6130c083612f55565b9150602083013580151581146130d4578182fd5b809150509250929050565b600080604083850312156130f1578182fd5b6130fa83612f55565b9150602083013567ffffffffffffffff811115613115578182fd5b61312185828601612f6c565b9150509250929050565b60008060006060848603121561313f578283fd5b61314884612f55565b9250602084013567ffffffffffffffff811115613163578283fd5b61316f86828701612f6c565b925050604084013561318081613f97565b809150509250925092565b6000806040838503121561319d578182fd5b6131a683612f55565b946020939093013593505050565b6000806000606084860312156131c8578283fd5b6131d184612f55565b925060208401356131e181613f97565b9150604084013580820b8114613180578182fd5b600060208284031215613206578081fd5b8135611eea81613f81565b600060208284031215613222578081fd5b8151611eea81613f81565b6000806040838503121561323f578182fd5b823567ffffffffffffffff811115613255578283fd5b61326185828601612f6c565b92505060208301356130d481613f97565b600060208284031215613283578081fd5b5035919050565b6000806040838503121561329c578182fd5b8235915060208301356130d481613f97565b6000602082840312156132bf578081fd5b8135611eea81613f97565b600080600080600060a086880312156132e1578283fd5b6132ea86612f8b565b945060208601519350604086015192506060860151915061330d60808701612f8b565b90509295509295909350565b60006020828403121561332a578081fd5b8151611eea81613f97565b6000815180845261334d816020860160208601613e84565b601f01601f19169290920160200192915050565b60008351613373818460208801613e84565b835190830190613387818360208801613e84565b01949350505050565b600084825260208481840152604080840185546133b38760009081526020902090565b855b82601f8201101561370257815460ff80821686526101008083048216898801526201000083048216888801526301000000830482166060880152640100000000830482166080880152650100000000008304821660a088015266010000000000008304821660c08801526701000000000000008304821660e08801526801000000000000000083048216908701526901000000000000000000820481166101208701526a0100000000000000000000820481166101408701526b010000000000000000000000820481166101608701526c01000000000000000000000000820481166101808701526d0100000000000000000000000000820481166101a08701526e010000000000000000000000000000820481166101c08701526f01000000000000000000000000000000820481166101e08701527001000000000000000000000000000000008204811661020087015271010000000000000000000000000000000000820481166102208701527201000000000000000000000000000000000000820481166102408701527301000000000000000000000000000000000000008204811661026087015274010000000000000000000000000000000000000000820481166102808701527501000000000000000000000000000000000000000000820481166102a0870152760100000000000000000000000000000000000000000000820481166102c087015277010000000000000000000000000000000000000000000000820481166102e0870152780100000000000000000000000000000000000000000000000082048116610300870152790100000000000000000000000000000000000000000000000000820481166103208701527a010000000000000000000000000000000000000000000000000000820481166103408701527b010000000000000000000000000000000000000000000000000000008204811661036087015260e060020a820481166103808701527d010000000000000000000000000000000000000000000000000000000000820481166103a08701527e01000000000000000000000000000000000000000000000000000000000000820481166103c087015260f860020a909104166103e08501526104009093019260019091019085016133b5565b815494508281101561371c5760ff85168452928501926001015b8281101561373657610100850460ff168452928501926001015b828110156137515762010000850460ff168452928501926001015b8281101561376d576301000000850460ff168452928501926001015b8281101561378a57640100000000850460ff168452928501926001015b828110156137a85765010000000000850460ff168452928501926001015b828110156137c7576601000000000000850460ff168452928501926001015b828110156137e757670100000000000000850460ff168452928501926001015b828110156138085768010000000000000000850460ff168452928501926001015b8281101561382a576901000000000000000000850460ff168452928501926001015b8281101561384d576a0100000000000000000000850460ff168452928501926001015b82811015613871576b010000000000000000000000850460ff168452928501926001015b82811015613896576c01000000000000000000000000850460ff168452928501926001015b828110156138bc576d0100000000000000000000000000850460ff168452928501926001015b828110156138e3576e010000000000000000000000000000850460ff168452928501926001015b8281101561390b576f01000000000000000000000000000000850460ff168452928501926001015b8281101561393457700100000000000000000000000000000000850460ff168452928501926001015b8281101561395e5771010000000000000000000000000000000000850460ff168452928501926001015b82811015613989577201000000000000000000000000000000000000850460ff168452928501926001015b828110156139b557730100000000000000000000000000000000000000850460ff168452928501926001015b828110156139e25774010000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a10577501000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a3f57760100000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613a6f5777010000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613aa0577801000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613ad257790100000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b05577a010000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b39577b01000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613b555760e060020a850460ff168452928501926001015b82811015613b8b577d010000000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613bc2577e01000000000000000000000000000000000000000000000000000000000000850460ff168452928501926001015b82811015613bdb5760f860020a850460ff168452928501925b50919998505050505050505050565b6000600160a060020a03808716835280861660208401525083604083015260806060830152613c1c6080830184613335565b9695505050505050565b600060208252611eea6020830184613335565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b60008219821115613d3b57613d3b613f36565b500190565b600082613d4f57613d4f613f4f565b500490565b80825b6001808611613d665750613d93565b818704821115613d7857613d78613f36565b80861615613d8557918102915b506002909404938002613d57565b94509492505050565b6000611eea60001960ff851684600082613db857506001611eea565b81613dc557506000611eea565b8160018114613ddb5760028114613de557613e12565b6001915050611eea565b60ff841115613df657613df6613f36565b8360020a915084821115613e0c57613e0c613f36565b50611eea565b5060208310610133831016604e8410600b8410161715613e45575081810a83811115613e4057613e40613f36565b611eea565b613e528484846001613d54565b808604821115613e6457613e64613f36565b02949350505050565b600082821015613e7f57613e7f613f36565b500390565b60005b83811015613e9f578181015183820152602001613e87565b8381111561169b5750506000910152565b600281046001821680613ec457607f821691505b6020821081141561177a5760e060020a634e487b7102600052602260045260246000fd5b600081810b607f811415613efe57613efe613f36565b60010192915050565b6000600019821415613f1b57613f1b613f36565b5060010190565b600082613f3157613f31613f4f565b500690565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052601260045260246000fd5b60e060020a634e487b7102600052604160045260246000fd5b600160e060020a03198116811461112c57600080fd5b60ff8116811461112c57600080fdfea26469706673582212206caaf7b7d6eddd0a1de9235e8ac38dc7d4a0f0095eeb46bb27cbdf5fac48480264736f6c63430008020033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000890000000000000000000000009917a225d8e40ed471598ec1cf5470b0406eee85
-----Decoded View---------------
Arg [0] : networkId (uint256): 137
Arg [1] : _gameServer (address): 0x9917A225d8e40Ed471598Ec1CF5470B0406eEE85
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000089
Arg [1] : 0000000000000000000000009917a225d8e40ed471598ec1cf5470b0406eee85
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.