ERC-721
Overview
Max Total Supply
310 CRYPTOBEES
Holders
57
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 CRYPTOBEESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CryptoBees
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./ICryptoBees.sol"; import "./IHoney.sol"; import "./IHive.sol"; import "./Traits.sol"; import "./Randomizer.sol"; import "./IAttack.sol"; contract CryptoBees is ICryptoBees, ERC721Enumerable, Ownable, ReentrancyGuard, Pausable { using Strings for uint256; address private constant BEEKEEPER_1 = 0x8F0025FF54879B322582CCBebB1f391b1d5a1FBf; address private constant BEEKEEPER_2 = 0xd3feEb12Feb6f371dF5e5587029212A6e2EFC109; address private constant BEEKEEPER_3 = 0x0219b3c14d7A374A89Cf8aB3C09036C030B91220; address private constant BEEKEEPER_4 = 0xeaF280E23995a65FEa71C726c213e6E8C4612817; address private constant BEAR = 0xE9FA9e12293B4BdBa893922bB35B784eE0ff3a9D; IERC20 private woolContract = IERC20(0x5B903d60E07Eea4dcd8E6A83aEC23722B0A89ab8); IHoney private honeyContract; IHive private hiveContract; Randomizer private randomizerContract; Traits private traitsContract; IAttack private attackContract; // there will only ever be (roughly) 0.5 billion $HONEY earned through staking uint256 public constant MAXIMUM_GLOBAL_HONEY = 500000000; // amount of $HONEY earned so far uint256 public totalHoneyEarned; // where we at with revealing uint256 public unrevealedTokenIndex; // number of tokens have been minted so far uint256 public minted; uint256 public bearsMinted; uint256 public beekeepersMinted; // mapping from tokenId to a struct containing the token's traits + data mapping(uint256 => Token) public tokenData; // mapping of $HONEY pots mapping(address => uint256) public pot; //events event Mint(address indexed owner, uint256 tokenId, uint256 blockNumber); event HoneyTransfer(address indexed owner, uint256 owed); event MintRevealed(address indexed owner, uint256 indexed tokenId, uint256 _type, bool staked); constructor() ERC721("CryptoBees Game", "CRYPTOBEES") {} function setContracts( address honey, address hive, address traits, address attack, address rand ) external onlyOwner { honeyContract = IHoney(honey); traitsContract = Traits(traits); hiveContract = IHive(hive); attackContract = IAttack(attack); randomizerContract = Randomizer(rand); } /** * mint a token - 90% Bee, 9% Bear, 1% Beekeeper */ function mintForEth(uint256 amount, bool stake) external payable whenNotPaused nonReentrant { traitsContract.mintForEth(_msgSender(), amount, minted, msg.value, stake); } function mintForEthWhitelist( uint256 amount, bytes32[] calldata _merkleProof, bool stake ) external payable whenNotPaused nonReentrant { traitsContract.mintForEthWhitelist(_msgSender(), amount, minted, msg.value, _merkleProof, stake); } function mintForHoney(uint256 amount, bool stake) external whenNotPaused nonReentrant { traitsContract.mintForHoney(_msgSender(), amount, minted, stake); } function mintForWool(uint256 amount, bool stake) external whenNotPaused nonReentrant { uint256 totalCost = traitsContract.mintForWool(_msgSender(), amount, minted, stake); woolContract.transferFrom(msg.sender, address(this), totalCost); } function mint( address _owner, uint256 tokenId, bool stake ) external { require(_msgSender() == address(traitsContract), "BEES:DONT CHEAT:MINT"); randomizerContract.createCommit(); minted = tokenId; if (!stake) { _safeMint(_owner, minted); } else { _safeMint(address(hiveContract), minted); hiveContract.addToWaitingRoom(_owner, tokenId); } emit Mint(_owner, tokenId, block.number); tryReveal(); } /** * Revealing of next token in line * if the token is staked & is bee move it to the next available hive */ function tryReveal() public returns (bool) { if (unrevealedTokenIndex >= minted) return false; if (tokenData[unrevealedTokenIndex + 1]._type != 0) return true; uint256 seed = randomizerContract.revealSeed(unrevealedTokenIndex); if (seed == 0) return false; address trueOwner = ownerOf(unrevealedTokenIndex + 1) == address(hiveContract) ? hiveContract.getWaitingRoomOwner(unrevealedTokenIndex + 1) : ownerOf(unrevealedTokenIndex + 1); Token memory t = traitsContract.generate(seed); tokenData[unrevealedTokenIndex + 1] = t; if (t._type == 2) bearsMinted++; if (t._type == 3) beekeepersMinted++; if (t._type == 1 && ownerOf(unrevealedTokenIndex + 1) == address(hiveContract)) { hiveContract.removeFromWaitingRoom(unrevealedTokenIndex + 1, 0); } emit MintRevealed(trueOwner, unrevealedTokenIndex + 1, t._type, ownerOf(unrevealedTokenIndex + 1) == address(hiveContract) ? true : false); unrevealedTokenIndex += 1; return true; } /** * reveal tokens in bulk */ function bulkReveal(uint256 n) public { for (uint256 i = 0; i < n; i++) { tryReveal(); } } function getMinted() external view returns (uint256 m) { m = minted; } /** * enables owner to pause / unpause minting */ function setPaused(bool _paused) external onlyOwner { if (_paused) _pause(); else _unpause(); } function setUnrevealedTokenIndex(uint256 _index) external onlyOwner { unrevealedTokenIndex = _index; } /** * adds honey to a address pot when clamin bee honey or when stealing/collecting */ function increaseTokensPot(address _owner, uint256 amount) external { require(_msgSender() == address(attackContract) || _msgSender() == address(hiveContract), "BEES:DONT CHEAT:POT"); require(totalHoneyEarned + amount < MAXIMUM_GLOBAL_HONEY, "NO MORE HONEY"); totalHoneyEarned += amount; pot[_owner] += amount; } /** * updates bear/beekeeper timestamps */ function updateTokensLastAttack( uint256 tokenId, uint48 timestamp, uint48 till ) external { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); require(_msgSender() == address(attackContract), "BEES:DONT CHEAT:ATTACK"); tokenData[tokenId].lastAttackTimestamp = timestamp; tokenData[tokenId].cooldownTillTimestamp = till; } /** * returns sender pot */ function getPotValue() public view returns (uint256) { return pot[_msgSender()]; } /** * transfers pot to sendrs address - honey in the pot is not stored in 18 decimals */ function transferPotToAddress() public { if (pot[_msgSender()] > 0) { uint256 amount = pot[_msgSender()] * 1 ether; pot[_msgSender()] = 0; honeyContract.mint(_msgSender(), amount); emit HoneyTransfer(_msgSender(), amount); } } /** * returns all your unstaked tokens */ function getTokenIds(address _owner) public view returns (uint256[] memory _tokensOfOwner) { _tokensOfOwner = new uint256[](balanceOf(_owner)); for (uint256 i; i < balanceOf(_owner); i++) { _tokensOfOwner[i] = tokenOfOwnerByIndex(_owner, i); } } function getOwnerOf(uint256 tokenId) external view returns (address) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); return ownerOf(tokenId); } function doesExist(uint256 tokenId) external view returns (bool exists) { exists = _exists(tokenId); } function getTokenData(uint256 tokenId) external view returns (Token memory token) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); token = tokenData[tokenId]; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: Nonexistent token"); return traitsContract.tokenURI(tokenId); } /** * withdraw eth */ function withdrawAll() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "Insufficent balance"); _widthdraw(BEAR, ((balance * 5) / 100)); balance = address(this).balance; _widthdraw(BEEKEEPER_1, ((balance * 25) / 100)); _widthdraw(BEEKEEPER_2, ((balance * 25) / 100)); _widthdraw(BEEKEEPER_3, ((balance * 25) / 100)); _widthdraw(BEEKEEPER_4, ((balance * 25) / 100)); } function _widthdraw(address _address, uint256 _amount) private { (bool success, ) = _address.call{value: _amount}(""); require(success, "Failed to widthdraw Ether"); } /// @notice withdraw ERC20 tokens from the contract /// @param erc20TokenAddress the ERC20 token address /// @param recipient who will get the tokens /// @param amount how many tokens function withdrawERC20( address erc20TokenAddress, address recipient, uint256 amount ) external onlyOwner { IERC20 erc20Contract = IERC20(erc20TokenAddress); bool sent = erc20Contract.transfer(recipient, amount); require(sent, "ERC20_WITHDRAW_FAILED"); } function performTransferFrom( address from, address to, uint256 tokenId ) external { // Hardcode the Hive's approval so that users don't have to waste gas approving if (_msgSender() != address(hiveContract)) require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } function performSafeTransferFrom( address from, address to, uint256 tokenId ) external { // Hardcode the Hive's approval so that users don't have to waste gas approving if (_msgSender() != address(hiveContract)) require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, ""); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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); } }
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; // import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface ICryptoBees { struct Token { uint8 _type; uint8 color; uint8 eyes; uint8 mouth; uint8 nose; uint8 hair; uint8 accessory; uint8 feelers; uint8 strength; uint48 lastAttackTimestamp; uint48 cooldownTillTimestamp; } function getMinted() external view returns (uint256 m); function increaseTokensPot(address _owner, uint256 amount) external; function updateTokensLastAttack( uint256 tokenId, uint48 timestamp, uint48 till ) external; function mint( address addr, uint256 tokenId, bool stake ) external; function setPaused(bool _paused) external; function getTokenData(uint256 tokenId) external view returns (Token memory token); function getOwnerOf(uint256 tokenId) external view returns (address); function doesExist(uint256 tokenId) external view returns (bool exists); function performTransferFrom( address sender, address recipient, uint256 amount ) external; function performSafeTransferFrom( address from, address to, uint256 tokenId ) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.9; interface IHoney { function mint(address to, uint256 amount) external; function mintGiveaway(address[] calldata addresses, uint256 amount) external; function burn(address from, uint256 amount) external; function disableGiveaway() external; function addController(address controller) external; function removeController(address controller) external; }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.9; interface IHive { struct Bee { address owner; uint32 tokenId; uint48 since; uint8 index; } struct BeeHive { uint32 startedTimestamp; uint32 lastCollectedHoneyTimestamp; uint32 hiveProtectionBears; uint32 lastStolenHoneyTimestamp; uint32 collectionAmount; uint32 collectionAmountPerBee; uint8 successfulAttacks; uint8 totalAttacks; mapping(uint256 => Bee) bees; uint16[] beesArray; } function addManyToHive( address account, uint16[] calldata tokenIds, uint16[] calldata hiveIds ) external; function claimManyFromHive( uint16[] calldata tokenIds, uint16[] calldata hiveIds, uint16[] calldata newHiveIds ) external; function addToWaitingRoom(address account, uint256 tokenId) external; function removeFromWaitingRoom(uint256 tokenId, uint256 hiveId) external; function setRescueEnabled(bool _enabled) external; function setPaused(bool _paused) external; function setBeeSince( uint256 hiveId, uint256 tokenId, uint48 since ) external; function calculateBeeOwed(uint256 hiveId, uint256 tokenId) external view returns (uint256 owed); function incSuccessfulAttacks(uint256 hiveId) external; function incTotalAttacks(uint256 hiveId) external; function setBearAttackData( uint256 hiveId, uint32 timestamp, uint32 protection ) external; function setKeeperAttackData( uint256 hiveId, uint32 timestamp, uint32 collected, uint32 collectedPerBee ) external; function getLastStolenHoneyTimestamp(uint256 hiveId) external view returns (uint256 lastStolenHoneyTimestamp); function getHiveProtectionBears(uint256 hiveId) external view returns (uint256 hiveProtectionBears); function isHiveProtectedFromKeepers(uint256 hiveId) external view returns (bool); function getHiveOccupancy(uint256 hiveId) external view returns (uint256 occupancy); function getBeeSinceTimestamp(uint256 hiveId, uint256 tokenId) external view returns (uint256 since); function getBeeTokenId(uint256 hiveId, uint256 index) external view returns (uint256 tokenId); function getHiveAge(uint256 hiveId) external view returns (uint32); function getHiveSuccessfulAttacks(uint256 hiveId) external view returns (uint8); function getWaitingRoomOwner(uint256 tokenId) external view returns (address); function resetHive(uint256 hiveId) external; }
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "hardhat/console.sol"; import "./ICryptoBees.sol"; import "./IHoney.sol"; import "./Base64.sol"; contract Traits is Ownable { using Strings for uint256; using MerkleProof for bytes32[]; // struct to store each trait's data for metadata and rendering struct Trait { string name; string png; } string unrevealedImage; ICryptoBees beesContract; IHoney honeyContract; // mint price ETH uint256 public constant MINT_PRICE = .06 ether; uint256 public constant MINT_PRICE_DISCOUNT = .055 ether; uint256 public constant MINTS_PER_WHITELIST = 6; // used to ensure there are no duplicates mapping(uint256 => uint256) public existingCombinations; // mint price HONEY uint256 public constant MINT_PRICE_HONEY = 3000 ether; // mint price WOOL uint256 public mintPriceWool = 7440 ether; // max number of tokens that can be minted uint256 public constant MAX_TOKENS = 40000; // number of tokens that can be claimed for ETH uint256 public constant PAID_TOKENS = 10000; /// @notice controls if mintWithEthPresale is paused bool public mintWithEthPresalePaused = true; /// @notice controls if mintWithWool is paused bool public mintWithWoolPaused = true; /// @notice controls if mainMint is paused bool public mintWithEthPaused = true; mapping(address => uint8) public whitelistMints; bytes32 private merkleRootWhitelist; string[8] _traitTypes = ["Body", "Color", "Eyes", "Mouth", "Nose", "Hair", "Accessories", "Feelers"]; // storage of each traits name and base64 PNG data mapping(uint8 => mapping(uint8 => Trait)) public traitData; string[4] _strengths = ["5", "6", "7", "8"]; // 0 - 7 are associated with Bees, 8 - 18 are associated with Bears uint8[][24] public rarities; // 0 - 7 are associated with Bees, 8 - 18 are associated with Bears uint8[][24] public aliases; constructor() { // colours rarities[1] = [255, 215, 122, 76, 30, 15]; aliases[1] = [0, 0, 0, 0, 0, 0]; // eyes rarities[2] = [255, 217, 217, 230, 217, 204, 230, 230, 230, 230, 230, 191, 191, 191, 191]; aliases[2] = [0, 0, 1, 2, 3, 4, 0, 1, 2, 6, 7, 1, 1, 2, 5]; // mouth rarities[3] = [255, 202, 191, 181, 215, 248, 199, 194, 189, 184, 179, 217, 174, 174, 174, 174, 174]; aliases[3] = [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 10]; // nose rarities[4] = [255, 230, 204, 192, 179, 179, 179]; aliases[4] = [0, 0, 1, 2, 0, 1, 3]; // hair rarities[5] = [255, 127, 204, 230, 115, 115, 115, 115, 115]; aliases[5] = [0, 0, 1, 3, 5, 4, 1, 1, 2]; // accessory rarities[6] = [255, 99, 53]; aliases[6] = [0, 0, 0]; // feelers rarities[7] = [255, 140, 204, 102, 179, 89, 89]; aliases[7] = [0, 0, 1, 2, 0, 1, 3]; //bear - colours rarities[9] = [255, 153, 153]; aliases[9] = [0, 0, 1]; //bear - eyes rarities[10] = [255, 220, 184, 148, 222, 186, 151, 225, 189, 153, 117, 240, 204, 168, 133, 145, 145, 97, 97]; aliases[10] = [0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 3, 6, 10, 14]; //bear - mouth rarities[11] = [255, 235, 184, 204, 225, 174, 245, 245, 245, 184, 184, 122]; aliases[11] = [0, 0, 1, 2, 3, 4, 0, 1, 6, 2, 3, 5]; //bear - nose rarities[12] = [255, 230, 204, 179, 179, 179, 179]; aliases[12] = [0, 0, 1, 3, 1, 2, 3]; //bear - hat/hair rarities[13] = [255, 204, 204, 204, 102, 102, 102, 102]; aliases[13] = [0, 1, 0, 2, 3, 2, 4, 4]; //bear - accessory rarities[14] = [255, 89, 89, 53, 53, 35, 35]; aliases[14] = [0, 0, 1, 1, 2, 2, 3]; // bear strength rarities[15] = [255, 102, 153, 51]; aliases[15] = [0, 0, 1, 1]; //beekeeper - color rarities[17] = [255, 153, 153, 153, 76, 76]; aliases[17] = [0, 0, 1, 1, 2, 2]; //beekeeper - eyes rarities[18] = [255, 170, 142, 113]; aliases[18] = [0, 0, 1, 2]; //beekeeper - mouth rarities[19] = [255, 243, 230, 217, 204, 192, 179]; aliases[19] = [0, 0, 1, 2, 3, 4, 5]; //beekeeper - hair rarities[21] = [255, 230, 230, 230, 230, 230, 230, 230, 230]; aliases[21] = [0, 0, 1, 1, 3, 4, 3, 1, 0]; //beekeeper - accessory rarities[22] = [255, 122, 122, 122, 122, 122, 122, 122, 122, 122, 92, 30]; aliases[22] = [0, 0, 1, 1, 4, 3, 0, 2, 2, 1, 5, 4]; //beekeeper skill rarities[23] = [255, 102, 153, 51]; aliases[23] = [0, 0, 1, 2]; } function setContracts(address _BEES, address _HONEY) external onlyOwner { honeyContract = IHoney(_HONEY); beesContract = ICryptoBees(_BEES); } /** MINTING */ function mintForEth( address addr, uint256 amount, uint256 minted, uint256 value, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); mintCheck(addr, amount, minted, false, value, true); for (uint256 i = 1; i <= amount; i++) { beesContract.mint(addr, minted + i, stake); } } function mintForEthWhitelist( address addr, uint256 amount, uint256 minted, uint256 value, bytes32[] calldata _merkleProof, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); bytes32 leaf = keccak256(abi.encodePacked(addr)); require(MerkleProof.verify(_merkleProof, merkleRootWhitelist, leaf), "You are not on the whitelist!"); mintCheck(addr, amount, minted, true, value, true); for (uint256 i = 1; i <= amount; i++) { beesContract.mint(addr, minted + i, stake); whitelistMints[addr]++; } } function mintForHoney( address addr, uint256 amount, uint256 minted, bool stake ) external { require(_msgSender() == address(beesContract), "DONT CHEAT!"); mintCheck(addr, amount, minted, false, 0, false); uint256 totalHoneyCost = 0; for (uint256 i = 1; i <= amount; i++) { totalHoneyCost += mintCost(minted + i); beesContract.mint(addr, minted + i, stake); } honeyContract.burn(addr, totalHoneyCost); } function mintForWool( address addr, uint256 amount, uint256 minted, bool stake ) external returns (uint256 totalWoolCost) { require(_msgSender() == address(beesContract), "DONT CHEAT!"); require(!mintWithWoolPaused, "WOOL minting paused"); require(minted + amount <= PAID_TOKENS, "All tokens on-sale already sold"); mintCheck(addr, amount, minted, false, 0, false); for (uint256 i = 1; i <= amount; i++) { totalWoolCost += mintPriceWool; beesContract.mint(addr, minted + i, stake); } } function mintCheck( address addr, uint256 amount, uint256 minted, bool presale, uint256 value, bool isEth ) private view { require(tx.origin == addr, "Only EOA"); require(minted + amount <= MAX_TOKENS, "All tokens minted"); if (presale) { require(!mintWithEthPresalePaused, "Presale mint paused"); require(amount > 0 && whitelistMints[addr] + amount <= MINTS_PER_WHITELIST, "Only limited amount for WL mint"); } else { require(amount > 0 && amount <= 10, "Invalid mint amount sale"); } if (isEth) { require(minted + amount <= PAID_TOKENS, "All tokens on-sale already sold"); if (presale) require(amount * MINT_PRICE_DISCOUNT == value, "Invalid payment amount presale"); else { require(amount * MINT_PRICE == value, "Invalid payment amount sale"); require(!mintWithEthPaused, "Public sale currently paused"); } } } function getTokenTextType(uint256 tokenId) external view returns (string memory) { require(beesContract.doesExist(tokenId), "ERC721Metadata: Nonexistent token"); return _getTokenTextType(tokenId); } function _getTokenTextType(uint256 tokenId) private view returns (string memory) { uint8 _type = beesContract.getTokenData(tokenId)._type; if (_type == 1) return "BEE"; else if (_type == 2) return "BEAR"; else if (_type == 3) return "BEEKEEPER"; else return "NOT REVEALED"; } function setPresaleMintPaused(bool _paused) external onlyOwner { mintWithEthPresalePaused = _paused; } function setWoolMintPaused(bool _paused) external onlyOwner { mintWithWoolPaused = _paused; } function setMintWithEthPaused(bool _paused) external onlyOwner { mintWithEthPaused = _paused; } function setWoolMintPrice(uint256 _price) external onlyOwner { mintPriceWool = _price; } function setMerkleRoot(bytes32 root) public onlyOwner { merkleRootWhitelist = root; } /** * generates traits for a specific token, checking to make sure it's unique * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of traits for the given token ID */ function generate(uint256 seed) public view returns (ICryptoBees.Token memory) { require(_msgSender() == address(beesContract), "DONT CHEAT!"); ICryptoBees.Token memory t = selectTraits(seed); return t; } /** * selects the species and all of its traits based on the seed value * @param seed a pseudorandom 256 bit number to derive traits from * @return t - a struct of randomly selected traits */ function selectTraits(uint256 seed) internal view returns (ICryptoBees.Token memory t) { uint256 num = ((seed & 0xFFFF) % 100); t._type = 1; if (num == 0) t._type = 3; else if (num < 10) t._type = 2; uint8 shift = t._type > 0 ? ((t._type - 1) * 8) : 0; seed >>= 16; t.color = selectTrait(uint16(seed & 0xFFFF), 1 + shift); seed >>= 16; t.eyes = selectTrait(uint16(seed & 0xFFFF), 2 + shift); seed >>= 16; t.mouth = selectTrait(uint16(seed & 0xFFFF), 3 + shift); if (t._type != 3) { seed >>= 16; t.nose = selectTrait(uint16(seed & 0xFFFF), 4 + shift); } seed >>= 16; t.hair = selectTrait(uint16(seed & 0xFFFF), 5 + shift); seed >>= 16; t.accessory = selectTrait(uint16(seed & 0xFFFF), 6 + shift); if (t._type == 1) { seed >>= 16; t.feelers = selectTrait(uint16(seed & 0xFFFF), 7); } else { seed >>= 16; t.strength = selectTrait(uint16(seed & 0xFFFF), 7 + shift); } } /** * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup * ensuring O(1) instead of O(n) reduces mint cost by more than 50% * probability & alias tables are generated off-chain beforehand * @param seed portion of the 256 bit seed to remove trait correlation * @param traitType the trait type to select a trait for * @return the ID of the randomly selected trait */ function selectTrait(uint16 seed, uint8 traitType) internal view returns (uint8) { uint8 trait = uint8(seed) % uint8(rarities[traitType].length); if (seed >> 8 < rarities[traitType][trait]) return trait; return aliases[traitType][trait]; } /** * converts a struct to a 256 bit hash to check for uniqueness * @param t the struct to pack into a hash * @return the 256 bit hash of the struct */ function structToHash(ICryptoBees.Token memory t) internal pure returns (uint256) { return uint256(bytes32(abi.encodePacked(t._type, t.color, t.eyes, t.mouth, t.nose, t.hair, t.accessory, t.feelers, t.strength))); } /** * Gen 0 can be mint for honey too * @param tokenId the ID to check the cost of to mint * @return the cost of the given token ID */ function mintCost(uint256 tokenId) public pure returns (uint256) { if (tokenId <= 20000) return MINT_PRICE_HONEY; if (tokenId <= 30000) return 7500 ether; return 15000 ether; } /** * administrative to upload the names and images associated with each trait * @param traitType the trait type to upload the traits for (see traitTypes for a mapping) * @param traitNames the names and base64 encoded PNGs for each trait * @param traitImages the names and base64 encoded PNGs for each trait */ function uploadTraits( uint8 traitType, string[] calldata traitNames, string[] calldata traitImages ) external onlyOwner { require(traitNames.length == traitImages.length, "Mismatched inputs"); for (uint256 i = 0; i < traitNames.length; i++) { traitData[traitType][uint8(i)] = Trait(traitNames[i], traitImages[i]); } } function uploadUnrevealImage(string calldata image) external onlyOwner { unrevealedImage = image; } // function random(uint256 seed) internal view returns (uint256) { // return uint256(keccak256(abi.encodePacked(seed))); // } /** RENDER */ /** * generates an <image> element using base64 encoded PNGs * @param trait the trait storing the PNG data * @return the <image> element */ function drawTrait(Trait memory trait) internal pure returns (string memory) { if (bytes(trait.png).length == 0) return ""; return string( abi.encodePacked( '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,', trait.png, '"/>' ) ); } /** * generates an <image> element using base64 encoded PNGs * @return the <image> element */ function drawUnrevealedImage() internal view returns (string memory) { return string( abi.encodePacked( '<image x="4" y="4" width="32" height="32" image-rendering="pixelated" preserveAspectRatio="xMidYMid" xlink:href="data:image/png;base64,', unrevealedImage, '"/>' ) ); } // /** // * generates an entire SVG by composing multiple <image> elements of PNGs // * @param tokenId the ID of the token to generate an SVG for // * @return a valid SVG of the Sheep / Wolf // */ function drawSVG(uint256 tokenId) public view returns (string memory) { ICryptoBees.Token memory s = beesContract.getTokenData(tokenId); uint8 shift = s._type > 0 ? ((s._type - 1) * 8) : 0; string memory svgString; if (s._type == 0) svgString = drawUnrevealedImage(); else { svgString = string( abi.encodePacked( drawTrait(traitData[0 + shift][0]), drawTrait(traitData[1 + shift][s.color]), drawTrait(traitData[2 + shift][s.eyes]), drawTrait(traitData[3 + shift][s.mouth]), drawTrait(traitData[4 + shift][s.nose]), drawTrait(traitData[5 + shift][s.hair]), drawTrait(traitData[6 + shift][s.accessory]), drawTrait(traitData[7][s.feelers]) ) ); } return string( abi.encodePacked( '<svg id="cryptobees" width="100%" height="100%" version="1.1" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">', svgString, "</svg>" ) ); } /** * generates an attribute for the attributes array in the ERC721 metadata standard * @param traitType the trait type to reference as the metadata key * @param value the token's trait associated with the key * @return a JSON dictionary for the single attribute */ function attributeForTypeAndValue(string memory traitType, string memory value) internal pure returns (string memory) { return string(abi.encodePacked('{"trait_type":"', traitType, '","value":"', value, '"}')); } /** * generates an array composed of all the individual traits and values * @param tokenId the ID of the token to compose the metadata for * @return a JSON array of all of the attributes for given token ID */ function compileAttributes(uint256 tokenId) public view returns (string memory) { ICryptoBees.Token memory t = beesContract.getTokenData(tokenId); string memory textType = _getTokenTextType(tokenId); uint8 shift = t._type > 0 ? ((t._type - 1) * 8) : 0; string memory traits; traits = string( abi.encodePacked( attributeForTypeAndValue(_traitTypes[1], traitData[1 + shift][t.color].name), ",", attributeForTypeAndValue(_traitTypes[2], traitData[2 + shift][t.eyes].name), ",", attributeForTypeAndValue(_traitTypes[3], traitData[3 + shift][t.mouth].name), ",", attributeForTypeAndValue(_traitTypes[5], traitData[5 + shift][t.hair].name), ",", attributeForTypeAndValue(_traitTypes[6], traitData[6 + shift][t.accessory].name), "," ) ); if (t._type != 3) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue(_traitTypes[4], traitData[4 + shift][t.nose].name), ",")); } if (t._type == 1) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue(_traitTypes[7], traitData[7][t.feelers].name), ",")); } else if (t._type == 2) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue("Strength", _strengths[t.strength]), ",")); } else if (t._type == 3) { traits = string(abi.encodePacked(traits, attributeForTypeAndValue("Skill", _strengths[t.strength]), ",")); } return string( abi.encodePacked( "[", traits, '{"trait_type":"Generation","value":', tokenId <= PAID_TOKENS ? '"Gen 0"' : '"Gen 1"', '},{"trait_type":"Type","value":"', textType, '"}]' ) ); } function tokenURI(uint256 tokenId) public view returns (string memory) { // require(beesContract.doesExist(tokenId), "ERC721Metadata: Nonexistent token"); string memory textType = _getTokenTextType(tokenId); string memory metadata = string( abi.encodePacked( '{"name": "', textType, " #", uint256(tokenId).toString(), '", "type": "', textType, '", "description": "People realized that the path to prosperity is to relocate to a farm. Some have bought sheep, some land but many ended up with nothing. $HONEY is the new opportunity.', '","image": "data:image/svg+xml;base64,', Base64.encode(bytes(drawSVG(tokenId))), '","attributes":', compileAttributes(tokenId), "}" ) ); return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(metadata)))); } }
//Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721 // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; import "./ICryptoBees.sol"; import "./Traits.sol"; import "./IAttack.sol"; contract Randomizer is Ownable { struct Commit { uint256 block; address sender; } mapping(uint256 => Commit) commits; mapping(address => bool) controllers; uint256 commitIndex; event CommitHash(address indexed sender, uint256 block, uint256 index); constructor() {} function createCommit() public { require(controllers[msg.sender], "Not permitted"); commits[commitIndex].block = block.number; commits[commitIndex].sender = tx.origin; commitIndex += 1; emit CommitHash(tx.origin, block.number, commitIndex - 1); } function reset(uint256 to) public onlyOwner { commitIndex = to; } function revealSeed(uint256 i) public view returns (uint256) { if (i < commitIndex && block.number > commits[i].block) return uint256(keccak256(abi.encode(commits[i].sender, i, blockhash(commits[i].block)))); return 0; } /** * enables an address * @param controller the address to enable */ function addController(address controller) external onlyOwner { controllers[controller] = true; } /** * disables an address * @param controller the address to disbale */ function removeController(address controller) external onlyOwner { controllers[controller] = false; } }
// SPDX-License-Identifier: MIT LICENSE pragma solidity ^0.8.9; interface IAttack { struct Settings { uint8 bearChance; uint8 beekeeperMultiplier; uint24 hiveProtectionBear; uint24 hiveProtectionKeeper; uint24 bearCooldownBase; uint24 bearCooldownPerHiveDay; uint24 beekeeperCooldownBase; uint24 beekeeperCooldownPerHiveDay; uint8 attacksToRestart; } struct UnresolvedAttack { uint24 tokenId; uint48 nonce; uint64 block; uint32 howMuch; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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.0 (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.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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 pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.9; library Base64 { string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ""; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); // solhint-disable-next-line no-inline-assembly assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))) resultPtr := add(resultPtr, 1) mstore(resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F))))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
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":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"owed","type":"uint256"}],"name":"HoneyTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"},{"indexed":false,"internalType":"bool","name":"staked","type":"bool"}],"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAXIMUM_GLOBAL_HONEY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bearsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beekeepersMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"bulkReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"doesExist","outputs":[{"internalType":"bool","name":"exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"m","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPotValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"feelers","type":"uint8"},{"internalType":"uint8","name":"strength","type":"uint8"},{"internalType":"uint48","name":"lastAttackTimestamp","type":"uint48"},{"internalType":"uint48","name":"cooldownTillTimestamp","type":"uint48"}],"internalType":"struct ICryptoBees.Token","name":"token","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getTokenIds","outputs":[{"internalType":"uint256[]","name":"_tokensOfOwner","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseTokensPot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForEthWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForHoney","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintForWool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"performSafeTransferFrom","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":"performTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"honey","type":"address"},{"internalType":"address","name":"hive","type":"address"},{"internalType":"address","name":"traits","type":"address"},{"internalType":"address","name":"attack","type":"address"},{"internalType":"address","name":"rand","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"setUnrevealedTokenIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"uint8","name":"color","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"mouth","type":"uint8"},{"internalType":"uint8","name":"nose","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"accessory","type":"uint8"},{"internalType":"uint8","name":"feelers","type":"uint8"},{"internalType":"uint8","name":"strength","type":"uint8"},{"internalType":"uint48","name":"lastAttackTimestamp","type":"uint48"},{"internalType":"uint48","name":"cooldownTillTimestamp","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHoneyEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferPotToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tryReveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedTokenIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint48","name":"timestamp","type":"uint48"},{"internalType":"uint48","name":"till","type":"uint48"}],"name":"updateTokensLastAttack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20TokenAddress","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600c8054610100600160a81b031916745b903d60e07eea4dcd8e6a83aec23722b0a89ab8001790553480156200003957600080fd5b50604080518082018252600f81526e43727970746f426565732047616d6560881b60208083019182528351808501909452600a84526943525950544f4245455360b01b908401528151919291620000939160009162000131565b508051620000a990600190602084019062000131565b505050620000c6620000c0620000db60201b60201c565b620000df565b6001600b55600c805460ff1916905562000214565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013f90620001d7565b90600052602060002090601f016020900481019282620001635760008555620001ae565b82601f106200017e57805160ff1916838001178555620001ae565b82800160010185558215620001ae579182015b82811115620001ae57825182559160200191906001019062000191565b50620001bc929150620001c0565b5090565b5b80821115620001bc5760008155600101620001c1565b600181811c90821680620001ec57607f821691505b602082108114156200020e57634e487b7160e01b600052602260045260246000fd5b50919050565b613b1080620002246000396000f3fe6080604052600436106102e45760003560e01c8063853828b611610190578063b7ab34ee116100dc578063d004b03611610095578063e8b721961161006f578063e8b7219614610973578063e985e9c514610993578063f2fde38b146109dc578063f63bf8bd146109fc57600080fd5b8063d004b03614610910578063d1a1beb41461093d578063dfbc15081461095d57600080fd5b8063b7ab34ee1461085a578063b88d4fde1461087a578063bfc628f41461089a578063c87b56dd146108ba578063ca00ed35146108da578063cf02f27e146108f057600080fd5b8063963cdc8411610149578063ac72200d11610123578063ac72200d146106e9578063b09afec1146106fe578063b4b5b48f1461072b578063b71a261a1461083857600080fd5b8063963cdc84146106a0578063a22cb465146106b3578063a92beeb0146106d357600080fd5b8063853828b61461061a578063898e8b001461062f5780638da5cb5b146106425780638ec4e67614610660578063929ea98e1461067657806395d89b411461068b57600080fd5b806342842e0e1161024f5780635c975abb11610208578063715018a6116101e2578063715018a6146105985780637883e14e146105ad578063799e898e146105cd57806383638710146105fa57600080fd5b80635c975abb146105405780636352211e1461055857806370a082311461057857600080fd5b806342842e0e1461048a57806344004cc1146104aa57806345ee95bf146104ca5780634944d63d146104ea5780634f02c4201461050a5780634f6ccce71461052057600080fd5b806318160ddd116102a157806318160ddd146103e057806318a1e017146103f55780631b23b016146104155780631cbda4d91461042a57806323b872dd1461044a5780632f745c591461046a57600080fd5b806301c8b525146102e957806301ffc9a71461031457806306fdde0314610344578063081812fc14610366578063095ea7b31461039e57806316c38b3c146103c0575b600080fd5b3480156102f557600080fd5b50610301631dcd650081565b6040519081526020015b60405180910390f35b34801561032057600080fd5b5061033461032f366004612fdb565b610a1c565b604051901515815260200161030b565b34801561035057600080fd5b50610359610a47565b60405161030b9190613057565b34801561037257600080fd5b5061038661038136600461306a565b610ad9565b6040516001600160a01b03909116815260200161030b565b3480156103aa57600080fd5b506103be6103b9366004613098565b610b66565b005b3480156103cc57600080fd5b506103be6103db3660046130d2565b610c7c565b3480156103ec57600080fd5b50600854610301565b34801561040157600080fd5b506103be610410366004613098565b610cbf565b34801561042157600080fd5b50610334610dce565b34801561043657600080fd5b506103be61044536600461306a565b61135f565b34801561045657600080fd5b506103be6104653660046130ef565b61138e565b34801561047657600080fd5b50610301610485366004613098565b6113c0565b34801561049657600080fd5b506103be6104a53660046130ef565b611456565b3480156104b657600080fd5b506103be6104c53660046130ef565b611471565b3480156104d657600080fd5b506103be6104e53660046130ef565b611570565b3480156104f657600080fd5b506103be610505366004613130565b6115cb565b34801561051657600080fd5b5061030160145481565b34801561052c57600080fd5b5061030161053b36600461306a565b611697565b34801561054c57600080fd5b50600c5460ff16610334565b34801561056457600080fd5b5061038661057336600461306a565b61172a565b34801561058457600080fd5b50610301610593366004613160565b6117a1565b3480156105a457600080fd5b506103be611828565b3480156105b957600080fd5b506103be6105c8366004613191565b61185e565b3480156105d957600080fd5b506103016105e8366004613160565b60186020526000908152604090205481565b34801561060657600080fd5b5061038661061536600461306a565b61193a565b34801561062657600080fd5b506103be61196a565b6103be61063d366004613130565b611aa2565b34801561064e57600080fd5b50600a546001600160a01b0316610386565b34801561066c57600080fd5b5061030160155481565b34801561068257600080fd5b506103be611b3d565b34801561069757600080fd5b50610359611c3b565b6103be6106ae3660046131d3565b611c4a565b3480156106bf57600080fd5b506103be6106ce366004613265565b611d0f565b3480156106df57600080fd5b5061030160165481565b3480156106f557600080fd5b50601454610301565b34801561070a57600080fd5b5061071e61071936600461306a565b611d1e565b60405161030b9190613293565b34801561073757600080fd5b506107c961074636600461306a565b60176020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691640100000000820481169165010000000000810482169166010000000000008204811691600160381b8104821691600160401b8204169065ffffffffffff600160481b8204811691600160781b9004168b565b6040805160ff9c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015290931661010083015265ffffffffffff928316610120830152919091166101408201526101600161030b565b34801561084457600080fd5b5033600090815260186020526040902054610301565b34801561086657600080fd5b506103be610875366004613130565b611e66565b34801561088657600080fd5b506103be610895366004613404565b611ff1565b3480156108a657600080fd5b506103be6108b53660046130ef565b612029565b3480156108c657600080fd5b506103596108d536600461306a565b61204d565b3480156108e657600080fd5b5061030160135481565b3480156108fc57600080fd5b506103be61090b36600461306a565b6120f4565b34801561091c57600080fd5b5061093061092b366004613160565b61211a565b60405161030b91906134b3565b34801561094957600080fd5b506103be6109583660046134f7565b6121bb565b34801561096957600080fd5b5061030160125481565b34801561097f57600080fd5b5061033461098e36600461306a565b612363565b34801561099f57600080fd5b506103346109ae36600461352e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109e857600080fd5b506103be6109f7366004613160565b61236e565b348015610a0857600080fd5b506103be610a1736600461355c565b612406565b60006001600160e01b0319821663780e9d6360e01b1480610a415750610a418261248e565b92915050565b606060008054610a56906135cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a82906135cd565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000610ae4826124de565b610b4a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b718261172a565b9050806001600160a01b0316836001600160a01b03161415610bdf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b41565b336001600160a01b0382161480610bfb5750610bfb81336109ae565b610c6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b41565b610c7783836124fb565b505050565b600a546001600160a01b03163314610ca65760405162461bcd60e51b8152600401610b4190613602565b8015610cb757610cb4612569565b50565b610cb46125de565b6011546001600160a01b0316336001600160a01b03161480610cf45750600e546001600160a01b0316336001600160a01b0316145b610d365760405162461bcd60e51b815260206004820152601360248201527210915154ce9113d3950810d21150550e9413d5606a1b6044820152606401610b41565b631dcd650081601254610d49919061364d565b10610d865760405162461bcd60e51b815260206004820152600d60248201526c4e4f204d4f524520484f4e455960981b6044820152606401610b41565b8060126000828254610d98919061364d565b90915550506001600160a01b03821660009081526018602052604081208054839290610dc590849061364d565b90915550505050565b600060145460135410610de15750600090565b601760006013546001610df4919061364d565b815260208101919091526040016000205460ff1615610e135750600190565b600f5460135460405162413a0f60e41b815260048101919091526000916001600160a01b031690630413a0f09060240160206040518083038186803b158015610e5b57600080fd5b505afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613665565b905080610ea257600091505090565b600e546013546000916001600160a01b031690610ec49061057390600161364d565b6001600160a01b031614610ee957610ee46013546001610573919061364d565b610f7a565b600e546013546001600160a01b03909116906384e98e8190610f0c90600161364d565b6040518263ffffffff1660e01b8152600401610f2a91815260200190565b60206040518083038186803b158015610f4257600080fd5b505afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a919061367e565b601054604051634a7dd52360e01b8152600481018590529192506000916001600160a01b0390911690634a7dd523906024016101606040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906136bc565b905080601760006013546001611013919061364d565b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055506101208201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555061014082015181600001600f6101000a81548165ffffffffffff021916908365ffffffffffff160217905550905050806000015160ff16600214156111cc57601580549060006111c683613796565b91905055505b806000015160ff16600314156111f257601680549060006111ec83613796565b91905055505b806000015160ff1660011480156112305750600e546013546001600160a01b03909116906112259061057390600161364d565b6001600160a01b0316145b156112b157600e546013546001600160a01b039091169063317afea49061125890600161364d565b6040516001600160e01b031960e084901b168152600481019190915260006024820152604401600060405180830381600087803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b505050505b6013546112bf90600161364d565b8151600e546013546001600160a01b03808716937f8f6425b35d036fc1dbf891c4c76cfdfd29b033d9ae28a6900042376e41e1b6719390929116906113099061057390600161364d565b6001600160a01b03161461131e576000611321565b60015b6040805160ff909316835290151560208301520160405180910390a3600160136000828254611350919061364d565b90915550600195945050505050565b600a546001600160a01b031633146113895760405162461bcd60e51b8152600401610b4190613602565b601355565b611399335b82612658565b6113b55760405162461bcd60e51b8152600401610b41906137b1565b610c77838383612742565b60006113cb836117a1565b821061142d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b41565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c7783838360405180602001604052806000815250611ff1565b600a546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610b4190613602565b60405163a9059cbb60e01b81526001600160a01b03838116600483015260248201839052849160009183169063a9059cbb90604401602060405180830381600087803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115229190613802565b9050806115695760405162461bcd60e51b8152602060048201526015602482015274115490cc8c17d5d2551211149055d7d19052531151605a1b6044820152606401610b41565b5050505050565b600e546001600160a01b0316336001600160a01b0316146115b05761159433611393565b6115b05760405162461bcd60e51b8152600401610b41906137b1565b610c77838383604051806020016040528060008152506128ed565b600c5460ff16156115ee5760405162461bcd60e51b8152600401610b419061381f565b6002600b5414156116115760405162461bcd60e51b8152600401610b4190613849565b6002600b55601054601454604051633bbc5ae960e11b815233600482015260248101859052604481019190915282151560648201526001600160a01b0390911690637778b5d2906084015b600060405180830381600087803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b50506001600b5550505050565b60006116a260085490565b82106117055760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b41565b6008828154811061171857611718613880565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b41565b60006001600160a01b03821661180c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b41565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118525760405162461bcd60e51b8152600401610b4190613602565b61185c6000612920565b565b611867836124de565b6118835760405162461bcd60e51b8152600401610b4190613896565b6011546001600160a01b0316336001600160a01b0316146118df5760405162461bcd60e51b8152602060048201526016602482015275424545533a444f4e542043484541543a41545441434b60501b6044820152606401610b41565b600092835260176020526040909220805474ffffffffffffffffffffffff0000000000000000001916600160481b65ffffffffffff9384160265ffffffffffff60781b191617600160781b9290931691909102919091179055565b6000611945826124de565b6119615760405162461bcd60e51b8152600401610b4190613896565b610a418261172a565b600a546001600160a01b031633146119945760405162461bcd60e51b8152600401610b4190613602565b47806119d85760405162461bcd60e51b8152602060048201526013602482015272496e737566666963656e742062616c616e636560681b6044820152606401610b41565b611a0c73e9fa9e12293b4bdba893922bb35b784ee0ff3a9d60646119fd8460056138d7565b611a0791906138f6565b612972565b5047611a33738f0025ff54879b322582ccbebb1f391b1d5a1fbf60646119fd8460196138d7565b611a5873d3feeb12feb6f371df5e5587029212a6e2efc10960646119fd8460196138d7565b611a7d730219b3c14d7a374a89cf8ab3c09036c030b9122060646119fd8460196138d7565b610cb473eaf280e23995a65fea71c726c213e6e8c461281760646119fd8460196138d7565b600c5460ff1615611ac55760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611ae85760405162461bcd60e51b8152600401610b4190613849565b6002600b5560105460145460405163781cad0760e11b815233600482015260248101859052604481019190915234606482015282151560848201526001600160a01b039091169063f0395a0e9060a40161165c565b336000908152601860205260409020541561185c5733600090815260186020526040812054611b7490670de0b6b3a76400006138d7565b33600081815260186020526040808220829055600d5481516340c10f1960e01b815260048101949094526024840185905290519394506001600160a01b0316926340c10f1992604480820193929182900301818387803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b50505050611bf63390565b6001600160a01b03167fdf176c54c04f6cfcae94d1db5a6629ee06f4f8c98ebc24afd441d1209763073282604051611c3091815260200190565b60405180910390a250565b606060018054610a56906135cd565b600c5460ff1615611c6d5760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611c905760405162461bcd60e51b8152600401610b4190613849565b6002600b55601054601454604051632c4ec97560e21b81526001600160a01b039092169163b13b25d491611cd2913391899134908a908a908a90600401613918565b600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b50506001600b55505050505050565b611d1a338383612a15565b5050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810191909152611d80826124de565b611d9c5760405162461bcd60e51b8152600401610b4190613896565b50600090815260176020908152604091829020825161016081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c0830152600160381b8104841660e0830152600160401b81049093169181019190915265ffffffffffff600160481b83048116610120830152600160781b90920490911661014082015290565b600c5460ff1615611e895760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611eac5760405162461bcd60e51b8152600401610b4190613849565b6002600b556010546000906001600160a01b031663cdb6d2fc336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820187905260448201528415156064820152608401602060405180830381600087803b158015611f1e57600080fd5b505af1158015611f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f569190613665565b600c546040516323b872dd60e01b81523360048201523060248201526044810183905291925061010090046001600160a01b0316906323b872dd90606401602060405180830381600087803b158015611fae57600080fd5b505af1158015611fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190613802565b50506001600b555050565b611ffb3383612658565b6120175760405162461bcd60e51b8152600401610b41906137b1565b612023848484846128ed565b50505050565b600e546001600160a01b0316336001600160a01b0316146113b55761139933611393565b6060612058826124de565b6120745760405162461bcd60e51b8152600401610b4190613896565b60105460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b1580156120b857600080fd5b505afa1580156120cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a41919081019061398a565b60005b81811015611d1a57612107610dce565b508061211281613796565b9150506120f7565b6060612125826117a1565b67ffffffffffffffff81111561213d5761213d61336b565b604051908082528060200260200182016040528015612166578160200160208202803683370190505b50905060005b612175836117a1565b8110156121b55761218683826113c0565b82828151811061219857612198613880565b6020908102919091010152806121ad81613796565b91505061216c565b50919050565b6010546001600160a01b0316336001600160a01b0316146122155760405162461bcd60e51b815260206004820152601460248201527310915154ce9113d3950810d21150550e9352539560621b6044820152606401610b41565b600f60009054906101000a90046001600160a01b03166001600160a01b031663916fbda46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050601483905550806122985761229383601454612ae4565b612318565b600e546014546122b1916001600160a01b031690612ae4565b600e5460405163150a55ab60e31b81526001600160a01b038581166004830152602482018590529091169063a852ad5890604401600060405180830381600087803b1580156122ff57600080fd5b505af1158015612313573d6000803e3d6000fd5b505050505b604080518381524360208201526001600160a01b038516917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2612023610dce565b6000610a41826124de565b600a546001600160a01b031633146123985760405162461bcd60e51b8152600401610b4190613602565b6001600160a01b0381166123fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b610cb481612920565b600a546001600160a01b031633146124305760405162461bcd60e51b8152600401610b4190613602565b600d80546001600160a01b03199081166001600160a01b039788161790915560108054821694871694909417909355600e8054841694861694909417909355601180548316918516919091179055600f805490911691909216179055565b60006001600160e01b031982166380ac58cd60e01b14806124bf57506001600160e01b03198216635b5e139f60e01b145b80610a4157506301ffc9a760e01b6001600160e01b0319831614610a41565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125308261172a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c5460ff161561258c5760405162461bcd60e51b8152600401610b419061381f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c13390565b6040516001600160a01b03909116815260200160405180910390a1565b600c5460ff166126275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b41565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336125c1565b6000612663826124de565b6126c45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b41565b60006126cf8361172a565b9050806001600160a01b0316846001600160a01b0316148061270a5750836001600160a01b03166126ff84610ad9565b6001600160a01b0316145b8061273a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166127558261172a565b6001600160a01b0316146127bd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b41565b6001600160a01b03821661281f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b41565b61282a838383612afe565b6128356000826124fb565b6001600160a01b038316600090815260036020526040812080546001929061285e908490613a01565b90915550506001600160a01b038216600090815260036020526040812080546001929061288c90849061364d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6128f8848484612742565b61290484848484612bb6565b6120235760405162461bcd60e51b8152600401610b4190613a18565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129bf576040519150601f19603f3d011682016040523d82523d6000602084013e6129c4565b606091505b5050905080610c775760405162461bcd60e51b815260206004820152601960248201527f4661696c656420746f20776964746864726177204574686572000000000000006044820152606401610b41565b816001600160a01b0316836001600160a01b03161415612a775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b41565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d1a828260405180602001604052806000815250612cc3565b6001600160a01b038316612b5957612b5481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b7c565b816001600160a01b0316836001600160a01b031614612b7c57612b7c8382612cf6565b6001600160a01b038216612b9357610c7781612d93565b826001600160a01b0316826001600160a01b031614610c7757610c778282612e42565b60006001600160a01b0384163b15612cb857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bfa903390899088908890600401613a6a565b602060405180830381600087803b158015612c1457600080fd5b505af1925050508015612c44575060408051601f3d908101601f19168201909252612c4191810190613aa7565b60015b612c9e573d808015612c72576040519150601f19603f3d011682016040523d82523d6000602084013e612c77565b606091505b508051612c965760405162461bcd60e51b8152600401610b4190613a18565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061273a565b506001949350505050565b612ccd8383612e86565b612cda6000848484612bb6565b610c775760405162461bcd60e51b8152600401610b4190613a18565b60006001612d03846117a1565b612d0d9190613a01565b600083815260076020526040902054909150808214612d60576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612da590600190613a01565b60008381526009602052604081205460088054939450909284908110612dcd57612dcd613880565b906000526020600020015490508060088381548110612dee57612dee613880565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612e2657612e26613ac4565b6001900381819060005260206000200160009055905550505050565b6000612e4d836117a1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612edc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b41565b612ee5816124de565b15612f325760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b41565b612f3e60008383612afe565b6001600160a01b0382166000908152600360205260408120805460019290612f6790849061364d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610cb457600080fd5b600060208284031215612fed57600080fd5b8135612ff881612fc5565b9392505050565b60005b8381101561301a578181015183820152602001613002565b838111156120235750506000910152565b60008151808452613043816020860160208601612fff565b601f01601f19169290920160200192915050565b602081526000612ff8602083018461302b565b60006020828403121561307c57600080fd5b5035919050565b6001600160a01b0381168114610cb457600080fd5b600080604083850312156130ab57600080fd5b82356130b681613083565b946020939093013593505050565b8015158114610cb457600080fd5b6000602082840312156130e457600080fd5b8135612ff8816130c4565b60008060006060848603121561310457600080fd5b833561310f81613083565b9250602084013561311f81613083565b929592945050506040919091013590565b6000806040838503121561314357600080fd5b823591506020830135613155816130c4565b809150509250929050565b60006020828403121561317257600080fd5b8135612ff881613083565b65ffffffffffff81168114610cb457600080fd5b6000806000606084860312156131a657600080fd5b8335925060208401356131b88161317d565b915060408401356131c88161317d565b809150509250925092565b600080600080606085870312156131e957600080fd5b84359350602085013567ffffffffffffffff8082111561320857600080fd5b818701915087601f83011261321c57600080fd5b81358181111561322b57600080fd5b8860208260051b850101111561324057600080fd5b602083019550809450505050604085013561325a816130c4565b939692955090935050565b6000806040838503121561327857600080fd5b823561328381613083565b91506020830135613155816130c4565b815160ff168152610160810160208301516132b3602084018260ff169052565b5060408301516132c8604084018260ff169052565b5060608301516132dd606084018260ff169052565b5060808301516132f2608084018260ff169052565b5060a083015161330760a084018260ff169052565b5060c083015161331c60c084018260ff169052565b5060e083015161333160e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156133a5576133a561336b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156133d4576133d461336b565b604052919050565b600067ffffffffffffffff8211156133f6576133f661336b565b50601f01601f191660200190565b6000806000806080858703121561341a57600080fd5b843561342581613083565b9350602085013561343581613083565b925060408501359150606085013567ffffffffffffffff81111561345857600080fd5b8501601f8101871361346957600080fd5b803561347c613477826133dc565b6133ab565b81815288602083850101111561349157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6020808252825182820181905260009190848201906040850190845b818110156134eb578351835292840192918401916001016134cf565b50909695505050505050565b60008060006060848603121561350c57600080fd5b833561351781613083565b92506020840135915060408401356131c8816130c4565b6000806040838503121561354157600080fd5b823561354c81613083565b9150602083013561315581613083565b600080600080600060a0868803121561357457600080fd5b853561357f81613083565b9450602086013561358f81613083565b9350604086013561359f81613083565b925060608601356135af81613083565b915060808601356135bf81613083565b809150509295509295909350565b600181811c908216806135e157607f821691505b602082108114156121b557634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561366057613660613637565b500190565b60006020828403121561367757600080fd5b5051919050565b60006020828403121561369057600080fd5b8151612ff881613083565b805160ff811681146136ac57600080fd5b919050565b80516136ac8161317d565b600061016082840312156136cf57600080fd5b6136d7613381565b6136e08361369b565b81526136ee6020840161369b565b60208201526136ff6040840161369b565b60408201526137106060840161369b565b60608201526137216080840161369b565b608082015261373260a0840161369b565b60a082015261374360c0840161369b565b60c082015261375460e0840161369b565b60e082015261010061376781850161369b565b908201526101206137798482016136b1565b9082015261014061378b8482016136b1565b908201529392505050565b60006000198214156137aa576137aa613637565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561381457600080fd5b8151612ff8816130c4565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656040820152603760f91b606082015260800190565b60008160001904831182151516156138f1576138f1613637565b500290565b60008261391357634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038816815260208101879052604081018690526060810185905260c060808201819052810183905260006001600160fb1b0384111561395d57600080fd5b8360051b808660e0850137600090830160e00190815292151560a090920191909152509695505050505050565b60006020828403121561399c57600080fd5b815167ffffffffffffffff8111156139b357600080fd5b8201601f810184136139c457600080fd5b80516139d2613477826133dc565b8181528560208385010111156139e757600080fd5b6139f8826020830160208601612fff565b95945050505050565b600082821015613a1357613a13613637565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a9d9083018461302b565b9695505050505050565b600060208284031215613ab957600080fd5b8151612ff881612fc5565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e92cc312a51c15f3700962b97fe0b6768b6c98a827b0380a4ed585130959277b64736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102e45760003560e01c8063853828b611610190578063b7ab34ee116100dc578063d004b03611610095578063e8b721961161006f578063e8b7219614610973578063e985e9c514610993578063f2fde38b146109dc578063f63bf8bd146109fc57600080fd5b8063d004b03614610910578063d1a1beb41461093d578063dfbc15081461095d57600080fd5b8063b7ab34ee1461085a578063b88d4fde1461087a578063bfc628f41461089a578063c87b56dd146108ba578063ca00ed35146108da578063cf02f27e146108f057600080fd5b8063963cdc8411610149578063ac72200d11610123578063ac72200d146106e9578063b09afec1146106fe578063b4b5b48f1461072b578063b71a261a1461083857600080fd5b8063963cdc84146106a0578063a22cb465146106b3578063a92beeb0146106d357600080fd5b8063853828b61461061a578063898e8b001461062f5780638da5cb5b146106425780638ec4e67614610660578063929ea98e1461067657806395d89b411461068b57600080fd5b806342842e0e1161024f5780635c975abb11610208578063715018a6116101e2578063715018a6146105985780637883e14e146105ad578063799e898e146105cd57806383638710146105fa57600080fd5b80635c975abb146105405780636352211e1461055857806370a082311461057857600080fd5b806342842e0e1461048a57806344004cc1146104aa57806345ee95bf146104ca5780634944d63d146104ea5780634f02c4201461050a5780634f6ccce71461052057600080fd5b806318160ddd116102a157806318160ddd146103e057806318a1e017146103f55780631b23b016146104155780631cbda4d91461042a57806323b872dd1461044a5780632f745c591461046a57600080fd5b806301c8b525146102e957806301ffc9a71461031457806306fdde0314610344578063081812fc14610366578063095ea7b31461039e57806316c38b3c146103c0575b600080fd5b3480156102f557600080fd5b50610301631dcd650081565b6040519081526020015b60405180910390f35b34801561032057600080fd5b5061033461032f366004612fdb565b610a1c565b604051901515815260200161030b565b34801561035057600080fd5b50610359610a47565b60405161030b9190613057565b34801561037257600080fd5b5061038661038136600461306a565b610ad9565b6040516001600160a01b03909116815260200161030b565b3480156103aa57600080fd5b506103be6103b9366004613098565b610b66565b005b3480156103cc57600080fd5b506103be6103db3660046130d2565b610c7c565b3480156103ec57600080fd5b50600854610301565b34801561040157600080fd5b506103be610410366004613098565b610cbf565b34801561042157600080fd5b50610334610dce565b34801561043657600080fd5b506103be61044536600461306a565b61135f565b34801561045657600080fd5b506103be6104653660046130ef565b61138e565b34801561047657600080fd5b50610301610485366004613098565b6113c0565b34801561049657600080fd5b506103be6104a53660046130ef565b611456565b3480156104b657600080fd5b506103be6104c53660046130ef565b611471565b3480156104d657600080fd5b506103be6104e53660046130ef565b611570565b3480156104f657600080fd5b506103be610505366004613130565b6115cb565b34801561051657600080fd5b5061030160145481565b34801561052c57600080fd5b5061030161053b36600461306a565b611697565b34801561054c57600080fd5b50600c5460ff16610334565b34801561056457600080fd5b5061038661057336600461306a565b61172a565b34801561058457600080fd5b50610301610593366004613160565b6117a1565b3480156105a457600080fd5b506103be611828565b3480156105b957600080fd5b506103be6105c8366004613191565b61185e565b3480156105d957600080fd5b506103016105e8366004613160565b60186020526000908152604090205481565b34801561060657600080fd5b5061038661061536600461306a565b61193a565b34801561062657600080fd5b506103be61196a565b6103be61063d366004613130565b611aa2565b34801561064e57600080fd5b50600a546001600160a01b0316610386565b34801561066c57600080fd5b5061030160155481565b34801561068257600080fd5b506103be611b3d565b34801561069757600080fd5b50610359611c3b565b6103be6106ae3660046131d3565b611c4a565b3480156106bf57600080fd5b506103be6106ce366004613265565b611d0f565b3480156106df57600080fd5b5061030160165481565b3480156106f557600080fd5b50601454610301565b34801561070a57600080fd5b5061071e61071936600461306a565b611d1e565b60405161030b9190613293565b34801561073757600080fd5b506107c961074636600461306a565b60176020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691640100000000820481169165010000000000810482169166010000000000008204811691600160381b8104821691600160401b8204169065ffffffffffff600160481b8204811691600160781b9004168b565b6040805160ff9c8d1681529a8c1660208c0152988b16988a01989098529589166060890152938816608088015291871660a0870152861660c0860152851660e085015290931661010083015265ffffffffffff928316610120830152919091166101408201526101600161030b565b34801561084457600080fd5b5033600090815260186020526040902054610301565b34801561086657600080fd5b506103be610875366004613130565b611e66565b34801561088657600080fd5b506103be610895366004613404565b611ff1565b3480156108a657600080fd5b506103be6108b53660046130ef565b612029565b3480156108c657600080fd5b506103596108d536600461306a565b61204d565b3480156108e657600080fd5b5061030160135481565b3480156108fc57600080fd5b506103be61090b36600461306a565b6120f4565b34801561091c57600080fd5b5061093061092b366004613160565b61211a565b60405161030b91906134b3565b34801561094957600080fd5b506103be6109583660046134f7565b6121bb565b34801561096957600080fd5b5061030160125481565b34801561097f57600080fd5b5061033461098e36600461306a565b612363565b34801561099f57600080fd5b506103346109ae36600461352e565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156109e857600080fd5b506103be6109f7366004613160565b61236e565b348015610a0857600080fd5b506103be610a1736600461355c565b612406565b60006001600160e01b0319821663780e9d6360e01b1480610a415750610a418261248e565b92915050565b606060008054610a56906135cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a82906135cd565b8015610acf5780601f10610aa457610100808354040283529160200191610acf565b820191906000526020600020905b815481529060010190602001808311610ab257829003601f168201915b5050505050905090565b6000610ae4826124de565b610b4a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610b718261172a565b9050806001600160a01b0316836001600160a01b03161415610bdf5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b41565b336001600160a01b0382161480610bfb5750610bfb81336109ae565b610c6d5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b41565b610c7783836124fb565b505050565b600a546001600160a01b03163314610ca65760405162461bcd60e51b8152600401610b4190613602565b8015610cb757610cb4612569565b50565b610cb46125de565b6011546001600160a01b0316336001600160a01b03161480610cf45750600e546001600160a01b0316336001600160a01b0316145b610d365760405162461bcd60e51b815260206004820152601360248201527210915154ce9113d3950810d21150550e9413d5606a1b6044820152606401610b41565b631dcd650081601254610d49919061364d565b10610d865760405162461bcd60e51b815260206004820152600d60248201526c4e4f204d4f524520484f4e455960981b6044820152606401610b41565b8060126000828254610d98919061364d565b90915550506001600160a01b03821660009081526018602052604081208054839290610dc590849061364d565b90915550505050565b600060145460135410610de15750600090565b601760006013546001610df4919061364d565b815260208101919091526040016000205460ff1615610e135750600190565b600f5460135460405162413a0f60e41b815260048101919091526000916001600160a01b031690630413a0f09060240160206040518083038186803b158015610e5b57600080fd5b505afa158015610e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e939190613665565b905080610ea257600091505090565b600e546013546000916001600160a01b031690610ec49061057390600161364d565b6001600160a01b031614610ee957610ee46013546001610573919061364d565b610f7a565b600e546013546001600160a01b03909116906384e98e8190610f0c90600161364d565b6040518263ffffffff1660e01b8152600401610f2a91815260200190565b60206040518083038186803b158015610f4257600080fd5b505afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a919061367e565b601054604051634a7dd52360e01b8152600481018590529192506000916001600160a01b0390911690634a7dd523906024016101606040518083038186803b158015610fc557600080fd5b505afa158015610fd9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffd91906136bc565b905080601760006013546001611013919061364d565b815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548160ff021916908360ff16021790555060608201518160000160036101000a81548160ff021916908360ff16021790555060808201518160000160046101000a81548160ff021916908360ff16021790555060a08201518160000160056101000a81548160ff021916908360ff16021790555060c08201518160000160066101000a81548160ff021916908360ff16021790555060e08201518160000160076101000a81548160ff021916908360ff1602179055506101008201518160000160086101000a81548160ff021916908360ff1602179055506101208201518160000160096101000a81548165ffffffffffff021916908365ffffffffffff16021790555061014082015181600001600f6101000a81548165ffffffffffff021916908365ffffffffffff160217905550905050806000015160ff16600214156111cc57601580549060006111c683613796565b91905055505b806000015160ff16600314156111f257601680549060006111ec83613796565b91905055505b806000015160ff1660011480156112305750600e546013546001600160a01b03909116906112259061057390600161364d565b6001600160a01b0316145b156112b157600e546013546001600160a01b039091169063317afea49061125890600161364d565b6040516001600160e01b031960e084901b168152600481019190915260006024820152604401600060405180830381600087803b15801561129857600080fd5b505af11580156112ac573d6000803e3d6000fd5b505050505b6013546112bf90600161364d565b8151600e546013546001600160a01b03808716937f8f6425b35d036fc1dbf891c4c76cfdfd29b033d9ae28a6900042376e41e1b6719390929116906113099061057390600161364d565b6001600160a01b03161461131e576000611321565b60015b6040805160ff909316835290151560208301520160405180910390a3600160136000828254611350919061364d565b90915550600195945050505050565b600a546001600160a01b031633146113895760405162461bcd60e51b8152600401610b4190613602565b601355565b611399335b82612658565b6113b55760405162461bcd60e51b8152600401610b41906137b1565b610c77838383612742565b60006113cb836117a1565b821061142d5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b41565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610c7783838360405180602001604052806000815250611ff1565b600a546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610b4190613602565b60405163a9059cbb60e01b81526001600160a01b03838116600483015260248201839052849160009183169063a9059cbb90604401602060405180830381600087803b1580156114ea57600080fd5b505af11580156114fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115229190613802565b9050806115695760405162461bcd60e51b8152602060048201526015602482015274115490cc8c17d5d2551211149055d7d19052531151605a1b6044820152606401610b41565b5050505050565b600e546001600160a01b0316336001600160a01b0316146115b05761159433611393565b6115b05760405162461bcd60e51b8152600401610b41906137b1565b610c77838383604051806020016040528060008152506128ed565b600c5460ff16156115ee5760405162461bcd60e51b8152600401610b419061381f565b6002600b5414156116115760405162461bcd60e51b8152600401610b4190613849565b6002600b55601054601454604051633bbc5ae960e11b815233600482015260248101859052604481019190915282151560648201526001600160a01b0390911690637778b5d2906084015b600060405180830381600087803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b50506001600b5550505050565b60006116a260085490565b82106117055760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b41565b6008828154811061171857611718613880565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b031680610a415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b41565b60006001600160a01b03821661180c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b41565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146118525760405162461bcd60e51b8152600401610b4190613602565b61185c6000612920565b565b611867836124de565b6118835760405162461bcd60e51b8152600401610b4190613896565b6011546001600160a01b0316336001600160a01b0316146118df5760405162461bcd60e51b8152602060048201526016602482015275424545533a444f4e542043484541543a41545441434b60501b6044820152606401610b41565b600092835260176020526040909220805474ffffffffffffffffffffffff0000000000000000001916600160481b65ffffffffffff9384160265ffffffffffff60781b191617600160781b9290931691909102919091179055565b6000611945826124de565b6119615760405162461bcd60e51b8152600401610b4190613896565b610a418261172a565b600a546001600160a01b031633146119945760405162461bcd60e51b8152600401610b4190613602565b47806119d85760405162461bcd60e51b8152602060048201526013602482015272496e737566666963656e742062616c616e636560681b6044820152606401610b41565b611a0c73e9fa9e12293b4bdba893922bb35b784ee0ff3a9d60646119fd8460056138d7565b611a0791906138f6565b612972565b5047611a33738f0025ff54879b322582ccbebb1f391b1d5a1fbf60646119fd8460196138d7565b611a5873d3feeb12feb6f371df5e5587029212a6e2efc10960646119fd8460196138d7565b611a7d730219b3c14d7a374a89cf8ab3c09036c030b9122060646119fd8460196138d7565b610cb473eaf280e23995a65fea71c726c213e6e8c461281760646119fd8460196138d7565b600c5460ff1615611ac55760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611ae85760405162461bcd60e51b8152600401610b4190613849565b6002600b5560105460145460405163781cad0760e11b815233600482015260248101859052604481019190915234606482015282151560848201526001600160a01b039091169063f0395a0e9060a40161165c565b336000908152601860205260409020541561185c5733600090815260186020526040812054611b7490670de0b6b3a76400006138d7565b33600081815260186020526040808220829055600d5481516340c10f1960e01b815260048101949094526024840185905290519394506001600160a01b0316926340c10f1992604480820193929182900301818387803b158015611bd757600080fd5b505af1158015611beb573d6000803e3d6000fd5b50505050611bf63390565b6001600160a01b03167fdf176c54c04f6cfcae94d1db5a6629ee06f4f8c98ebc24afd441d1209763073282604051611c3091815260200190565b60405180910390a250565b606060018054610a56906135cd565b600c5460ff1615611c6d5760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611c905760405162461bcd60e51b8152600401610b4190613849565b6002600b55601054601454604051632c4ec97560e21b81526001600160a01b039092169163b13b25d491611cd2913391899134908a908a908a90600401613918565b600060405180830381600087803b158015611cec57600080fd5b505af1158015611d00573d6000803e3d6000fd5b50506001600b55505050505050565b611d1a338383612a15565b5050565b6040805161016081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810191909152611d80826124de565b611d9c5760405162461bcd60e51b8152600401610b4190613896565b50600090815260176020908152604091829020825161016081018452905460ff80821683526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c0830152600160381b8104841660e0830152600160401b81049093169181019190915265ffffffffffff600160481b83048116610120830152600160781b90920490911661014082015290565b600c5460ff1615611e895760405162461bcd60e51b8152600401610b419061381f565b6002600b541415611eac5760405162461bcd60e51b8152600401610b4190613849565b6002600b556010546000906001600160a01b031663cdb6d2fc336014546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820187905260448201528415156064820152608401602060405180830381600087803b158015611f1e57600080fd5b505af1158015611f32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f569190613665565b600c546040516323b872dd60e01b81523360048201523060248201526044810183905291925061010090046001600160a01b0316906323b872dd90606401602060405180830381600087803b158015611fae57600080fd5b505af1158015611fc2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe69190613802565b50506001600b555050565b611ffb3383612658565b6120175760405162461bcd60e51b8152600401610b41906137b1565b612023848484846128ed565b50505050565b600e546001600160a01b0316336001600160a01b0316146113b55761139933611393565b6060612058826124de565b6120745760405162461bcd60e51b8152600401610b4190613896565b60105460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd9060240160006040518083038186803b1580156120b857600080fd5b505afa1580156120cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a41919081019061398a565b60005b81811015611d1a57612107610dce565b508061211281613796565b9150506120f7565b6060612125826117a1565b67ffffffffffffffff81111561213d5761213d61336b565b604051908082528060200260200182016040528015612166578160200160208202803683370190505b50905060005b612175836117a1565b8110156121b55761218683826113c0565b82828151811061219857612198613880565b6020908102919091010152806121ad81613796565b91505061216c565b50919050565b6010546001600160a01b0316336001600160a01b0316146122155760405162461bcd60e51b815260206004820152601460248201527310915154ce9113d3950810d21150550e9352539560621b6044820152606401610b41565b600f60009054906101000a90046001600160a01b03166001600160a01b031663916fbda46040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561226557600080fd5b505af1158015612279573d6000803e3d6000fd5b505050601483905550806122985761229383601454612ae4565b612318565b600e546014546122b1916001600160a01b031690612ae4565b600e5460405163150a55ab60e31b81526001600160a01b038581166004830152602482018590529091169063a852ad5890604401600060405180830381600087803b1580156122ff57600080fd5b505af1158015612313573d6000803e3d6000fd5b505050505b604080518381524360208201526001600160a01b038516917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a2612023610dce565b6000610a41826124de565b600a546001600160a01b031633146123985760405162461bcd60e51b8152600401610b4190613602565b6001600160a01b0381166123fd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b610cb481612920565b600a546001600160a01b031633146124305760405162461bcd60e51b8152600401610b4190613602565b600d80546001600160a01b03199081166001600160a01b039788161790915560108054821694871694909417909355600e8054841694861694909417909355601180548316918516919091179055600f805490911691909216179055565b60006001600160e01b031982166380ac58cd60e01b14806124bf57506001600160e01b03198216635b5e139f60e01b145b80610a4157506301ffc9a760e01b6001600160e01b0319831614610a41565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906125308261172a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600c5460ff161561258c5760405162461bcd60e51b8152600401610b419061381f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586125c13390565b6040516001600160a01b03909116815260200160405180910390a1565b600c5460ff166126275760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610b41565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336125c1565b6000612663826124de565b6126c45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b41565b60006126cf8361172a565b9050806001600160a01b0316846001600160a01b0316148061270a5750836001600160a01b03166126ff84610ad9565b6001600160a01b0316145b8061273a57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166127558261172a565b6001600160a01b0316146127bd5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b41565b6001600160a01b03821661281f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b41565b61282a838383612afe565b6128356000826124fb565b6001600160a01b038316600090815260036020526040812080546001929061285e908490613a01565b90915550506001600160a01b038216600090815260036020526040812080546001929061288c90849061364d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6128f8848484612742565b61290484848484612bb6565b6120235760405162461bcd60e51b8152600401610b4190613a18565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146129bf576040519150601f19603f3d011682016040523d82523d6000602084013e6129c4565b606091505b5050905080610c775760405162461bcd60e51b815260206004820152601960248201527f4661696c656420746f20776964746864726177204574686572000000000000006044820152606401610b41565b816001600160a01b0316836001600160a01b03161415612a775760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b41565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611d1a828260405180602001604052806000815250612cc3565b6001600160a01b038316612b5957612b5481600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612b7c565b816001600160a01b0316836001600160a01b031614612b7c57612b7c8382612cf6565b6001600160a01b038216612b9357610c7781612d93565b826001600160a01b0316826001600160a01b031614610c7757610c778282612e42565b60006001600160a01b0384163b15612cb857604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612bfa903390899088908890600401613a6a565b602060405180830381600087803b158015612c1457600080fd5b505af1925050508015612c44575060408051601f3d908101601f19168201909252612c4191810190613aa7565b60015b612c9e573d808015612c72576040519150601f19603f3d011682016040523d82523d6000602084013e612c77565b606091505b508051612c965760405162461bcd60e51b8152600401610b4190613a18565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061273a565b506001949350505050565b612ccd8383612e86565b612cda6000848484612bb6565b610c775760405162461bcd60e51b8152600401610b4190613a18565b60006001612d03846117a1565b612d0d9190613a01565b600083815260076020526040902054909150808214612d60576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612da590600190613a01565b60008381526009602052604081205460088054939450909284908110612dcd57612dcd613880565b906000526020600020015490508060088381548110612dee57612dee613880565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612e2657612e26613ac4565b6001900381819060005260206000200160009055905550505050565b6000612e4d836117a1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216612edc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b41565b612ee5816124de565b15612f325760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b41565b612f3e60008383612afe565b6001600160a01b0382166000908152600360205260408120805460019290612f6790849061364d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160e01b031981168114610cb457600080fd5b600060208284031215612fed57600080fd5b8135612ff881612fc5565b9392505050565b60005b8381101561301a578181015183820152602001613002565b838111156120235750506000910152565b60008151808452613043816020860160208601612fff565b601f01601f19169290920160200192915050565b602081526000612ff8602083018461302b565b60006020828403121561307c57600080fd5b5035919050565b6001600160a01b0381168114610cb457600080fd5b600080604083850312156130ab57600080fd5b82356130b681613083565b946020939093013593505050565b8015158114610cb457600080fd5b6000602082840312156130e457600080fd5b8135612ff8816130c4565b60008060006060848603121561310457600080fd5b833561310f81613083565b9250602084013561311f81613083565b929592945050506040919091013590565b6000806040838503121561314357600080fd5b823591506020830135613155816130c4565b809150509250929050565b60006020828403121561317257600080fd5b8135612ff881613083565b65ffffffffffff81168114610cb457600080fd5b6000806000606084860312156131a657600080fd5b8335925060208401356131b88161317d565b915060408401356131c88161317d565b809150509250925092565b600080600080606085870312156131e957600080fd5b84359350602085013567ffffffffffffffff8082111561320857600080fd5b818701915087601f83011261321c57600080fd5b81358181111561322b57600080fd5b8860208260051b850101111561324057600080fd5b602083019550809450505050604085013561325a816130c4565b939692955090935050565b6000806040838503121561327857600080fd5b823561328381613083565b91506020830135613155816130c4565b815160ff168152610160810160208301516132b3602084018260ff169052565b5060408301516132c8604084018260ff169052565b5060608301516132dd606084018260ff169052565b5060808301516132f2608084018260ff169052565b5060a083015161330760a084018260ff169052565b5060c083015161331c60c084018260ff169052565b5060e083015161333160e084018260ff169052565b506101008381015160ff16908301526101208084015165ffffffffffff908116918401919091526101409384015116929091019190915290565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156133a5576133a561336b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156133d4576133d461336b565b604052919050565b600067ffffffffffffffff8211156133f6576133f661336b565b50601f01601f191660200190565b6000806000806080858703121561341a57600080fd5b843561342581613083565b9350602085013561343581613083565b925060408501359150606085013567ffffffffffffffff81111561345857600080fd5b8501601f8101871361346957600080fd5b803561347c613477826133dc565b6133ab565b81815288602083850101111561349157600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6020808252825182820181905260009190848201906040850190845b818110156134eb578351835292840192918401916001016134cf565b50909695505050505050565b60008060006060848603121561350c57600080fd5b833561351781613083565b92506020840135915060408401356131c8816130c4565b6000806040838503121561354157600080fd5b823561354c81613083565b9150602083013561315581613083565b600080600080600060a0868803121561357457600080fd5b853561357f81613083565b9450602086013561358f81613083565b9350604086013561359f81613083565b925060608601356135af81613083565b915060808601356135bf81613083565b809150509295509295909350565b600181811c908216806135e157607f821691505b602082108114156121b557634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561366057613660613637565b500190565b60006020828403121561367757600080fd5b5051919050565b60006020828403121561369057600080fd5b8151612ff881613083565b805160ff811681146136ac57600080fd5b919050565b80516136ac8161317d565b600061016082840312156136cf57600080fd5b6136d7613381565b6136e08361369b565b81526136ee6020840161369b565b60208201526136ff6040840161369b565b60408201526137106060840161369b565b60608201526137216080840161369b565b608082015261373260a0840161369b565b60a082015261374360c0840161369b565b60c082015261375460e0840161369b565b60e082015261010061376781850161369b565b908201526101206137798482016136b1565b9082015261014061378b8482016136b1565b908201529392505050565b60006000198214156137aa576137aa613637565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561381457600080fd5b8151612ff8816130c4565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60208082526021908201527f4552433732314d657461646174613a204e6f6e6578697374656e7420746f6b656040820152603760f91b606082015260800190565b60008160001904831182151516156138f1576138f1613637565b500290565b60008261391357634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b038816815260208101879052604081018690526060810185905260c060808201819052810183905260006001600160fb1b0384111561395d57600080fd5b8360051b808660e0850137600090830160e00190815292151560a090920191909152509695505050505050565b60006020828403121561399c57600080fd5b815167ffffffffffffffff8111156139b357600080fd5b8201601f810184136139c457600080fd5b80516139d2613477826133dc565b8181528560208385010111156139e757600080fd5b6139f8826020830160208601612fff565b95945050505050565b600082821015613a1357613a13613637565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a9d9083018461302b565b9695505050505050565b600060208284031215613ab957600080fd5b8151612ff881612fc5565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220e92cc312a51c15f3700962b97fe0b6768b6c98a827b0380a4ed585130959277b64736f6c63430008090033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.