Source Code
Latest 25 from a total of 488 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Preorder Mint | 19679462 | 677 days ago | IN | 0 ETH | 0.00043782 | ||||
| Preorder Mint | 19679414 | 677 days ago | IN | 0 ETH | 0.00031234 | ||||
| Parent | 19664566 | 679 days ago | IN | 0 ETH | 0.00136253 | ||||
| Parent | 18625104 | 825 days ago | IN | 0 ETH | 0.00397936 | ||||
| Parent | 17772534 | 944 days ago | IN | 0 ETH | 0.00452855 | ||||
| Parent | 17772480 | 944 days ago | IN | 0 ETH | 0.00484499 | ||||
| Parent | 17679763 | 957 days ago | IN | 0 ETH | 0.00439813 | ||||
| Parent | 17679087 | 957 days ago | IN | 0 ETH | 0.01232581 | ||||
| Parent | 17582656 | 971 days ago | IN | 0 ETH | 0.00079801 | ||||
| Parent | 17582655 | 971 days ago | IN | 0 ETH | 0.00079224 | ||||
| Parent | 17487261 | 984 days ago | IN | 0 ETH | 0.0010085 | ||||
| Parent | 17487260 | 984 days ago | IN | 0 ETH | 0.0010539 | ||||
| Parent | 17423112 | 993 days ago | IN | 0 ETH | 0.00487137 | ||||
| Preorder Mint | 17368459 | 1001 days ago | IN | 0 ETH | 0.0007343 | ||||
| Preorder Mint | 17368427 | 1001 days ago | IN | 0 ETH | 0.00077558 | ||||
| Preorder Mint | 17368391 | 1001 days ago | IN | 0 ETH | 0.00145277 | ||||
| Parent | 17354071 | 1003 days ago | IN | 0 ETH | 0.00149121 | ||||
| Parent | 17354069 | 1003 days ago | IN | 0 ETH | 0.00461596 | ||||
| Parent | 17123187 | 1035 days ago | IN | 0 ETH | 0.00547791 | ||||
| Parent | 17123175 | 1035 days ago | IN | 0 ETH | 0.00582012 | ||||
| Parent | 17123163 | 1035 days ago | IN | 0 ETH | 0.00560005 | ||||
| Parent | 17120309 | 1036 days ago | IN | 0 ETH | 0.01019633 | ||||
| Parent | 17103629 | 1038 days ago | IN | 0 ETH | 0.00924523 | ||||
| Parent | 17094506 | 1039 days ago | IN | 0 ETH | 0.00509901 | ||||
| Parent | 17077400 | 1042 days ago | IN | 0 ETH | 0.0069385 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 16092666 | 1180 days ago | 11.5 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
QUOKKA_KIDS_STOREFRONT
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "solidity-bytes-utils/contracts/BytesLib.sol";
interface IERC1155Burnable {
function burn(
address from,
uint256 id,
uint256 amount) external;
}
interface IERC721 {
function mint(address to, uint amount) external;
function totalSupply() external view returns (uint256);
function ownerOf(uint256 tokenId) external returns (address);
}
interface IER721ParentTracker is IERC721 {
function genesisParents(uint256 index) external returns (bool);
function legendParents(uint256 index) external returns (bool);
function parentMint(address to, uint amount) external;
function setGenesisParentUsed(uint256 index, bool used) external;
function setLegendParentUsed(uint256 index, bool used) external;
}
// Version 2 of Storefront
contract QUOKKA_KIDS_STOREFRONT is Ownable {
uint256 public constant DOUBLE_TICKET = 2;
uint256 public constant TRIPLE_TICKET = 3;
using Address for address;
using BytesLib for bytes;
using ECDSA for bytes32;
using Strings for uint256;
address public preorderContract;
address public mintingContract;
address public genesisContract;
address public legendsContract;
uint public preSaleStart = 1663646400;
uint public publicSaleStart = 1663970400;
uint256 public tokenPrice = 300000000000000000;
uint256 public doubleDiscount = 200000000000000000;
uint256 public tripleDiscount = 300000000000000000;
address payable public payout = payable(0x6A4813082c2F6598b01698B222c5b1414Fe77eF6);
address public parentingSigner = 0x3dF6f92097B349f30d31315a7453821f14998f3E;
address public freemintSigner = 0x3dF6f92097B349f30d31315a7453821f14998f3E;
mapping(address => uint256) public claimed;
uint256 public nextId = 1;
//Declare an Event
event ParentMint(uint256 id, bool parentsfur);
event ManyMint(uint256 id, uint256 count);
event Mint(uint256 id, bool parentsfur);
function setNextId(uint256 nextId_) public onlyOwner {
nextId = nextId_;
}
function setMintingContract(address mintingContract_) public onlyOwner{
mintingContract = mintingContract_;
}
// exchange preorder tokens
function setPreorderContract(address preorderContract_) public onlyOwner {
preorderContract = preorderContract_;
}
function setGenesisLegendsContract(address genesis_, address legends_) public onlyOwner {
genesisContract = genesis_;
legendsContract = legends_;
}
function setSignerAddress(address parentingSigner_, address freemintSigner_) public onlyOwner {
parentingSigner = parentingSigner_;
freemintSigner = freemintSigner_;
}
function setPrice(uint tokenPrice_) public onlyOwner {
tokenPrice = tokenPrice_;
}
function setPayout(address addr) public onlyOwner {
payout = payable(addr);
}
function release(uint amount) public {
uint ourBalance = address(this).balance;
require(ourBalance >= amount, "Must have enough balance to send");
payout.transfer(amount);
}
function setSaleStart(uint preSaleStartTime, uint publicSaleStartTime) public onlyOwner {
preSaleStart = preSaleStartTime;
publicSaleStart = publicSaleStartTime;
}
function airdrop(address recipient, uint totalMint) public onlyOwner {
IERC721(mintingContract).mint(recipient, uint256(totalMint));
for (uint i = 0; i < totalMint; i++) {
//Emit an event
emit Mint(nextId, false);
nextId += 1;
}
}
function whitelistMint(uint index, uint claimAmmt, uint claimTotal, bytes memory signature) payable public {
require(block.timestamp >= preSaleStart, "Presale has not begun");
require(claimed[msg.sender] + claimAmmt <= claimTotal, "Already claimed.");
claimed[msg.sender] += claimAmmt;
bytes memory encoded = abi.encodePacked(
index,
claimTotal,
msg.sender);
bytes32 digestreal = keccak256(encoded);
address claimSigner = digestreal.toEthSignedMessageHash().recover(signature);
require(claimSigner == freemintSigner, "Invalid Message Signer.");
IERC721(mintingContract).mint(msg.sender, uint256(claimAmmt));
for (uint i = 0; i < claimAmmt; i++) {
//Emit an event
emit Mint(nextId, false);
nextId += 1;
}
}
function publicSale(uint totalMint) payable public {
require(block.timestamp >= publicSaleStart, "Sale has not begun");
require( msg.value >= totalMint * tokenPrice, "Not enough ETH sent");
IERC721(mintingContract).mint(msg.sender, uint256(totalMint));
for (uint i = 0; i < totalMint; i++) {
//Emit an event
emit Mint(nextId, false);
nextId += 1;
}
}
function preorderMint(uint doublePreorders, uint triplePreorders) payable public {
require(block.timestamp >= preSaleStart, "Presale has not begun");
uint totalMint = doublePreorders + triplePreorders;
IERC1155 POContract = IERC1155(preorderContract);
IERC1155Burnable POBurn = IERC1155Burnable(preorderContract);
uint priceRequired = tokenPrice * totalMint - (doubleDiscount * doublePreorders) -(tripleDiscount * triplePreorders);
require(msg.value >= priceRequired, "Not enough ETH sent");
// burn double preorders equal to #
// check holdingsdoublePreorders);
if (doublePreorders > 0) {
require(POContract.balanceOf(_msgSender(), DOUBLE_TICKET) >= doublePreorders, "Need as many preorder tickets as being requested to mint");
POBurn.burn(_msgSender(), DOUBLE_TICKET, doublePreorders);
}
if (triplePreorders > 0) {
require(POContract.balanceOf(_msgSender(), TRIPLE_TICKET) >= triplePreorders, "Need as many preorder tickets as being requested to mint");
POBurn.burn(_msgSender(), TRIPLE_TICKET, triplePreorders);
}
for (uint i = 0; i < totalMint; i++) {
//Emit an event
emit Mint(nextId, false);
nextId += 1;
}
IERC721(mintingContract).mint(_msgSender(), totalMint);
}
function parent(bool[] memory tokentypes, uint256[] memory parents, address[] memory owners, bool[] memory parentsfur, bytes memory signature) public {
// require(mintAllowed, "Minting period has ended");
bytes memory encoded = abi.encodePacked(msg.sender, tokentypes, owners, parents);
bytes32 digestreal = keccak256(encoded);
address claimSigner = digestreal.toEthSignedMessageHash().recover(signature);
require(claimSigner == parentingSigner, "Invalid Message Signer.");
require(block.timestamp >= preSaleStart, "Presale has not begun");
require(parents.length == tokentypes.length, "Length of parents and tokentypes must be the same");
require(parents.length == owners.length, "Length of parents and owners must be the same");
uint pairs = parents.length / 2;
require(parentsfur.length == pairs, "Must have a fur choice for each pair");
// first, verify tokens and mark them as used
for (uint i = 0; i < parents.length; i++) {
if (tokentypes[i]) {
require(IERC721(genesisContract).ownerOf(parents[i]) == owners[i], "Must own genesis token");
require(IER721ParentTracker(mintingContract).genesisParents(parents[i]) == false, "Token must not already be a parent");
IER721ParentTracker(mintingContract).setGenesisParentUsed(parents[i], true);
} else {
// require(IERC721(legendsContract));
require(IERC721(legendsContract).ownerOf(parents[i]) == owners[i], "Must own legend token");
require(IER721ParentTracker(mintingContract).legendParents(parents[i]) == false, "Token must not already be a parent");
IER721ParentTracker(mintingContract).setLegendParentUsed(parents[i], true);
}
}
// let's mint!
for (uint i = 0; i < pairs; i++) {
//Emit an event
emit Mint(nextId, parentsfur[i]);
nextId += 1;
}
IER721ParentTracker(mintingContract).parentMint(msg.sender, pairs);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @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);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155 is IERC165 {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
external
view
returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes calldata data
) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.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 Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: Unlicense
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <goncalo.sa@consensys.net>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
)
internal
pure
returns (bytes memory)
{
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
// Initialize a copy counter to the start of the _preBytes data,
// 32 bytes into its memory.
let cc := add(_preBytes, 0x20)
} lt(mc, end) {
// Increase both counters by 32 bytes each iteration.
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
// Write the _preBytes data into the tempBytes memory 32 bytes
// at a time.
mstore(mc, mload(cc))
}
// Add the length of _postBytes to the current length of tempBytes
// and store it as the new length in the first 32 bytes of the
// tempBytes memory.
length := mload(_postBytes)
mstore(tempBytes, add(length, mload(tempBytes)))
// Move the memory counter back from a multiple of 0x20 to the
// actual end of the _preBytes data.
mc := end
// Stop copying when the memory counter reaches the new combined
// length of the arrays.
end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
// Update the free-memory pointer by padding our last write location
// to 32 bytes: add 31 bytes to the end of tempBytes to move to the
// next 32 byte block, then round down to the nearest multiple of
// 32. If the sum of the length of the two arrays is zero then add
// one before rounding down to leave a blank 32 bytes (the length block with 0).
mstore(0x40, and(
add(add(end, iszero(add(length, mload(_preBytes)))), 31),
not(31) // Round down to the nearest 32 bytes.
))
}
return tempBytes;
}
function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
assembly {
// Read the first 32 bytes of _preBytes storage, which is the length
// of the array. (We don't need to use the offset into the slot
// because arrays use the entire slot.)
let fslot := sload(_preBytes.slot)
// Arrays of 31 bytes or less have an even value in their slot,
// while longer arrays have an odd value. The actual length is
// the slot divided by two for odd values, and the lowest order
// byte divided by two for even values.
// If the slot is even, bitwise and the slot with 255 and divide by
// two to get the length. If the slot is odd, bitwise and the slot
// with -1 and divide by two.
let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
let mlength := mload(_postBytes)
let newlength := add(slength, mlength)
// slength can contain both the length and contents of the array
// if length < 32 bytes so let's prepare for that
// v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
switch add(lt(slength, 32), lt(newlength, 32))
case 2 {
// Since the new array still fits in the slot, we just need to
// update the contents of the slot.
// uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
sstore(
_preBytes.slot,
// all the modifications to the slot are inside this
// next block
add(
// we can just add to the slot contents because the
// bytes we want to change are the LSBs
fslot,
add(
mul(
div(
// load the bytes from memory
mload(add(_postBytes, 0x20)),
// zero all bytes to the right
exp(0x100, sub(32, mlength))
),
// and now shift left the number of bytes to
// leave space for the length in the slot
exp(0x100, sub(32, newlength))
),
// increase length by the double of the memory
// bytes length
mul(mlength, 2)
)
)
)
}
case 1 {
// The stored value fits in the slot, but the combined value
// will exceed it.
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
// save new length
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
// The contents of the _postBytes array start 32 bytes into
// the structure. Our first read should obtain the `submod`
// bytes that can fit into the unused space in the last word
// of the stored array. To get this, we read 32 bytes starting
// from `submod`, so the data we read overlaps with the array
// contents by `submod` bytes. Masking the lowest-order
// `submod` bytes allows us to add that value directly to the
// stored value.
let submod := sub(32, slength)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(
sc,
add(
and(
fslot,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
),
and(mload(mc), mask)
)
)
for {
mc := add(mc, 0x20)
sc := add(sc, 1)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
default {
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
// Start copying to the last used word of the stored array.
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
// save new length
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
// Copy over the first `submod` bytes of the new data as in
// case 1 above.
let slengthmod := mod(slength, 32)
let mlengthmod := mod(mlength, 32)
let submod := sub(32, slengthmod)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(sc, add(sload(sc), and(mload(mc), mask)))
for {
sc := add(sc, 1)
mc := add(mc, 0x20)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
}
}
function slice(
bytes memory _bytes,
uint256 _start,
uint256 _length
)
internal
pure
returns (bytes memory)
{
require(_length + 31 >= _length, "slice_overflow");
require(_bytes.length >= _start + _length, "slice_outOfBounds");
bytes memory tempBytes;
assembly {
switch iszero(_length)
case 0 {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// The first word of the slice result is potentially a partial
// word read from the original array. To read it, we calculate
// the length of that partial word and start copying that many
// bytes into the array. The first word we copy will start with
// data we don't care about, but the last `lengthmod` bytes will
// land at the beginning of the contents of the new array. When
// we're done copying, we overwrite the full first word with
// the actual length of the slice.
let lengthmod := and(_length, 31)
// The multiplication in the next line is necessary
// because when slicing multiples of 32 bytes (lengthmod == 0)
// the following copy loop was copying the origin's length
// and then ending prematurely not copying everything it should.
let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
let end := add(mc, _length)
for {
// The multiplication in the next line has the same exact purpose
// as the one above.
let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(tempBytes, _length)
//update free-memory pointer
//allocating the array padded to 32 bytes like the compiler does now
mstore(0x40, and(add(mc, 31), not(31)))
}
//if we want a zero-length slice let's just return a zero-length array
default {
tempBytes := mload(0x40)
//zero out the 32 bytes slice we are about to return
//we need to do it because Solidity does not garbage collect
mstore(tempBytes, 0)
mstore(0x40, add(tempBytes, 0x20))
}
}
return tempBytes;
}
function toAddress(bytes memory _bytes, uint256 _start) internal pure returns (address) {
require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
address tempAddress;
assembly {
tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
}
return tempAddress;
}
function toUint8(bytes memory _bytes, uint256 _start) internal pure returns (uint8) {
require(_bytes.length >= _start + 1 , "toUint8_outOfBounds");
uint8 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x1), _start))
}
return tempUint;
}
function toUint16(bytes memory _bytes, uint256 _start) internal pure returns (uint16) {
require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
uint16 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x2), _start))
}
return tempUint;
}
function toUint32(bytes memory _bytes, uint256 _start) internal pure returns (uint32) {
require(_bytes.length >= _start + 4, "toUint32_outOfBounds");
uint32 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x4), _start))
}
return tempUint;
}
function toUint64(bytes memory _bytes, uint256 _start) internal pure returns (uint64) {
require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
uint64 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x8), _start))
}
return tempUint;
}
function toUint96(bytes memory _bytes, uint256 _start) internal pure returns (uint96) {
require(_bytes.length >= _start + 12, "toUint96_outOfBounds");
uint96 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0xc), _start))
}
return tempUint;
}
function toUint128(bytes memory _bytes, uint256 _start) internal pure returns (uint128) {
require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
uint128 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x10), _start))
}
return tempUint;
}
function toUint256(bytes memory _bytes, uint256 _start) internal pure returns (uint256) {
require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
uint256 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
function toBytes32(bytes memory _bytes, uint256 _start) internal pure returns (bytes32) {
require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
bytes32 tempBytes32;
assembly {
tempBytes32 := mload(add(add(_bytes, 0x20), _start))
}
return tempBytes32;
}
function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
bool success = true;
assembly {
let length := mload(_preBytes)
// if lengths don't match the arrays are not equal
switch eq(length, mload(_postBytes))
case 1 {
// cb is a circuit breaker in the for loop since there's
// no said feature for inline assembly loops
// cb = 1 - don't breaker
// cb = 0 - break
let cb := 1
let mc := add(_preBytes, 0x20)
let end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
// the next line is the loop condition:
// while(uint256(mc < end) + cb == 2)
} eq(add(lt(mc, end), cb), 2) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
// if any of these checks fails then arrays are not equal
if iszero(eq(mload(mc), mload(cc))) {
// unsuccess:
success := 0
cb := 0
}
}
}
default {
// unsuccess:
success := 0
}
}
return success;
}
function equalStorage(
bytes storage _preBytes,
bytes memory _postBytes
)
internal
view
returns (bool)
{
bool success = true;
assembly {
// we know _preBytes_offset is 0
let fslot := sload(_preBytes.slot)
// Decode the length of the stored array like in concatStorage().
let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
let mlength := mload(_postBytes)
// if lengths don't match the arrays are not equal
switch eq(slength, mlength)
case 1 {
// slength can contain both the length and contents of the array
// if length < 32 bytes so let's prepare for that
// v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
if iszero(iszero(slength)) {
switch lt(slength, 32)
case 1 {
// blank the last byte which is the length
fslot := mul(div(fslot, 0x100), 0x100)
if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
// unsuccess:
success := 0
}
}
default {
// cb is a circuit breaker in the for loop since there's
// no said feature for inline assembly loops
// cb = 1 - don't breaker
// cb = 0 - break
let cb := 1
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
let sc := keccak256(0x0, 0x20)
let mc := add(_postBytes, 0x20)
let end := add(mc, mlength)
// the next line is the loop condition:
// while(uint256(mc < end) + cb == 2)
for {} eq(add(lt(mc, end), cb), 2) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
if iszero(eq(sload(sc), mload(mc))) {
// unsuccess:
success := 0
cb := 0
}
}
}
}
}
default {
// unsuccess:
success := 0
}
}
return success;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"}],"name":"ManyMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"parentsfur","type":"bool"}],"name":"Mint","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":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"parentsfur","type":"bool"}],"name":"ParentMint","type":"event"},{"inputs":[],"name":"DOUBLE_TICKET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRIPLE_TICKET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"totalMint","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doubleDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freemintSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendsContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool[]","name":"tokentypes","type":"bool[]"},{"internalType":"uint256[]","name":"parents","type":"uint256[]"},{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"bool[]","name":"parentsfur","type":"bool[]"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"parent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"parentingSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payout","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preorderContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"doublePreorders","type":"uint256"},{"internalType":"uint256","name":"triplePreorders","type":"uint256"}],"name":"preorderMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalMint","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"genesis_","type":"address"},{"internalType":"address","name":"legends_","type":"address"}],"name":"setGenesisLegendsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mintingContract_","type":"address"}],"name":"setMintingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nextId_","type":"uint256"}],"name":"setNextId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"preorderContract_","type":"address"}],"name":"setPreorderContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenPrice_","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"preSaleStartTime","type":"uint256"},{"internalType":"uint256","name":"publicSaleStartTime","type":"uint256"}],"name":"setSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"parentingSigner_","type":"address"},{"internalType":"address","name":"freemintSigner_","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tripleDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"claimAmmt","type":"uint256"},{"internalType":"uint256","name":"claimTotal","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]Contract Creation Code
60806040526363293ac060055563632e2c60600655670429d069189e000060078190556702c68af0bb140000600855600955600a80546001600160a01b0319908116736a4813082c2f6598b01698b222c5b1414fe77ef617909155600b80548216733df6f92097b349f30d31315a7453821f14998f3e908117909155600c80549092161790556001600e5534801561009657600080fd5b506100a0336100a5565b6100f5565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6123a6806101046000396000f3fe6080604052600436106101ee5760003560e01c80638175e89c1161010d578063c884ef83116100a0578063d8e99f921161006f578063d8e99f9214610531578063f2fde38b14610551578063f5b8cde314610571578063f8e8b1b214610587578063f9843dd0146105a757600080fd5b8063c884ef83146104a4578063c8a0dde6146104d1578063d2f6f67d146104f1578063d559f1e81461051157600080fd5b806391b7f5ed116100dc57806391b7f5ed14610431578063a3ff39b214610451578063b287c8ed14610471578063c56e13751461048457600080fd5b80638175e89c146103be5780638ba4cc3c146103de5780638da5cb5b146103fe57806390f871771461041c57600080fd5b80634822f9281161018557806365c649a21161015457806365c649a21461036b5780636aaba4801461037e578063715018a6146103935780637ff9b596146103a857600080fd5b80634822f928146102f55780634e4da0a71461031557806361b8ce8c1461033557806363bd1d4a1461034b57600080fd5b806329d0d51f116101c157806329d0d51f146102895780632c46b5811461029f5780633360caa0146102bf57806337bdc99b146102d557600080fd5b8063019e9251146101f3578063022f7a6b146102155780630d5624b3146102525780631b36a7fc14610276575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611fb8565b6105c7565b005b34801561022157600080fd5b50600c54610235906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b5061026860055481565b604051908152602001610249565b610213610284366004611fea565b6105d4565b34801561029557600080fd5b5061026860085481565b3480156102ab57600080fd5b506102136102ba366004611e23565b6109d5565b3480156102cb57600080fd5b5061026860065481565b3480156102e157600080fd5b506102136102f0366004611fb8565b6109ff565b34801561030157600080fd5b50600154610235906001600160a01b031681565b34801561032157600080fd5b50610213610330366004611ec9565b610a8f565b34801561034157600080fd5b50610268600e5481565b34801561035757600080fd5b50600a54610235906001600160a01b031681565b61021361037936600461200c565b61129f565b34801561038a57600080fd5b50610268600281565b34801561039f57600080fd5b506102136114c4565b3480156103b457600080fd5b5061026860075481565b3480156103ca57600080fd5b506102136103d9366004611e64565b6114d8565b3480156103ea57600080fd5b506102136103f9366004611e9d565b61150e565b34801561040a57600080fd5b506000546001600160a01b0316610235565b34801561042857600080fd5b50610268600381565b34801561043d57600080fd5b5061021361044c366004611fb8565b6115dc565b34801561045d57600080fd5b5061021361046c366004611e23565b6115e9565b61021361047f366004611fb8565b611613565b34801561049057600080fd5b5061021361049f366004611e23565b611774565b3480156104b057600080fd5b506102686104bf366004611e23565b600d6020526000908152604090205481565b3480156104dd57600080fd5b506102136104ec366004611fea565b61179e565b3480156104fd57600080fd5b50600254610235906001600160a01b031681565b34801561051d57600080fd5b50600454610235906001600160a01b031681565b34801561053d57600080fd5b50600354610235906001600160a01b031681565b34801561055d57600080fd5b5061021361056c366004611e23565b6117b1565b34801561057d57600080fd5b5061026860095481565b34801561059357600080fd5b50600b54610235906001600160a01b031681565b3480156105b357600080fd5b506102136105c2366004611e64565b61182a565b6105cf611860565b600e55565b6005544210156105ff5760405162461bcd60e51b81526004016105f690612169565b60405180910390fd5b600061060b828461224a565b6001546009549192506001600160a01b031690819060009061062e908690612284565b8660085461063c9190612284565b8560075461064a9190612284565b61065491906122a3565b61065e91906122a3565b9050803410156106a65760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016105f6565b85156107d057856001600160a01b03841662fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526002602482015260440160206040518083038186803b15801561070257600080fd5b505afa158015610716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073a9190611fd1565b10156107585760405162461bcd60e51b81526004016105f690612198565b6001600160a01b03821663f5298aca336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526002602482015260448101899052606401600060405180830381600087803b1580156107b757600080fd5b505af11580156107cb573d6000803e3d6000fd5b505050505b84156108fa57846001600160a01b03841662fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526003602482015260440160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190611fd1565b10156108825760405162461bcd60e51b81526004016105f690612198565b6001600160a01b03821663f5298aca336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526003602482015260448101889052606401600060405180830381600087803b1580156108e157600080fd5b505af11580156108f5573d6000803e3d6000fd5b505050505b60005b8481101561095a57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e6000828254610942919061224a565b90915550819050610952816122ba565b9150506108fd565b506002546001600160a01b03166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101879052604401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b50505050505050505050565b6109dd611860565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b4781811015610a505760405162461bcd60e51b815260206004820181905260248201527f4d757374206861766520656e6f7567682062616c616e636520746f2073656e6460448201526064016105f6565b600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610a8a573d6000803e3d6000fd5b505050565b600033868587604051602001610aa89493929190612099565b60408051601f19818403018152919052805160208201209091506000610ad784610ad1846118ba565b9061190d565b600b549091506001600160a01b03808316911614610b315760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b21026b2b9b9b0b3b29029b4b3b732b91760491b60448201526064016105f6565b600554421015610b535760405162461bcd60e51b81526004016105f690612169565b8751875114610bbe5760405162461bcd60e51b815260206004820152603160248201527f4c656e677468206f6620706172656e747320616e6420746f6b656e7479706573604482015270206d757374206265207468652073616d6560781b60648201526084016105f6565b8551875114610c255760405162461bcd60e51b815260206004820152602d60248201527f4c656e677468206f6620706172656e747320616e64206f776e657273206d757360448201526c74206265207468652073616d6560981b60648201526084016105f6565b600060028851610c359190612262565b905080865114610c935760405162461bcd60e51b8152602060048201526024808201527f4d75737420686176652061206675722063686f69636520666f722065616368206044820152633830b4b960e11b60648201526084016105f6565b60005b88518110156111ab57898181518110610cb157610cb1612301565b602002602001015115610f2e57878181518110610cd057610cd0612301565b60200260200101516001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b0316636352211e8b8481518110610d1757610d17612301565b60200260200101516040518263ffffffff1660e01b8152600401610d3d91815260200190565b602060405180830381600087803b158015610d5757600080fd5b505af1158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611e47565b6001600160a01b031614610dde5760405162461bcd60e51b815260206004820152601660248201527526bab9ba1037bbb71033b2b732b9b4b9903a37b5b2b760511b60448201526064016105f6565b60025489516001600160a01b03909116906382478756908b9084908110610e0757610e07612301565b60200260200101516040518263ffffffff1660e01b8152600401610e2d91815260200190565b602060405180830381600087803b158015610e4757600080fd5b505af1158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f9190611f9b565b15610e9c5760405162461bcd60e51b81526004016105f690612127565b60025489516001600160a01b03909116906318cdf15e908b9084908110610ec557610ec5612301565b602002602001015160016040518363ffffffff1660e01b8152600401610ef79291909182521515602082015260400190565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b50505050611199565b878181518110610f4057610f40612301565b60200260200101516001600160a01b0316600460009054906101000a90046001600160a01b03166001600160a01b0316636352211e8b8481518110610f8757610f87612301565b60200260200101516040518263ffffffff1660e01b8152600401610fad91815260200190565b602060405180830381600087803b158015610fc757600080fd5b505af1158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190611e47565b6001600160a01b03161461104d5760405162461bcd60e51b815260206004820152601560248201527426bab9ba1037bbb7103632b3b2b732103a37b5b2b760591b60448201526064016105f6565b60025489516001600160a01b03909116906372524806908b908490811061107657611076612301565b60200260200101516040518263ffffffff1660e01b815260040161109c91815260200190565b602060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ee9190611f9b565b1561110b5760405162461bcd60e51b81526004016105f690612127565b60025489516001600160a01b0390911690636f18f966908b908490811061113457611134612301565b602002602001015160016040518363ffffffff1660e01b81526004016111669291909182521515602082015260400190565b600060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b505050505b806111a3816122ba565b915050610c96565b5060005b8181101561122f57600080516020612351833981519152600e548883815181106111db576111db612301565b60200260200101516040516111fc9291909182521515602082015260400190565b60405180910390a16001600e6000828254611217919061224a565b90915550819050611227816122ba565b9150506111af565b5060025460405163389e67ab60e01b8152336004820152602481018390526001600160a01b039091169063389e67ab90604401600060405180830381600087803b15801561127c57600080fd5b505af1158015611290573d6000803e3d6000fd5b50505050505050505050505050565b6005544210156112c15760405162461bcd60e51b81526004016105f690612169565b336000908152600d602052604090205482906112de90859061224a565b111561131f5760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016105f6565b336000908152600d60205260408120805485929061133e90849061224a565b9091555050604080516020810186905290810183905233606090811b6bffffffffffffffffffffffff19169082015260009060740160408051601f1981840301815291905280516020820120909150600061139c84610ad1846118ba565b600c549091506001600160a01b038083169116146113f65760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b21026b2b9b9b0b3b29029b4b3b732b91760491b60448201526064016105f6565b6002546040516340c10f1960e01b8152336004820152602481018890526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505060005b868110156114ba57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e60008282546114a2919061224a565b909155508190506114b2816122ba565b91505061145d565b5050505050505050565b6114cc611860565b6114d66000611931565b565b6114e0611860565b600b80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b611516611860565b6002546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561156457600080fd5b505af1158015611578573d6000803e3d6000fd5b5050505060005b81811015610a8a57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e60008282546115c4919061224a565b909155508190506115d4816122ba565b91505061157f565b6115e4611860565b600755565b6115f1611860565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60065442101561165a5760405162461bcd60e51b815260206004820152601260248201527129b0b632903430b9903737ba103132b3bab760711b60448201526064016105f6565b6007546116679082612284565b3410156116ac5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016105f6565b6002546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156116f857600080fd5b505af115801561170c573d6000803e3d6000fd5b5050505060005b8181101561177057600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e6000828254611758919061224a565b90915550819050611768816122ba565b915050611713565b5050565b61177c611860565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6117a6611860565b600591909155600655565b6117b9611860565b6001600160a01b03811661181e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f6565b61182781611931565b50565b611832611860565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b6000546001600160a01b031633146114d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f6565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b600080600061191c8585611981565b91509150611929816119c7565b509392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808251604114156119b85760208301516040840151606085015160001a6119ac87828585611b82565b945094505050506119c0565b506000905060025b9250929050565b60008160048111156119db576119db6122eb565b14156119e45750565b60018160048111156119f8576119f86122eb565b1415611a465760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f6565b6002816004811115611a5a57611a5a6122eb565b1415611aa85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f6565b6003816004811115611abc57611abc6122eb565b1415611b155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105f6565b6004816004811115611b2957611b296122eb565b14156118275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105f6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611bb95750600090506003611c66565b8460ff16601b14158015611bd157508460ff16601c14155b15611be25750600090506004611c66565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c36573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c5f57600060019250925050611c66565b9150600090505b94509492505050565b600082601f830112611c8057600080fd5b81356020611c95611c9083612226565b6121f5565b80838252828201915082860187848660051b8901011115611cb557600080fd5b60005b85811015611cdd578135611ccb8161232d565b84529284019290840190600101611cb8565b5090979650505050505050565b600082601f830112611cfb57600080fd5b81356020611d0b611c9083612226565b80838252828201915082860187848660051b8901011115611d2b57600080fd5b60005b85811015611cdd578135611d4181612342565b84529284019290840190600101611d2e565b600082601f830112611d6457600080fd5b81356020611d74611c9083612226565b80838252828201915082860187848660051b8901011115611d9457600080fd5b60005b85811015611cdd57813584529284019290840190600101611d97565b600082601f830112611dc457600080fd5b813567ffffffffffffffff811115611dde57611dde612317565b611df1601f8201601f19166020016121f5565b818152846020838601011115611e0657600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611e3557600080fd5b8135611e408161232d565b9392505050565b600060208284031215611e5957600080fd5b8151611e408161232d565b60008060408385031215611e7757600080fd5b8235611e828161232d565b91506020830135611e928161232d565b809150509250929050565b60008060408385031215611eb057600080fd5b8235611ebb8161232d565b946020939093013593505050565b600080600080600060a08688031215611ee157600080fd5b853567ffffffffffffffff80821115611ef957600080fd5b611f0589838a01611cea565b96506020880135915080821115611f1b57600080fd5b611f2789838a01611d53565b95506040880135915080821115611f3d57600080fd5b611f4989838a01611c6f565b94506060880135915080821115611f5f57600080fd5b611f6b89838a01611cea565b93506080880135915080821115611f8157600080fd5b50611f8e88828901611db3565b9150509295509295909350565b600060208284031215611fad57600080fd5b8151611e4081612342565b600060208284031215611fca57600080fd5b5035919050565b600060208284031215611fe357600080fd5b5051919050565b60008060408385031215611ffd57600080fd5b50508035926020909101359150565b6000806000806080858703121561202257600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561204e57600080fd5b61205a87828801611db3565b91505092959194509250565b60008151602080840160005b8381101561208e57815187529582019590820190600101612072565b509495945050505050565b6bffffffffffffffffffffffff198560601b1681526000601482018551602080880160005b838110156120dc5781511515855293820193908201906001016120be565b5050865181880193925060005b8181101561210e5784516001600160a01b0316845293820193928201926001016120e9565b50505061211b8186612066565b98975050505050505050565b60208082526022908201527f546f6b656e206d757374206e6f7420616c7265616479206265206120706172656040820152611b9d60f21b606082015260800190565b602080825260159082015274283932b9b0b632903430b9903737ba103132b3bab760591b604082015260600190565b60208082526038908201527f4e656564206173206d616e79207072656f72646572207469636b65747320617360408201527f206265696e672072657175657374656420746f206d696e740000000000000000606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561221e5761221e612317565b604052919050565b600067ffffffffffffffff82111561224057612240612317565b5060051b60200190565b6000821982111561225d5761225d6122d5565b500190565b60008261227f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561229e5761229e6122d5565b500290565b6000828210156122b5576122b56122d5565b500390565b60006000198214156122ce576122ce6122d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461182757600080fd5b801515811461182757600080fdfedca3b34e6c9d5f86272dbca88ab5572823f1c041d4deba565154c22e1b812a41a2646970667358221220b7f0e40d0e9f44fcade0ced68813c49b719c666553479891bed5efa9eeb6393f64736f6c63430008060033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80638175e89c1161010d578063c884ef83116100a0578063d8e99f921161006f578063d8e99f9214610531578063f2fde38b14610551578063f5b8cde314610571578063f8e8b1b214610587578063f9843dd0146105a757600080fd5b8063c884ef83146104a4578063c8a0dde6146104d1578063d2f6f67d146104f1578063d559f1e81461051157600080fd5b806391b7f5ed116100dc57806391b7f5ed14610431578063a3ff39b214610451578063b287c8ed14610471578063c56e13751461048457600080fd5b80638175e89c146103be5780638ba4cc3c146103de5780638da5cb5b146103fe57806390f871771461041c57600080fd5b80634822f9281161018557806365c649a21161015457806365c649a21461036b5780636aaba4801461037e578063715018a6146103935780637ff9b596146103a857600080fd5b80634822f928146102f55780634e4da0a71461031557806361b8ce8c1461033557806363bd1d4a1461034b57600080fd5b806329d0d51f116101c157806329d0d51f146102895780632c46b5811461029f5780633360caa0146102bf57806337bdc99b146102d557600080fd5b8063019e9251146101f3578063022f7a6b146102155780630d5624b3146102525780631b36a7fc14610276575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611fb8565b6105c7565b005b34801561022157600080fd5b50600c54610235906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561025e57600080fd5b5061026860055481565b604051908152602001610249565b610213610284366004611fea565b6105d4565b34801561029557600080fd5b5061026860085481565b3480156102ab57600080fd5b506102136102ba366004611e23565b6109d5565b3480156102cb57600080fd5b5061026860065481565b3480156102e157600080fd5b506102136102f0366004611fb8565b6109ff565b34801561030157600080fd5b50600154610235906001600160a01b031681565b34801561032157600080fd5b50610213610330366004611ec9565b610a8f565b34801561034157600080fd5b50610268600e5481565b34801561035757600080fd5b50600a54610235906001600160a01b031681565b61021361037936600461200c565b61129f565b34801561038a57600080fd5b50610268600281565b34801561039f57600080fd5b506102136114c4565b3480156103b457600080fd5b5061026860075481565b3480156103ca57600080fd5b506102136103d9366004611e64565b6114d8565b3480156103ea57600080fd5b506102136103f9366004611e9d565b61150e565b34801561040a57600080fd5b506000546001600160a01b0316610235565b34801561042857600080fd5b50610268600381565b34801561043d57600080fd5b5061021361044c366004611fb8565b6115dc565b34801561045d57600080fd5b5061021361046c366004611e23565b6115e9565b61021361047f366004611fb8565b611613565b34801561049057600080fd5b5061021361049f366004611e23565b611774565b3480156104b057600080fd5b506102686104bf366004611e23565b600d6020526000908152604090205481565b3480156104dd57600080fd5b506102136104ec366004611fea565b61179e565b3480156104fd57600080fd5b50600254610235906001600160a01b031681565b34801561051d57600080fd5b50600454610235906001600160a01b031681565b34801561053d57600080fd5b50600354610235906001600160a01b031681565b34801561055d57600080fd5b5061021361056c366004611e23565b6117b1565b34801561057d57600080fd5b5061026860095481565b34801561059357600080fd5b50600b54610235906001600160a01b031681565b3480156105b357600080fd5b506102136105c2366004611e64565b61182a565b6105cf611860565b600e55565b6005544210156105ff5760405162461bcd60e51b81526004016105f690612169565b60405180910390fd5b600061060b828461224a565b6001546009549192506001600160a01b031690819060009061062e908690612284565b8660085461063c9190612284565b8560075461064a9190612284565b61065491906122a3565b61065e91906122a3565b9050803410156106a65760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016105f6565b85156107d057856001600160a01b03841662fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526002602482015260440160206040518083038186803b15801561070257600080fd5b505afa158015610716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073a9190611fd1565b10156107585760405162461bcd60e51b81526004016105f690612198565b6001600160a01b03821663f5298aca336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526002602482015260448101899052606401600060405180830381600087803b1580156107b757600080fd5b505af11580156107cb573d6000803e3d6000fd5b505050505b84156108fa57846001600160a01b03841662fdd58e336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526003602482015260440160206040518083038186803b15801561082c57600080fd5b505afa158015610840573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108649190611fd1565b10156108825760405162461bcd60e51b81526004016105f690612198565b6001600160a01b03821663f5298aca336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526003602482015260448101889052606401600060405180830381600087803b1580156108e157600080fd5b505af11580156108f5573d6000803e3d6000fd5b505050505b60005b8481101561095a57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e6000828254610942919061224a565b90915550819050610952816122ba565b9150506108fd565b506002546001600160a01b03166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101879052604401600060405180830381600087803b1580156109b557600080fd5b505af11580156109c9573d6000803e3d6000fd5b50505050505050505050565b6109dd611860565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b4781811015610a505760405162461bcd60e51b815260206004820181905260248201527f4d757374206861766520656e6f7567682062616c616e636520746f2073656e6460448201526064016105f6565b600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610a8a573d6000803e3d6000fd5b505050565b600033868587604051602001610aa89493929190612099565b60408051601f19818403018152919052805160208201209091506000610ad784610ad1846118ba565b9061190d565b600b549091506001600160a01b03808316911614610b315760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b21026b2b9b9b0b3b29029b4b3b732b91760491b60448201526064016105f6565b600554421015610b535760405162461bcd60e51b81526004016105f690612169565b8751875114610bbe5760405162461bcd60e51b815260206004820152603160248201527f4c656e677468206f6620706172656e747320616e6420746f6b656e7479706573604482015270206d757374206265207468652073616d6560781b60648201526084016105f6565b8551875114610c255760405162461bcd60e51b815260206004820152602d60248201527f4c656e677468206f6620706172656e747320616e64206f776e657273206d757360448201526c74206265207468652073616d6560981b60648201526084016105f6565b600060028851610c359190612262565b905080865114610c935760405162461bcd60e51b8152602060048201526024808201527f4d75737420686176652061206675722063686f69636520666f722065616368206044820152633830b4b960e11b60648201526084016105f6565b60005b88518110156111ab57898181518110610cb157610cb1612301565b602002602001015115610f2e57878181518110610cd057610cd0612301565b60200260200101516001600160a01b0316600360009054906101000a90046001600160a01b03166001600160a01b0316636352211e8b8481518110610d1757610d17612301565b60200260200101516040518263ffffffff1660e01b8152600401610d3d91815260200190565b602060405180830381600087803b158015610d5757600080fd5b505af1158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f9190611e47565b6001600160a01b031614610dde5760405162461bcd60e51b815260206004820152601660248201527526bab9ba1037bbb71033b2b732b9b4b9903a37b5b2b760511b60448201526064016105f6565b60025489516001600160a01b03909116906382478756908b9084908110610e0757610e07612301565b60200260200101516040518263ffffffff1660e01b8152600401610e2d91815260200190565b602060405180830381600087803b158015610e4757600080fd5b505af1158015610e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7f9190611f9b565b15610e9c5760405162461bcd60e51b81526004016105f690612127565b60025489516001600160a01b03909116906318cdf15e908b9084908110610ec557610ec5612301565b602002602001015160016040518363ffffffff1660e01b8152600401610ef79291909182521515602082015260400190565b600060405180830381600087803b158015610f1157600080fd5b505af1158015610f25573d6000803e3d6000fd5b50505050611199565b878181518110610f4057610f40612301565b60200260200101516001600160a01b0316600460009054906101000a90046001600160a01b03166001600160a01b0316636352211e8b8481518110610f8757610f87612301565b60200260200101516040518263ffffffff1660e01b8152600401610fad91815260200190565b602060405180830381600087803b158015610fc757600080fd5b505af1158015610fdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fff9190611e47565b6001600160a01b03161461104d5760405162461bcd60e51b815260206004820152601560248201527426bab9ba1037bbb7103632b3b2b732103a37b5b2b760591b60448201526064016105f6565b60025489516001600160a01b03909116906372524806908b908490811061107657611076612301565b60200260200101516040518263ffffffff1660e01b815260040161109c91815260200190565b602060405180830381600087803b1580156110b657600080fd5b505af11580156110ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110ee9190611f9b565b1561110b5760405162461bcd60e51b81526004016105f690612127565b60025489516001600160a01b0390911690636f18f966908b908490811061113457611134612301565b602002602001015160016040518363ffffffff1660e01b81526004016111669291909182521515602082015260400190565b600060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b505050505b806111a3816122ba565b915050610c96565b5060005b8181101561122f57600080516020612351833981519152600e548883815181106111db576111db612301565b60200260200101516040516111fc9291909182521515602082015260400190565b60405180910390a16001600e6000828254611217919061224a565b90915550819050611227816122ba565b9150506111af565b5060025460405163389e67ab60e01b8152336004820152602481018390526001600160a01b039091169063389e67ab90604401600060405180830381600087803b15801561127c57600080fd5b505af1158015611290573d6000803e3d6000fd5b50505050505050505050505050565b6005544210156112c15760405162461bcd60e51b81526004016105f690612169565b336000908152600d602052604090205482906112de90859061224a565b111561131f5760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016105f6565b336000908152600d60205260408120805485929061133e90849061224a565b9091555050604080516020810186905290810183905233606090811b6bffffffffffffffffffffffff19169082015260009060740160408051601f1981840301815291905280516020820120909150600061139c84610ad1846118ba565b600c549091506001600160a01b038083169116146113f65760405162461bcd60e51b815260206004820152601760248201527624b73b30b634b21026b2b9b9b0b3b29029b4b3b732b91760491b60448201526064016105f6565b6002546040516340c10f1960e01b8152336004820152602481018890526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561144257600080fd5b505af1158015611456573d6000803e3d6000fd5b5050505060005b868110156114ba57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e60008282546114a2919061224a565b909155508190506114b2816122ba565b91505061145d565b5050505050505050565b6114cc611860565b6114d66000611931565b565b6114e0611860565b600b80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b611516611860565b6002546040516340c10f1960e01b81526001600160a01b03848116600483015260248201849052909116906340c10f1990604401600060405180830381600087803b15801561156457600080fd5b505af1158015611578573d6000803e3d6000fd5b5050505060005b81811015610a8a57600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e60008282546115c4919061224a565b909155508190506115d4816122ba565b91505061157f565b6115e4611860565b600755565b6115f1611860565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60065442101561165a5760405162461bcd60e51b815260206004820152601260248201527129b0b632903430b9903737ba103132b3bab760711b60448201526064016105f6565b6007546116679082612284565b3410156116ac5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da08115512081cd95b9d606a1b60448201526064016105f6565b6002546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156116f857600080fd5b505af115801561170c573d6000803e3d6000fd5b5050505060005b8181101561177057600e546040805191825260006020830152600080516020612351833981519152910160405180910390a16001600e6000828254611758919061224a565b90915550819050611768816122ba565b915050611713565b5050565b61177c611860565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6117a6611860565b600591909155600655565b6117b9611860565b6001600160a01b03811661181e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f6565b61182781611931565b50565b611832611860565b600380546001600160a01b039384166001600160a01b03199182161790915560048054929093169116179055565b6000546001600160a01b031633146114d65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f6565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b600080600061191c8585611981565b91509150611929816119c7565b509392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808251604114156119b85760208301516040840151606085015160001a6119ac87828585611b82565b945094505050506119c0565b506000905060025b9250929050565b60008160048111156119db576119db6122eb565b14156119e45750565b60018160048111156119f8576119f86122eb565b1415611a465760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016105f6565b6002816004811115611a5a57611a5a6122eb565b1415611aa85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016105f6565b6003816004811115611abc57611abc6122eb565b1415611b155760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016105f6565b6004816004811115611b2957611b296122eb565b14156118275760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016105f6565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611bb95750600090506003611c66565b8460ff16601b14158015611bd157508460ff16601c14155b15611be25750600090506004611c66565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c36573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611c5f57600060019250925050611c66565b9150600090505b94509492505050565b600082601f830112611c8057600080fd5b81356020611c95611c9083612226565b6121f5565b80838252828201915082860187848660051b8901011115611cb557600080fd5b60005b85811015611cdd578135611ccb8161232d565b84529284019290840190600101611cb8565b5090979650505050505050565b600082601f830112611cfb57600080fd5b81356020611d0b611c9083612226565b80838252828201915082860187848660051b8901011115611d2b57600080fd5b60005b85811015611cdd578135611d4181612342565b84529284019290840190600101611d2e565b600082601f830112611d6457600080fd5b81356020611d74611c9083612226565b80838252828201915082860187848660051b8901011115611d9457600080fd5b60005b85811015611cdd57813584529284019290840190600101611d97565b600082601f830112611dc457600080fd5b813567ffffffffffffffff811115611dde57611dde612317565b611df1601f8201601f19166020016121f5565b818152846020838601011115611e0657600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611e3557600080fd5b8135611e408161232d565b9392505050565b600060208284031215611e5957600080fd5b8151611e408161232d565b60008060408385031215611e7757600080fd5b8235611e828161232d565b91506020830135611e928161232d565b809150509250929050565b60008060408385031215611eb057600080fd5b8235611ebb8161232d565b946020939093013593505050565b600080600080600060a08688031215611ee157600080fd5b853567ffffffffffffffff80821115611ef957600080fd5b611f0589838a01611cea565b96506020880135915080821115611f1b57600080fd5b611f2789838a01611d53565b95506040880135915080821115611f3d57600080fd5b611f4989838a01611c6f565b94506060880135915080821115611f5f57600080fd5b611f6b89838a01611cea565b93506080880135915080821115611f8157600080fd5b50611f8e88828901611db3565b9150509295509295909350565b600060208284031215611fad57600080fd5b8151611e4081612342565b600060208284031215611fca57600080fd5b5035919050565b600060208284031215611fe357600080fd5b5051919050565b60008060408385031215611ffd57600080fd5b50508035926020909101359150565b6000806000806080858703121561202257600080fd5b843593506020850135925060408501359150606085013567ffffffffffffffff81111561204e57600080fd5b61205a87828801611db3565b91505092959194509250565b60008151602080840160005b8381101561208e57815187529582019590820190600101612072565b509495945050505050565b6bffffffffffffffffffffffff198560601b1681526000601482018551602080880160005b838110156120dc5781511515855293820193908201906001016120be565b5050865181880193925060005b8181101561210e5784516001600160a01b0316845293820193928201926001016120e9565b50505061211b8186612066565b98975050505050505050565b60208082526022908201527f546f6b656e206d757374206e6f7420616c7265616479206265206120706172656040820152611b9d60f21b606082015260800190565b602080825260159082015274283932b9b0b632903430b9903737ba103132b3bab760591b604082015260600190565b60208082526038908201527f4e656564206173206d616e79207072656f72646572207469636b65747320617360408201527f206265696e672072657175657374656420746f206d696e740000000000000000606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561221e5761221e612317565b604052919050565b600067ffffffffffffffff82111561224057612240612317565b5060051b60200190565b6000821982111561225d5761225d6122d5565b500190565b60008261227f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561229e5761229e6122d5565b500290565b6000828210156122b5576122b56122d5565b500390565b60006000198214156122ce576122ce6122d5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461182757600080fd5b801515811461182757600080fdfedca3b34e6c9d5f86272dbca88ab5572823f1c041d4deba565154c22e1b812a41a2646970667358221220b7f0e40d0e9f44fcade0ced68813c49b719c666553479891bed5efa9eeb6393f64736f6c63430008060033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$4,913.04
Net Worth in ETH
2.698175
Token Allocations
ETH
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1,819.64 | 2.7 | $4,913.04 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.