Overview
ETH Balance
0.16 ETH
Eth Value
$366.10 (@ $2,288.15/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 554 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Commit | 13916741 | 981 days ago | IN | 0.16 ETH | 0.00600579 | ||||
Mint Reveal | 13894684 | 984 days ago | IN | 0 ETH | 0.23741371 | ||||
Withdraw | 13888353 | 985 days ago | IN | 0 ETH | 0.00409502 | ||||
Add Commit Rando... | 13888346 | 985 days ago | IN | 0 ETH | 0.00572357 | ||||
Mint Reveal | 13875607 | 987 days ago | IN | 0 ETH | 0.01313172 | ||||
Mint Reveal | 13872372 | 988 days ago | IN | 0 ETH | 0.06644533 | ||||
Mint Commit | 13869157 | 988 days ago | IN | 0.8 ETH | 0.0061968 | ||||
Mint Commit | 13868940 | 988 days ago | IN | 0.8 ETH | 0.00748114 | ||||
Mint Commit | 13868628 | 988 days ago | IN | 0.8 ETH | 0.00643363 | ||||
Add Commit Rando... | 13862936 | 989 days ago | IN | 0 ETH | 0.00793564 | ||||
Add Commit Rando... | 13862751 | 989 days ago | IN | 0 ETH | 0.00546979 | ||||
Add Commit Rando... | 13862611 | 989 days ago | IN | 0 ETH | 0.00510262 | ||||
Add Commit Rando... | 13862416 | 989 days ago | IN | 0 ETH | 0.00491363 | ||||
Add Commit Rando... | 13862238 | 989 days ago | IN | 0 ETH | 0.00413069 | ||||
Add Commit Rando... | 13862063 | 989 days ago | IN | 0 ETH | 0.00339094 | ||||
Add Commit Rando... | 13861883 | 989 days ago | IN | 0 ETH | 0.00310477 | ||||
Mint Reveal | 13861706 | 989 days ago | IN | 0 ETH | 0.01868453 | ||||
Add Commit Rando... | 13861678 | 989 days ago | IN | 0 ETH | 0.00302377 | ||||
Mint Commit | 13861637 | 989 days ago | IN | 0.08 ETH | 0.00500465 | ||||
Add Commit Rando... | 13861488 | 989 days ago | IN | 0 ETH | 0.0026728 | ||||
Add Commit Rando... | 13861326 | 989 days ago | IN | 0 ETH | 0.00296978 | ||||
Add Commit Rando... | 13861118 | 989 days ago | IN | 0 ETH | 0.00287798 | ||||
Add Commit Rando... | 13860935 | 989 days ago | IN | 0 ETH | 0.00213236 | ||||
Add Commit Rando... | 13860767 | 989 days ago | IN | 0 ETH | 0.00356294 | ||||
Mint Reveal | 13860697 | 989 days ago | IN | 0 ETH | 0.01801119 |
Loading...
Loading
Contract Name:
HNDGame
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./interfaces/IHNDGame.sol"; import "./interfaces/IKingdom.sol"; import "./interfaces/ITraits.sol"; import "./interfaces/Iexp.sol"; import "./interfaces/IHND.sol"; import "./interfaces/IShop.sol"; contract HNDGame is IHNDGame, Ownable, ReentrancyGuard, Pausable { event MintCommitted(address indexed owner, uint256 indexed amount); event MintRevealed(address indexed owner, uint256 indexed amount); struct MintCommit { bool stake; uint16 amount; } // Maximum price in EXP of the final game mints uint256 private maxExpCost = 105000 ether; // pricing uint256 public presalePrice = 0.07 ether; uint256 public publicSalePrice = 0.08 ether; // address -> commit # -> commits mapping(address => mapping(uint16 => MintCommit)) private _mintCommits; // address -> commit num of commit need revealed for account mapping(address => uint16) private _pendingCommitId; // commit # -> offchain random mapping(uint16 => uint256) private _commitRandoms; // whitelisted address => number of tokens minted during whitelist. // if address did not mint then they will not be in this list. mapping(address => uint256) private _whitelistClaims; // root of the merkle trie constructed from whitelist claimants bytes32 private whitelistMerkleRoot; uint16 private _commitBatch = 1; uint16 private pendingMintAmt; bool public isPublicSale; // address => can call addCommitRandom mapping(address => bool) private admins; // reference to the Kingdom for choosing random Demon thieves IKingdom public kingdom; ITraits public traits; IEXP public expToken; IHND public HNDNFT; address private kingdomAddr; address private treasury; // reference to loot IShop public shop; constructor() { _pause(); } /** CRITICAL TO SETUP */ modifier requireContractsSet() { require(address(expToken) != address(0) && address(traits) != address(0) && address(expToken) != address(0) && address(kingdom) != address(0) && address(shop) != address(0) , "Contracts not set"); _; } modifier requireEOA() { require(tx.origin == _msgSender(), "Only EOA"); _; } function setContracts(address _exp, address _traits, address _HND, address _kingdom, address _shop) external onlyOwner { expToken = IEXP(_exp); traits = ITraits(_traits); HNDNFT = IHND(_HND); kingdom = IKingdom(_kingdom); kingdomAddr = _kingdom; shop = IShop(_shop); } function setTreasury(address _treasury) external onlyOwner { treasury = _treasury; } function setWhitelistMerkleRoot(bytes32 root) external onlyOwner { whitelistMerkleRoot = root; } /** EXTERNAL */ function getPendingMint(address addr) external view returns (MintCommit memory) { require(_pendingCommitId[addr] != 0, "no pending commits"); return _mintCommits[addr][_pendingCommitId[addr]]; } function hasMintPending(address addr) external view returns (bool) { return _pendingCommitId[addr] != 0; } function canMint(address addr) external view returns (bool) { return _pendingCommitId[addr] != 0 && _commitRandoms[_pendingCommitId[addr]] > 0; } // Seed the current commit id so that pending commits can be revealed function addCommitRandom(uint256 seed, bytes32 parentBlockHash) external { require(owner() == _msgSender() || admins[_msgSender()], "Only admins can call this"); if (parentBlockHash != "") { // we poll to get the previous blockhash and continually submit tx until it's included // no gas waste as flashbots rpc fails if tx will revert require(blockhash(block.number - 1) == parentBlockHash, "block was uncled"); } _commitRandoms[_commitBatch] = seed; _commitBatch += 1; } function deleteCommit(address addr) external { require(owner() == _msgSender() || admins[_msgSender()], "Only admins can call this"); uint16 commitIdCur = _pendingCommitId[_msgSender()]; require(commitIdCur > 0, "No pending commit"); delete _mintCommits[addr][commitIdCur]; delete _pendingCommitId[addr]; } function forceRevealCommit(address addr) external { require(owner() == _msgSender() || admins[_msgSender()], "Only admins can call this"); reveal(addr); } /** Initiate the start of a mint during the whitelisted minting period **/ function whitelistMintCommit(uint256 index, uint256 a, uint256 amount, bytes32[] calldata merkleProof, bool stake) external payable whenNotPaused nonReentrant requireEOA { require(_pendingCommitId[_msgSender()] == 0, "Already have pending mints"); require(_whitelistClaims[_msgSender()] + amount <= 2, "exceeds whitelist mint limit"); // all whitelist mints take place during the presale phase, no need to check for other prices. require(amount * presalePrice == msg.value, "Invalid payment amount"); // verify merkle proof bytes32 node = keccak256(abi.encodePacked(index, _msgSender(), a)); require(MerkleProof.verify(merkleProof, whitelistMerkleRoot, node), "Not on Whitelist: Invalid Merkle proof."); _whitelistClaims[_msgSender()] += amount; uint16 amt = uint16(amount); _mintCommits[_msgSender()][_commitBatch] = MintCommit(stake, amt); _pendingCommitId[_msgSender()] = _commitBatch; pendingMintAmt += amt; emit MintCommitted(_msgSender(), amount); } /** Initiate the start of a mint. This action burns $EXP, as the intent of committing is that you cannot back out once you've started. * This will add users into the pending queue, to be revealed after a random seed is generated and assigned to the commit id this * commit was added to. */ function mintCommit(uint256 amount, bool stake) external payable whenNotPaused nonReentrant requireEOA { require(isPublicSale == true, "Public Sale not started!"); require(_pendingCommitId[_msgSender()] == 0, "Already have pending mints"); uint16 minted = HNDNFT.minted(); uint256 maxTokens = HNDNFT.getMaxTokens(); uint256 paidTokens = HNDNFT.getPaidTokens(); require(minted + pendingMintAmt + amount <= maxTokens, "All tokens minted"); require(amount <= 10, "HNDGame: Maximum mint amount of 10"); if (minted < paidTokens) { require(minted + amount <= paidTokens, "HNDGame: Paid tokens sold out"); require(amount * publicSalePrice == msg.value, "HNDGame: Invalid payment amount"); } else { require(msg.value == 0); uint256 totalExpCost = 0; // Loop through the amount of for (uint i = 1; i <= amount; i++) { totalExpCost += mintCost(minted + pendingMintAmt + i, maxTokens); } if (totalExpCost > 0) { // burn 30% (and the recycled 35%) expToken.burn(_msgSender(), totalExpCost * 13 / 20); // recycle the 35% kingdom.recycleExp(totalExpCost * 7/20); // 35% to treasury expToken.transferFrom(_msgSender(), treasury, totalExpCost * 7 / 20); expToken.updateOriginAccess(); } } uint16 amt = uint16(amount); _mintCommits[_msgSender()][_commitBatch] = MintCommit(stake, amt); _pendingCommitId[_msgSender()] = _commitBatch; pendingMintAmt += amt; emit MintCommitted(_msgSender(), amount); } /** Reveal the commits for this user. This will be when the user gets their NFT, and can only be done when the commit id that * the user is pending for has been assigned a random seed. */ function mintReveal() external whenNotPaused nonReentrant requireEOA { reveal(_msgSender()); } function reveal(address addr) internal { uint16 commitIdCur = _pendingCommitId[addr]; require(commitIdCur > 0, "No pending commit"); require(_commitRandoms[commitIdCur] > 0, "random seed not set"); uint16 minted = HNDNFT.minted(); MintCommit memory commit = _mintCommits[addr][commitIdCur]; pendingMintAmt -= commit.amount; uint16[] memory tokenIds = new uint16[](commit.amount); uint256 seed = _commitRandoms[commitIdCur]; for (uint k = 0; k < commit.amount; k++) { minted++; // change seed per mint seed = uint256(keccak256(abi.encode(seed, addr))); address recipient = selectRecipient(seed); tokenIds[k] = minted; if (!commit.stake || recipient != addr) { HNDNFT.mint(recipient, seed); } else { HNDNFT.mint(address(kingdom), seed); } } HNDNFT.updateOriginAccess(tokenIds); if(commit.stake) { kingdom.addManyToKingdom(addr, tokenIds); } delete _mintCommits[addr][commitIdCur]; delete _pendingCommitId[addr]; emit MintCommitted(addr, tokenIds.length); } /** * @param tokenId the ID to check the cost of to mint * @return the cost of the given token ID */ function mintCost(uint256 tokenId, uint256 maxTokens) public view returns (uint256) { if (tokenId <= maxTokens * 2 / 5) return 20000 ether; if (tokenId <= maxTokens * 3 / 5) return 45000 ether; if (tokenId <= maxTokens * 4 / 5) return 80000 ether; if (tokenId <= maxTokens) return 105000 ether; return maxExpCost; } /** INTERNAL */ /** * the first 20% (ETH purchases) go to the minter * the remaining 80% have a 10% chance to be given to a random staked demon * @param seed a random value to select a recipient from * @return the address of the recipient (either the minter or the Demon thief's owner) */ function selectRecipient(uint256 seed) internal returns (address) { if (HNDNFT.getPaidTokens() < HNDNFT.minted()) { if (((seed >> 245) % 10) != 0) return _msgSender(); // top 10 bits haven't been used address thief = kingdom.randomDemonOwner(seed >> 144); // 144 bits reserved for trait selection if (thief == address(0x0)) return _msgSender(); return thief; } else { return _msgSender(); } } /** ADMIN */ /** * enables owner to pause / unpause contract */ function setPaused(bool _paused) external requireContractsSet onlyOwner { if (_paused) _pause(); else _unpause(); } function startPublicSale(bool _saleStarted) external onlyOwner { isPublicSale = _saleStarted; } function setMaxExpCost(uint256 _amount) external requireContractsSet onlyOwner { maxExpCost = _amount; } /** Allow the contract owner to set the pending mint amount. * This allows any long-standing pending commits to be overwritten, say for instance if the max supply has been * reached but there are many stale pending commits, it could be used to free up those spaces if needed/desired by the community. * This function should not be called lightly, this will have negative consequences on the game. */ function setPendingMintAmt(uint256 pendingAmt) external onlyOwner { pendingMintAmt = uint16(pendingAmt); } /** * enables an address to mint / burn * @param addr the address to enable */ function addAdmin(address addr) external onlyOwner { admins[addr] = true; } /** * disables an address from minting / burning * @param addr the address to disbale */ function removeAdmin(address addr) external onlyOwner { admins[addr] = false; } /** * allows owner to withdraw funds from minting */ function withdraw() external onlyOwner { payable(owner()).transfer(address(this).balance); } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IShop { function mint(uint256 typeId, uint16 qty, address recipient) external; function burn(uint256 typeId, uint16 qty, address burnFrom) external; function updateOriginAccess() external; function balanceOf(address account, uint256 id) external returns (uint256); function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory data) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; interface IHND is IERC721Enumerable { // game data storage struct HeroDemon { bool isHero; bool isFemale; uint8 body; uint8 face; uint8 eyes; uint8 headpiecehorns; uint8 gloves; uint8 armor; uint8 weapon; uint8 shield; uint8 shoes; uint8 tailflame; uint8 rankIndex; } function minted() external returns (uint16); function updateOriginAccess(uint16[] memory tokenIds) external; function mint(address recipient, uint256 seed) external; function burn(uint256 tokenId) external; function getMaxTokens() external view returns (uint256); function getPaidTokens() external view returns (uint256); function getTokenTraits(uint256 tokenId) external view returns (HeroDemon memory); function getTokenWriteBlock(uint256 tokenId) external view returns(uint64); function isHero(uint256 tokenId) external view returns(bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IEXP { function mint(address to, uint256 amount) external; function burn(address from, uint256 amount) external; function updateOriginAccess() external; function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface ITraits { function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IKingdom { function addManyToKingdom(address account, uint16[] calldata tokenIds) external; function randomDemonOwner(uint256 seed) external view returns (address); function recycleExp(uint256 amount) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.0; interface IHNDGame { }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 500 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintCommitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MintRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"HNDNFT","outputs":[{"internalType":"contract IHND","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"bytes32","name":"parentBlockHash","type":"bytes32"}],"name":"addCommitRandom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"deleteCommit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expToken","outputs":[{"internalType":"contract IEXP","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"forceRevealCommit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getPendingMint","outputs":[{"components":[{"internalType":"bool","name":"stake","type":"bool"},{"internalType":"uint16","name":"amount","type":"uint16"}],"internalType":"struct HNDGame.MintCommit","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"hasMintPending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kingdom","outputs":[{"internalType":"contract IKingdom","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintCommit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_exp","type":"address"},{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_HND","type":"address"},{"internalType":"address","name":"_kingdom","type":"address"},{"internalType":"address","name":"_shop","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxExpCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pendingAmt","type":"uint256"}],"name":"setPendingMintAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shop","outputs":[{"internalType":"contract IShop","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleStarted","type":"bool"}],"name":"startPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITraits","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"whitelistMintCommit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405269163c0fb846284fa0000060035566f8b0a10e47000060045567011c37937e080000600555600b805461ffff191660011790553480156200004457600080fd5b5062000050336200006e565b600180556002805460ff1916905562000068620000be565b6200015c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025460ff1615620001095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200013f3390565b6040516001600160a01b03909116815260200160405180910390a1565b612c01806200016c6000396000f3fe6080604052600436106101e25760003560e01c80639b6860c811610102578063e6eebd8b11610095578063f4c1fc5f11610064578063f4c1fc5f14610570578063f62b1c0d14610585578063f63bf8bd146105a5578063ff9e23d0146105c557600080fd5b8063e6eebd8b146104f0578063f0f4426014610510578063f2fde38b14610530578063f49bb4921461055057600080fd5b8063ce4f276c116100d1578063ce4f276c14610461578063d0f09da71461049d578063e1fc334f146104bd578063e5d391a2146104dd57600080fd5b80639b6860c8146103e9578063a5a865dc146103ff578063bd32fb6614610421578063c2ba47441461044157600080fd5b80635dd6f92f1161017a578063772f976011610149578063772f976014610378578063828c5e1b1461038b5780638da5cb5b146103ab57806392660550146103c957600080fd5b80635dd6f92f146103035780637048027514610323578063715018a61461034357806375e7a1e61461035857600080fd5b80633ccfd60b116101b65780633ccfd60b1461028a578063497c00ae1461029f578063497f7172146102bf5780635c975abb146102df57600080fd5b80620e7fa8146101e75780630881fa0d1461021057806316c38b3c146102485780631785f53c1461026a575b600080fd5b3480156101f357600080fd5b506101fd60045481565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b50601354610230906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561025457600080fd5b50610268610263366004612834565b610606565b005b34801561027657600080fd5b50610268610285366004612789565b610712565b34801561029657600080fd5b5061026861077b565b3480156102ab57600080fd5b506102686102ba366004612834565b6107fd565b3480156102cb57600080fd5b506102686102da366004612789565b610865565b3480156102eb57600080fd5b5060025460ff165b6040519015158152602001610207565b34801561030f57600080fd5b50600f54610230906001600160a01b031681565b34801561032f57600080fd5b5061026861033e366004612789565b610976565b34801561034f57600080fd5b506102686109e2565b34801561036457600080fd5b50600d54610230906001600160a01b031681565b610268610386366004612916565b610a36565b34801561039757600080fd5b506102686103a636600461286e565b610e45565b3480156103b757600080fd5b506000546001600160a01b0316610230565b3480156103d557600080fd5b506102686103e43660046128f4565b610f38565b3480156103f557600080fd5b506101fd60055481565b34801561040b57600080fd5b50600b546102f390640100000000900460ff1681565b34801561042d57600080fd5b5061026861043c36600461286e565b611057565b34801561044d57600080fd5b506102f361045c366004612789565b6110a4565b34801561046d57600080fd5b506102f361047c366004612789565b6001600160a01b031660009081526007602052604090205461ffff16151590565b3480156104a957600080fd5b50601054610230906001600160a01b031681565b3480156104c957600080fd5b50600e54610230906001600160a01b031681565b6102686104eb3660046128c4565b6110fd565b3480156104fc57600080fd5b506101fd61050b3660046128f4565b611960565b34801561051c57600080fd5b5061026861052b366004612789565b611a0e565b34801561053c57600080fd5b5061026861054b366004612789565b611a78565b34801561055c57600080fd5b5061026861056b366004612789565b611b2e565b34801561057c57600080fd5b50610268611bab565b34801561059157600080fd5b506102686105a036600461286e565b611c92565b3480156105b157600080fd5b506102686105c03660046127c3565b611cfa565b3480156105d157600080fd5b506105e56105e0366004612789565b611dab565b6040805182511515815260209283015161ffff169281019290925201610207565b600f546001600160a01b03161580159061062a5750600e546001600160a01b031615155b80156106405750600f546001600160a01b031615155b80156106565750600d546001600160a01b031615155b801561066c57506013546001600160a01b031615155b6106b15760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b60448201526064015b60405180910390fd5b6000546001600160a01b031633146106f95760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b801561070a57610707611e7a565b50565b610707611f12565b6000546001600160a01b0316331461075a5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6000546001600160a01b031633146107c35760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610707573d6000803e3d6000fd5b6000546001600160a01b031633146108455760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600b80549115156401000000000264ff0000000019909216919091179055565b6000546001600160a01b031633148061088d5750336000908152600c602052604090205460ff165b6108d95760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b3360009081526007602052604090205461ffff168061092e5760405162461bcd60e51b8152602060048201526011602482015270139bc81c195b991a5b99c818dbdb5b5a5d607a1b60448201526064016106a8565b6001600160a01b03909116600081815260066020908152604080832061ffff9095168352938152838220805462ffffff19169055918152600790915220805461ffff19169055565b6000546001600160a01b031633146109be5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000546001600160a01b03163314610a2a5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b610a346000611f95565b565b60025460ff1615610a7c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b60026001541415610acf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b6002600155323314610b0e5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b3360009081526007602052604090205461ffff1615610b6f5760405162461bcd60e51b815260206004820152601a60248201527f416c726561647920686176652070656e64696e67206d696e747300000000000060448201526064016106a8565b33600090815260096020526040902054600290610b8d908690612a5a565b1115610bdb5760405162461bcd60e51b815260206004820152601c60248201527f657863656564732077686974656c697374206d696e74206c696d69740000000060448201526064016106a8565b3460045485610bea9190612a86565b14610c375760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207061796d656e7420616d6f756e740000000000000000000060448201526064016106a8565b60408051602081018890526bffffffffffffffffffffffff193360601b169181019190915260548101869052600090607401604051602081830303815290604052805190602001209050610cc284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611fe5565b610d1e5760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2057686974656c6973743a20496e76616c6964204d65726b6c6560448201526610383937b7b31760c91b60648201526084016106a8565b3360009081526009602052604081208054879290610d3d908490612a5a565b9091555050604080518082018252831515815261ffff878116602080840191825233600081815260068352868120600b80548716835290845287822096518754955187166101000262ffff00199115159190911662ffffff1990961695909517949094179095558254908552600790915293909220805461ffff19169382169390931790925580548792839291600291610de09185916201000090910416612a34565b92506101000a81548161ffff021916908361ffff16021790555085610e023390565b6001600160a01b03167faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143560405160405180910390a3505060018055505050505050565b600f546001600160a01b031615801590610e695750600e546001600160a01b031615155b8015610e7f5750600f546001600160a01b031615155b8015610e955750600d546001600160a01b031615155b8015610eab57506013546001600160a01b031615155b610eeb5760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b60448201526064016106a8565b6000546001600160a01b03163314610f335760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600355565b6000546001600160a01b0316331480610f605750336000908152600c602052604090205460ff165b610fac5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b801561100c5780610fbe600143612ac8565b401461100c5760405162461bcd60e51b815260206004820152601060248201527f626c6f636b2077617320756e636c65640000000000000000000000000000000060448201526064016106a8565b600b805461ffff908116600090815260086020526040812085905582546001939261103991859116612a34565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000546001600160a01b0316331461109f5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600a55565b6001600160a01b03811660009081526007602052604081205461ffff16158015906110f757506001600160a01b03821660009081526007602090815260408083205461ffff168352600890915290205415155b92915050565b60025460ff16156111435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b600260015414156111965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b60026001553233146111d55760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b600b54640100000000900460ff1615156001146112345760405162461bcd60e51b815260206004820152601860248201527f5075626c69632053616c65206e6f74207374617274656421000000000000000060448201526064016106a8565b3360009081526007602052604090205461ffff16156112955760405162461bcd60e51b815260206004820152601a60248201527f416c726561647920686176652070656e64696e67206d696e747300000000000060448201526064016106a8565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113139190612887565b90506000601060009054906101000a90046001600160a01b03166001600160a01b0316636abcded16040518163ffffffff1660e01b815260040160206040518083038186803b15801561136557600080fd5b505afa158015611379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906128ab565b90506000601060009054906101000a90046001600160a01b03166001600160a01b0316634018b1f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906128ab565b600b54909150829086906114459062010000900461ffff1686612a34565b61ffff166114539190612a5a565b11156114a15760405162461bcd60e51b815260206004820152601160248201527f416c6c20746f6b656e73206d696e74656400000000000000000000000000000060448201526064016106a8565b600a8511156114fd5760405162461bcd60e51b815260206004820152602260248201527f484e4447616d653a204d6178696d756d206d696e7420616d6f756e74206f6620604482015261031360f41b60648201526084016106a8565b808361ffff1610156115c757806115188661ffff8616612a5a565b11156115665760405162461bcd60e51b815260206004820152601d60248201527f484e4447616d653a205061696420746f6b656e7320736f6c64206f757400000060448201526064016106a8565b34600554866115759190612a86565b146115c25760405162461bcd60e51b815260206004820152601f60248201527f484e4447616d653a20496e76616c6964207061796d656e7420616d6f756e740060448201526064016106a8565b61185f565b34156115d257600080fd5b600060015b86811161162d57600b5461160f9082906115fb9062010000900461ffff1688612a34565b61ffff166116099190612a5a565b85611960565b6116199083612a5a565b91508061162581612b01565b9150506115d7565b50801561185d57600f546001600160a01b0316639dc29fac33601461165385600d612a86565b61165d9190612a72565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156116a357600080fd5b505af11580156116b7573d6000803e3d6000fd5b5050600d546001600160a01b0316915063c8d88afe905060146116db846007612a86565b6116e59190612a72565b6040518263ffffffff1660e01b815260040161170391815260200190565b600060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b5050600f546001600160a01b031691506323b872dd9050336012546001600160a01b03166014611762866007612a86565b61176c9190612a72565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156117bb57600080fd5b505af11580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190612851565b50600f60009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b505050505b505b604080518082018252851515815261ffff878116602080840191825233600081815260068352868120600b80548716835290845287822096518754955187166101000262ffff00199115159190911662ffffff1990961695909517949094179095558254908552600790915293909220805461ffff191693821693909317909255805487928392916002916118fd9185916201000090910416612a34565b92506101000a81548161ffff021916908361ffff1602179055508561191f3390565b6001600160a01b03167faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143560405160405180910390a350506001805550505050565b6000600561196f836002612a86565b6119799190612a72565b8311611990575069043c33c19375648000006110f7565b600561199d836003612a86565b6119a79190612a72565b83116119be575069098774738bc8222000006110f7565b60056119cb836004612a86565b6119d59190612a72565b83116119ec57506910f0cf064dd5920000006110f7565b818311611a04575069163c0fb846284fa000006110f7565b5060035492915050565b6000546001600160a01b03163314611a565760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ac05760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b038116611b255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a8565b61070781611f95565b6000546001600160a01b0316331480611b565750336000908152600c602052604090205460ff165b611ba25760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b61070781611ffb565b60025460ff1615611bf15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b60026001541415611c445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b6002600155323314611c835760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b611c8c33611ffb565b60018055565b6000546001600160a01b03163314611cda5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600b805461ffff909216620100000263ffff000019909216919091179055565b6000546001600160a01b03163314611d425760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600f80546001600160a01b039687166001600160a01b031991821617909155600e8054958716958216959095179094556010805493861693851693909317909255600d805491851691841682179055601180548416909117905560138054919093169116179055565b60408051808201909152600080825260208201526001600160a01b03821660009081526007602052604090205461ffff16611e285760405162461bcd60e51b815260206004820152601260248201527f6e6f2070656e64696e6720636f6d6d697473000000000000000000000000000060448201526064016106a8565b506001600160a01b03166000908152600660209081526040808320600783528184205461ffff90811685529083529281902081518083019092525460ff81161515825261010090049092169082015290565b60025460ff1615611ec05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ef53390565b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff16611f645760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016106a8565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ef5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082611ff28584612506565b14949350505050565b6001600160a01b03811660009081526007602052604090205461ffff16806120595760405162461bcd60e51b8152602060048201526011602482015270139bc81c195b991a5b99c818dbdb5b5a5d607a1b60448201526064016106a8565b61ffff81166000908152600860205260409020546120b95760405162461bcd60e51b815260206004820152601360248201527f72616e646f6d2073656564206e6f74207365740000000000000000000000000060448201526064016106a8565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612887565b6001600160a01b038416600090815260066020908152604080832061ffff80881685529083529281902081518083019092525460ff81161515825261010090048316918101829052600b80549495509093919290916002916121a29185916201000090910416612aa5565b92506101000a81548161ffff021916908361ffff1602179055506000816020015161ffff1667ffffffffffffffff8111156121df576121df612b72565b604051908082528060200260200182016040528015612208578160200160208202803683370190505b5061ffff85166000908152600860205260408120549192505b836020015161ffff168110156123bd578461223b81612adf565b95505081876040516020016122639291909182526001600160a01b0316602082015260400190565b6040516020818303038152906040528051906020012060001c91506000612289836125b2565b90508584838151811061229e5761229e612b5c565b61ffff90921660209283029190910190910152845115806122d15750876001600160a01b0316816001600160a01b031614155b15612341576010546040516340c10f1960e01b81526001600160a01b03838116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b15801561232457600080fd5b505af1158015612338573d6000803e3d6000fd5b505050506123aa565b601054600d546040516340c10f1960e01b81526001600160a01b039182166004820152602481018690529116906340c10f1990604401600060405180830381600087803b15801561239157600080fd5b505af11580156123a5573d6000803e3d6000fd5b505050505b50806123b581612b01565b915050612221565b506010546040516335ca838b60e01b81526001600160a01b03909116906335ca838b906123ee908590600401612a21565b600060405180830381600087803b15801561240857600080fd5b505af115801561241c573d6000803e3d6000fd5b5050505082600001511561248f57600d54604051630463b97d60e11b81526001600160a01b03909116906308c772fa9061245c90899086906004016129f7565b600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b505050505b6001600160a01b038616600081815260066020908152604080832061ffff8a1684528252808320805462ffffff191690558383526007909152808220805461ffff19169055845190519092917faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143591a3505050505050565b600081815b84518110156125aa57600085828151811061252857612528612b5c565b6020026020010151905080831161256a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612597565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806125a281612b01565b91505061250b565b509392505050565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156125f857600080fd5b505af115801561260c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126309190612887565b61ffff16601060009054906101000a90046001600160a01b03166001600160a01b0316634018b1f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561268257600080fd5b505afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba91906128ab565b1015612773576126cf600a60f584901c612b1c565b156126da57336110f7565b600d54604051633b1f4e8760e11b8152609084901c60048201526000916001600160a01b03169063763e9d0e9060240160206040518083038186803b15801561272257600080fd5b505afa158015612736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275a91906127a6565b90506001600160a01b0381166110f757335b9392505050565b336110f7565b919050565b803561277981612b9d565b60006020828403121561279b57600080fd5b813561276c81612b88565b6000602082840312156127b857600080fd5b815161276c81612b88565b600080600080600060a086880312156127db57600080fd5b85356127e681612b88565b945060208601356127f681612b88565b9350604086013561280681612b88565b9250606086013561281681612b88565b9150608086013561282681612b88565b809150509295509295909350565b60006020828403121561284657600080fd5b813561276c81612b9d565b60006020828403121561286357600080fd5b815161276c81612b9d565b60006020828403121561288057600080fd5b5035919050565b60006020828403121561289957600080fd5b815161ffff8116811461276c57600080fd5b6000602082840312156128bd57600080fd5b5051919050565b600080604083850312156128d757600080fd5b8235915060208301356128e981612b9d565b809150509250929050565b6000806040838503121561290757600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561292f57600080fd5b863595506020870135945060408701359350606087013567ffffffffffffffff8082111561295c57600080fd5b818901915089601f83011261297057600080fd5b81358181111561297f57600080fd5b8a60208260051b850101111561299457600080fd5b6020830195508094505050506129ac6080880161277e565b90509295509295509295565b600081518084526020808501945080840160005b838110156129ec57815161ffff16875295820195908201906001016129cc565b509495945050505050565b6001600160a01b0383168152604060208201526000612a1960408301846129b8565b949350505050565b60208152600061276c60208301846129b8565b600061ffff808316818516808303821115612a5157612a51612b30565b01949350505050565b60008219821115612a6d57612a6d612b30565b500190565b600082612a8157612a81612b46565b500490565b6000816000190483118215151615612aa057612aa0612b30565b500290565b600061ffff83811690831681811015612ac057612ac0612b30565b039392505050565b600082821015612ada57612ada612b30565b500390565b600061ffff80831681811415612af757612af7612b30565b6001019392505050565b6000600019821415612b1557612b15612b30565b5060010190565b600082612b2b57612b2b612b46565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461070757600080fd5b801515811461070757600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209351a44e9547a161d1b9a73f5ee52eeb12b2e4c692dd94d0abd77c2534f09ef764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101e25760003560e01c80639b6860c811610102578063e6eebd8b11610095578063f4c1fc5f11610064578063f4c1fc5f14610570578063f62b1c0d14610585578063f63bf8bd146105a5578063ff9e23d0146105c557600080fd5b8063e6eebd8b146104f0578063f0f4426014610510578063f2fde38b14610530578063f49bb4921461055057600080fd5b8063ce4f276c116100d1578063ce4f276c14610461578063d0f09da71461049d578063e1fc334f146104bd578063e5d391a2146104dd57600080fd5b80639b6860c8146103e9578063a5a865dc146103ff578063bd32fb6614610421578063c2ba47441461044157600080fd5b80635dd6f92f1161017a578063772f976011610149578063772f976014610378578063828c5e1b1461038b5780638da5cb5b146103ab57806392660550146103c957600080fd5b80635dd6f92f146103035780637048027514610323578063715018a61461034357806375e7a1e61461035857600080fd5b80633ccfd60b116101b65780633ccfd60b1461028a578063497c00ae1461029f578063497f7172146102bf5780635c975abb146102df57600080fd5b80620e7fa8146101e75780630881fa0d1461021057806316c38b3c146102485780631785f53c1461026a575b600080fd5b3480156101f357600080fd5b506101fd60045481565b6040519081526020015b60405180910390f35b34801561021c57600080fd5b50601354610230906001600160a01b031681565b6040516001600160a01b039091168152602001610207565b34801561025457600080fd5b50610268610263366004612834565b610606565b005b34801561027657600080fd5b50610268610285366004612789565b610712565b34801561029657600080fd5b5061026861077b565b3480156102ab57600080fd5b506102686102ba366004612834565b6107fd565b3480156102cb57600080fd5b506102686102da366004612789565b610865565b3480156102eb57600080fd5b5060025460ff165b6040519015158152602001610207565b34801561030f57600080fd5b50600f54610230906001600160a01b031681565b34801561032f57600080fd5b5061026861033e366004612789565b610976565b34801561034f57600080fd5b506102686109e2565b34801561036457600080fd5b50600d54610230906001600160a01b031681565b610268610386366004612916565b610a36565b34801561039757600080fd5b506102686103a636600461286e565b610e45565b3480156103b757600080fd5b506000546001600160a01b0316610230565b3480156103d557600080fd5b506102686103e43660046128f4565b610f38565b3480156103f557600080fd5b506101fd60055481565b34801561040b57600080fd5b50600b546102f390640100000000900460ff1681565b34801561042d57600080fd5b5061026861043c36600461286e565b611057565b34801561044d57600080fd5b506102f361045c366004612789565b6110a4565b34801561046d57600080fd5b506102f361047c366004612789565b6001600160a01b031660009081526007602052604090205461ffff16151590565b3480156104a957600080fd5b50601054610230906001600160a01b031681565b3480156104c957600080fd5b50600e54610230906001600160a01b031681565b6102686104eb3660046128c4565b6110fd565b3480156104fc57600080fd5b506101fd61050b3660046128f4565b611960565b34801561051c57600080fd5b5061026861052b366004612789565b611a0e565b34801561053c57600080fd5b5061026861054b366004612789565b611a78565b34801561055c57600080fd5b5061026861056b366004612789565b611b2e565b34801561057c57600080fd5b50610268611bab565b34801561059157600080fd5b506102686105a036600461286e565b611c92565b3480156105b157600080fd5b506102686105c03660046127c3565b611cfa565b3480156105d157600080fd5b506105e56105e0366004612789565b611dab565b6040805182511515815260209283015161ffff169281019290925201610207565b600f546001600160a01b03161580159061062a5750600e546001600160a01b031615155b80156106405750600f546001600160a01b031615155b80156106565750600d546001600160a01b031615155b801561066c57506013546001600160a01b031615155b6106b15760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b60448201526064015b60405180910390fd5b6000546001600160a01b031633146106f95760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b801561070a57610707611e7a565b50565b610707611f12565b6000546001600160a01b0316331461075a5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b03166000908152600c60205260409020805460ff19169055565b6000546001600160a01b031633146107c35760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610707573d6000803e3d6000fd5b6000546001600160a01b031633146108455760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600b80549115156401000000000264ff0000000019909216919091179055565b6000546001600160a01b031633148061088d5750336000908152600c602052604090205460ff165b6108d95760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b3360009081526007602052604090205461ffff168061092e5760405162461bcd60e51b8152602060048201526011602482015270139bc81c195b991a5b99c818dbdb5b5a5d607a1b60448201526064016106a8565b6001600160a01b03909116600081815260066020908152604080832061ffff9095168352938152838220805462ffffff19169055918152600790915220805461ffff19169055565b6000546001600160a01b031633146109be5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b03166000908152600c60205260409020805460ff19166001179055565b6000546001600160a01b03163314610a2a5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b610a346000611f95565b565b60025460ff1615610a7c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b60026001541415610acf5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b6002600155323314610b0e5760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b3360009081526007602052604090205461ffff1615610b6f5760405162461bcd60e51b815260206004820152601a60248201527f416c726561647920686176652070656e64696e67206d696e747300000000000060448201526064016106a8565b33600090815260096020526040902054600290610b8d908690612a5a565b1115610bdb5760405162461bcd60e51b815260206004820152601c60248201527f657863656564732077686974656c697374206d696e74206c696d69740000000060448201526064016106a8565b3460045485610bea9190612a86565b14610c375760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964207061796d656e7420616d6f756e740000000000000000000060448201526064016106a8565b60408051602081018890526bffffffffffffffffffffffff193360601b169181019190915260548101869052600090607401604051602081830303815290604052805190602001209050610cc284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611fe5565b610d1e5760405162461bcd60e51b815260206004820152602760248201527f4e6f74206f6e2057686974656c6973743a20496e76616c6964204d65726b6c6560448201526610383937b7b31760c91b60648201526084016106a8565b3360009081526009602052604081208054879290610d3d908490612a5a565b9091555050604080518082018252831515815261ffff878116602080840191825233600081815260068352868120600b80548716835290845287822096518754955187166101000262ffff00199115159190911662ffffff1990961695909517949094179095558254908552600790915293909220805461ffff19169382169390931790925580548792839291600291610de09185916201000090910416612a34565b92506101000a81548161ffff021916908361ffff16021790555085610e023390565b6001600160a01b03167faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143560405160405180910390a3505060018055505050505050565b600f546001600160a01b031615801590610e695750600e546001600160a01b031615155b8015610e7f5750600f546001600160a01b031615155b8015610e955750600d546001600160a01b031615155b8015610eab57506013546001600160a01b031615155b610eeb5760405162461bcd60e51b815260206004820152601160248201527010dbdb9d1c9858dd1cc81b9bdd081cd95d607a1b60448201526064016106a8565b6000546001600160a01b03163314610f335760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600355565b6000546001600160a01b0316331480610f605750336000908152600c602052604090205460ff165b610fac5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b801561100c5780610fbe600143612ac8565b401461100c5760405162461bcd60e51b815260206004820152601060248201527f626c6f636b2077617320756e636c65640000000000000000000000000000000060448201526064016106a8565b600b805461ffff908116600090815260086020526040812085905582546001939261103991859116612a34565b92506101000a81548161ffff021916908361ffff1602179055505050565b6000546001600160a01b0316331461109f5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600a55565b6001600160a01b03811660009081526007602052604081205461ffff16158015906110f757506001600160a01b03821660009081526007602090815260408083205461ffff168352600890915290205415155b92915050565b60025460ff16156111435760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b600260015414156111965760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b60026001553233146111d55760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b600b54640100000000900460ff1615156001146112345760405162461bcd60e51b815260206004820152601860248201527f5075626c69632053616c65206e6f74207374617274656421000000000000000060448201526064016106a8565b3360009081526007602052604090205461ffff16156112955760405162461bcd60e51b815260206004820152601a60248201527f416c726561647920686176652070656e64696e67206d696e747300000000000060448201526064016106a8565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156112db57600080fd5b505af11580156112ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113139190612887565b90506000601060009054906101000a90046001600160a01b03166001600160a01b0316636abcded16040518163ffffffff1660e01b815260040160206040518083038186803b15801561136557600080fd5b505afa158015611379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139d91906128ab565b90506000601060009054906101000a90046001600160a01b03166001600160a01b0316634018b1f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156113ef57600080fd5b505afa158015611403573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142791906128ab565b600b54909150829086906114459062010000900461ffff1686612a34565b61ffff166114539190612a5a565b11156114a15760405162461bcd60e51b815260206004820152601160248201527f416c6c20746f6b656e73206d696e74656400000000000000000000000000000060448201526064016106a8565b600a8511156114fd5760405162461bcd60e51b815260206004820152602260248201527f484e4447616d653a204d6178696d756d206d696e7420616d6f756e74206f6620604482015261031360f41b60648201526084016106a8565b808361ffff1610156115c757806115188661ffff8616612a5a565b11156115665760405162461bcd60e51b815260206004820152601d60248201527f484e4447616d653a205061696420746f6b656e7320736f6c64206f757400000060448201526064016106a8565b34600554866115759190612a86565b146115c25760405162461bcd60e51b815260206004820152601f60248201527f484e4447616d653a20496e76616c6964207061796d656e7420616d6f756e740060448201526064016106a8565b61185f565b34156115d257600080fd5b600060015b86811161162d57600b5461160f9082906115fb9062010000900461ffff1688612a34565b61ffff166116099190612a5a565b85611960565b6116199083612a5a565b91508061162581612b01565b9150506115d7565b50801561185d57600f546001600160a01b0316639dc29fac33601461165385600d612a86565b61165d9190612a72565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156116a357600080fd5b505af11580156116b7573d6000803e3d6000fd5b5050600d546001600160a01b0316915063c8d88afe905060146116db846007612a86565b6116e59190612a72565b6040518263ffffffff1660e01b815260040161170391815260200190565b600060405180830381600087803b15801561171d57600080fd5b505af1158015611731573d6000803e3d6000fd5b5050600f546001600160a01b031691506323b872dd9050336012546001600160a01b03166014611762866007612a86565b61176c9190612a72565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156117bb57600080fd5b505af11580156117cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f39190612851565b50600f60009054906101000a90046001600160a01b03166001600160a01b0316639c47ee3b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b505050505b505b604080518082018252851515815261ffff878116602080840191825233600081815260068352868120600b80548716835290845287822096518754955187166101000262ffff00199115159190911662ffffff1990961695909517949094179095558254908552600790915293909220805461ffff191693821693909317909255805487928392916002916118fd9185916201000090910416612a34565b92506101000a81548161ffff021916908361ffff1602179055508561191f3390565b6001600160a01b03167faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143560405160405180910390a350506001805550505050565b6000600561196f836002612a86565b6119799190612a72565b8311611990575069043c33c19375648000006110f7565b600561199d836003612a86565b6119a79190612a72565b83116119be575069098774738bc8222000006110f7565b60056119cb836004612a86565b6119d59190612a72565b83116119ec57506910f0cf064dd5920000006110f7565b818311611a04575069163c0fb846284fa000006110f7565b5060035492915050565b6000546001600160a01b03163314611a565760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611ac05760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b6001600160a01b038116611b255760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106a8565b61070781611f95565b6000546001600160a01b0316331480611b565750336000908152600c602052604090205460ff165b611ba25760405162461bcd60e51b815260206004820152601960248201527f4f6e6c792061646d696e732063616e2063616c6c20746869730000000000000060448201526064016106a8565b61070781611ffb565b60025460ff1615611bf15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b60026001541415611c445760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106a8565b6002600155323314611c835760405162461bcd60e51b81526020600482015260086024820152674f6e6c7920454f4160c01b60448201526064016106a8565b611c8c33611ffb565b60018055565b6000546001600160a01b03163314611cda5760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600b805461ffff909216620100000263ffff000019909216919091179055565b6000546001600160a01b03163314611d425760405162461bcd60e51b81526020600482018190526024820152600080516020612bac83398151915260448201526064016106a8565b600f80546001600160a01b039687166001600160a01b031991821617909155600e8054958716958216959095179094556010805493861693851693909317909255600d805491851691841682179055601180548416909117905560138054919093169116179055565b60408051808201909152600080825260208201526001600160a01b03821660009081526007602052604090205461ffff16611e285760405162461bcd60e51b815260206004820152601260248201527f6e6f2070656e64696e6720636f6d6d697473000000000000000000000000000060448201526064016106a8565b506001600160a01b03166000908152600660209081526040808320600783528184205461ffff90811685529083529281902081518083019092525460ff81161515825261010090049092169082015290565b60025460ff1615611ec05760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106a8565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ef53390565b6040516001600160a01b03909116815260200160405180910390a1565b60025460ff16611f645760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016106a8565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ef5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082611ff28584612506565b14949350505050565b6001600160a01b03811660009081526007602052604090205461ffff16806120595760405162461bcd60e51b8152602060048201526011602482015270139bc81c195b991a5b99c818dbdb5b5a5d607a1b60448201526064016106a8565b61ffff81166000908152600860205260409020546120b95760405162461bcd60e51b815260206004820152601360248201527f72616e646f6d2073656564206e6f74207365740000000000000000000000000060448201526064016106a8565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612887565b6001600160a01b038416600090815260066020908152604080832061ffff80881685529083529281902081518083019092525460ff81161515825261010090048316918101829052600b80549495509093919290916002916121a29185916201000090910416612aa5565b92506101000a81548161ffff021916908361ffff1602179055506000816020015161ffff1667ffffffffffffffff8111156121df576121df612b72565b604051908082528060200260200182016040528015612208578160200160208202803683370190505b5061ffff85166000908152600860205260408120549192505b836020015161ffff168110156123bd578461223b81612adf565b95505081876040516020016122639291909182526001600160a01b0316602082015260400190565b6040516020818303038152906040528051906020012060001c91506000612289836125b2565b90508584838151811061229e5761229e612b5c565b61ffff90921660209283029190910190910152845115806122d15750876001600160a01b0316816001600160a01b031614155b15612341576010546040516340c10f1960e01b81526001600160a01b03838116600483015260248201869052909116906340c10f1990604401600060405180830381600087803b15801561232457600080fd5b505af1158015612338573d6000803e3d6000fd5b505050506123aa565b601054600d546040516340c10f1960e01b81526001600160a01b039182166004820152602481018690529116906340c10f1990604401600060405180830381600087803b15801561239157600080fd5b505af11580156123a5573d6000803e3d6000fd5b505050505b50806123b581612b01565b915050612221565b506010546040516335ca838b60e01b81526001600160a01b03909116906335ca838b906123ee908590600401612a21565b600060405180830381600087803b15801561240857600080fd5b505af115801561241c573d6000803e3d6000fd5b5050505082600001511561248f57600d54604051630463b97d60e11b81526001600160a01b03909116906308c772fa9061245c90899086906004016129f7565b600060405180830381600087803b15801561247657600080fd5b505af115801561248a573d6000803e3d6000fd5b505050505b6001600160a01b038616600081815260066020908152604080832061ffff8a1684528252808320805462ffffff191690558383526007909152808220805461ffff19169055845190519092917faf67cde32876f45d0ccb318d8ddb3e26990a5bfce179cec382204ceddf93143591a3505050505050565b600081815b84518110156125aa57600085828151811061252857612528612b5c565b6020026020010151905080831161256a576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612597565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b50806125a281612b01565b91505061250b565b509392505050565b60105460408051630278162160e51b815290516000926001600160a01b031691634f02c42091600480830192602092919082900301818787803b1580156125f857600080fd5b505af115801561260c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126309190612887565b61ffff16601060009054906101000a90046001600160a01b03166001600160a01b0316634018b1f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561268257600080fd5b505afa158015612696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ba91906128ab565b1015612773576126cf600a60f584901c612b1c565b156126da57336110f7565b600d54604051633b1f4e8760e11b8152609084901c60048201526000916001600160a01b03169063763e9d0e9060240160206040518083038186803b15801561272257600080fd5b505afa158015612736573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061275a91906127a6565b90506001600160a01b0381166110f757335b9392505050565b336110f7565b919050565b803561277981612b9d565b60006020828403121561279b57600080fd5b813561276c81612b88565b6000602082840312156127b857600080fd5b815161276c81612b88565b600080600080600060a086880312156127db57600080fd5b85356127e681612b88565b945060208601356127f681612b88565b9350604086013561280681612b88565b9250606086013561281681612b88565b9150608086013561282681612b88565b809150509295509295909350565b60006020828403121561284657600080fd5b813561276c81612b9d565b60006020828403121561286357600080fd5b815161276c81612b9d565b60006020828403121561288057600080fd5b5035919050565b60006020828403121561289957600080fd5b815161ffff8116811461276c57600080fd5b6000602082840312156128bd57600080fd5b5051919050565b600080604083850312156128d757600080fd5b8235915060208301356128e981612b9d565b809150509250929050565b6000806040838503121561290757600080fd5b50508035926020909101359150565b60008060008060008060a0878903121561292f57600080fd5b863595506020870135945060408701359350606087013567ffffffffffffffff8082111561295c57600080fd5b818901915089601f83011261297057600080fd5b81358181111561297f57600080fd5b8a60208260051b850101111561299457600080fd5b6020830195508094505050506129ac6080880161277e565b90509295509295509295565b600081518084526020808501945080840160005b838110156129ec57815161ffff16875295820195908201906001016129cc565b509495945050505050565b6001600160a01b0383168152604060208201526000612a1960408301846129b8565b949350505050565b60208152600061276c60208301846129b8565b600061ffff808316818516808303821115612a5157612a51612b30565b01949350505050565b60008219821115612a6d57612a6d612b30565b500190565b600082612a8157612a81612b46565b500490565b6000816000190483118215151615612aa057612aa0612b30565b500290565b600061ffff83811690831681811015612ac057612ac0612b30565b039392505050565b600082821015612ada57612ada612b30565b500390565b600061ffff80831681811415612af757612af7612b30565b6001019392505050565b6000600019821415612b1557612b15612b30565b5060010190565b600082612b2b57612b2b612b46565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461070757600080fd5b801515811461070757600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209351a44e9547a161d1b9a73f5ee52eeb12b2e4c692dd94d0abd77c2534f09ef764736f6c63430008070033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.