Source Code
Latest 25 from a total of 65 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 17510692 | 901 days ago | IN | 0 ETH | 0.00073516 | ||||
| Pub Mint | 17503922 | 902 days ago | IN | 0.02 ETH | 0.00126307 | ||||
| Set End Id | 17503641 | 902 days ago | IN | 0 ETH | 0.00043372 | ||||
| Pub Mint | 17503585 | 902 days ago | IN | 0.02 ETH | 0.00184064 | ||||
| Pub Mint | 17503528 | 902 days ago | IN | 0.06 ETH | 0.0030712 | ||||
| Pre Mint | 17503525 | 902 days ago | IN | 0.02 ETH | 0.00200349 | ||||
| Pub Mint | 17503054 | 902 days ago | IN | 0.02 ETH | 0.00185632 | ||||
| Pub Mint | 17502588 | 902 days ago | IN | 0.02 ETH | 0.0019544 | ||||
| Pub Mint | 17502465 | 902 days ago | IN | 0.02 ETH | 0.00191686 | ||||
| Pub Mint | 17502376 | 902 days ago | IN | 0.02 ETH | 0.00192706 | ||||
| Pub Mint | 17500305 | 902 days ago | IN | 0.02 ETH | 0.00240681 | ||||
| Pub Mint | 17500297 | 902 days ago | IN | 0.02 ETH | 0.00258832 | ||||
| Pub Mint | 17500082 | 902 days ago | IN | 0.04 ETH | 0.00381128 | ||||
| Pub Mint | 17499766 | 902 days ago | IN | 0.02 ETH | 0.00198184 | ||||
| Pub Mint | 17499742 | 902 days ago | IN | 0.02 ETH | 0.00182703 | ||||
| Pub Mint | 17499739 | 902 days ago | IN | 0.02 ETH | 0.0018859 | ||||
| Pub Mint | 17499707 | 902 days ago | IN | 0.02 ETH | 0.00188895 | ||||
| Pub Mint | 17499704 | 902 days ago | IN | 0.02 ETH | 0.00186645 | ||||
| Pub Mint | 17499702 | 902 days ago | IN | 0.04 ETH | 0.00259747 | ||||
| Pub Mint | 17499689 | 902 days ago | IN | 0.06 ETH | 0.00308442 | ||||
| Pub Mint | 17499687 | 902 days ago | IN | 0.02 ETH | 0.00199463 | ||||
| Pub Mint | 17499687 | 902 days ago | IN | 0.02 ETH | 0.00220309 | ||||
| Set Sale Start | 17499685 | 902 days ago | IN | 0 ETH | 0.00066661 | ||||
| Pre Mint | 17499446 | 902 days ago | IN | 0.02 ETH | 0.00193888 | ||||
| Set Merkle Root | 17499370 | 902 days ago | IN | 0 ETH | 0.00043386 |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MONONOKE_SALE
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol';
contract MONONOKE_SALE is ReentrancyGuard, Ownable {
address public contractAddress;
uint256 public prePrice = 0.02 ether;
uint256 public pubPrice = 0.02 ether;
uint256 public startId = 80;
uint256 public endId = 139;
uint256 public mintId = 80;
bytes32 public merkleRoot;
mapping(uint256 => uint256) public mintLimit; // _mintType 0: preSale, 1: publicSale
mapping(uint256 => bool) public saleStart; // _mintType 0: preSale, 1: publicSale
mapping(address => mapping(uint256 => uint256)) public claimed; // address => (mintType => quantity)
constructor() {
mintLimit[0] = 1;
mintLimit[1] = 5;
}
function setContractAddress(address _contractAddress) external onlyOwner {
contractAddress = _contractAddress;
}
function setStartId(uint256 _startId) external onlyOwner {
startId = _startId;
}
function setEndId(uint256 _endId) external onlyOwner {
endId = _endId;
}
function setPrePrice(uint256 _priceInWei) external onlyOwner {
prePrice = _priceInWei;
}
function setPubPrice(uint256 _priceInWei) external onlyOwner {
pubPrice = _priceInWei;
}
function setMintLimit(uint256 _mintType, uint256 _amount) external onlyOwner {
mintLimit[_mintType] = _amount;
}
function setSaleStart(uint256 _mintType, bool _state) external onlyOwner {
saleStart[_mintType] = _state;
}
function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
merkleRoot = _merkleRoot;
}
function checkMerkleProof(
bytes32[] calldata _merkleProof
) public view returns (bool) {
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
return MerkleProof.verifyCalldata(_merkleProof, merkleRoot, leaf);
}
function preMint(
uint256 _quantity,
bytes32[] calldata _merkleProof
) external payable nonReentrant {
uint256 cost = prePrice * _quantity;
uint256 mintType = 0;
require(saleStart[mintType], 'Before sale begin.');
require(_quantity > 0, 'Please set quantity.');
require(_quantity <= mintLimit[mintType], 'mintLimit over.');
require(endId > mintId, 'Sold out.');
require(msg.value == cost, 'Not enough funds');
require(
claimed[msg.sender][mintType] < mintLimit[mintType],
'Already claimed max'
);
require(checkMerkleProof(_merkleProof), 'Invalid Merkle Proof');
claimed[msg.sender][mintType] += _quantity;
uint256 target = mintId;
for (uint256 i = 0; i < _quantity; ) {
IERC721(contractAddress).transferFrom(owner(), msg.sender, target);
unchecked {
target++;
i++;
}
}
mintId += _quantity;
}
function pubMint(uint256 _quantity) external payable nonReentrant {
uint256 cost = prePrice * _quantity;
uint256 mintType = 1;
require(saleStart[mintType], 'Before sale begin.');
require(_quantity > 0, 'Please set quantity.');
require(_quantity <= mintLimit[mintType], 'mintLimit over.');
require(endId > mintId, 'Sold out.');
require(msg.value == cost, 'Not enough funds');
require(
claimed[msg.sender][mintType] < mintLimit[mintType],
'Already claimed max'
);
claimed[msg.sender][mintType] += _quantity;
uint256 target = mintId;
for (uint256 i = 0; i < _quantity; ) {
IERC721(contractAddress).transferFrom(owner(), msg.sender, target);
unchecked {
target++;
i++;
}
}
mintId += _quantity;
}
struct ProjectMember {
address founder;
address dev;
}
ProjectMember private _member;
function setMemberAddress(address _founder, address _dev) public onlyOwner {
_member.founder = _founder;
_member.dev = _dev;
}
function withdraw() external onlyOwner {
require(
_member.founder != address(0) && _member.dev != address(0),
'Please set member address'
);
uint256 balance = address(this).balance;
Address.sendValue(payable(_member.founder), ((balance * 6000) / 10000));
Address.sendValue(payable(_member.dev), ((balance * 4000) / 10000));
}
}// 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: 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/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`.
*
* 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;
/**
* @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 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 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 the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @dev These functions deal with verification of Merkle Tree 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.
*
* WARNING: You should avoid using leaf values that are 64 bytes long prior to
* hashing, or use a hash function other than keccak256 for hashing leaves.
* This is because the concatenation of a sorted pair of internal nodes in
* the merkle tree could be reinterpreted as a leaf value.
*/
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 Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
* consuming from one or the other at each step according to the instructions given by
* `proofFlags`.
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/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": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"checkMerkleProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintLimit","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":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"prePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"pubMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pubPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"saleStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_endId","type":"uint256"}],"name":"setEndId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_founder","type":"address"},{"internalType":"address","name":"_dev","type":"address"}],"name":"setMemberAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintType","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setPrePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_priceInWei","type":"uint256"}],"name":"setPubPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintType","type":"uint256"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startId","type":"uint256"}],"name":"setStartId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startId","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405266470de4df82000060035566470de4df8200006004556050600555608b600655605060075534801561003557600080fd5b50600160008190555061005a61004f61009260201b60201c565b61009a60201b60201c565b600160096000808152602001908152602001600020819055506005600960006001815260200190815260200160002081905550610160565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61228580620001706000396000f3fe6080604052600436106101815760003560e01c80639ed2b8dd116100d1578063c835990e1161008a578063e567cad611610064578063e567cad614610528578063f2fde38b14610553578063f6b4dfb41461057c578063fe90e5bc146105a757610181565b8063c835990e14610499578063dcd5994e146104c2578063e521aa94146104eb57610181565b80639ed2b8dd1461039a578063a9a38262146103c3578063add1e70914610400578063bddb7be714610429578063c1d9df8d14610454578063c30565fb1461047057610181565b80635c64ef661161013e57806377df012e1161011857806377df012e146102f25780637cb647591461031d57806382816979146103465780638da5cb5b1461036f57610181565b80635c64ef66146102755780636fad40d5146102b2578063715018a6146102db57610181565b806329d7e69b146101865780632eb4a7ab146101b15780633ccfd60b146101dc578063477bddaa146101f35780634dd6c8de1461021c5780635a54622314610259575b600080fd5b34801561019257600080fd5b5061019b6105d2565b6040516101a891906115ac565b60405180910390f35b3480156101bd57600080fd5b506101c66105d8565b6040516101d391906115e0565b60405180910390f35b3480156101e857600080fd5b506101f16105de565b005b3480156101ff57600080fd5b5061021a60048036038101906102159190611663565b610773565b005b34801561022857600080fd5b50610243600480360381019061023e91906116bc565b6107bf565b60405161025091906115ac565b60405180910390f35b610273600480360381019061026e9190611761565b6107e4565b005b34801561028157600080fd5b5061029c600480360381019061029791906117c1565b610c04565b6040516102a99190611809565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190611824565b610c24565b005b3480156102e757600080fd5b506102f0610c48565b005b3480156102fe57600080fd5b50610307610c5c565b60405161031491906115ac565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190611890565b610c62565b005b34801561035257600080fd5b5061036d600480360381019061036891906117c1565b610c74565b005b34801561037b57600080fd5b50610384610c86565b60405161039191906118cc565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906117c1565b610cb0565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906118e7565b610cc2565b6040516103f79190611809565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190611934565b610d05565b005b34801561043557600080fd5b5061043e610d99565b60405161044b91906115ac565b60405180910390f35b61046e600480360381019061046991906117c1565b610d9f565b005b34801561047c57600080fd5b50610497600480360381019061049291906119a0565b611178565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906117c1565b6111af565b005b3480156104ce57600080fd5b506104e960048036038101906104e491906117c1565b6111c1565b005b3480156104f757600080fd5b50610512600480360381019061050d91906117c1565b6111d3565b60405161051f91906115ac565b60405180910390f35b34801561053457600080fd5b5061053d6111eb565b60405161054a91906115ac565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190611663565b6111f1565b005b34801561058857600080fd5b50610591611274565b60405161059e91906118cc565b60405180910390f35b3480156105b357600080fd5b506105bc61129a565b6040516105c991906115ac565b60405180910390f35b60055481565b60085481565b6105e66112a0565b600073ffffffffffffffffffffffffffffffffffffffff16600c60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561069a5750600073ffffffffffffffffffffffffffffffffffffffff16600c60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090611a3d565b60405180910390fd5b6000479050610727600c60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710611770846107189190611a8c565b6107229190611b15565b61131e565b610770600c60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710610fa0846107619190611a8c565b61076b9190611b15565b61131e565b50565b61077b6112a0565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b602052816000526040600020602052806000526040600020600091509150505481565b600260005403610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082090611b92565b60405180910390fd5b60026000819055506000836003546108419190611a8c565b90506000600a600082815260200190815260200160002060009054906101000a900460ff166108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c90611bfe565b60405180910390fd5b600085116108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90611c6a565b60405180910390fd5b600960008281526020019081526020016000205485111561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590611cd6565b60405180910390fd5b60075460065411610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90611d42565b60405180910390fd5b8134146109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90611dae565b60405180910390fd5b6009600082815260200190815260200160002054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205410610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290611e1a565b60405180910390fd5b610a758484610cc2565b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90611e86565b60405180910390fd5b84600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000828254610b149190611ea6565b925050819055506000600754905060005b86811015610bda57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610b73610c86565b33856040518463ffffffff1660e01b8152600401610b9393929190611efc565b600060405180830381600087803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b5050505081806001019250508080600101915050610b25565b508560076000828254610bed9190611ea6565b925050819055505050506001600081905550505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610c2c6112a0565b8060096000848152602001908152602001600020819055505050565b610c506112a0565b610c5a6000611412565b565b60065481565b610c6a6112a0565b8060088190555050565b610c7c6112a0565b8060068190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cb86112a0565b8060058190555050565b60008033604051602001610cd69190611f7b565b604051602081830303815290604052805190602001209050610cfc8484600854846114d8565b91505092915050565b610d0d6112a0565b81600c60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60045481565b600260005403610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90611b92565b60405180910390fd5b6002600081905550600081600354610dfc9190611a8c565b9050600060019050600a600082815260200190815260200160002060009054906101000a900460ff16610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90611bfe565b60405180910390fd5b60008311610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90611c6a565b60405180910390fd5b6009600082815260200190815260200160002054831115610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490611cd6565b60405180910390fd5b60075460065411610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90611d42565b60405180910390fd5b813414610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90611dae565b60405180910390fd5b6009600082815260200190815260200160002054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020541061102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190611e1a565b60405180910390fd5b82600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600082825461108a9190611ea6565b925050819055506000600754905060005b8481101561115057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6110e9610c86565b33856040518463ffffffff1660e01b815260040161110993929190611efc565b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050508180600101925050808060010191505061109b565b5083600760008282546111639190611ea6565b92505081905550505050600160008190555050565b6111806112a0565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6111b76112a0565b8060038190555050565b6111c96112a0565b8060048190555050565b60096020528060005260406000206000915090505481565b60035481565b6111f96112a0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90612008565b60405180910390fd5b61127181611412565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b6112a86114f1565b73ffffffffffffffffffffffffffffffffffffffff166112c6610c86565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390612074565b60405180910390fd5b565b80471015611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906120e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161138790612131565b60006040518083038185875af1925050503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611404906121b8565b60405180910390fd5b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826114e68686856114f9565b149050949350505050565b600033905090565b60008082905060005b858590508110156115455761153082878784818110611524576115236121d8565b5b90506020020135611551565b9150808061153d90612207565b915050611502565b50809150509392505050565b600081831061156957611564828461157c565b611574565b611573838361157c565b5b905092915050565b600082600052816020526040600020905092915050565b6000819050919050565b6115a681611593565b82525050565b60006020820190506115c1600083018461159d565b92915050565b6000819050919050565b6115da816115c7565b82525050565b60006020820190506115f560008301846115d1565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163082611605565b9050919050565b61164081611625565b811461164b57600080fd5b50565b60008135905061165d81611637565b92915050565b600060208284031215611679576116786115fb565b5b60006116878482850161164e565b91505092915050565b61169981611593565b81146116a457600080fd5b50565b6000813590506116b681611690565b92915050565b600080604083850312156116d3576116d26115fb565b5b60006116e18582860161164e565b92505060206116f2858286016116a7565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112611721576117206116fc565b5b8235905067ffffffffffffffff81111561173e5761173d611701565b5b60208301915083602082028301111561175a57611759611706565b5b9250929050565b60008060006040848603121561177a576117796115fb565b5b6000611788868287016116a7565b935050602084013567ffffffffffffffff8111156117a9576117a8611600565b5b6117b58682870161170b565b92509250509250925092565b6000602082840312156117d7576117d66115fb565b5b60006117e5848285016116a7565b91505092915050565b60008115159050919050565b611803816117ee565b82525050565b600060208201905061181e60008301846117fa565b92915050565b6000806040838503121561183b5761183a6115fb565b5b6000611849858286016116a7565b925050602061185a858286016116a7565b9150509250929050565b61186d816115c7565b811461187857600080fd5b50565b60008135905061188a81611864565b92915050565b6000602082840312156118a6576118a56115fb565b5b60006118b48482850161187b565b91505092915050565b6118c681611625565b82525050565b60006020820190506118e160008301846118bd565b92915050565b600080602083850312156118fe576118fd6115fb565b5b600083013567ffffffffffffffff81111561191c5761191b611600565b5b6119288582860161170b565b92509250509250929050565b6000806040838503121561194b5761194a6115fb565b5b60006119598582860161164e565b925050602061196a8582860161164e565b9150509250929050565b61197d816117ee565b811461198857600080fd5b50565b60008135905061199a81611974565b92915050565b600080604083850312156119b7576119b66115fb565b5b60006119c5858286016116a7565b92505060206119d68582860161198b565b9150509250929050565b600082825260208201905092915050565b7f506c6561736520736574206d656d626572206164647265737300000000000000600082015250565b6000611a276019836119e0565b9150611a32826119f1565b602082019050919050565b60006020820190508181036000830152611a5681611a1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611a9782611593565b9150611aa283611593565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611adb57611ada611a5d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611b2082611593565b9150611b2b83611593565b925082611b3b57611b3a611ae6565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000611b7c601f836119e0565b9150611b8782611b46565b602082019050919050565b60006020820190508181036000830152611bab81611b6f565b9050919050565b7f4265666f72652073616c6520626567696e2e0000000000000000000000000000600082015250565b6000611be86012836119e0565b9150611bf382611bb2565b602082019050919050565b60006020820190508181036000830152611c1781611bdb565b9050919050565b7f506c6561736520736574207175616e746974792e000000000000000000000000600082015250565b6000611c546014836119e0565b9150611c5f82611c1e565b602082019050919050565b60006020820190508181036000830152611c8381611c47565b9050919050565b7f6d696e744c696d6974206f7665722e0000000000000000000000000000000000600082015250565b6000611cc0600f836119e0565b9150611ccb82611c8a565b602082019050919050565b60006020820190508181036000830152611cef81611cb3565b9050919050565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b6000611d2c6009836119e0565b9150611d3782611cf6565b602082019050919050565b60006020820190508181036000830152611d5b81611d1f565b9050919050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000611d986010836119e0565b9150611da382611d62565b602082019050919050565b60006020820190508181036000830152611dc781611d8b565b9050919050565b7f416c726561647920636c61696d6564206d617800000000000000000000000000600082015250565b6000611e046013836119e0565b9150611e0f82611dce565b602082019050919050565b60006020820190508181036000830152611e3381611df7565b9050919050565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b6000611e706014836119e0565b9150611e7b82611e3a565b602082019050919050565b60006020820190508181036000830152611e9f81611e63565b9050919050565b6000611eb182611593565b9150611ebc83611593565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611ef157611ef0611a5d565b5b828201905092915050565b6000606082019050611f1160008301866118bd565b611f1e60208301856118bd565b611f2b604083018461159d565b949350505050565b60008160601b9050919050565b6000611f4b82611f33565b9050919050565b6000611f5d82611f40565b9050919050565b611f75611f7082611625565b611f52565b82525050565b6000611f878284611f64565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611ff26026836119e0565b9150611ffd82611f96565b604082019050919050565b6000602082019050818103600083015261202181611fe5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061205e6020836119e0565b915061206982612028565b602082019050919050565b6000602082019050818103600083015261208d81612051565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006120ca601d836119e0565b91506120d582612094565b602082019050919050565b600060208201905081810360008301526120f9816120bd565b9050919050565b600081905092915050565b50565b600061211b600083612100565b91506121268261210b565b600082019050919050565b600061213c8261210e565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006121a2603a836119e0565b91506121ad82612146565b604082019050919050565b600060208201905081810360008301526121d181612195565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061221282611593565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361224457612243611a5d565b5b60018201905091905056fea264697066735822122074645b1ab099c00cb1860df5699d2d09993d09fbbc18534400450ab4786b97f864736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106101815760003560e01c80639ed2b8dd116100d1578063c835990e1161008a578063e567cad611610064578063e567cad614610528578063f2fde38b14610553578063f6b4dfb41461057c578063fe90e5bc146105a757610181565b8063c835990e14610499578063dcd5994e146104c2578063e521aa94146104eb57610181565b80639ed2b8dd1461039a578063a9a38262146103c3578063add1e70914610400578063bddb7be714610429578063c1d9df8d14610454578063c30565fb1461047057610181565b80635c64ef661161013e57806377df012e1161011857806377df012e146102f25780637cb647591461031d57806382816979146103465780638da5cb5b1461036f57610181565b80635c64ef66146102755780636fad40d5146102b2578063715018a6146102db57610181565b806329d7e69b146101865780632eb4a7ab146101b15780633ccfd60b146101dc578063477bddaa146101f35780634dd6c8de1461021c5780635a54622314610259575b600080fd5b34801561019257600080fd5b5061019b6105d2565b6040516101a891906115ac565b60405180910390f35b3480156101bd57600080fd5b506101c66105d8565b6040516101d391906115e0565b60405180910390f35b3480156101e857600080fd5b506101f16105de565b005b3480156101ff57600080fd5b5061021a60048036038101906102159190611663565b610773565b005b34801561022857600080fd5b50610243600480360381019061023e91906116bc565b6107bf565b60405161025091906115ac565b60405180910390f35b610273600480360381019061026e9190611761565b6107e4565b005b34801561028157600080fd5b5061029c600480360381019061029791906117c1565b610c04565b6040516102a99190611809565b60405180910390f35b3480156102be57600080fd5b506102d960048036038101906102d49190611824565b610c24565b005b3480156102e757600080fd5b506102f0610c48565b005b3480156102fe57600080fd5b50610307610c5c565b60405161031491906115ac565b60405180910390f35b34801561032957600080fd5b50610344600480360381019061033f9190611890565b610c62565b005b34801561035257600080fd5b5061036d600480360381019061036891906117c1565b610c74565b005b34801561037b57600080fd5b50610384610c86565b60405161039191906118cc565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906117c1565b610cb0565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906118e7565b610cc2565b6040516103f79190611809565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190611934565b610d05565b005b34801561043557600080fd5b5061043e610d99565b60405161044b91906115ac565b60405180910390f35b61046e600480360381019061046991906117c1565b610d9f565b005b34801561047c57600080fd5b50610497600480360381019061049291906119a0565b611178565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906117c1565b6111af565b005b3480156104ce57600080fd5b506104e960048036038101906104e491906117c1565b6111c1565b005b3480156104f757600080fd5b50610512600480360381019061050d91906117c1565b6111d3565b60405161051f91906115ac565b60405180910390f35b34801561053457600080fd5b5061053d6111eb565b60405161054a91906115ac565b60405180910390f35b34801561055f57600080fd5b5061057a60048036038101906105759190611663565b6111f1565b005b34801561058857600080fd5b50610591611274565b60405161059e91906118cc565b60405180910390f35b3480156105b357600080fd5b506105bc61129a565b6040516105c991906115ac565b60405180910390f35b60055481565b60085481565b6105e66112a0565b600073ffffffffffffffffffffffffffffffffffffffff16600c60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415801561069a5750600073ffffffffffffffffffffffffffffffffffffffff16600c60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6106d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d090611a3d565b60405180910390fd5b6000479050610727600c60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710611770846107189190611a8c565b6107229190611b15565b61131e565b610770600c60010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710610fa0846107619190611a8c565b61076b9190611b15565b61131e565b50565b61077b6112a0565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600b602052816000526040600020602052806000526040600020600091509150505481565b600260005403610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082090611b92565b60405180910390fd5b60026000819055506000836003546108419190611a8c565b90506000600a600082815260200190815260200160002060009054906101000a900460ff166108a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089c90611bfe565b60405180910390fd5b600085116108e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108df90611c6a565b60405180910390fd5b600960008281526020019081526020016000205485111561093e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093590611cd6565b60405180910390fd5b60075460065411610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097b90611d42565b60405180910390fd5b8134146109c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bd90611dae565b60405180910390fd5b6009600082815260200190815260200160002054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000205410610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290611e1a565b60405180910390fd5b610a758484610cc2565b610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90611e86565b60405180910390fd5b84600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000828254610b149190611ea6565b925050819055506000600754905060005b86811015610bda57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610b73610c86565b33856040518463ffffffff1660e01b8152600401610b9393929190611efc565b600060405180830381600087803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b5050505081806001019250508080600101915050610b25565b508560076000828254610bed9190611ea6565b925050819055505050506001600081905550505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b610c2c6112a0565b8060096000848152602001908152602001600020819055505050565b610c506112a0565b610c5a6000611412565b565b60065481565b610c6a6112a0565b8060088190555050565b610c7c6112a0565b8060068190555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610cb86112a0565b8060058190555050565b60008033604051602001610cd69190611f7b565b604051602081830303815290604052805190602001209050610cfc8484600854846114d8565b91505092915050565b610d0d6112a0565b81600c60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600c60010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b60045481565b600260005403610de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddb90611b92565b60405180910390fd5b6002600081905550600081600354610dfc9190611a8c565b9050600060019050600a600082815260200190815260200160002060009054906101000a900460ff16610e64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5b90611bfe565b60405180910390fd5b60008311610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90611c6a565b60405180910390fd5b6009600082815260200190815260200160002054831115610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef490611cd6565b60405180910390fd5b60075460065411610f43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90611d42565b60405180910390fd5b813414610f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7c90611dae565b60405180910390fd5b6009600082815260200190815260200160002054600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020541061102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190611e1a565b60405180910390fd5b82600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600082825461108a9190611ea6565b925050819055506000600754905060005b8481101561115057600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd6110e9610c86565b33856040518463ffffffff1660e01b815260040161110993929190611efc565b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050508180600101925050808060010191505061109b565b5083600760008282546111639190611ea6565b92505081905550505050600160008190555050565b6111806112a0565b80600a600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6111b76112a0565b8060038190555050565b6111c96112a0565b8060048190555050565b60096020528060005260406000206000915090505481565b60035481565b6111f96112a0565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90612008565b60405180910390fd5b61127181611412565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b6112a86114f1565b73ffffffffffffffffffffffffffffffffffffffff166112c6610c86565b73ffffffffffffffffffffffffffffffffffffffff161461131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390612074565b60405180910390fd5b565b80471015611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906120e0565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405161138790612131565b60006040518083038185875af1925050503d80600081146113c4576040519150601f19603f3d011682016040523d82523d6000602084013e6113c9565b606091505b505090508061140d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611404906121b8565b60405180910390fd5b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826114e68686856114f9565b149050949350505050565b600033905090565b60008082905060005b858590508110156115455761153082878784818110611524576115236121d8565b5b90506020020135611551565b9150808061153d90612207565b915050611502565b50809150509392505050565b600081831061156957611564828461157c565b611574565b611573838361157c565b5b905092915050565b600082600052816020526040600020905092915050565b6000819050919050565b6115a681611593565b82525050565b60006020820190506115c1600083018461159d565b92915050565b6000819050919050565b6115da816115c7565b82525050565b60006020820190506115f560008301846115d1565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163082611605565b9050919050565b61164081611625565b811461164b57600080fd5b50565b60008135905061165d81611637565b92915050565b600060208284031215611679576116786115fb565b5b60006116878482850161164e565b91505092915050565b61169981611593565b81146116a457600080fd5b50565b6000813590506116b681611690565b92915050565b600080604083850312156116d3576116d26115fb565b5b60006116e18582860161164e565b92505060206116f2858286016116a7565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112611721576117206116fc565b5b8235905067ffffffffffffffff81111561173e5761173d611701565b5b60208301915083602082028301111561175a57611759611706565b5b9250929050565b60008060006040848603121561177a576117796115fb565b5b6000611788868287016116a7565b935050602084013567ffffffffffffffff8111156117a9576117a8611600565b5b6117b58682870161170b565b92509250509250925092565b6000602082840312156117d7576117d66115fb565b5b60006117e5848285016116a7565b91505092915050565b60008115159050919050565b611803816117ee565b82525050565b600060208201905061181e60008301846117fa565b92915050565b6000806040838503121561183b5761183a6115fb565b5b6000611849858286016116a7565b925050602061185a858286016116a7565b9150509250929050565b61186d816115c7565b811461187857600080fd5b50565b60008135905061188a81611864565b92915050565b6000602082840312156118a6576118a56115fb565b5b60006118b48482850161187b565b91505092915050565b6118c681611625565b82525050565b60006020820190506118e160008301846118bd565b92915050565b600080602083850312156118fe576118fd6115fb565b5b600083013567ffffffffffffffff81111561191c5761191b611600565b5b6119288582860161170b565b92509250509250929050565b6000806040838503121561194b5761194a6115fb565b5b60006119598582860161164e565b925050602061196a8582860161164e565b9150509250929050565b61197d816117ee565b811461198857600080fd5b50565b60008135905061199a81611974565b92915050565b600080604083850312156119b7576119b66115fb565b5b60006119c5858286016116a7565b92505060206119d68582860161198b565b9150509250929050565b600082825260208201905092915050565b7f506c6561736520736574206d656d626572206164647265737300000000000000600082015250565b6000611a276019836119e0565b9150611a32826119f1565b602082019050919050565b60006020820190508181036000830152611a5681611a1a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611a9782611593565b9150611aa283611593565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611adb57611ada611a5d565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611b2082611593565b9150611b2b83611593565b925082611b3b57611b3a611ae6565b5b828204905092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000611b7c601f836119e0565b9150611b8782611b46565b602082019050919050565b60006020820190508181036000830152611bab81611b6f565b9050919050565b7f4265666f72652073616c6520626567696e2e0000000000000000000000000000600082015250565b6000611be86012836119e0565b9150611bf382611bb2565b602082019050919050565b60006020820190508181036000830152611c1781611bdb565b9050919050565b7f506c6561736520736574207175616e746974792e000000000000000000000000600082015250565b6000611c546014836119e0565b9150611c5f82611c1e565b602082019050919050565b60006020820190508181036000830152611c8381611c47565b9050919050565b7f6d696e744c696d6974206f7665722e0000000000000000000000000000000000600082015250565b6000611cc0600f836119e0565b9150611ccb82611c8a565b602082019050919050565b60006020820190508181036000830152611cef81611cb3565b9050919050565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b6000611d2c6009836119e0565b9150611d3782611cf6565b602082019050919050565b60006020820190508181036000830152611d5b81611d1f565b9050919050565b7f4e6f7420656e6f7567682066756e647300000000000000000000000000000000600082015250565b6000611d986010836119e0565b9150611da382611d62565b602082019050919050565b60006020820190508181036000830152611dc781611d8b565b9050919050565b7f416c726561647920636c61696d6564206d617800000000000000000000000000600082015250565b6000611e046013836119e0565b9150611e0f82611dce565b602082019050919050565b60006020820190508181036000830152611e3381611df7565b9050919050565b7f496e76616c6964204d65726b6c652050726f6f66000000000000000000000000600082015250565b6000611e706014836119e0565b9150611e7b82611e3a565b602082019050919050565b60006020820190508181036000830152611e9f81611e63565b9050919050565b6000611eb182611593565b9150611ebc83611593565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611ef157611ef0611a5d565b5b828201905092915050565b6000606082019050611f1160008301866118bd565b611f1e60208301856118bd565b611f2b604083018461159d565b949350505050565b60008160601b9050919050565b6000611f4b82611f33565b9050919050565b6000611f5d82611f40565b9050919050565b611f75611f7082611625565b611f52565b82525050565b6000611f878284611f64565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611ff26026836119e0565b9150611ffd82611f96565b604082019050919050565b6000602082019050818103600083015261202181611fe5565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061205e6020836119e0565b915061206982612028565b602082019050919050565b6000602082019050818103600083015261208d81612051565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b60006120ca601d836119e0565b91506120d582612094565b602082019050919050565b600060208201905081810360008301526120f9816120bd565b9050919050565b600081905092915050565b50565b600061211b600083612100565b91506121268261210b565b600082019050919050565b600061213c8261210e565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b60006121a2603a836119e0565b91506121ad82612146565b604082019050919050565b600060208201905081810360008301526121d181612195565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061221282611593565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361224457612243611a5d565b5b60018201905091905056fea264697066735822122074645b1ab099c00cb1860df5699d2d09993d09fbbc18534400450ab4786b97f864736f6c634300080d0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.