Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 15216251 | 851 days ago | IN | 0 ETH | 0.07566648 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MonsterbudsV2
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 200 runs
Other Settings:
petersburg EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.12; import "./MonsterBudHolders.sol"; import "./IMonsterBudsV2.sol"; import "@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/cryptography/SignatureCheckerUpgradeable.sol"; /** * @dev Implementation of the {IMonsterBuds} interface. */ contract MonsterbudsV2 is MonsterBudHolders, ERC721URIStorageUpgradeable, IMonsterBudsV2{ using StringsUpgradeable for uint256; // token count uint256 public tokenCounter; // percentage denominator uint private percentDeno; // percent of fees uint private feeMargin; // new Item count uint256 private newItemId; // SKT Wallet address address private feeSKTWallet; // smartcontract community address address private SmartContractCommunity; // array of token ids uint256[] private tokenIds; // array of token URI's string[] private tokenUris; // token price uint private tokenValue; // breed price uint private breedValue; // token URI string private beforeUri; string private afterUri; // status where buy should be allowed or not bool private buyONorOFFstatus; // status where self breed should be allowed or not bool private selfBreedStatus; // status where hybrid should be allowed or not bool private hybridStatus; // stores the details of token breeding struct breedInfomation{ uint256 tokenId; uint breedCount; uint256 timstamp; } // mapping of token Id with Breeding Information mapping (uint256 => breedInfomation) public breedingInfo; // mapping of ppp tokeen id with their minting status mapping(uint256 => bool) public pppMintStatus; // stucture for purchase struct Order{ address buyer; address owner; uint256 token_id; string tokenUri; uint256 expiryTimestamp; uint256 price; bytes32 signKey; // buyHash bytes32 signature; // messageHash } // structure for breed struct SelfBreed{ uint256 req_token_id; uint256 accept_token_id; bytes32 signKey; } // 2nd structure for purchase struct PurchaseOrder{ uint256 token_id; uint256 expiryTimestamp; uint256 price; bytes32 signKey; bytes32 signature; } // PFP ETH value uint256 private pfpValue; // packwood ERC 721 address address public packwoodERC721; // modifier modifier onlyPackwood721(){ require(msg.sender == packwoodERC721, "$MONSTERBUDS: You are not authorised"); _; } // functions Sections function updatePackwoodERC721(address nextOwner) external onlyOwner returns (address){ require(nextOwner != address(0x00), "$MONSTERBUDS: cannot be zero address"); packwoodERC721 = nextOwner; // update commuinty wallet return packwoodERC721; } /** * @dev calculates the 5 percent fees */ function feeCalulation(uint256 _totalPrice) private view returns (uint256) { uint256 fee = feeMargin * _totalPrice; uint256 fees = fee / percentDeno; return fees; } /** * @dev sets the status of Buy Tokens function. */ function updateBuyStatus(bool _status) external onlyOwner returns (bool){ buyONorOFFstatus = _status; return buyONorOFFstatus; } /** * @dev sets the value of pfp Tokens function. */ function updatePfpValue(uint256 _value) external onlyOwner returns (bool){ pfpValue = _value; return true; } /** * @dev sets the status of self breed Tokens function. */ function updateSelfBreedStatus(bool _status) external onlyOwner returns (bool){ selfBreedStatus = _status; return selfBreedStatus; } /** * @dev sets the status of hybrid Tokens function. */ function updateHybridStatus(bool _status) external onlyOwner returns (bool){ hybridStatus = _status; return hybridStatus; } /** * @dev concates the two string and token id to create new URI. * * @param _before token uri before part. * @param _after token uri after part. * @param _token_id token Id. * * Returns * - token uri */ function uriConcate(string memory _before, uint256 _token_id, string memory _after) private pure returns (string memory){ string memory token_uri = string( abi.encodePacked(_before, _token_id.toString(), _after)); return token_uri; } /** * @dev updates the token price(in ETH) * * @param _ethValue updated ETH price of token minting. * * Requirements: * - `_ethValue` must be pass. * - only owner can update value. */ function updateTokenMintRate(uint256 _ethValue) external onlyOwner returns (uint256){ tokenValue = _ethValue; // update the eth value of token return tokenValue; } /** * @dev updates the percent denominator. * For the fee margin in points the denominator should be increased * * @param _no denominator(100, 1000, 10000) * Requirements: * - only owner can update value. */ function updatepercentDenominator(uint256 _no) external onlyOwner returns (uint256){ percentDeno = _no; // update the eth value of token return percentDeno; } /** * @dev updates the token URI. * * @param tokenId token Id. * @param token_uri token uri. * * Requirements: * - only owner can update ant token URI. */ function updateTokenUri(uint256 tokenId, string memory token_uri) external onlyOwner returns (bool){ _setTokenURI(tokenId, token_uri); // update the uri of token return true; } /** * @dev updates the breed price(in ETH). * * @param _ethValue updated ETH price of breeding. * * Requirements: * - only owner can update value. */ function updateBreedValue(uint256 _ethValue) external onlyOwner returns (uint256){ breedValue = _ethValue; // update the eth value of breed value return breedValue; } /** * @dev updates the default Token URI. * * @param _before token uri before part. * @param _after token uri after part. * * Requirements: * - only owner can update default URI. */ function updateDefaultUri(string memory _before, string memory _after) external onlyOwner returns (bool){ beforeUri = _before; // update the before uri for SKT afterUri = _after; // update the after uri for SKT return true; } /** * @dev updates the SKT Wallet Address. * * @param nextOwner updated SKT wallet address. * * Requirements: * - only owner can update value. * - `nextOwner` cannot be zero address. */ function updateFeeSKTWallet(address payable nextOwner) external onlyOwner returns (address){ require(nextOwner != address(0x00), "$MONSTERBUDS: cannot be zero address"); feeSKTWallet = nextOwner; // update the fee wallet for SKT return feeSKTWallet; } /** * @dev updates the SmartContract Community Wallet Address. * * @param nextOwner updated smart contract community wallet address. * * Requirements: * - only owner can update value. * - `nextOwner` must not be zero address. */ function updateSKTCommunityWallet(address payable nextOwner) external onlyOwner returns (address){ require(nextOwner != address(0x00), "$MONSTERBUDS: cannot be zero address"); SmartContractCommunity = nextOwner; // update commuinty wallet return SmartContractCommunity; } /** * @dev updates the percent of fees. * - `nextFeeMargin` must be pass. * * Requirements: * - only owner can update value. */ function updateFeeMargin(uint256 nextMargin) external onlyOwner returns (uint256){ feeMargin = nextMargin; // update fee percent return feeMargin; } /** * @dev mints the ERC721 NFT tokens. * * @param quantity number of tokens that to be minted. * * Requirements: * - `quantity` must be from 1 to 28. * - ETH amount must be quantity * token price. * * Returns * - array of newly token counts. * * Emits a {TokenDetails} event. */ function createCollectible(uint quantity) external payable override returns (uint256[] memory){ uint256 totalAmount = (tokenValue * quantity); // total amount uint256 count = tokenCounter + (quantity-1); require(count <= 10420, "$MONSTERBUDS: Total supply has reached"); require(quantity <= 28 && totalAmount == msg.value, "$MONSTERBUDS: Cannot mint more than max buds or price is incorrect"); delete tokenIds; // delete the privious tokenIDs array delete tokenUris; string memory _uri; for (uint i = 0; i < quantity; i++) { // loop to mint no of seeds newItemId = tokenCounter; _uri = uriConcate(beforeUri, newItemId, afterUri); _safeMint(msg.sender, newItemId); // mint new seed _setTokenURI(newItemId, _uri); // set uri to new seed breedInfomation storage new_data = breedingInfo[newItemId]; new_data.tokenId = newItemId; new_data.breedCount = 0; new_data.timstamp = block.timestamp + 4 days; tokenIds.push(newItemId); tokenUris.push(_uri); tokenCounter = tokenCounter + 1; } payable(owner()).transfer(msg.value); // transfer the ethers to smart contract owner emit TokenDetails(msg.sender, tokenUris, tokenIds, msg.value); return tokenIds; } /** * @dev user can create new ERC721 token by hybriding with another token. * * @param req_token_id token Id of msg.sender. * @param accept_token_id token Id of accepter address. * @param breed_req_id request Id send by msg.sender to accepter. * * Returns * - new token count. * * Emits a {hybreed} event. */ function hybreedCollectiable( uint256 req_token_id,uint256 accept_token_id, uint256 breed_req_id) external override payable returns (uint256) { address payable accepter_token_address = payable(ownerOf(accept_token_id)); address owner_req = (ownerOf(req_token_id)); require(hybridStatus == true, "$MONSTERBUDS: Breeding is closed"); require(accepter_token_address != msg.sender && owner_req == msg.sender, "$MONSTERBUDS: can not hybrid"); uint256 breedFee = breedValue * 2; // 0.008 Eth breed Value * 2 require(breedFee == msg.value, "$MONSTERBUDS: Amount is incorrect"); newItemId = tokenCounter; string memory seed_token_uri = uriConcate(beforeUri, newItemId, afterUri); _safeMint(msg.sender, newItemId); // mint child seed _setTokenURI(newItemId, seed_token_uri); // set token uri for child seed tokenCounter = tokenCounter + 1; accepter_token_address.transfer(breedValue); // send 0.008 to accepter address payable(feeSKTWallet).transfer(breedValue); // send 0.008 to skt fee wallet emit hybreed( msg.sender, accepter_token_address, req_token_id, accept_token_id, seed_token_uri, newItemId, breed_req_id, breedValue, breedValue ); return newItemId; } /** * @dev user can create new ERC721 token by self breeding with owned two tokens. * * @param breed struct for breeding info. * @param signature verify. * * Returns * - new token count. * * Emits a {breedSelf} event. */ function selfBreedCollectiable(SelfBreed calldata breed, bytes calldata signature) external payable returns (uint256) { bool status = SignatureCheckerUpgradeable.isValidSignatureNow(owner(), breed.signKey, signature); require(status == true, "$MONSTERBUDS: cannot breed[ERROR]"); require(selfBreedStatus == true, "$MONSTERBUDS: Breeding is closed"); require(breed.req_token_id > 865 && breed.accept_token_id > 865, "$MONSTERBUDS: PPP Monsters cannot breed"); // 865 ppp users require(breedValue == msg.value, "$MONSTERBUDS: Amount is incorrect"); address owner_req = (ownerOf(breed.req_token_id)); address owner_accept = (ownerOf(breed.accept_token_id)); require(owner_req == owner_accept && owner_req == msg.sender && breed.req_token_id != breed.accept_token_id, "$MONSTERBUDS: Cannot Self Breed"); require(breedingInfo[breed.req_token_id].breedCount < 2 && breedingInfo[breed.accept_token_id].breedCount < 2, "$MONSTERBUDS: Exceeds max breed count"); require(block.timestamp >= breedingInfo[breed.req_token_id].timstamp && block.timestamp >= breedingInfo[breed.accept_token_id].timstamp,"$MONSTERBUDS: You cannot breed now"); newItemId = tokenCounter; string memory seed_token_uri = uriConcate(beforeUri, newItemId, afterUri); _safeMint(msg.sender, newItemId); // mint new child seed _setTokenURI(newItemId, seed_token_uri); // set child uri uint countOfReq = breedingInfo[breed.req_token_id].breedCount; uint countOfAccept = breedingInfo[breed.accept_token_id].breedCount; breedInfomation storage new_data = breedingInfo[newItemId]; new_data.tokenId = newItemId; new_data.breedCount = 0; new_data.timstamp = block.timestamp + 4 days; tokenCounter = tokenCounter + 1; breedInfomation storage req_data = breedingInfo[breed.req_token_id]; req_data.tokenId = breed.req_token_id; req_data.breedCount = countOfReq + 1; req_data.timstamp = block.timestamp + 1512000; breedInfomation storage accept_data = breedingInfo[breed.accept_token_id]; accept_data.tokenId = breed.accept_token_id; accept_data.breedCount = countOfAccept + 1; accept_data.timstamp = block.timestamp + 1512000; payable(feeSKTWallet).transfer(msg.value); // send 0.008 to skt fee wallet emit breedSelf( msg.sender, breed.req_token_id, breed.accept_token_id, seed_token_uri, newItemId, msg.value ); return newItemId; } // /** // * @dev free mint for ppp users. // * // * Requirements // * - user address must be ppp user. // * - user address must not be zero address. // * // * Returns // * - new token count. // * // * Emits a {FreeTokenDetails} event. // */ // function freeMint() external override returns(uint256) { // require(holders[msg.sender] == true, "$MONSTERBUDS: Not PPP User"); // string memory _uri; // holders[msg.sender] = false; // newItemId = tokenCounter; // string memory before_ = "https://s3.amazonaws.com/assets.monsterbuds.io/Monster-Uri/PPP_Ticket_"; // string memory after_ = ".json"; // _uri = uriConcate(before_, newItemId, after_); // _safeMint(msg.sender, newItemId); // mint new seed // _setTokenURI(newItemId, _uri); // set uri to new seed // tokenCounter = tokenCounter + 1; // emit FreeTokenDetails(0, msg.sender, _uri, newItemId, false); // return newItemId; // } /** * @dev user can create new ERC721 token by self breeding with owned two tokens. * * @param _tokenId token Id of msg.sender. * * Returns * - new token count. * * Emits a {FreeTokenDetails} event. */ function createPPPCollectiable(uint256 _tokenId) external returns (uint256){ require(_tokenId <= 865 && ownerOf(_tokenId) == msg.sender ,"$MONSTERBUDS: Not a PPP token or owner of PPP token"); require(pppMintStatus[_tokenId] == false, "$MONSTERBUDS: Token is already minted by selected PPP token ID"); newItemId = tokenCounter; string memory token_uri = uriConcate(beforeUri, newItemId, afterUri); _safeMint(msg.sender, newItemId); // mint child seed _setTokenURI(newItemId, token_uri); // set token uri for child seed breedInfomation storage new_data = breedingInfo[newItemId]; new_data.tokenId = newItemId; new_data.breedCount = 0; new_data.timstamp = block.timestamp + 4 days; tokenCounter = tokenCounter + 1; pppMintStatus[_tokenId] = true; emit FreeTokenDetails(_tokenId, msg.sender, token_uri, newItemId, true); return newItemId; } /** * @dev matches the price and order * * @param order structure about token order details. * * Returns * - bool. * * Emits a {buyTransfer} event. */ function orderCheck(Order memory order) private returns(bool){ address payable owner = payable(ownerOf(order.token_id)); bytes32 hashS = keccak256(abi.encodePacked(msg.sender)); bytes32 hashR = keccak256(abi.encodePacked(owner)); bytes32 hashT = keccak256(abi.encodePacked(order.price)); bytes32 hashV = keccak256(abi.encodePacked(order.token_id)); bytes32 hashP = keccak256(abi.encodePacked(order.expiryTimestamp)); bytes32 sign = keccak256(abi.encodePacked(hashV, hashP, hashT, hashR, hashS)); require(order.expiryTimestamp >= block.timestamp, "MONSTERBUDS: expired time"); require(sign == order.signKey, "$MONSTERBUDS: ERROR"); require(order.price == msg.value, "MONSTERBUDS: Price is incorrect"); uint256 feeAmount = feeCalulation(msg.value); payable(feeSKTWallet).transfer(feeAmount); // transfer 5% ethers of msg.value to skt fee wallet payable(SmartContractCommunity).transfer(feeAmount); // transfer 5% ethers of msg.value to commuinty uint256 remainAmount = msg.value - (feeAmount + feeAmount); payable(order.owner).transfer(remainAmount); // transfer remaining 90% ethers of msg.value to owner of token _transfer(order.owner, msg.sender, order.token_id); // transfer the ownership of token to buyer emit buyTransfer(order.owner, msg.sender, order.token_id, msg.value); return true; } /** * @dev user can purchase the token. * * @param order structure about token order details. * @param signature signature to verify. * * Returns * - bool. */ function purchase(Order memory order, bytes memory signature) external payable returns(bool){ require(buyONorOFFstatus == true, "$MONSTERBUDS: Marketplace for buying is closed"); orderCheck(order); bool status = SignatureCheckerUpgradeable.isValidSignatureNow(owner(), order.signature, signature); require(status == true, "$MONSTERBUDS: cannot purchase the token"); return true; } /** * @dev user can purchase the token. * * @param token_id token Id. * * Returns * - bool. * * Emits a {PfpDetails} event. */ function createPfpVersion(uint256 token_id) external payable returns(bool){ require(msg.value == pfpValue, "$MONSTERBUDS: Price is incorrect"); require(ownerOf(token_id) == msg.sender, "$MONSTERBUDS: You are not owner of token"); payable(feeSKTWallet).transfer(msg.value); emit PfpDetails(msg.sender, token_id, msg.value); return true; } /** * @dev breeding of Packwood ERC721 and monsterbuds ERC721 creates new token * * @param monsterbudId token Id. * @param reciever mint new token to reciver address * * Returns * - bool. * * Emits a {PfpDetails} event. */ function breedUpdation(uint256 monsterbudId, address reciever) external onlyPackwood721 returns(uint256){ require(breedingInfo[monsterbudId].breedCount < 2, "$MONSTERBUDS: Exceeds max breed count"); require(block.timestamp >= breedingInfo[monsterbudId].timstamp ,"$MONSTERBUDS: cannot breed now"); newItemId = tokenCounter; string memory seed_token_uri = uriConcate(beforeUri, newItemId, afterUri); _safeMint(reciever, newItemId); // mint new child seed _setTokenURI(newItemId, seed_token_uri); // set child uri uint countOfReq = breedingInfo[monsterbudId].breedCount; breedInfomation storage new_data = breedingInfo[newItemId]; new_data.tokenId = newItemId; new_data.breedCount = 0; new_data.timstamp = block.timestamp + 4 days; tokenCounter = tokenCounter + 1; breedInfomation storage req_data = breedingInfo[monsterbudId]; req_data.tokenId = monsterbudId; req_data.breedCount = countOfReq + 1; req_data.timstamp = block.timestamp + 1512000; return newItemId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init(address owner_) internal initializer { __Context_init_unchained(); __Ownable_init_unchained(owner_); } function __Ownable_init_unchained(address owner_) internal initializer { _setOwner(owner_); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address ) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner((address(0))); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC1271 standard signature validation method for * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. * * _Available since v4.1._ */ interface IERC1271Upgradeable { /** * @dev Should return whether the signature provided is valid for the provided data * @param hash Hash of the data to be signed * @param signature Signature byte array associated with _data */ function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721Upgradeable.sol"; import "./IERC721ReceiverUpgradeable.sol"; import "./extensions/IERC721MetadataUpgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/ContextUpgradeable.sol"; import "../../utils/StringsUpgradeable.sol"; import "../../utils/introspection/ERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable { using AddressUpgradeable for address; using StringsUpgradeable 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. */ function __ERC721_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721_init_unchained(name_, symbol_); } function __ERC721_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC721Upgradeable).interfaceId || interfaceId == type(IERC721MetadataUpgradeable).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 = ERC721Upgradeable.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721Upgradeable.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 = ERC721Upgradeable.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(ERC721Upgradeable.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(ERC721Upgradeable.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} uint256[44] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @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 pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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 pragma solidity ^0.8.0; import "../ERC721Upgradeable.sol"; import "../../../proxy/utils/Initializable.sol"; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorageUpgradeable is Initializable, ERC721Upgradeable { function __ERC721URIStorage_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __ERC721URIStorage_init_unchained(); } function __ERC721URIStorage_init_unchained() internal initializer { } using StringsUpgradeable 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]; } } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @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 pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @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 ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return recover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return recover(hash, r, vs); } else { revert("ECDSA: invalid signature length"); } } /** * @dev Overload of {ECDSA-recover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require( uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value" ); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSAUpgradeable.sol"; import "../AddressUpgradeable.sol"; import "../../interfaces/IERC1271Upgradeable.sol"; /** * @dev Signature verification helper: Provide a single mechanism to verify both private-key (EOA) ECDSA signature and * ERC1271 contract sigantures. Using this instead of ECDSA.recover in your contract will make them compatible with * smart contract wallets such as Argent and Gnosis. * * Note: unlike ECDSA signatures, contract signature's are revocable, and the outcome of this function can thus change * through time. It could return true at block N and false at block N+1 (or the opposite). * * _Available since v4.1._ */ library SignatureCheckerUpgradeable { function isValidSignatureNow( address signer, bytes32 hash, bytes memory signature ) internal view returns (bool) { if (AddressUpgradeable.isContract(signer)) { try IERC1271Upgradeable(signer).isValidSignature(hash, signature) returns (bytes4 magicValue) { return magicValue == IERC1271Upgradeable(signer).isValidSignature.selector; } catch { return false; } } else { return ECDSAUpgradeable.recover(hash, signature) == signer; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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 pragma experimental ABIEncoderV2; pragma solidity >=0.6.0 <0.8.12; interface IMonsterBudsV2 { // Events Section /** * @dev Emitted when new tokens are minted by user. */ event TokenDetails( address owner, // owner address of token string[] tokenURI, // newly created token uri's uint256[] tokenId, // newly created token Id's uint256 totalValue // total price to create them ); /** * @dev Emitted when token is purchased by buyer. */ event buyTransfer( address indexed sellerAddress, // sender address address indexed buyerAddress, // buyer address uint256 indexed tokenId, // purchase token id uint256 price // price of token id ); /** * @dev Emitted when new token is minted from two owned tokens. */ event breedSelf( address indexed selfAddress, // msg.sender address uint256 motherTokenId, uint256 donorTokenId, string tokenURI, // child seed uri uint256 newTokenId, // new minted child id uint256 sktFeePrice // fee to skt wallet ); /** * @dev Emitted when new tokens is minted by hybreed between owned and another users tokens. */ event hybreed( address indexed requesterEthAddress, // msg.sender address address indexed accepterEthAddress, // wallet address of accepter uint256 motherTokenId, // token id of msg.sender uint256 donorTokenId, // token id of accepter string tokenURI, // new minted child uri uint256 newTokenId, // new minted child id uint256 breedReqId, // breed request id uint256 sktFeePrice, // fee to skt wallet uint256 accepterFeePrice // fee to accepter ); /** * @dev Emitted when free token is minted by ppp user. */ event FreeTokenDetails( uint256 parentTokenId, address owner, // owner address of token string tokenURI, // newly created token uri uint256 tokenId, // newly created token Id bool status ); /** * @dev Emitted when token is upgraded by user. */ event PfpDetails( address tokenOwner, uint256 tokenId, uint256 price ); /** * @dev mints the ERC721 NFT tokens. * * Returns * - array of newly token counts. * * Emits a {TokenDetails} event. */ function createCollectible(uint256 quantity) external payable returns (uint256[] memory); /** * @dev user can create new ERC721 token by hybriding with another token. * * Returns * - new token count. * * Emits a {hybreed} event. */ function hybreedCollectiable( uint256 req_token_id, uint256 accept_token_id, uint256 breed_req_id) external payable returns (uint256); // /** // * @dev free mint for ppp users. // * // * Returns // * - new token count. // * // * Emits a {FreeTokenDetails} event. // */ // function freeMint() external returns(uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.12; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; abstract contract MonsterBudHolders is OwnableUpgradeable{ // mapping of ppp address with their status mapping(address => bool) public holders; /** * @dev Emitted when `ppp user address` status is set to true. */ event AddHolder(address pppUser, bool status); /** * @dev adds 484 ppp users at one time. * @param _pppUser array of address to be added. * @param _status status in boolean. * * Requirements * - array must have 484 address. * - only owner must call this method. * * Emits a {AddHolder} event. */ function addPPPUserStatus(address[484] calldata _pppUser, bool _status) onlyOwner external { for(uint i = 0; i < 484; i++){ holders[_pppUser[i]] = _status; emit AddHolder(_pppUser[i], _status); } } /** * @dev checks where user address can use free mint. * @param _pppUser user address. * * Returns * - status in boolean. */ function checkPPPUser(address _pppUser) external view returns(bool){ require(_pppUser != address(0x00), "$MONSTERBUDS: zero address can not be ppp user"); return holders[_pppUser]; } /** * @dev It destroy the contract and returns all balance of this contract to owner. * * Returns * - only owner can call this method. */ function selfDestruct() public onlyOwner{ payable(owner()).transfer(address(this).balance); //selfdestruct(payable(address(this))); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "petersburg", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pppUser","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"AddHolder","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"parentTokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"FreeTokenDetails","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":"tokenOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PfpDetails","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string[]","name":"tokenURI","type":"string[]"},{"indexed":false,"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"totalValue","type":"uint256"}],"name":"TokenDetails","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":true,"internalType":"address","name":"selfAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"motherTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"donorTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sktFeePrice","type":"uint256"}],"name":"breedSelf","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"buyerAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"buyTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requesterEthAddress","type":"address"},{"indexed":true,"internalType":"address","name":"accepterEthAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"motherTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"donorTokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"},{"indexed":false,"internalType":"uint256","name":"newTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"breedReqId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sktFeePrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accepterFeePrice","type":"uint256"}],"name":"hybreed","type":"event"},{"inputs":[{"internalType":"address[484]","name":"_pppUser","type":"address[484]"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"addPPPUserStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"monsterbudId","type":"uint256"},{"internalType":"address","name":"reciever","type":"address"}],"name":"breedUpdation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"breedingInfo","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"breedCount","type":"uint256"},{"internalType":"uint256","name":"timstamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pppUser","type":"address"}],"name":"checkPPPUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"createCollectible","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"createPPPCollectiable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"token_id","type":"uint256"}],"name":"createPfpVersion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"req_token_id","type":"uint256"},{"internalType":"uint256","name":"accept_token_id","type":"uint256"},{"internalType":"uint256","name":"breed_req_id","type":"uint256"}],"name":"hybreedCollectiable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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":"packwoodERC721","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pppMintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"token_id","type":"uint256"},{"internalType":"string","name":"tokenUri","type":"string"},{"internalType":"uint256","name":"expiryTimestamp","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"signKey","type":"bytes32"},{"internalType":"bytes32","name":"signature","type":"bytes32"}],"internalType":"struct MonsterbudsV2.Order","name":"order","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"purchase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"req_token_id","type":"uint256"},{"internalType":"uint256","name":"accept_token_id","type":"uint256"},{"internalType":"bytes32","name":"signKey","type":"bytes32"}],"internalType":"struct MonsterbudsV2.SelfBreed","name":"breed","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfBreedCollectiable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"selfDestruct","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCounter","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethValue","type":"uint256"}],"name":"updateBreedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateBuyStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_before","type":"string"},{"internalType":"string","name":"_after","type":"string"}],"name":"updateDefaultUri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nextMargin","type":"uint256"}],"name":"updateFeeMargin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"nextOwner","type":"address"}],"name":"updateFeeSKTWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateHybridStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nextOwner","type":"address"}],"name":"updatePackwoodERC721","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"updatePfpValue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"nextOwner","type":"address"}],"name":"updateSKTCommunityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateSelfBreedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethValue","type":"uint256"}],"name":"updateTokenMintRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"token_uri","type":"string"}],"name":"updateTokenUri","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_no","type":"uint256"}],"name":"updatepercentDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614378806100206000396000f3fe6080604052600436106102675760003560e01c80638da5cb5b11610144578063d2fd6546116100b6578063e985e9c51161007a578063e985e9c514610770578063f2fde38b146107b9578063f3a3317f146107d9578063f4b22a60146107f9578063fa63dd3d1461080c578063fb97a4791461082c57600080fd5b8063d2fd6546146106dd578063d31af484146106fd578063d3f3afba1461071d578063d860b1de1461073d578063e5ca7c891461075d57600080fd5b8063ac34419b11610108578063ac34419b14610627578063b5c4c47b14610647578063b88d4fde14610667578063bb71561d14610687578063c87b56dd146106a7578063d082e381146106c757600080fd5b80638da5cb5b1461059f5780638f9fe526146105bd57806395d89b41146105dd5780639cb8a26a146105f2578063a22cb4651461060757600080fd5b806327538fea116101dd57806356655bf5116101a157806356655bf5146104b25780636352211e146104d25780636d947176146104f257806370a0823114610512578063715018a61461053257806385eafbdc1461054757600080fd5b806327538fea1461041257806338e1294c1461043257806342842e0e1461045257806344e97d84146104725780634881c72f1461049257600080fd5b806311bbfa1d1161022f57806311bbfa1d1461033d57806315480c551461035e578063186338ed1461037e57806318a5bbdc1461039157806320d0c31e146103c157806323b872dd146103f257600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb5780630e230ff41461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004613a0c565b61084d565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661089f565b6040516102989190613f2d565b3480156102cf57600080fd5b506102e36102de366004613bfd565b610931565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004613989565b6109be565b005b34801561032957600080fd5b506102e3610338366004613851565b610ad4565b61035061034b366004613c78565b610b4d565b604051908152602001610298565b34801561036a57600080fd5b50610350610379366004613c16565b610e9d565b61028c61038c366004613aa0565b61105f565b34801561039d57600080fd5b5061028c6103ac366004613851565b60656020526000908152604090205460ff1681565b3480156103cd57600080fd5b5061028c6103dc366004613bfd565b61010a6020526000908152604090205460ff1681565b3480156103fe57600080fd5b5061031b61040d3660046138a7565b61116b565b34801561041e57600080fd5b506102e361042d366004613851565b61119c565b34801561043e57600080fd5b5061028c61044d3660046139f1565b611213565b34801561045e57600080fd5b5061031b61046d3660046138a7565b611258565b34801561047e57600080fd5b506102e361048d366004613851565b611273565b34801561049e57600080fd5b506103506104ad366004613bfd565b6112ea565b3480156104be57600080fd5b5061028c6104cd3660046139f1565b611321565b3480156104de57600080fd5b506102e36104ed366004613bfd565b611371565b3480156104fe57600080fd5b5061035061050d366004613bfd565b6113e8565b34801561051e57600080fd5b5061035061052d366004613851565b61141e565b34801561053e57600080fd5b5061031b6114a5565b34801561055357600080fd5b50610584610562366004613bfd565b6101096020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610298565b3480156105ab57600080fd5b506033546001600160a01b03166102e3565b3480156105c957600080fd5b5061028c6105d8366004613a46565b6114db565b3480156105e957600080fd5b506102b6611531565b3480156105fe57600080fd5b5061031b611540565b34801561061357600080fd5b5061031b610622366004613954565b6115b1565b34801561063357600080fd5b50610350610642366004613bfd565b611676565b61065a610655366004613bfd565b611864565b6040516102989190613ed0565b34801561067357600080fd5b5061031b6106823660046138e8565b611b7c565b34801561069357600080fd5b5061028c6106a23660046139f1565b611bb4565b3480156106b357600080fd5b506102b66106c2366004613bfd565b611c02565b3480156106d357600080fd5b5061035060fc5481565b3480156106e957600080fd5b5061028c6106f8366004613851565b611d79565b34801561070957600080fd5b5061028c610718366004613c3b565b611e07565b34801561072957600080fd5b50610350610738366004613bfd565b611e47565b34801561074957600080fd5b50610350610758366004613bfd565b611e7d565b61035061076b366004613b72565b611eb4565b34801561077c57600080fd5b5061028c61078b36600461386e565b6001600160a01b039182166000908152609d6020908152604080832093909416825291909152205460ff1690565b3480156107c557600080fd5b5061031b6107d4366004613851565b612398565b3480156107e557600080fd5b5061031b6107f43660046139b5565b612430565b61028c610807366004613bfd565b612535565b34801561081857600080fd5b5061028c610827366004613bfd565b61267c565b34801561083857600080fd5b5061010c546102e3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061087e57506001600160e01b03198216635b5e139f60e01b145b8061089957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609880546108ae90614255565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90614255565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093c826126b3565b6109a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609c60205260409020546001600160a01b031690565b60006109c982611371565b9050806001600160a01b0316836001600160a01b03161415610a375760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610999565b336001600160a01b0382161480610a535750610a53813361078b565b610ac55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610999565b610acf83836126d0565b505050565b6033546000906001600160a01b03163314610b015760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b038216610b275760405162461bcd60e51b81526004016109999061405d565b5061010080546001600160a01b0319166001600160a01b0383169081179091555b919050565b600080610b5984611371565b90506000610b6686611371565b6101085490915062010000900460ff161515600114610bc75760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a204272656564696e6720697320636c6f7365646044820152606401610999565b6001600160a01b0382163314801590610be857506001600160a01b03811633145b610c345760405162461bcd60e51b815260206004820152601c60248201527f244d4f4e53544552425544533a2063616e206e6f7420687962726964000000006044820152606401610999565b6000610105546002610c4691906141f3565b9050348114610c675760405162461bcd60e51b8152600401610999906140a1565b60fc5460ff556101068054600091610d9491610c8290614255565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90614255565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b505050505060ff546101078054610d1190614255565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90614255565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b505050505061273e565b9050610da23360ff54612778565b610dae60ff5482612796565b60fc54610dbc9060016141c7565b60fc55610105546040516001600160a01b0386169180156108fc02916000818181858888f19350505050158015610df7573d6000803e3d6000fd5b5061010054610105546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610e36573d6000803e3d6000fd5b5060ff54610105546040516001600160a01b0387169233927f2fe881e8fc8f1cc30a9326be899b079ceddc5ccb40b6739c6d57232e27844b7e92610e84928e928e928992918f918190614158565b60405180910390a360ff549450505050505b9392505050565b61010c546000906001600160a01b03163314610f075760405162461bcd60e51b8152602060048201526024808201527f244d4f4e53544552425544533a20596f7520617265206e6f7420617574686f726044820152631a5cd95960e21b6064820152608401610999565b60008381526101096020526040902060010154600211610f395760405162461bcd60e51b815260040161099990613f92565b60008381526101096020526040902060020154421015610f9b5760405162461bcd60e51b815260206004820152601e60248201527f244d4f4e53544552425544533a2063616e6e6f74206272656564206e6f7700006044820152606401610999565b60fc5460ff556101068054600091610fb691610c8290614255565b9050610fc48360ff54612778565b610fd060ff5482612796565b6000848152610109602052604080822060019081015460ff548085529284209283559082019290925561100642620546006141c7565b600282015560fc546110199060016141c7565b60fc556000868152610109602052604090208681556110398360016141c7565b600182015561104b42621712406141c7565b600290910155505060ff5491505092915050565b6101085460009060ff1615156001146110d15760405162461bcd60e51b815260206004820152602e60248201527f244d4f4e53544552425544533a204d61726b6574706c61636520666f7220627560448201526d1e5a5b99c81a5cc818db1bdcd95960921b6064820152608401610999565b6110da83612821565b5060006110fd6110f26033546001600160a01b031690565b8560e0015185612bc6565b90506001811515146111615760405162461bcd60e51b815260206004820152602760248201527f244d4f4e53544552425544533a2063616e6e6f7420707572636861736520746860448201526632903a37b5b2b760c91b6064820152608401610999565b5060019392505050565b6111753382612c90565b6111915760405162461bcd60e51b81526004016109999061400c565b610acf838383612d76565b6033546000906001600160a01b031633146111c95760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0382166111ef5760405162461bcd60e51b81526004016109999061405d565b5061010c80546001600160a01b0319166001600160a01b0392909216918217905590565b6033546000906001600160a01b031633146112405760405162461bcd60e51b815260040161099990613fd7565b50610108805460ff1916911515918217905560ff1690565b610acf83838360405180602001604052806000815250611b7c565b6033546000906001600160a01b031633146112a05760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0382166112c65760405162461bcd60e51b81526004016109999061405d565b5061010180546001600160a01b0319166001600160a01b0392909216918217905590565b6033546000906001600160a01b031633146113175760405162461bcd60e51b815260040161099990613fd7565b5061010581905590565b6033546000906001600160a01b0316331461134e5760405162461bcd60e51b815260040161099990613fd7565b50610108805462ff00001916620100009215158302179081905560ff9190041690565b6000818152609a60205260408120546001600160a01b0316806108995760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610999565b6033546000906001600160a01b031633146114155760405162461bcd60e51b815260040161099990613fd7565b5060fe81905590565b60006001600160a01b0382166114895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610999565b506001600160a01b03166000908152609b602052604090205490565b6033546001600160a01b031633146114cf5760405162461bcd60e51b815260040161099990613fd7565b6114d96000612f16565b565b6033546000906001600160a01b031633146115085760405162461bcd60e51b815260040161099990613fd7565b825161151c9061010690602086019061367d565b5081516111619061010790602085019061367d565b6060609980546108ae90614255565b6033546001600160a01b0316331461156a5760405162461bcd60e51b815260040161099990613fd7565b6033546001600160a01b03166040516001600160a01b039190911690303180156108fc02916000818181858888f193505050501580156115ae573d6000803e3d6000fd5b50565b6001600160a01b03821633141561160a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610999565b336000818152609d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610361821115801561169a57503361168f83611371565b6001600160a01b0316145b6117025760405162461bcd60e51b815260206004820152603360248201527f244d4f4e53544552425544533a204e6f7420612050505020746f6b656e206f726044820152721037bbb732b91037b310282828103a37b5b2b760691b6064820152608401610999565b600082815261010a602052604090205460ff16156117885760405162461bcd60e51b815260206004820152603e60248201527f244d4f4e53544552425544533a20546f6b656e20697320616c7265616479206d60448201527f696e7465642062792073656c65637465642050505020746f6b656e20494400006064820152608401610999565b60fc5460ff5561010680546000916117a391610c8290614255565b90506117b13360ff54612778565b6117bd60ff5482612796565b60ff5460008181526101096020526040812091825560018201556117e442620546006141c7565b600282015560fc546117f79060016141c7565b60fc55600084815261010a602052604090819020805460ff1916600190811790915560ff5491517f30c5cd9e7c709e39036bb12111e50999fbe3279e29d0cd6741eb38f39970a307926118519288923392889290916140e2565b60405180910390a1505060ff5492915050565b60606000826101045461187791906141f3565b90506000611886600185614212565b60fc5461189391906141c7565b90506128b48111156118f65760405162461bcd60e51b815260206004820152602660248201527f244d4f4e53544552425544533a20546f74616c20737570706c79206861732072604482015265195858da195960d21b6064820152608401610999565b601c841115801561190657503482145b6119835760405162461bcd60e51b815260206004820152604260248201527f244d4f4e53544552425544533a2043616e6e6f74206d696e74206d6f7265207460448201527f68616e206d61782062756473206f7220707269636520697320696e636f72726560648201526118dd60f21b608482015260a401610999565b6119906101026000613701565b61199d610103600061371f565b606060005b85811015611aa45760fc5460ff5561010680546119c39190610c8290614255565b91506119d13360ff54612778565b6119dd60ff5483612796565b60ff546000818152610109602052604081209182556001820155611a0442620546006141c7565b600282015560ff54610102805460018181019092557f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0191909155610103805491820181556000528351611a7f917f02c297ab74aad0aede3a1895c857b1f2c71e6a203feb727bec95ac752998cb780190602086019061367d565b5060fc54611a8e9060016141c7565b60fc555080611a9c81614290565b9150506119a2565b506033546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611ade573d6000803e3d6000fd5b507f264a11f390cfabdc9308b73b2fb6c13a1f0a823fe24b5cf1098f9d5ac890e2bd3361010361010234604051611b189493929190613db5565b60405180910390a1610102805480602002602001604051908101604052809291908181526020018280548015611b6d57602002820191906000526020600020905b815481526020019060010190808311611b59575b50505050509350505050919050565b611b863383612c90565b611ba25760405162461bcd60e51b81526004016109999061400c565b611bae84848484612f68565b50505050565b6033546000906001600160a01b03163314611be15760405162461bcd60e51b815260040161099990613fd7565b50610108805461ff0019166101009215158302179081905560ff9190041690565b6060611c0d826126b3565b611c735760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610999565b600082815260ca602052604081208054611c8c90614255565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb890614255565b8015611d055780601f10611cda57610100808354040283529160200191611d05565b820191906000526020600020905b815481529060010190602001808311611ce857829003601f168201915b505050505090506000611d2360408051602081019091526000815290565b9050805160001415611d36575092915050565b815115611d68578082604051602001611d50929190613d10565b60405160208183030381529060405292505050919050565b611d7184612f9b565b949350505050565b60006001600160a01b038216611de85760405162461bcd60e51b815260206004820152602e60248201527f244d4f4e53544552425544533a207a65726f20616464726573732063616e206e60448201526d37ba10313290383838103ab9b2b960911b6064820152608401610999565b506001600160a01b031660009081526065602052604090205460ff1690565b6033546000906001600160a01b03163314611e345760405162461bcd60e51b815260040161099990613fd7565b611e3e8383612796565b50600192915050565b6033546000906001600160a01b03163314611e745760405162461bcd60e51b815260040161099990613fd7565b5060fd81905590565b6033546000906001600160a01b03163314611eaa5760405162461bcd60e51b815260040161099990613fd7565b5061010481905590565b600080611f0d611ecc6033546001600160a01b031690565b866040013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bc692505050565b9050600181151514611f6b5760405162461bcd60e51b815260206004820152602160248201527f244d4f4e53544552425544533a2063616e6e6f742062726565645b4552524f526044820152605d60f81b6064820152608401610999565b6101085460ff610100909104161515600114611fc95760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a204272656564696e6720697320636c6f7365646044820152606401610999565b6103618535118015611fe057506103618560200135115b61203c5760405162461bcd60e51b815260206004820152602760248201527f244d4f4e53544552425544533a20505050204d6f6e73746572732063616e6e6f6044820152661d08189c99595960ca1b6064820152608401610999565b34610105541461205e5760405162461bcd60e51b8152600401610999906140a1565b600061206a8635611371565b9050600061207b8760200135611371565b9050806001600160a01b0316826001600160a01b03161480156120a657506001600160a01b03821633145b80156120b757508635602088013514155b6121035760405162461bcd60e51b815260206004820152601f60248201527f244d4f4e53544552425544533a2043616e6e6f742053656c66204272656564006044820152606401610999565b86356000908152610109602052604090206001015460021180156121425750600261010960008960200135815260200190815260200160002060010154105b61215e5760405162461bcd60e51b815260040161099990613f92565b863560009081526101096020526040902060020154421080159061219a5750602080880135600090815261010990915260409020600201544210155b6121f15760405162461bcd60e51b815260206004820152602260248201527f244d4f4e53544552425544533a20596f752063616e6e6f74206272656564206e6044820152616f7760f01b6064820152608401610999565b60fc5460ff55610106805460009161220c91610c8290614255565b905061221a3360ff54612778565b61222660ff5482612796565b8735600090815261010960209081526040808320600190810154928c0135845281842081015460ff548086529285209283559082019390935590919061226f42620546006141c7565b600282015560fc546122829060016141c7565b60fc558a356000818152610109602052604090209081556122a48460016141c7565b60018201556122b642621712406141c7565b60028201556020808d0135600081815261010990925260409091209081556122df8460016141c7565b60018201556122f142621712406141c7565b6002820155610100546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015612330573d6000803e3d6000fd5b50336001600160a01b03167f7f80d0da4a3c3d788b343994246b1aa637d28008a65ce832a40cc31acd9a6e6a8e600001358f602001358960ff543460405161237c959493929190614125565b60405180910390a2505060ff549b9a5050505050505050505050565b6033546001600160a01b031633146123c25760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0381166124275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610999565b6115ae81612f16565b6033546001600160a01b0316331461245a5760405162461bcd60e51b815260040161099990613fd7565b60005b6101e4811015610acf57816065600085846101e4811061247f5761247f6142eb565b6020020160208101906124929190613851565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f2231b808040cab8e79f0bc6f734eb000a94ba1f8213d48a551df80275ed298b883826101e481106124ee576124ee6142eb565b6020020160208101906125019190613851565b604080516001600160a01b03909216825284151560208301520160405180910390a18061252d81614290565b91505061245d565b600061010b5434146125895760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a20507269636520697320696e636f72726563746044820152606401610999565b3361259383611371565b6001600160a01b0316146125fa5760405162461bcd60e51b815260206004820152602860248201527f244d4f4e53544552425544533a20596f7520617265206e6f74206f776e65722060448201526737b3103a37b5b2b760c11b6064820152608401610999565b610100546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015612634573d6000803e3d6000fd5b506040805133815260208101849052348183015290517f61bcb9d767fe5d2284f7e715d9380d99d91387c315b47506bd6bb4cb8e0dd81f9181900360600190a1506001919050565b6033546000906001600160a01b031633146126a95760405162461bcd60e51b815260040161099990613fd7565b5061010b55600190565b6000908152609a60205260409020546001600160a01b0316151590565b6000818152609c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061270582611371565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060008461274c85613072565b8460405160200161275f93929190613d3f565b60408051808303601f1901815291905295945050505050565b612792828260405180602001604052806000815250613170565b5050565b61279f826126b3565b6128025760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610999565b600082815260ca602090815260409091208251610acf9284019061367d565b6000806128318360400151611371565b6040516bffffffffffffffffffffffff193360601b166020820152909150600090603401604051602081830303815290604052805190602001209050600082604051602001612898919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120905060008560a001516040516020016128c991815260200190565b604051602081830303815290604052805190602001209050600086604001516040516020016128fa91815260200190565b6040516020818303038152906040528051906020012090506000876080015160405160200161292b91815260200190565b60408051601f198184030181528282528051602091820120908301859052908201819052606082018590526080820186905260a08201879052915060009060c00160405160208183030381529060405280519060200120905042896080015110156129d85760405162461bcd60e51b815260206004820152601960248201527f4d4f4e53544552425544533a20657870697265642074696d65000000000000006044820152606401610999565b8860c001518114612a215760405162461bcd60e51b81526020600482015260136024820152721226a7a729aa22a9212aa2299d1022a92927a960691b6044820152606401610999565b348960a0015114612a745760405162461bcd60e51b815260206004820152601f60248201527f4d4f4e53544552425544533a20507269636520697320696e636f7272656374006044820152606401610999565b6000612a7f346131a3565b610100546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612abb573d6000803e3d6000fd5b50610101546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612af7573d6000803e3d6000fd5b506000612b0482806141c7565b612b0e9034614212565b60208c01516040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612b4b573d6000803e3d6000fd5b50612b5f8b60200151338d60400151612d76565b8a60400151336001600160a01b03168c602001516001600160a01b03167f4846bb92e4688018001b57c3be0b767a864854f677f24fc23f36ca1efd331f4d34604051612bad91815260200190565b60405180910390a45060019a9950505050505050505050565b6000833b15612c6b57604051630b135d3f60e11b81526001600160a01b03851690631626ba7e90612bfd9086908690600401613f14565b60206040518083038186803b158015612c1557600080fd5b505afa925050508015612c45575060408051601f3d908101601f19168201909252612c4291810190613a29565b60015b612c5157506000610e96565b6001600160e01b031916630b135d3f60e11b149050610e96565b836001600160a01b0316612c7f84846131c6565b6001600160a01b0316149050610e96565b6000612c9b826126b3565b612cfc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610999565b6000612d0783611371565b9050806001600160a01b0316846001600160a01b03161480612d425750836001600160a01b0316612d3784610931565b6001600160a01b0316145b80611d7157506001600160a01b038082166000908152609d602090815260408083209388168352929052205460ff16611d71565b826001600160a01b0316612d8982611371565b6001600160a01b031614612df15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610999565b6001600160a01b038216612e535760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610999565b612e5e6000826126d0565b6001600160a01b0383166000908152609b60205260408120805460019290612e87908490614212565b90915550506001600160a01b0382166000908152609b60205260408120805460019290612eb59084906141c7565b90915550506000818152609a602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612f73848484612d76565b612f7f8484848461326a565b611bae5760405162461bcd60e51b815260040161099990613f40565b6060612fa6826126b3565b61300a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610999565b600061302160408051602081019091526000815290565b905060008151116130415760405180602001604052806000815250610e96565b8061304b84613072565b60405160200161305c929190613d10565b6040516020818303038152906040529392505050565b6060816130965750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130c057806130aa81614290565b91506130b99050600a836141df565b915061309a565b60008167ffffffffffffffff8111156130db576130db614301565b6040519080825280601f01601f191660200182016040528015613105576020820181803683370190505b5090505b8415611d715761311a600183614212565b9150613127600a866142ab565b6131329060306141c7565b60f81b818381518110613147576131476142eb565b60200101906001600160f81b031916908160001a905350613169600a866141df565b9450613109565b61317a8383613377565b613187600084848461326a565b610acf5760405162461bcd60e51b815260040161099990613f40565b6000808260fe546131b491906141f3565b9050600060fd5482611d7191906141df565b60008151604114156131fa5760208201516040830151606084015160001a6131f0868285856134aa565b9350505050610899565b8151604014156132225760208201516040830151613219858383613653565b92505050610899565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610999565b60006001600160a01b0384163b1561336c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132ae903390899088908890600401613d82565b602060405180830381600087803b1580156132c857600080fd5b505af19250505080156132f8575060408051601f3d908101601f191682019092526132f591810190613a29565b60015b613352573d808015613326576040519150601f19603f3d011682016040523d82523d6000602084013e61332b565b606091505b50805161334a5760405162461bcd60e51b815260040161099990613f40565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d71565b506001949350505050565b6001600160a01b0382166133cd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610999565b6133d6816126b3565b156134235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610999565b6001600160a01b0382166000908152609b6020526040812080546001929061344c9084906141c7565b90915550506000818152609a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156135275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610999565b8360ff16601b148061353c57508360ff16601c145b6135935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610999565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156135e7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661364a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610999565b95945050505050565b60006001600160ff1b03821660ff83901c601b01613673868287856134aa565b9695505050505050565b82805461368990614255565b90600052602060002090601f0160209004810192826136ab57600085556136f1565b82601f106136c457805160ff19168380011785556136f1565b828001600101855582156136f1579182015b828111156136f15782518255916020019190600101906136d6565b506136fd92915061373d565b5090565b50805460008255906000526020600020908101906115ae919061373d565b50805460008255906000526020600020908101906115ae9190613752565b5b808211156136fd576000815560010161373e565b808211156136fd576000613766828261376f565b50600101613752565b50805461377b90614255565b6000825580601f1061378b575050565b601f0160209004906000526020600020908101906115ae919061373d565b8035610b4881614317565b80358015158114610b4857600080fd5b600082601f8301126137d557600080fd5b813567ffffffffffffffff808211156137f0576137f0614301565b604051601f8301601f19908116603f0116810190828211818310171561381857613818614301565b8160405283815286602085880101111561383157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561386357600080fd5b8135610e9681614317565b6000806040838503121561388157600080fd5b823561388c81614317565b9150602083013561389c81614317565b809150509250929050565b6000806000606084860312156138bc57600080fd5b83356138c781614317565b925060208401356138d781614317565b929592945050506040919091013590565b600080600080608085870312156138fe57600080fd5b843561390981614317565b9350602085013561391981614317565b925060408501359150606085013567ffffffffffffffff81111561393c57600080fd5b613948878288016137c4565b91505092959194509250565b6000806040838503121561396757600080fd5b823561397281614317565b9150613980602084016137b4565b90509250929050565b6000806040838503121561399c57600080fd5b82356139a781614317565b946020939093013593505050565b600080613ca083850312156139c957600080fd5b613c808301848111156139db57600080fd5b8392506139e7816137b4565b9150509250929050565b600060208284031215613a0357600080fd5b610e96826137b4565b600060208284031215613a1e57600080fd5b8135610e968161432c565b600060208284031215613a3b57600080fd5b8151610e968161432c565b60008060408385031215613a5957600080fd5b823567ffffffffffffffff80821115613a7157600080fd5b613a7d868387016137c4565b93506020850135915080821115613a9357600080fd5b506139e7858286016137c4565b60008060408385031215613ab357600080fd5b823567ffffffffffffffff80821115613acb57600080fd5b908401906101008287031215613ae057600080fd5b613ae861419d565b613af1836137a9565b8152613aff602084016137a9565b602082015260408301356040820152606083013582811115613b2057600080fd5b613b2c888286016137c4565b6060830152506080830135608082015260a083013560a082015260c083013560c082015260e083013560e0820152809450506020850135915080821115613a9357600080fd5b60008060008385036080811215613b8857600080fd5b6060811215613b9657600080fd5b50839250606084013567ffffffffffffffff80821115613bb557600080fd5b818601915086601f830112613bc957600080fd5b813581811115613bd857600080fd5b876020828501011115613bea57600080fd5b6020830194508093505050509250925092565b600060208284031215613c0f57600080fd5b5035919050565b60008060408385031215613c2957600080fd5b82359150602083013561389c81614317565b60008060408385031215613c4e57600080fd5b82359150602083013567ffffffffffffffff811115613c6c57600080fd5b6139e7858286016137c4565b600080600060608486031215613c8d57600080fd5b505081359360208301359350604090920135919050565b6000815480845260208085019450836000528060002060005b83811015613cd957815487529582019560019182019101613cbd565b509495945050505050565b60008151808452613cfc816020860160208601614229565b601f01601f19169290920160200192915050565b60008351613d22818460208801614229565b835190830190613d36818360208801614229565b01949350505050565b60008451613d51818460208901614229565b845190830190613d65818360208901614229565b8451910190613d78818360208801614229565b0195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061367390830184613ce4565b60006080820160018060a01b0387168352602060808185015281875480845260a08601915060a08160051b87010193506000898152838120815b83811015613ea657888703609f1901855281548390600181811c9080831680613e1957607f831692505b8a8310811415613e3757634e487b7160e01b88526022600452602488fd5b828c5260208c01818015613e525760018114613e6357613e8d565b60ff19861682528c82019650613e8d565b6000898152602090208a5b86811015613e8757815484820152908501908e01613e6e565b83019750505b50949b5050978901979490940193505050600101613def565b5050505050508281036040840152613ebe8186613ca4565b91505082606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613f0857835183529284019291840191600101613eec565b50909695505050505050565b828152604060208201526000611d716040830184613ce4565b602081526000610e966020830184613ce4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f244d4f4e53544552425544533a2045786365656473206d61782062726565642060408201526418dbdd5b9d60da1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f244d4f4e53544552425544533a2063616e6e6f74206265207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526021908201527f244d4f4e53544552425544533a20416d6f756e7420697320696e636f727265636040820152601d60fa1b606082015260800190565b8581526001600160a01b038516602082015260a06040820181905260009061410c90830186613ce4565b6060830194909452509015156080909101529392505050565b85815284602082015260a06040820152600061414460a0830186613ce4565b606083019490945250608001529392505050565b87815286602082015260e06040820152600061417760e0830188613ce4565b90508560608301528460808301528360a08301528260c083015298975050505050505050565b604051610100810167ffffffffffffffff811182821017156141c1576141c1614301565b60405290565b600082198211156141da576141da6142bf565b500190565b6000826141ee576141ee6142d5565b500490565b600081600019048311821515161561420d5761420d6142bf565b500290565b600082821015614224576142246142bf565b500390565b60005b8381101561424457818101518382015260200161422c565b83811115611bae5750506000910152565b600181811c9082168061426957607f821691505b6020821081141561428a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142a4576142a46142bf565b5060010190565b6000826142ba576142ba6142d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146115ae57600080fd5b6001600160e01b0319811681146115ae57600080fdfea26469706673582212201e630667cd6be08c6f40f2e22d7af8e55168fd417d6928b6d61b722351c4a5c264736f6c63430008070033
Deployed Bytecode
0x6080604052600436106102675760003560e01c80638da5cb5b11610144578063d2fd6546116100b6578063e985e9c51161007a578063e985e9c514610770578063f2fde38b146107b9578063f3a3317f146107d9578063f4b22a60146107f9578063fa63dd3d1461080c578063fb97a4791461082c57600080fd5b8063d2fd6546146106dd578063d31af484146106fd578063d3f3afba1461071d578063d860b1de1461073d578063e5ca7c891461075d57600080fd5b8063ac34419b11610108578063ac34419b14610627578063b5c4c47b14610647578063b88d4fde14610667578063bb71561d14610687578063c87b56dd146106a7578063d082e381146106c757600080fd5b80638da5cb5b1461059f5780638f9fe526146105bd57806395d89b41146105dd5780639cb8a26a146105f2578063a22cb4651461060757600080fd5b806327538fea116101dd57806356655bf5116101a157806356655bf5146104b25780636352211e146104d25780636d947176146104f257806370a0823114610512578063715018a61461053257806385eafbdc1461054757600080fd5b806327538fea1461041257806338e1294c1461043257806342842e0e1461045257806344e97d84146104725780634881c72f1461049257600080fd5b806311bbfa1d1161022f57806311bbfa1d1461033d57806315480c551461035e578063186338ed1461037e57806318a5bbdc1461039157806320d0c31e146103c157806323b872dd146103f257600080fd5b806301ffc9a71461026c57806306fdde03146102a1578063081812fc146102c3578063095ea7b3146102fb5780630e230ff41461031d575b600080fd5b34801561027857600080fd5b5061028c610287366004613a0c565b61084d565b60405190151581526020015b60405180910390f35b3480156102ad57600080fd5b506102b661089f565b6040516102989190613f2d565b3480156102cf57600080fd5b506102e36102de366004613bfd565b610931565b6040516001600160a01b039091168152602001610298565b34801561030757600080fd5b5061031b610316366004613989565b6109be565b005b34801561032957600080fd5b506102e3610338366004613851565b610ad4565b61035061034b366004613c78565b610b4d565b604051908152602001610298565b34801561036a57600080fd5b50610350610379366004613c16565b610e9d565b61028c61038c366004613aa0565b61105f565b34801561039d57600080fd5b5061028c6103ac366004613851565b60656020526000908152604090205460ff1681565b3480156103cd57600080fd5b5061028c6103dc366004613bfd565b61010a6020526000908152604090205460ff1681565b3480156103fe57600080fd5b5061031b61040d3660046138a7565b61116b565b34801561041e57600080fd5b506102e361042d366004613851565b61119c565b34801561043e57600080fd5b5061028c61044d3660046139f1565b611213565b34801561045e57600080fd5b5061031b61046d3660046138a7565b611258565b34801561047e57600080fd5b506102e361048d366004613851565b611273565b34801561049e57600080fd5b506103506104ad366004613bfd565b6112ea565b3480156104be57600080fd5b5061028c6104cd3660046139f1565b611321565b3480156104de57600080fd5b506102e36104ed366004613bfd565b611371565b3480156104fe57600080fd5b5061035061050d366004613bfd565b6113e8565b34801561051e57600080fd5b5061035061052d366004613851565b61141e565b34801561053e57600080fd5b5061031b6114a5565b34801561055357600080fd5b50610584610562366004613bfd565b6101096020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610298565b3480156105ab57600080fd5b506033546001600160a01b03166102e3565b3480156105c957600080fd5b5061028c6105d8366004613a46565b6114db565b3480156105e957600080fd5b506102b6611531565b3480156105fe57600080fd5b5061031b611540565b34801561061357600080fd5b5061031b610622366004613954565b6115b1565b34801561063357600080fd5b50610350610642366004613bfd565b611676565b61065a610655366004613bfd565b611864565b6040516102989190613ed0565b34801561067357600080fd5b5061031b6106823660046138e8565b611b7c565b34801561069357600080fd5b5061028c6106a23660046139f1565b611bb4565b3480156106b357600080fd5b506102b66106c2366004613bfd565b611c02565b3480156106d357600080fd5b5061035060fc5481565b3480156106e957600080fd5b5061028c6106f8366004613851565b611d79565b34801561070957600080fd5b5061028c610718366004613c3b565b611e07565b34801561072957600080fd5b50610350610738366004613bfd565b611e47565b34801561074957600080fd5b50610350610758366004613bfd565b611e7d565b61035061076b366004613b72565b611eb4565b34801561077c57600080fd5b5061028c61078b36600461386e565b6001600160a01b039182166000908152609d6020908152604080832093909416825291909152205460ff1690565b3480156107c557600080fd5b5061031b6107d4366004613851565b612398565b3480156107e557600080fd5b5061031b6107f43660046139b5565b612430565b61028c610807366004613bfd565b612535565b34801561081857600080fd5b5061028c610827366004613bfd565b61267c565b34801561083857600080fd5b5061010c546102e3906001600160a01b031681565b60006001600160e01b031982166380ac58cd60e01b148061087e57506001600160e01b03198216635b5e139f60e01b145b8061089957506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060609880546108ae90614255565b80601f01602080910402602001604051908101604052809291908181526020018280546108da90614255565b80156109275780601f106108fc57610100808354040283529160200191610927565b820191906000526020600020905b81548152906001019060200180831161090a57829003601f168201915b5050505050905090565b600061093c826126b3565b6109a25760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152609c60205260409020546001600160a01b031690565b60006109c982611371565b9050806001600160a01b0316836001600160a01b03161415610a375760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610999565b336001600160a01b0382161480610a535750610a53813361078b565b610ac55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610999565b610acf83836126d0565b505050565b6033546000906001600160a01b03163314610b015760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b038216610b275760405162461bcd60e51b81526004016109999061405d565b5061010080546001600160a01b0319166001600160a01b0383169081179091555b919050565b600080610b5984611371565b90506000610b6686611371565b6101085490915062010000900460ff161515600114610bc75760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a204272656564696e6720697320636c6f7365646044820152606401610999565b6001600160a01b0382163314801590610be857506001600160a01b03811633145b610c345760405162461bcd60e51b815260206004820152601c60248201527f244d4f4e53544552425544533a2063616e206e6f7420687962726964000000006044820152606401610999565b6000610105546002610c4691906141f3565b9050348114610c675760405162461bcd60e51b8152600401610999906140a1565b60fc5460ff556101068054600091610d9491610c8290614255565b80601f0160208091040260200160405190810160405280929190818152602001828054610cae90614255565b8015610cfb5780601f10610cd057610100808354040283529160200191610cfb565b820191906000526020600020905b815481529060010190602001808311610cde57829003601f168201915b505050505060ff546101078054610d1190614255565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3d90614255565b8015610d8a5780601f10610d5f57610100808354040283529160200191610d8a565b820191906000526020600020905b815481529060010190602001808311610d6d57829003601f168201915b505050505061273e565b9050610da23360ff54612778565b610dae60ff5482612796565b60fc54610dbc9060016141c7565b60fc55610105546040516001600160a01b0386169180156108fc02916000818181858888f19350505050158015610df7573d6000803e3d6000fd5b5061010054610105546040516001600160a01b039092169181156108fc0291906000818181858888f19350505050158015610e36573d6000803e3d6000fd5b5060ff54610105546040516001600160a01b0387169233927f2fe881e8fc8f1cc30a9326be899b079ceddc5ccb40b6739c6d57232e27844b7e92610e84928e928e928992918f918190614158565b60405180910390a360ff549450505050505b9392505050565b61010c546000906001600160a01b03163314610f075760405162461bcd60e51b8152602060048201526024808201527f244d4f4e53544552425544533a20596f7520617265206e6f7420617574686f726044820152631a5cd95960e21b6064820152608401610999565b60008381526101096020526040902060010154600211610f395760405162461bcd60e51b815260040161099990613f92565b60008381526101096020526040902060020154421015610f9b5760405162461bcd60e51b815260206004820152601e60248201527f244d4f4e53544552425544533a2063616e6e6f74206272656564206e6f7700006044820152606401610999565b60fc5460ff556101068054600091610fb691610c8290614255565b9050610fc48360ff54612778565b610fd060ff5482612796565b6000848152610109602052604080822060019081015460ff548085529284209283559082019290925561100642620546006141c7565b600282015560fc546110199060016141c7565b60fc556000868152610109602052604090208681556110398360016141c7565b600182015561104b42621712406141c7565b600290910155505060ff5491505092915050565b6101085460009060ff1615156001146110d15760405162461bcd60e51b815260206004820152602e60248201527f244d4f4e53544552425544533a204d61726b6574706c61636520666f7220627560448201526d1e5a5b99c81a5cc818db1bdcd95960921b6064820152608401610999565b6110da83612821565b5060006110fd6110f26033546001600160a01b031690565b8560e0015185612bc6565b90506001811515146111615760405162461bcd60e51b815260206004820152602760248201527f244d4f4e53544552425544533a2063616e6e6f7420707572636861736520746860448201526632903a37b5b2b760c91b6064820152608401610999565b5060019392505050565b6111753382612c90565b6111915760405162461bcd60e51b81526004016109999061400c565b610acf838383612d76565b6033546000906001600160a01b031633146111c95760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0382166111ef5760405162461bcd60e51b81526004016109999061405d565b5061010c80546001600160a01b0319166001600160a01b0392909216918217905590565b6033546000906001600160a01b031633146112405760405162461bcd60e51b815260040161099990613fd7565b50610108805460ff1916911515918217905560ff1690565b610acf83838360405180602001604052806000815250611b7c565b6033546000906001600160a01b031633146112a05760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0382166112c65760405162461bcd60e51b81526004016109999061405d565b5061010180546001600160a01b0319166001600160a01b0392909216918217905590565b6033546000906001600160a01b031633146113175760405162461bcd60e51b815260040161099990613fd7565b5061010581905590565b6033546000906001600160a01b0316331461134e5760405162461bcd60e51b815260040161099990613fd7565b50610108805462ff00001916620100009215158302179081905560ff9190041690565b6000818152609a60205260408120546001600160a01b0316806108995760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610999565b6033546000906001600160a01b031633146114155760405162461bcd60e51b815260040161099990613fd7565b5060fe81905590565b60006001600160a01b0382166114895760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610999565b506001600160a01b03166000908152609b602052604090205490565b6033546001600160a01b031633146114cf5760405162461bcd60e51b815260040161099990613fd7565b6114d96000612f16565b565b6033546000906001600160a01b031633146115085760405162461bcd60e51b815260040161099990613fd7565b825161151c9061010690602086019061367d565b5081516111619061010790602085019061367d565b6060609980546108ae90614255565b6033546001600160a01b0316331461156a5760405162461bcd60e51b815260040161099990613fd7565b6033546001600160a01b03166040516001600160a01b039190911690303180156108fc02916000818181858888f193505050501580156115ae573d6000803e3d6000fd5b50565b6001600160a01b03821633141561160a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610999565b336000818152609d602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610361821115801561169a57503361168f83611371565b6001600160a01b0316145b6117025760405162461bcd60e51b815260206004820152603360248201527f244d4f4e53544552425544533a204e6f7420612050505020746f6b656e206f726044820152721037bbb732b91037b310282828103a37b5b2b760691b6064820152608401610999565b600082815261010a602052604090205460ff16156117885760405162461bcd60e51b815260206004820152603e60248201527f244d4f4e53544552425544533a20546f6b656e20697320616c7265616479206d60448201527f696e7465642062792073656c65637465642050505020746f6b656e20494400006064820152608401610999565b60fc5460ff5561010680546000916117a391610c8290614255565b90506117b13360ff54612778565b6117bd60ff5482612796565b60ff5460008181526101096020526040812091825560018201556117e442620546006141c7565b600282015560fc546117f79060016141c7565b60fc55600084815261010a602052604090819020805460ff1916600190811790915560ff5491517f30c5cd9e7c709e39036bb12111e50999fbe3279e29d0cd6741eb38f39970a307926118519288923392889290916140e2565b60405180910390a1505060ff5492915050565b60606000826101045461187791906141f3565b90506000611886600185614212565b60fc5461189391906141c7565b90506128b48111156118f65760405162461bcd60e51b815260206004820152602660248201527f244d4f4e53544552425544533a20546f74616c20737570706c79206861732072604482015265195858da195960d21b6064820152608401610999565b601c841115801561190657503482145b6119835760405162461bcd60e51b815260206004820152604260248201527f244d4f4e53544552425544533a2043616e6e6f74206d696e74206d6f7265207460448201527f68616e206d61782062756473206f7220707269636520697320696e636f72726560648201526118dd60f21b608482015260a401610999565b6119906101026000613701565b61199d610103600061371f565b606060005b85811015611aa45760fc5460ff5561010680546119c39190610c8290614255565b91506119d13360ff54612778565b6119dd60ff5483612796565b60ff546000818152610109602052604081209182556001820155611a0442620546006141c7565b600282015560ff54610102805460018181019092557f93bdaa6a4190909b7c3fbe8d42169ffe1cab19f51dfc8db24c71abf849eced4a0191909155610103805491820181556000528351611a7f917f02c297ab74aad0aede3a1895c857b1f2c71e6a203feb727bec95ac752998cb780190602086019061367d565b5060fc54611a8e9060016141c7565b60fc555080611a9c81614290565b9150506119a2565b506033546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611ade573d6000803e3d6000fd5b507f264a11f390cfabdc9308b73b2fb6c13a1f0a823fe24b5cf1098f9d5ac890e2bd3361010361010234604051611b189493929190613db5565b60405180910390a1610102805480602002602001604051908101604052809291908181526020018280548015611b6d57602002820191906000526020600020905b815481526020019060010190808311611b59575b50505050509350505050919050565b611b863383612c90565b611ba25760405162461bcd60e51b81526004016109999061400c565b611bae84848484612f68565b50505050565b6033546000906001600160a01b03163314611be15760405162461bcd60e51b815260040161099990613fd7565b50610108805461ff0019166101009215158302179081905560ff9190041690565b6060611c0d826126b3565b611c735760405162461bcd60e51b815260206004820152603160248201527f45524337323155524953746f726167653a2055524920717565727920666f72206044820152703737b732bc34b9ba32b73a103a37b5b2b760791b6064820152608401610999565b600082815260ca602052604081208054611c8c90614255565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb890614255565b8015611d055780601f10611cda57610100808354040283529160200191611d05565b820191906000526020600020905b815481529060010190602001808311611ce857829003601f168201915b505050505090506000611d2360408051602081019091526000815290565b9050805160001415611d36575092915050565b815115611d68578082604051602001611d50929190613d10565b60405160208183030381529060405292505050919050565b611d7184612f9b565b949350505050565b60006001600160a01b038216611de85760405162461bcd60e51b815260206004820152602e60248201527f244d4f4e53544552425544533a207a65726f20616464726573732063616e206e60448201526d37ba10313290383838103ab9b2b960911b6064820152608401610999565b506001600160a01b031660009081526065602052604090205460ff1690565b6033546000906001600160a01b03163314611e345760405162461bcd60e51b815260040161099990613fd7565b611e3e8383612796565b50600192915050565b6033546000906001600160a01b03163314611e745760405162461bcd60e51b815260040161099990613fd7565b5060fd81905590565b6033546000906001600160a01b03163314611eaa5760405162461bcd60e51b815260040161099990613fd7565b5061010481905590565b600080611f0d611ecc6033546001600160a01b031690565b866040013586868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612bc692505050565b9050600181151514611f6b5760405162461bcd60e51b815260206004820152602160248201527f244d4f4e53544552425544533a2063616e6e6f742062726565645b4552524f526044820152605d60f81b6064820152608401610999565b6101085460ff610100909104161515600114611fc95760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a204272656564696e6720697320636c6f7365646044820152606401610999565b6103618535118015611fe057506103618560200135115b61203c5760405162461bcd60e51b815260206004820152602760248201527f244d4f4e53544552425544533a20505050204d6f6e73746572732063616e6e6f6044820152661d08189c99595960ca1b6064820152608401610999565b34610105541461205e5760405162461bcd60e51b8152600401610999906140a1565b600061206a8635611371565b9050600061207b8760200135611371565b9050806001600160a01b0316826001600160a01b03161480156120a657506001600160a01b03821633145b80156120b757508635602088013514155b6121035760405162461bcd60e51b815260206004820152601f60248201527f244d4f4e53544552425544533a2043616e6e6f742053656c66204272656564006044820152606401610999565b86356000908152610109602052604090206001015460021180156121425750600261010960008960200135815260200190815260200160002060010154105b61215e5760405162461bcd60e51b815260040161099990613f92565b863560009081526101096020526040902060020154421080159061219a5750602080880135600090815261010990915260409020600201544210155b6121f15760405162461bcd60e51b815260206004820152602260248201527f244d4f4e53544552425544533a20596f752063616e6e6f74206272656564206e6044820152616f7760f01b6064820152608401610999565b60fc5460ff55610106805460009161220c91610c8290614255565b905061221a3360ff54612778565b61222660ff5482612796565b8735600090815261010960209081526040808320600190810154928c0135845281842081015460ff548086529285209283559082019390935590919061226f42620546006141c7565b600282015560fc546122829060016141c7565b60fc558a356000818152610109602052604090209081556122a48460016141c7565b60018201556122b642621712406141c7565b60028201556020808d0135600081815261010990925260409091209081556122df8460016141c7565b60018201556122f142621712406141c7565b6002820155610100546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015612330573d6000803e3d6000fd5b50336001600160a01b03167f7f80d0da4a3c3d788b343994246b1aa637d28008a65ce832a40cc31acd9a6e6a8e600001358f602001358960ff543460405161237c959493929190614125565b60405180910390a2505060ff549b9a5050505050505050505050565b6033546001600160a01b031633146123c25760405162461bcd60e51b815260040161099990613fd7565b6001600160a01b0381166124275760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610999565b6115ae81612f16565b6033546001600160a01b0316331461245a5760405162461bcd60e51b815260040161099990613fd7565b60005b6101e4811015610acf57816065600085846101e4811061247f5761247f6142eb565b6020020160208101906124929190613851565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f2231b808040cab8e79f0bc6f734eb000a94ba1f8213d48a551df80275ed298b883826101e481106124ee576124ee6142eb565b6020020160208101906125019190613851565b604080516001600160a01b03909216825284151560208301520160405180910390a18061252d81614290565b91505061245d565b600061010b5434146125895760405162461bcd60e51b815260206004820181905260248201527f244d4f4e53544552425544533a20507269636520697320696e636f72726563746044820152606401610999565b3361259383611371565b6001600160a01b0316146125fa5760405162461bcd60e51b815260206004820152602860248201527f244d4f4e53544552425544533a20596f7520617265206e6f74206f776e65722060448201526737b3103a37b5b2b760c11b6064820152608401610999565b610100546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015612634573d6000803e3d6000fd5b506040805133815260208101849052348183015290517f61bcb9d767fe5d2284f7e715d9380d99d91387c315b47506bd6bb4cb8e0dd81f9181900360600190a1506001919050565b6033546000906001600160a01b031633146126a95760405162461bcd60e51b815260040161099990613fd7565b5061010b55600190565b6000908152609a60205260409020546001600160a01b0316151590565b6000818152609c6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061270582611371565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b606060008461274c85613072565b8460405160200161275f93929190613d3f565b60408051808303601f1901815291905295945050505050565b612792828260405180602001604052806000815250613170565b5050565b61279f826126b3565b6128025760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b6064820152608401610999565b600082815260ca602090815260409091208251610acf9284019061367d565b6000806128318360400151611371565b6040516bffffffffffffffffffffffff193360601b166020820152909150600090603401604051602081830303815290604052805190602001209050600082604051602001612898919060609190911b6bffffffffffffffffffffffff1916815260140190565b60405160208183030381529060405280519060200120905060008560a001516040516020016128c991815260200190565b604051602081830303815290604052805190602001209050600086604001516040516020016128fa91815260200190565b6040516020818303038152906040528051906020012090506000876080015160405160200161292b91815260200190565b60408051601f198184030181528282528051602091820120908301859052908201819052606082018590526080820186905260a08201879052915060009060c00160405160208183030381529060405280519060200120905042896080015110156129d85760405162461bcd60e51b815260206004820152601960248201527f4d4f4e53544552425544533a20657870697265642074696d65000000000000006044820152606401610999565b8860c001518114612a215760405162461bcd60e51b81526020600482015260136024820152721226a7a729aa22a9212aa2299d1022a92927a960691b6044820152606401610999565b348960a0015114612a745760405162461bcd60e51b815260206004820152601f60248201527f4d4f4e53544552425544533a20507269636520697320696e636f7272656374006044820152606401610999565b6000612a7f346131a3565b610100546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612abb573d6000803e3d6000fd5b50610101546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612af7573d6000803e3d6000fd5b506000612b0482806141c7565b612b0e9034614212565b60208c01516040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015612b4b573d6000803e3d6000fd5b50612b5f8b60200151338d60400151612d76565b8a60400151336001600160a01b03168c602001516001600160a01b03167f4846bb92e4688018001b57c3be0b767a864854f677f24fc23f36ca1efd331f4d34604051612bad91815260200190565b60405180910390a45060019a9950505050505050505050565b6000833b15612c6b57604051630b135d3f60e11b81526001600160a01b03851690631626ba7e90612bfd9086908690600401613f14565b60206040518083038186803b158015612c1557600080fd5b505afa925050508015612c45575060408051601f3d908101601f19168201909252612c4291810190613a29565b60015b612c5157506000610e96565b6001600160e01b031916630b135d3f60e11b149050610e96565b836001600160a01b0316612c7f84846131c6565b6001600160a01b0316149050610e96565b6000612c9b826126b3565b612cfc5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610999565b6000612d0783611371565b9050806001600160a01b0316846001600160a01b03161480612d425750836001600160a01b0316612d3784610931565b6001600160a01b0316145b80611d7157506001600160a01b038082166000908152609d602090815260408083209388168352929052205460ff16611d71565b826001600160a01b0316612d8982611371565b6001600160a01b031614612df15760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610999565b6001600160a01b038216612e535760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610999565b612e5e6000826126d0565b6001600160a01b0383166000908152609b60205260408120805460019290612e87908490614212565b90915550506001600160a01b0382166000908152609b60205260408120805460019290612eb59084906141c7565b90915550506000818152609a602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612f73848484612d76565b612f7f8484848461326a565b611bae5760405162461bcd60e51b815260040161099990613f40565b6060612fa6826126b3565b61300a5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610999565b600061302160408051602081019091526000815290565b905060008151116130415760405180602001604052806000815250610e96565b8061304b84613072565b60405160200161305c929190613d10565b6040516020818303038152906040529392505050565b6060816130965750506040805180820190915260018152600360fc1b602082015290565b8160005b81156130c057806130aa81614290565b91506130b99050600a836141df565b915061309a565b60008167ffffffffffffffff8111156130db576130db614301565b6040519080825280601f01601f191660200182016040528015613105576020820181803683370190505b5090505b8415611d715761311a600183614212565b9150613127600a866142ab565b6131329060306141c7565b60f81b818381518110613147576131476142eb565b60200101906001600160f81b031916908160001a905350613169600a866141df565b9450613109565b61317a8383613377565b613187600084848461326a565b610acf5760405162461bcd60e51b815260040161099990613f40565b6000808260fe546131b491906141f3565b9050600060fd5482611d7191906141df565b60008151604114156131fa5760208201516040830151606084015160001a6131f0868285856134aa565b9350505050610899565b8151604014156132225760208201516040830151613219858383613653565b92505050610899565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610999565b60006001600160a01b0384163b1561336c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906132ae903390899088908890600401613d82565b602060405180830381600087803b1580156132c857600080fd5b505af19250505080156132f8575060408051601f3d908101601f191682019092526132f591810190613a29565b60015b613352573d808015613326576040519150601f19603f3d011682016040523d82523d6000602084013e61332b565b606091505b50805161334a5760405162461bcd60e51b815260040161099990613f40565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611d71565b506001949350505050565b6001600160a01b0382166133cd5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610999565b6133d6816126b3565b156134235760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610999565b6001600160a01b0382166000908152609b6020526040812080546001929061344c9084906141c7565b90915550506000818152609a602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156135275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610999565b8360ff16601b148061353c57508360ff16601c145b6135935760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610999565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa1580156135e7573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661364a5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610999565b95945050505050565b60006001600160ff1b03821660ff83901c601b01613673868287856134aa565b9695505050505050565b82805461368990614255565b90600052602060002090601f0160209004810192826136ab57600085556136f1565b82601f106136c457805160ff19168380011785556136f1565b828001600101855582156136f1579182015b828111156136f15782518255916020019190600101906136d6565b506136fd92915061373d565b5090565b50805460008255906000526020600020908101906115ae919061373d565b50805460008255906000526020600020908101906115ae9190613752565b5b808211156136fd576000815560010161373e565b808211156136fd576000613766828261376f565b50600101613752565b50805461377b90614255565b6000825580601f1061378b575050565b601f0160209004906000526020600020908101906115ae919061373d565b8035610b4881614317565b80358015158114610b4857600080fd5b600082601f8301126137d557600080fd5b813567ffffffffffffffff808211156137f0576137f0614301565b604051601f8301601f19908116603f0116810190828211818310171561381857613818614301565b8160405283815286602085880101111561383157600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561386357600080fd5b8135610e9681614317565b6000806040838503121561388157600080fd5b823561388c81614317565b9150602083013561389c81614317565b809150509250929050565b6000806000606084860312156138bc57600080fd5b83356138c781614317565b925060208401356138d781614317565b929592945050506040919091013590565b600080600080608085870312156138fe57600080fd5b843561390981614317565b9350602085013561391981614317565b925060408501359150606085013567ffffffffffffffff81111561393c57600080fd5b613948878288016137c4565b91505092959194509250565b6000806040838503121561396757600080fd5b823561397281614317565b9150613980602084016137b4565b90509250929050565b6000806040838503121561399c57600080fd5b82356139a781614317565b946020939093013593505050565b600080613ca083850312156139c957600080fd5b613c808301848111156139db57600080fd5b8392506139e7816137b4565b9150509250929050565b600060208284031215613a0357600080fd5b610e96826137b4565b600060208284031215613a1e57600080fd5b8135610e968161432c565b600060208284031215613a3b57600080fd5b8151610e968161432c565b60008060408385031215613a5957600080fd5b823567ffffffffffffffff80821115613a7157600080fd5b613a7d868387016137c4565b93506020850135915080821115613a9357600080fd5b506139e7858286016137c4565b60008060408385031215613ab357600080fd5b823567ffffffffffffffff80821115613acb57600080fd5b908401906101008287031215613ae057600080fd5b613ae861419d565b613af1836137a9565b8152613aff602084016137a9565b602082015260408301356040820152606083013582811115613b2057600080fd5b613b2c888286016137c4565b6060830152506080830135608082015260a083013560a082015260c083013560c082015260e083013560e0820152809450506020850135915080821115613a9357600080fd5b60008060008385036080811215613b8857600080fd5b6060811215613b9657600080fd5b50839250606084013567ffffffffffffffff80821115613bb557600080fd5b818601915086601f830112613bc957600080fd5b813581811115613bd857600080fd5b876020828501011115613bea57600080fd5b6020830194508093505050509250925092565b600060208284031215613c0f57600080fd5b5035919050565b60008060408385031215613c2957600080fd5b82359150602083013561389c81614317565b60008060408385031215613c4e57600080fd5b82359150602083013567ffffffffffffffff811115613c6c57600080fd5b6139e7858286016137c4565b600080600060608486031215613c8d57600080fd5b505081359360208301359350604090920135919050565b6000815480845260208085019450836000528060002060005b83811015613cd957815487529582019560019182019101613cbd565b509495945050505050565b60008151808452613cfc816020860160208601614229565b601f01601f19169290920160200192915050565b60008351613d22818460208801614229565b835190830190613d36818360208801614229565b01949350505050565b60008451613d51818460208901614229565b845190830190613d65818360208901614229565b8451910190613d78818360208801614229565b0195945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061367390830184613ce4565b60006080820160018060a01b0387168352602060808185015281875480845260a08601915060a08160051b87010193506000898152838120815b83811015613ea657888703609f1901855281548390600181811c9080831680613e1957607f831692505b8a8310811415613e3757634e487b7160e01b88526022600452602488fd5b828c5260208c01818015613e525760018114613e6357613e8d565b60ff19861682528c82019650613e8d565b6000898152602090208a5b86811015613e8757815484820152908501908e01613e6e565b83019750505b50949b5050978901979490940193505050600101613def565b5050505050508281036040840152613ebe8186613ca4565b91505082606083015295945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613f0857835183529284019291840191600101613eec565b50909695505050505050565b828152604060208201526000611d716040830184613ce4565b602081526000610e966020830184613ce4565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526025908201527f244d4f4e53544552425544533a2045786365656473206d61782062726565642060408201526418dbdd5b9d60da1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f244d4f4e53544552425544533a2063616e6e6f74206265207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526021908201527f244d4f4e53544552425544533a20416d6f756e7420697320696e636f727265636040820152601d60fa1b606082015260800190565b8581526001600160a01b038516602082015260a06040820181905260009061410c90830186613ce4565b6060830194909452509015156080909101529392505050565b85815284602082015260a06040820152600061414460a0830186613ce4565b606083019490945250608001529392505050565b87815286602082015260e06040820152600061417760e0830188613ce4565b90508560608301528460808301528360a08301528260c083015298975050505050505050565b604051610100810167ffffffffffffffff811182821017156141c1576141c1614301565b60405290565b600082198211156141da576141da6142bf565b500190565b6000826141ee576141ee6142d5565b500490565b600081600019048311821515161561420d5761420d6142bf565b500290565b600082821015614224576142246142bf565b500390565b60005b8381101561424457818101518382015260200161422c565b83811115611bae5750506000910152565b600181811c9082168061426957607f821691505b6020821081141561428a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156142a4576142a46142bf565b5060010190565b6000826142ba576142ba6142d5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146115ae57600080fd5b6001600160e01b0319811681146115ae57600080fdfea26469706673582212201e630667cd6be08c6f40f2e22d7af8e55168fd417d6928b6d61b722351c4a5c264736f6c63430008070033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.