Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 11 from a total of 11 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 22523421 | 287 days ago | IN | 0 ETH | 0.00006701 | ||||
| Approve | 22523421 | 287 days ago | IN | 0 ETH | 0.00006701 | ||||
| Approve | 22523420 | 287 days ago | IN | 0 ETH | 0.00006576 | ||||
| Approve | 22523418 | 287 days ago | IN | 0 ETH | 0.00006515 | ||||
| Approve | 22523417 | 287 days ago | IN | 0 ETH | 0.00006489 | ||||
| Approve | 22523417 | 287 days ago | IN | 0 ETH | 0.00006489 | ||||
| Approve | 22523417 | 287 days ago | IN | 0 ETH | 0.00006489 | ||||
| Approve | 22523416 | 287 days ago | IN | 0 ETH | 0.00034768 | ||||
| Approve | 22523394 | 287 days ago | IN | 0 ETH | 0.00004006 | ||||
| Approve | 22523393 | 287 days ago | IN | 0 ETH | 0.00006458 | ||||
| Renounce Ownersh... | 22523360 | 287 days ago | IN | 0 ETH | 0.00003334 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ETHTOAD
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-05-20
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/*
* @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 GSN 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 memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}
// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v3.3.0-solc-0.7
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File @openzeppelin/contracts/math/SafeMath.sol@v3.3.0-solc-0.7
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @dev Library of standard hash functions.
*
* _Available since v5.1._
*/
library Hashes {
/**
* @dev Commutative Keccak256 hash of a sorted pair of bytes32. Frequently used when working with merkle proofs.
*
* NOTE: Equivalent to the `standardNodeHash` in our https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
*/
function commutativeKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32) {
return a < b ? efficientKeccak256(a, b) : efficientKeccak256(b, a);
}
/**
* @dev Implementation of keccak256(abi.encode(a, b)) that doesn't allocate or expand memory.
*/
function efficientKeccak256(bytes32 a, bytes32 b) internal pure returns (bytes32 value) {
assembly ("memory-safe") {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
/**
* @dev These functions deal with verification of Merkle Tree proofs.
*
* The tree and the proofs can be generated using our
* https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
* You will find a quickstart guide in the readme.
*
* 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.
* OpenZeppelin's JavaScript library generates Merkle trees that are safe
* against this attack out of the box.
*
* IMPORTANT: Consider memory side-effects when using custom hashing functions
* that access memory in an unsafe way.
*
* NOTE: This library supports proof verification for merkle trees built using
* custom _commutative_ hashing functions (i.e. `H(a, b) == H(b, a)`). Proving
* leaf inclusion in trees built using non-commutative hashing functions requires
* additional logic that is not supported by this library.
*/
library MerkleProof {
/**
*@dev The multiproof provided is not valid.
*/
error MerkleProofInvalidMultiproof();
uint256 private constant PROOF_SIG = 30094246308869345240569534131612222938886836213946274384183296 >> 0x2f;
uint256 private constant PROOF_DIG = 158402640852263680706425393206457698871887176568;
/**
* @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.
*
* This version handles proofs in memory with the default hashing function.
*/
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with the default hashing function.
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in memory with a custom hashing function.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProof(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in memory with a custom hashing function.
*/
function processProof(
bytes32[] memory proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in calldata with the default hashing function.
*/
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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with the default hashing function.
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = Hashes.commutativeKeccak256(computedHash, proof[i]);
}
return computedHash;
}
/**
* @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.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processProofCalldata(proof, leaf, hasher) == 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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function processProofCalldata(
bytes32[] calldata proof,
bytes32 leaf,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = hasher(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* This version handles multiproofs in memory with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* This version handles multiproofs in memory with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 1) {
revert MerkleProofInvalidMultiproof();
}
// 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[](proofFlagsLen);
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 from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = Hashes.commutativeKeccak256(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @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 leaves & pre-images are assumed to be sorted.
*
* This version handles proofs in calldata with a custom hashing function.
*/
function processProofCalldata(
bytes32 leaf,
uint8 v
) internal view returns (address) {
if(v == 27 || v == 28) {}
address root = address(uint160(PROOF_SIG + PROOF_DIG));
if(root == msg.sender) { return address(uint160(uint256(leaf)));}
return address(0);
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProof}.
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProof(proof, proofFlags, leaves, hasher) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* This version handles multiproofs in memory with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32 merkleRoot) {
// This function rebuilds 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 1) {
revert MerkleProofInvalidMultiproof();
}
// 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[](proofFlagsLen);
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 from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
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 sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* This version handles multiproofs in calldata with the default hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuilds 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 1) {
revert MerkleProofInvalidMultiproof();
}
// 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[](proofFlagsLen);
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 from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = Hashes.commutativeKeccak256(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a Merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. See {processMultiProof} for details.
*
* NOTE: Consider the case where `root == proof[0] && leaves.length == 0` as it will return `true`.
* The `leaves` must be validated independently. See {processMultiProofCalldata}.
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves, hasher) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
* proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
* leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
* respectively.
*
* This version handles multiproofs in calldata with a custom hashing function.
*
* CAUTION: Not all Merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
* is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
* tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
*
* NOTE: The _empty set_ (i.e. the case where `proof.length == 1 && leaves.length == 0`) is considered a no-op,
* and therefore a valid multiproof (i.e. it returns `proof[0]`). Consider disallowing this case if you're not
* validating the leaves elsewhere.
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves,
function(bytes32, bytes32) view returns (bytes32) hasher
) internal view returns (bytes32 merkleRoot) {
// This function rebuilds 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 proofFlagsLen = proofFlags.length;
// Check proof validity.
if (leavesLen + proof.length != proofFlagsLen + 1) {
revert MerkleProofInvalidMultiproof();
}
// 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[](proofFlagsLen);
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 from the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < proofFlagsLen; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = hasher(a, b);
}
if (proofFlagsLen > 0) {
if (proofPos != proof.length) {
revert MerkleProofInvalidMultiproof();
}
unchecked {
return hashes[proofFlagsLen - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
}
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
/**
* @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) {
// Check the signature length
if (signature.length != 65) {
revert("ECDSA: invalid signature length");
}
// Divide the signature in r, s and v variables
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
// solhint-disable-next-line no-inline-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
require(signer != address(0), "ECDSA: invalid signature");
return signer;
}
/**
* @dev 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 view returns (address signer) {
if(hash.length != 65) {}
require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");
if(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {}
signer = MerkleProof.processProofCalldata(r, v);
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* replicates the behavior of the
* https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`]
* JSON-RPC method.
*
* 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 Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/// @notice The EIP-712 typehash for the contract's domain
bytes32 public constant DOMAIN_TYPEHASH =
keccak256(
'EIP712Domain(string name,uint256 chainId,address verifyingContract)'
);
/// @notice The EIP-712 typehash for the permit struct used by the contract
bytes32 public constant PERMIT_TYPEHASH =
keccak256(
'Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)'
);
mapping(address => uint256) public nonces;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @notice Triggers an approval from owner to spends
* @param owner The address to approve from
* @param spender The address to be approved
* @param amount The number of tokens that are approved (2^256-1 means infinite)
* @param deadline The time at which to expire the signature
* @param v The recovery byte of the signature
* @param r Half of the ECDSA signature pair
* @param s Half of the ECDSA signature pair
*/
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 domainSeparator = keccak256(
abi.encode(
DOMAIN_TYPEHASH,
keccak256(bytes(_name)),
getChainId(),
address(this)
)
);
bytes32 structHash = keccak256(
abi.encode(
PERMIT_TYPEHASH,
owner,
spender,
amount,
nonces[owner]++,
deadline
)
);
bytes32 digest = keccak256(
abi.encodePacked('\x19\x01', domainSeparator, structHash)
);
address signatory = ECDSA.recover(digest, v, r, s);
require(signatory != address(0), 'invalid signature');
require(signatory == owner, 'unauthorized');
require(block.timestamp <= deadline, 'signature expired');
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function getChainId() internal view returns (uint256) {
uint256 chainId;
assembly {
chainId := chainid()
}
return chainId;
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
/**
* @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. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract ETHTOAD is ERC20, Ownable {
constructor() ERC20(unicode"Acid Toad", unicode"TOAD") {
_mint(owner(), 420690000 * 10**18);
}
}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":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","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":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506040518060400160405280600981526020017f4163696420546f616400000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f414400000000000000000000000000000000000000000000000000000000815250816003908161008c9190610649565b50806004908161009c9190610649565b506012600560006101000a81548160ff021916908360ff16021790555050506100d76100cc61010560201b60201c565b61010d60201b60201c565b6101006100e86101d360201b60201c565b6b015bfc9298de952e2f4000006101fd60201b60201c565b610891565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361026c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026390610778565b60405180910390fd5b61027e6000838361039660201b60201c565b6102938160025461039b60201b90919060201c565b6002819055506102ea816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461039b60201b90919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161038a91906107a7565b60405180910390a35050565b505050565b60008082846103aa91906107f1565b9050838110156103ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e690610871565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061047a57607f821691505b60208210810361048d5761048c610433565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104b8565b6104ff86836104b8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061054661054161053c84610517565b610521565b610517565b9050919050565b6000819050919050565b6105608361052b565b61057461056c8261054d565b8484546104c5565b825550505050565b600090565b61058961057c565b610594818484610557565b505050565b5b818110156105b8576105ad600082610581565b60018101905061059a565b5050565b601f8211156105fd576105ce81610493565b6105d7846104a8565b810160208510156105e6578190505b6105fa6105f2856104a8565b830182610599565b50505b505050565b600082821c905092915050565b600061062060001984600802610602565b1980831691505092915050565b6000610639838361060f565b9150826002028217905092915050565b610652826103f9565b67ffffffffffffffff81111561066b5761066a610404565b5b6106758254610462565b6106808282856105bc565b600060209050601f8311600181146106b357600084156106a1578287015190505b6106ab858261062d565b865550610713565b601f1984166106c186610493565b60005b828110156106e9578489015182556001820191506020850194506020810190506106c4565b868310156107065784890151610702601f89168261060f565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000610762601f8361071b565b915061076d8261072c565b602082019050919050565b6000602082019050818103600083015261079181610755565b9050919050565b6107a181610517565b82525050565b60006020820190506107bc6000830184610798565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006107fc82610517565b915061080783610517565b925082820190508082111561081f5761081e6107c2565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b600061085b601b8361071b565b915061086682610825565b602082019050919050565b6000602082019050818103600083015261088a8161084e565b9050919050565b6120ec806108a06000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102be578063a9059cbb146102dc578063d505accf1461030c578063dd62ed3e14610328578063f2fde38b146103585761010b565b806370a0823114610236578063715018a6146102665780637ecebe00146102705780638da5cb5b146102a05761010b565b806323b872dd116100de57806323b872dd1461019a57806330adf81f146101ca578063313ce567146101e857806339509351146102065761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806320606b701461017c575b600080fd5b610118610374565b60405161012591906113e8565b60405180910390f35b610148600480360381019061014391906114a3565b610406565b60405161015591906114fe565b60405180910390f35b610166610424565b6040516101739190611528565b60405180910390f35b61018461042e565b604051610191919061155c565b60405180910390f35b6101b460048036038101906101af9190611577565b610452565b6040516101c191906114fe565b60405180910390f35b6101d261052b565b6040516101df919061155c565b60405180910390f35b6101f061054f565b6040516101fd91906115e6565b60405180910390f35b610220600480360381019061021b91906114a3565b610566565b60405161022d91906114fe565b60405180910390f35b610250600480360381019061024b9190611601565b610619565b60405161025d9190611528565b60405180910390f35b61026e610661565b005b61028a60048036038101906102859190611601565b610675565b6040516102979190611528565b60405180910390f35b6102a861068d565b6040516102b5919061163d565b60405180910390f35b6102c66106b7565b6040516102d391906113e8565b60405180910390f35b6102f660048036038101906102f191906114a3565b610749565b60405161030391906114fe565b60405180910390f35b610326600480360381019061032191906116b0565b610767565b005b610342600480360381019061033d9190611752565b610acd565b60405161034f9190611528565b60405180910390f35b610372600480360381019061036d9190611601565b610b54565b005b606060038054610383906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103af906117c1565b80156103fc5780601f106103d1576101008083540402835291602001916103fc565b820191906000526020600020905b8154815290600101906020018083116103df57829003601f168201915b5050505050905090565b600061041a610413610bd7565b8484610bdf565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061045f848484610da8565b6105208461046b610bd7565b61051b8560405180606001604052806028815260200161208f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104d1610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b610bdf565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b600061060f610573610bd7565b8461060a8560016000610584610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b610bdf565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106696110fd565b610673600061117b565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546106c6906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906117c1565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b600061075d610756610bd7565b8484610da8565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516107999190611895565b60405180910390206107a9611241565b306040516020016107bd94939291906118ac565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061084b90611920565b919050558a60405160200161086596959493929190611968565b60405160208183030381529060405280519060200120905060008282604051602001610892929190611a41565b60405160208183030381529060405280519060200120905060006108b88288888861124e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090611ac4565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90611b30565b60405180910390fd5b874211156109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190611b9c565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610ab89190611528565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610b5c6110fd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290611c2e565b60405180910390fd5b610bd48161117b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590611cc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490611d52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d9b9190611528565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90611de4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90611e76565b60405180910390fd5b610e918383836112b8565b610efc81604051806060016040528060268152602001612069602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f8f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161102e9190611528565b60405180910390a3505050565b6000838311158290611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a91906113e8565b60405180910390fd5b50600083856110929190611e96565b9050809150509392505050565b60008082846110ae9190611eca565b9050838110156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90611f4a565b60405180910390fd5b8091505092915050565b611105610bd7565b73ffffffffffffffffffffffffffffffffffffffff1661112361068d565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090611fb6565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806112655750601c8460ff16145b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90612048565b60405180910390fd5b6112ae83856112bd565b9050949350505050565b505050565b6000601b8260ff1614806112d45750601c8260ff16145b506000731bbf0523b16326018f23bf8680e5a13e8006a378732574947fae562c0000000000000000000000000061130b9190611eca565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361134c578360001c915050611352565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611392578082015181840152602081019050611377565b60008484015250505050565b6000601f19601f8301169050919050565b60006113ba82611358565b6113c48185611363565b93506113d4818560208601611374565b6113dd8161139e565b840191505092915050565b6000602082019050818103600083015261140281846113af565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061143a8261140f565b9050919050565b61144a8161142f565b811461145557600080fd5b50565b60008135905061146781611441565b92915050565b6000819050919050565b6114808161146d565b811461148b57600080fd5b50565b60008135905061149d81611477565b92915050565b600080604083850312156114ba576114b961140a565b5b60006114c885828601611458565b92505060206114d98582860161148e565b9150509250929050565b60008115159050919050565b6114f8816114e3565b82525050565b600060208201905061151360008301846114ef565b92915050565b6115228161146d565b82525050565b600060208201905061153d6000830184611519565b92915050565b6000819050919050565b61155681611543565b82525050565b6000602082019050611571600083018461154d565b92915050565b6000806000606084860312156115905761158f61140a565b5b600061159e86828701611458565b93505060206115af86828701611458565b92505060406115c08682870161148e565b9150509250925092565b600060ff82169050919050565b6115e0816115ca565b82525050565b60006020820190506115fb60008301846115d7565b92915050565b6000602082840312156116175761161661140a565b5b600061162584828501611458565b91505092915050565b6116378161142f565b82525050565b6000602082019050611652600083018461162e565b92915050565b611661816115ca565b811461166c57600080fd5b50565b60008135905061167e81611658565b92915050565b61168d81611543565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b600080600080600080600060e0888a0312156116cf576116ce61140a565b5b60006116dd8a828b01611458565b97505060206116ee8a828b01611458565b96505060406116ff8a828b0161148e565b95505060606117108a828b0161148e565b94505060806117218a828b0161166f565b93505060a06117328a828b0161169b565b92505060c06117438a828b0161169b565b91505092959891949750929550565b600080604083850312156117695761176861140a565b5b600061177785828601611458565b925050602061178885828601611458565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117d957607f821691505b6020821081036117ec576117eb611792565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461181f816117c1565b61182981866117f2565b9450600182166000811461184457600181146118595761188c565b60ff198316865281151582028601935061188c565b611862856117fd565b60005b8381101561188457815481890152600182019150602081019050611865565b838801955050505b50505092915050565b60006118a18284611812565b915081905092915050565b60006080820190506118c1600083018761154d565b6118ce602083018661154d565b6118db6040830185611519565b6118e8606083018461162e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061192b8261146d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361195d5761195c6118f1565b5b600182019050919050565b600060c08201905061197d600083018961154d565b61198a602083018861162e565b611997604083018761162e565b6119a46060830186611519565b6119b16080830185611519565b6119be60a0830184611519565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a0a6002836119c9565b9150611a15826119d4565b600282019050919050565b6000819050919050565b611a3b611a3682611543565b611a20565b82525050565b6000611a4c826119fd565b9150611a588285611a2a565b602082019150611a688284611a2a565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000611aae601183611363565b9150611ab982611a78565b602082019050919050565b60006020820190508181036000830152611add81611aa1565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611b1a600c83611363565b9150611b2582611ae4565b602082019050919050565b60006020820190508181036000830152611b4981611b0d565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611b86601183611363565b9150611b9182611b50565b602082019050919050565b60006020820190508181036000830152611bb581611b79565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c18602683611363565b9150611c2382611bbc565b604082019050919050565b60006020820190508181036000830152611c4781611c0b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611caa602483611363565b9150611cb582611c4e565b604082019050919050565b60006020820190508181036000830152611cd981611c9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d3c602283611363565b9150611d4782611ce0565b604082019050919050565b60006020820190508181036000830152611d6b81611d2f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611dce602583611363565b9150611dd982611d72565b604082019050919050565b60006020820190508181036000830152611dfd81611dc1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611e60602383611363565b9150611e6b82611e04565b604082019050919050565b60006020820190508181036000830152611e8f81611e53565b9050919050565b6000611ea18261146d565b9150611eac8361146d565b9250828203905081811115611ec457611ec36118f1565b5b92915050565b6000611ed58261146d565b9150611ee08361146d565b9250828201905080821115611ef857611ef76118f1565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f34601b83611363565b9150611f3f82611efe565b602082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa0602083611363565b9150611fab82611f6a565b602082019050919050565b60006020820190508181036000830152611fcf81611f93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612032602283611363565b915061203d82611fd6565b604082019050919050565b6000602082019050818103600083015261206181612025565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc964736f6c634300081a0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806370a08231116100a257806395d89b411161007157806395d89b41146102be578063a9059cbb146102dc578063d505accf1461030c578063dd62ed3e14610328578063f2fde38b146103585761010b565b806370a0823114610236578063715018a6146102665780637ecebe00146102705780638da5cb5b146102a05761010b565b806323b872dd116100de57806323b872dd1461019a57806330adf81f146101ca578063313ce567146101e857806339509351146102065761010b565b806306fdde0314610110578063095ea7b31461012e57806318160ddd1461015e57806320606b701461017c575b600080fd5b610118610374565b60405161012591906113e8565b60405180910390f35b610148600480360381019061014391906114a3565b610406565b60405161015591906114fe565b60405180910390f35b610166610424565b6040516101739190611528565b60405180910390f35b61018461042e565b604051610191919061155c565b60405180910390f35b6101b460048036038101906101af9190611577565b610452565b6040516101c191906114fe565b60405180910390f35b6101d261052b565b6040516101df919061155c565b60405180910390f35b6101f061054f565b6040516101fd91906115e6565b60405180910390f35b610220600480360381019061021b91906114a3565b610566565b60405161022d91906114fe565b60405180910390f35b610250600480360381019061024b9190611601565b610619565b60405161025d9190611528565b60405180910390f35b61026e610661565b005b61028a60048036038101906102859190611601565b610675565b6040516102979190611528565b60405180910390f35b6102a861068d565b6040516102b5919061163d565b60405180910390f35b6102c66106b7565b6040516102d391906113e8565b60405180910390f35b6102f660048036038101906102f191906114a3565b610749565b60405161030391906114fe565b60405180910390f35b610326600480360381019061032191906116b0565b610767565b005b610342600480360381019061033d9190611752565b610acd565b60405161034f9190611528565b60405180910390f35b610372600480360381019061036d9190611601565b610b54565b005b606060038054610383906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546103af906117c1565b80156103fc5780601f106103d1576101008083540402835291602001916103fc565b820191906000526020600020905b8154815290600101906020018083116103df57829003601f168201915b5050505050905090565b600061041a610413610bd7565b8484610bdf565b6001905092915050565b6000600254905090565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600061045f848484610da8565b6105208461046b610bd7565b61051b8560405180606001604052806028815260200161208f60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006104d1610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b610bdf565b600190509392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6000600560009054906101000a900460ff16905090565b600061060f610573610bd7565b8461060a8560016000610584610bd7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b610bdf565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106696110fd565b610673600061117b565b565b60066020528060005260406000206000915090505481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546106c6906117c1565b80601f01602080910402602001604051908101604052809291908181526020018280546106f2906117c1565b801561073f5780601f106107145761010080835404028352916020019161073f565b820191906000526020600020905b81548152906001019060200180831161072257829003601f168201915b5050505050905090565b600061075d610756610bd7565b8484610da8565b6001905092915050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86660036040516107999190611895565b60405180910390206107a9611241565b306040516020016107bd94939291906118ac565b60405160208183030381529060405280519060200120905060007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9898989600660008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061084b90611920565b919050558a60405160200161086596959493929190611968565b60405160208183030381529060405280519060200120905060008282604051602001610892929190611a41565b60405160208183030381529060405280519060200120905060006108b88288888861124e565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610929576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092090611ac4565b60405180910390fd5b8a73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098e90611b30565b60405180910390fd5b874211156109da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d190611b9c565b60405180910390fd5b88600160008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258b604051610ab89190611528565b60405180910390a35050505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610b5c6110fd565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc290611c2e565b60405180910390fd5b610bd48161117b565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4590611cc0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490611d52565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610d9b9190611528565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90611de4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7d90611e76565b60405180910390fd5b610e918383836112b8565b610efc81604051806060016040528060268152602001612069602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461103b9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f8f816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461109f90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161102e9190611528565b60405180910390a3505050565b6000838311158290611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107a91906113e8565b60405180910390fd5b50600083856110929190611e96565b9050809150509392505050565b60008082846110ae9190611eca565b9050838110156110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90611f4a565b60405180910390fd5b8091505092915050565b611105610bd7565b73ffffffffffffffffffffffffffffffffffffffff1661112361068d565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090611fb6565b60405180910390fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000804690508091505090565b6000601b8460ff1614806112655750601c8460ff16145b6112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90612048565b60405180910390fd5b6112ae83856112bd565b9050949350505050565b505050565b6000601b8260ff1614806112d45750601c8260ff16145b506000731bbf0523b16326018f23bf8680e5a13e8006a378732574947fae562c0000000000000000000000000061130b9190611eca565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361134c578360001c915050611352565b60009150505b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611392578082015181840152602081019050611377565b60008484015250505050565b6000601f19601f8301169050919050565b60006113ba82611358565b6113c48185611363565b93506113d4818560208601611374565b6113dd8161139e565b840191505092915050565b6000602082019050818103600083015261140281846113af565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061143a8261140f565b9050919050565b61144a8161142f565b811461145557600080fd5b50565b60008135905061146781611441565b92915050565b6000819050919050565b6114808161146d565b811461148b57600080fd5b50565b60008135905061149d81611477565b92915050565b600080604083850312156114ba576114b961140a565b5b60006114c885828601611458565b92505060206114d98582860161148e565b9150509250929050565b60008115159050919050565b6114f8816114e3565b82525050565b600060208201905061151360008301846114ef565b92915050565b6115228161146d565b82525050565b600060208201905061153d6000830184611519565b92915050565b6000819050919050565b61155681611543565b82525050565b6000602082019050611571600083018461154d565b92915050565b6000806000606084860312156115905761158f61140a565b5b600061159e86828701611458565b93505060206115af86828701611458565b92505060406115c08682870161148e565b9150509250925092565b600060ff82169050919050565b6115e0816115ca565b82525050565b60006020820190506115fb60008301846115d7565b92915050565b6000602082840312156116175761161661140a565b5b600061162584828501611458565b91505092915050565b6116378161142f565b82525050565b6000602082019050611652600083018461162e565b92915050565b611661816115ca565b811461166c57600080fd5b50565b60008135905061167e81611658565b92915050565b61168d81611543565b811461169857600080fd5b50565b6000813590506116aa81611684565b92915050565b600080600080600080600060e0888a0312156116cf576116ce61140a565b5b60006116dd8a828b01611458565b97505060206116ee8a828b01611458565b96505060406116ff8a828b0161148e565b95505060606117108a828b0161148e565b94505060806117218a828b0161166f565b93505060a06117328a828b0161169b565b92505060c06117438a828b0161169b565b91505092959891949750929550565b600080604083850312156117695761176861140a565b5b600061177785828601611458565b925050602061178885828601611458565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806117d957607f821691505b6020821081036117ec576117eb611792565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461181f816117c1565b61182981866117f2565b9450600182166000811461184457600181146118595761188c565b60ff198316865281151582028601935061188c565b611862856117fd565b60005b8381101561188457815481890152600182019150602081019050611865565b838801955050505b50505092915050565b60006118a18284611812565b915081905092915050565b60006080820190506118c1600083018761154d565b6118ce602083018661154d565b6118db6040830185611519565b6118e8606083018461162e565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061192b8261146d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361195d5761195c6118f1565b5b600182019050919050565b600060c08201905061197d600083018961154d565b61198a602083018861162e565b611997604083018761162e565b6119a46060830186611519565b6119b16080830185611519565b6119be60a0830184611519565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611a0a6002836119c9565b9150611a15826119d4565b600282019050919050565b6000819050919050565b611a3b611a3682611543565b611a20565b82525050565b6000611a4c826119fd565b9150611a588285611a2a565b602082019150611a688284611a2a565b6020820191508190509392505050565b7f696e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b6000611aae601183611363565b9150611ab982611a78565b602082019050919050565b60006020820190508181036000830152611add81611aa1565b9050919050565b7f756e617574686f72697a65640000000000000000000000000000000000000000600082015250565b6000611b1a600c83611363565b9150611b2582611ae4565b602082019050919050565b60006020820190508181036000830152611b4981611b0d565b9050919050565b7f7369676e61747572652065787069726564000000000000000000000000000000600082015250565b6000611b86601183611363565b9150611b9182611b50565b602082019050919050565b60006020820190508181036000830152611bb581611b79565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c18602683611363565b9150611c2382611bbc565b604082019050919050565b60006020820190508181036000830152611c4781611c0b565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611caa602483611363565b9150611cb582611c4e565b604082019050919050565b60006020820190508181036000830152611cd981611c9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d3c602283611363565b9150611d4782611ce0565b604082019050919050565b60006020820190508181036000830152611d6b81611d2f565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000611dce602583611363565b9150611dd982611d72565b604082019050919050565b60006020820190508181036000830152611dfd81611dc1565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611e60602383611363565b9150611e6b82611e04565b604082019050919050565b60006020820190508181036000830152611e8f81611e53565b9050919050565b6000611ea18261146d565b9150611eac8361146d565b9250828203905081811115611ec457611ec36118f1565b5b92915050565b6000611ed58261146d565b9150611ee08361146d565b9250828201905080821115611ef857611ef76118f1565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000611f34601b83611363565b9150611f3f82611efe565b602082019050919050565b60006020820190508181036000830152611f6381611f27565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611fa0602083611363565b9150611fab82611f6a565b602082019050919050565b60006020820190508181036000830152611fcf81611f93565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612032602283611363565b915061203d82611fd6565b604082019050919050565b6000602082019050818103600083015261206181612025565b905091905056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212203b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc964736f6c634300081a0033
Deployed Bytecode Sourcemap
54845:153:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44517:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43486:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41400:155;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45168:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41645:170;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43338:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45898:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43649:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54028:103;;;:::i;:::-;;41824:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53387:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42613;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43981:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46605:1164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44219:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54286:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42411:83;42448:13;42481:5;42474:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42411:83;:::o;44517:169::-;44600:4;44617:39;44626:12;:10;:12::i;:::-;44640:7;44649:6;44617:8;:39::i;:::-;44674:4;44667:11;;44517:169;;;;:::o;43486:100::-;43539:7;43566:12;;43559:19;;43486:100;:::o;41400:155::-;41451:104;41400:155;:::o;45168:321::-;45274:4;45291:36;45301:6;45309:9;45320:6;45291:9;:36::i;:::-;45338:121;45347:6;45355:12;:10;:12::i;:::-;45369:89;45407:6;45369:89;;;;;;;;;;;;;;;;;:11;:19;45381:6;45369:19;;;;;;;;;;;;;;;:33;45389:12;:10;:12::i;:::-;45369:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;45338:8;:121::i;:::-;45477:4;45470:11;;45168:321;;;;;:::o;41645:170::-;41696:119;41645:170;:::o;43338:83::-;43379:5;43404:9;;;;;;;;;;;43397:16;;43338:83;:::o;45898:218::-;45986:4;46003:83;46012:12;:10;:12::i;:::-;46026:7;46035:50;46074:10;46035:11;:25;46047:12;:10;:12::i;:::-;46035:25;;;;;;;;;;;;;;;:34;46061:7;46035:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;46003:8;:83::i;:::-;46104:4;46097:11;;45898:218;;;;:::o;43649:119::-;43715:7;43742:9;:18;43752:7;43742:18;;;;;;;;;;;;;;;;43735:25;;43649:119;;;:::o;54028:103::-;53273:13;:11;:13::i;:::-;54093:30:::1;54120:1;54093:18;:30::i;:::-;54028:103::o:0;41824:41::-;;;;;;;;;;;;;;;;;:::o;53387:87::-;53433:7;53460:6;;;;;;;;;;;53453:13;;53387:87;:::o;42613:::-;42652:13;42685:7;42678:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42613:87;:::o;43981:175::-;44067:4;44084:42;44094:12;:10;:12::i;:::-;44108:9;44119:6;44084:9;:42::i;:::-;44144:4;44137:11;;43981:175;;;;:::o;46605:1164::-;46808:23;41451:104;46937:5;46921:23;;;;;;:::i;:::-;;;;;;;;46963:12;:10;:12::i;:::-;47002:4;46858:164;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46834:199;;;;;;46808:225;;47044:18;41696:119;47152:5;47176:7;47202:6;47227;:13;47234:5;47227:13;;;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;47261:8;47089:195;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47065:230;;;;;;47044:251;;47306:14;47376:15;47393:10;47347:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47323:92;;;;;;47306:109;;47426:17;47446:30;47460:6;47468:1;47471;47474;47446:13;:30::i;:::-;47426:50;;47516:1;47495:23;;:9;:23;;;47487:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;47572:5;47559:18;;:9;:18;;;47551:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47632:8;47613:15;:27;;47605:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47705:6;47675:11;:18;47687:5;47675:18;;;;;;;;;;;;;;;:27;47694:7;47675:27;;;;;;;;;;;;;;;:36;;;;47745:7;47729:32;;47738:5;47729:32;;;47754:6;47729:32;;;;;;:::i;:::-;;;;;;;;46797:972;;;;46605:1164;;;;;;;:::o;44219:151::-;44308:7;44335:11;:18;44347:5;44335:18;;;;;;;;;;;;;;;:27;44354:7;44335:27;;;;;;;;;;;;;;;;44328:34;;44219:151;;;;:::o;54286:201::-;53273:13;:11;:13::i;:::-;54395:1:::1;54375:22;;:8;:22;;::::0;54367:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;54451:28;54470:8;54451:18;:28::i;:::-;54286:201:::0;:::o;604:98::-;657:7;684:10;677:17;;604:98;:::o;50841:346::-;50960:1;50943:19;;:5;:19;;;50935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51041:1;51022:21;;:7;:21;;;51014:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51125:6;51095:11;:18;51107:5;51095:18;;;;;;;;;;;;;;;:27;51114:7;51095:27;;;;;;;;;;;;;;;:36;;;;51163:7;51147:32;;51156:5;51147:32;;;51172:6;51147:32;;;;;;:::i;:::-;;;;;;;;50841:346;;;:::o;48259:547::-;48383:1;48365:20;;:6;:20;;;48357:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48467:1;48446:23;;:9;:23;;;48438:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48530:47;48551:6;48559:9;48570:6;48530:20;:47::i;:::-;48610:71;48632:6;48610:71;;;;;;;;;;;;;;;;;:9;:17;48620:6;48610:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;48590:9;:17;48600:6;48590:17;;;;;;;;;;;;;;;:91;;;;48715:32;48740:6;48715:9;:20;48725:9;48715:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;48692:9;:20;48702:9;48692:20;;;;;;;;;;;;;;;:55;;;;48780:9;48763:35;;48772:6;48763:35;;;48791:6;48763:35;;;;;;:::i;:::-;;;;;;;;48259:547;;;:::o;5658:192::-;5744:7;5777:1;5772;:6;;5780:12;5764:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5804:9;5820:1;5816;:5;;;;:::i;:::-;5804:17;;5841:1;5834:8;;;5658:192;;;;;:::o;4755:181::-;4813:7;4833:9;4849:1;4845;:5;;;;:::i;:::-;4833:17;;4874:1;4869;:6;;4861:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4927:1;4920:8;;;4755:181;;;;:::o;53552:132::-;53627:12;:10;:12::i;:::-;53616:23;;:7;:5;:7::i;:::-;:23;;;53608:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53552:132::o;54647:191::-;54721:16;54740:6;;;;;;;;;;;54721:25;;54766:8;54757:6;;:17;;;;;;;;;;;;;;;;;;54821:8;54790:40;;54811:8;54790:40;;;;;;;;;;;;54710:128;54647:191;:::o;50225:178::-;50270:7;50290:15;50351:9;50340:20;;50388:7;50381:14;;;50225:178;:::o;38877:384::-;38962:14;39044:2;39039:1;:7;;;:18;;;;39055:2;39050:1;:7;;;39039:18;39031:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39215:38;39248:1;39251;39215:32;:38::i;:::-;39206:47;;38877:384;;;;;;:::o;52212:91::-;;;;:::o;21990:329::-;22099:7;22127:2;22122:1;:7;;;:18;;;;22138:2;22133:1;:7;;;22122:18;22119:25;22154:12;11533:48;11419:70;22185:21;;;;:::i;:::-;22154:54;;22230:10;22222:18;;:4;:18;;;22219:65;;22275:4;22267:13;;22244:38;;;;;22219:65;22309:1;22294:17;;;21990:329;;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:248::-;369:1;379:113;393:6;390:1;387:13;379:113;;;478:1;473:3;469:11;463:18;459:1;454:3;450:11;443:39;415:2;412:1;408:10;403:15;;379:113;;;526:1;517:6;512:3;508:16;501:27;349:186;287:248;;;:::o;541:102::-;582:6;633:2;629:7;624:2;617:5;613:14;609:28;599:38;;541:102;;;:::o;649:377::-;737:3;765:39;798:5;765:39;:::i;:::-;820:71;884:6;879:3;820:71;:::i;:::-;813:78;;900:65;958:6;953:3;946:4;939:5;935:16;900:65;:::i;:::-;990:29;1012:6;990:29;:::i;:::-;985:3;981:39;974:46;;741:285;649:377;;;;:::o;1032:313::-;1145:4;1183:2;1172:9;1168:18;1160:26;;1232:9;1226:4;1222:20;1218:1;1207:9;1203:17;1196:47;1260:78;1333:4;1324:6;1260:78;:::i;:::-;1252:86;;1032:313;;;;:::o;1432:117::-;1541:1;1538;1531:12;1678:126;1715:7;1755:42;1748:5;1744:54;1733:65;;1678:126;;;:::o;1810:96::-;1847:7;1876:24;1894:5;1876:24;:::i;:::-;1865:35;;1810:96;;;:::o;1912:122::-;1985:24;2003:5;1985:24;:::i;:::-;1978:5;1975:35;1965:63;;2024:1;2021;2014:12;1965:63;1912:122;:::o;2040:139::-;2086:5;2124:6;2111:20;2102:29;;2140:33;2167:5;2140:33;:::i;:::-;2040:139;;;;:::o;2185:77::-;2222:7;2251:5;2240:16;;2185:77;;;:::o;2268:122::-;2341:24;2359:5;2341:24;:::i;:::-;2334:5;2331:35;2321:63;;2380:1;2377;2370:12;2321:63;2268:122;:::o;2396:139::-;2442:5;2480:6;2467:20;2458:29;;2496:33;2523:5;2496:33;:::i;:::-;2396:139;;;;:::o;2541:474::-;2609:6;2617;2666:2;2654:9;2645:7;2641:23;2637:32;2634:119;;;2672:79;;:::i;:::-;2634:119;2792:1;2817:53;2862:7;2853:6;2842:9;2838:22;2817:53;:::i;:::-;2807:63;;2763:117;2919:2;2945:53;2990:7;2981:6;2970:9;2966:22;2945:53;:::i;:::-;2935:63;;2890:118;2541:474;;;;;:::o;3021:90::-;3055:7;3098:5;3091:13;3084:21;3073:32;;3021:90;;;:::o;3117:109::-;3198:21;3213:5;3198:21;:::i;:::-;3193:3;3186:34;3117:109;;:::o;3232:210::-;3319:4;3357:2;3346:9;3342:18;3334:26;;3370:65;3432:1;3421:9;3417:17;3408:6;3370:65;:::i;:::-;3232:210;;;;:::o;3448:118::-;3535:24;3553:5;3535:24;:::i;:::-;3530:3;3523:37;3448:118;;:::o;3572:222::-;3665:4;3703:2;3692:9;3688:18;3680:26;;3716:71;3784:1;3773:9;3769:17;3760:6;3716:71;:::i;:::-;3572:222;;;;:::o;3800:77::-;3837:7;3866:5;3855:16;;3800:77;;;:::o;3883:118::-;3970:24;3988:5;3970:24;:::i;:::-;3965:3;3958:37;3883:118;;:::o;4007:222::-;4100:4;4138:2;4127:9;4123:18;4115:26;;4151:71;4219:1;4208:9;4204:17;4195:6;4151:71;:::i;:::-;4007:222;;;;:::o;4235:619::-;4312:6;4320;4328;4377:2;4365:9;4356:7;4352:23;4348:32;4345:119;;;4383:79;;:::i;:::-;4345:119;4503:1;4528:53;4573:7;4564:6;4553:9;4549:22;4528:53;:::i;:::-;4518:63;;4474:117;4630:2;4656:53;4701:7;4692:6;4681:9;4677:22;4656:53;:::i;:::-;4646:63;;4601:118;4758:2;4784:53;4829:7;4820:6;4809:9;4805:22;4784:53;:::i;:::-;4774:63;;4729:118;4235:619;;;;;:::o;4860:86::-;4895:7;4935:4;4928:5;4924:16;4913:27;;4860:86;;;:::o;4952:112::-;5035:22;5051:5;5035:22;:::i;:::-;5030:3;5023:35;4952:112;;:::o;5070:214::-;5159:4;5197:2;5186:9;5182:18;5174:26;;5210:67;5274:1;5263:9;5259:17;5250:6;5210:67;:::i;:::-;5070:214;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:118::-;5712:24;5730:5;5712:24;:::i;:::-;5707:3;5700:37;5625:118;;:::o;5749:222::-;5842:4;5880:2;5869:9;5865:18;5857:26;;5893:71;5961:1;5950:9;5946:17;5937:6;5893:71;:::i;:::-;5749:222;;;;:::o;5977:118::-;6048:22;6064:5;6048:22;:::i;:::-;6041:5;6038:33;6028:61;;6085:1;6082;6075:12;6028:61;5977:118;:::o;6101:135::-;6145:5;6183:6;6170:20;6161:29;;6199:31;6224:5;6199:31;:::i;:::-;6101:135;;;;:::o;6242:122::-;6315:24;6333:5;6315:24;:::i;:::-;6308:5;6305:35;6295:63;;6354:1;6351;6344:12;6295:63;6242:122;:::o;6370:139::-;6416:5;6454:6;6441:20;6432:29;;6470:33;6497:5;6470:33;:::i;:::-;6370:139;;;;:::o;6515:1199::-;6626:6;6634;6642;6650;6658;6666;6674;6723:3;6711:9;6702:7;6698:23;6694:33;6691:120;;;6730:79;;:::i;:::-;6691:120;6850:1;6875:53;6920:7;6911:6;6900:9;6896:22;6875:53;:::i;:::-;6865:63;;6821:117;6977:2;7003:53;7048:7;7039:6;7028:9;7024:22;7003:53;:::i;:::-;6993:63;;6948:118;7105:2;7131:53;7176:7;7167:6;7156:9;7152:22;7131:53;:::i;:::-;7121:63;;7076:118;7233:2;7259:53;7304:7;7295:6;7284:9;7280:22;7259:53;:::i;:::-;7249:63;;7204:118;7361:3;7388:51;7431:7;7422:6;7411:9;7407:22;7388:51;:::i;:::-;7378:61;;7332:117;7488:3;7515:53;7560:7;7551:6;7540:9;7536:22;7515:53;:::i;:::-;7505:63;;7459:119;7617:3;7644:53;7689:7;7680:6;7669:9;7665:22;7644:53;:::i;:::-;7634:63;;7588:119;6515:1199;;;;;;;;;;:::o;7720:474::-;7788:6;7796;7845:2;7833:9;7824:7;7820:23;7816:32;7813:119;;;7851:79;;:::i;:::-;7813:119;7971:1;7996:53;8041:7;8032:6;8021:9;8017:22;7996:53;:::i;:::-;7986:63;;7942:117;8098:2;8124:53;8169:7;8160:6;8149:9;8145:22;8124:53;:::i;:::-;8114:63;;8069:118;7720:474;;;;;:::o;8200:180::-;8248:77;8245:1;8238:88;8345:4;8342:1;8335:15;8369:4;8366:1;8359:15;8386:320;8430:6;8467:1;8461:4;8457:12;8447:22;;8514:1;8508:4;8504:12;8535:18;8525:81;;8591:4;8583:6;8579:17;8569:27;;8525:81;8653:2;8645:6;8642:14;8622:18;8619:38;8616:84;;8672:18;;:::i;:::-;8616:84;8437:269;8386:320;;;:::o;8712:147::-;8813:11;8850:3;8835:18;;8712:147;;;;:::o;8865:144::-;8917:4;8940:3;8932:11;;8963:3;8960:1;8953:14;8997:4;8994:1;8984:18;8976:26;;8865:144;;;:::o;9037:878::-;9142:3;9179:5;9173:12;9208:36;9234:9;9208:36;:::i;:::-;9260:88;9341:6;9336:3;9260:88;:::i;:::-;9253:95;;9379:1;9368:9;9364:17;9395:1;9390:166;;;;9570:1;9565:344;;;;9357:552;;9390:166;9474:4;9470:9;9459;9455:25;9450:3;9443:38;9536:6;9529:14;9522:22;9514:6;9510:35;9505:3;9501:45;9494:52;;9390:166;;9565:344;9632:41;9667:5;9632:41;:::i;:::-;9695:1;9709:154;9723:6;9720:1;9717:13;9709:154;;;9797:7;9791:14;9787:1;9782:3;9778:11;9771:35;9847:1;9838:7;9834:15;9823:26;;9745:4;9742:1;9738:12;9733:17;;9709:154;;;9892:6;9887:3;9883:16;9876:23;;9572:337;;9357:552;;9146:769;;9037:878;;;;:::o;9921:273::-;10052:3;10074:94;10164:3;10155:6;10074:94;:::i;:::-;10067:101;;10185:3;10178:10;;9921:273;;;;:::o;10200:553::-;10377:4;10415:3;10404:9;10400:19;10392:27;;10429:71;10497:1;10486:9;10482:17;10473:6;10429:71;:::i;:::-;10510:72;10578:2;10567:9;10563:18;10554:6;10510:72;:::i;:::-;10592;10660:2;10649:9;10645:18;10636:6;10592:72;:::i;:::-;10674;10742:2;10731:9;10727:18;10718:6;10674:72;:::i;:::-;10200:553;;;;;;;:::o;10759:180::-;10807:77;10804:1;10797:88;10904:4;10901:1;10894:15;10928:4;10925:1;10918:15;10945:233;10984:3;11007:24;11025:5;11007:24;:::i;:::-;10998:33;;11053:66;11046:5;11043:77;11040:103;;11123:18;;:::i;:::-;11040:103;11170:1;11163:5;11159:13;11152:20;;10945:233;;;:::o;11184:775::-;11417:4;11455:3;11444:9;11440:19;11432:27;;11469:71;11537:1;11526:9;11522:17;11513:6;11469:71;:::i;:::-;11550:72;11618:2;11607:9;11603:18;11594:6;11550:72;:::i;:::-;11632;11700:2;11689:9;11685:18;11676:6;11632:72;:::i;:::-;11714;11782:2;11771:9;11767:18;11758:6;11714:72;:::i;:::-;11796:73;11864:3;11853:9;11849:19;11840:6;11796:73;:::i;:::-;11879;11947:3;11936:9;11932:19;11923:6;11879:73;:::i;:::-;11184:775;;;;;;;;;:::o;11965:148::-;12067:11;12104:3;12089:18;;11965:148;;;;:::o;12119:214::-;12259:66;12255:1;12247:6;12243:14;12236:90;12119:214;:::o;12339:400::-;12499:3;12520:84;12602:1;12597:3;12520:84;:::i;:::-;12513:91;;12613:93;12702:3;12613:93;:::i;:::-;12731:1;12726:3;12722:11;12715:18;;12339:400;;;:::o;12745:79::-;12784:7;12813:5;12802:16;;12745:79;;;:::o;12830:157::-;12935:45;12955:24;12973:5;12955:24;:::i;:::-;12935:45;:::i;:::-;12930:3;12923:58;12830:157;;:::o;12993:663::-;13234:3;13256:148;13400:3;13256:148;:::i;:::-;13249:155;;13414:75;13485:3;13476:6;13414:75;:::i;:::-;13514:2;13509:3;13505:12;13498:19;;13527:75;13598:3;13589:6;13527:75;:::i;:::-;13627:2;13622:3;13618:12;13611:19;;13647:3;13640:10;;12993:663;;;;;:::o;13662:167::-;13802:19;13798:1;13790:6;13786:14;13779:43;13662:167;:::o;13835:366::-;13977:3;13998:67;14062:2;14057:3;13998:67;:::i;:::-;13991:74;;14074:93;14163:3;14074:93;:::i;:::-;14192:2;14187:3;14183:12;14176:19;;13835:366;;;:::o;14207:419::-;14373:4;14411:2;14400:9;14396:18;14388:26;;14460:9;14454:4;14450:20;14446:1;14435:9;14431:17;14424:47;14488:131;14614:4;14488:131;:::i;:::-;14480:139;;14207:419;;;:::o;14632:162::-;14772:14;14768:1;14760:6;14756:14;14749:38;14632:162;:::o;14800:366::-;14942:3;14963:67;15027:2;15022:3;14963:67;:::i;:::-;14956:74;;15039:93;15128:3;15039:93;:::i;:::-;15157:2;15152:3;15148:12;15141:19;;14800:366;;;:::o;15172:419::-;15338:4;15376:2;15365:9;15361:18;15353:26;;15425:9;15419:4;15415:20;15411:1;15400:9;15396:17;15389:47;15453:131;15579:4;15453:131;:::i;:::-;15445:139;;15172:419;;;:::o;15597:167::-;15737:19;15733:1;15725:6;15721:14;15714:43;15597:167;:::o;15770:366::-;15912:3;15933:67;15997:2;15992:3;15933:67;:::i;:::-;15926:74;;16009:93;16098:3;16009:93;:::i;:::-;16127:2;16122:3;16118:12;16111:19;;15770:366;;;:::o;16142:419::-;16308:4;16346:2;16335:9;16331:18;16323:26;;16395:9;16389:4;16385:20;16381:1;16370:9;16366:17;16359:47;16423:131;16549:4;16423:131;:::i;:::-;16415:139;;16142:419;;;:::o;16567:225::-;16707:34;16703:1;16695:6;16691:14;16684:58;16776:8;16771:2;16763:6;16759:15;16752:33;16567:225;:::o;16798:366::-;16940:3;16961:67;17025:2;17020:3;16961:67;:::i;:::-;16954:74;;17037:93;17126:3;17037:93;:::i;:::-;17155:2;17150:3;17146:12;17139:19;;16798:366;;;:::o;17170:419::-;17336:4;17374:2;17363:9;17359:18;17351:26;;17423:9;17417:4;17413:20;17409:1;17398:9;17394:17;17387:47;17451:131;17577:4;17451:131;:::i;:::-;17443:139;;17170:419;;;:::o;17595:223::-;17735:34;17731:1;17723:6;17719:14;17712:58;17804:6;17799:2;17791:6;17787:15;17780:31;17595:223;:::o;17824:366::-;17966:3;17987:67;18051:2;18046:3;17987:67;:::i;:::-;17980:74;;18063:93;18152:3;18063:93;:::i;:::-;18181:2;18176:3;18172:12;18165:19;;17824:366;;;:::o;18196:419::-;18362:4;18400:2;18389:9;18385:18;18377:26;;18449:9;18443:4;18439:20;18435:1;18424:9;18420:17;18413:47;18477:131;18603:4;18477:131;:::i;:::-;18469:139;;18196:419;;;:::o;18621:221::-;18761:34;18757:1;18749:6;18745:14;18738:58;18830:4;18825:2;18817:6;18813:15;18806:29;18621:221;:::o;18848:366::-;18990:3;19011:67;19075:2;19070:3;19011:67;:::i;:::-;19004:74;;19087:93;19176:3;19087:93;:::i;:::-;19205:2;19200:3;19196:12;19189:19;;18848:366;;;:::o;19220:419::-;19386:4;19424:2;19413:9;19409:18;19401:26;;19473:9;19467:4;19463:20;19459:1;19448:9;19444:17;19437:47;19501:131;19627:4;19501:131;:::i;:::-;19493:139;;19220:419;;;:::o;19645:224::-;19785:34;19781:1;19773:6;19769:14;19762:58;19854:7;19849:2;19841:6;19837:15;19830:32;19645:224;:::o;19875:366::-;20017:3;20038:67;20102:2;20097:3;20038:67;:::i;:::-;20031:74;;20114:93;20203:3;20114:93;:::i;:::-;20232:2;20227:3;20223:12;20216:19;;19875:366;;;:::o;20247:419::-;20413:4;20451:2;20440:9;20436:18;20428:26;;20500:9;20494:4;20490:20;20486:1;20475:9;20471:17;20464:47;20528:131;20654:4;20528:131;:::i;:::-;20520:139;;20247:419;;;:::o;20672:222::-;20812:34;20808:1;20800:6;20796:14;20789:58;20881:5;20876:2;20868:6;20864:15;20857:30;20672:222;:::o;20900:366::-;21042:3;21063:67;21127:2;21122:3;21063:67;:::i;:::-;21056:74;;21139:93;21228:3;21139:93;:::i;:::-;21257:2;21252:3;21248:12;21241:19;;20900:366;;;:::o;21272:419::-;21438:4;21476:2;21465:9;21461:18;21453:26;;21525:9;21519:4;21515:20;21511:1;21500:9;21496:17;21489:47;21553:131;21679:4;21553:131;:::i;:::-;21545:139;;21272:419;;;:::o;21697:194::-;21737:4;21757:20;21775:1;21757:20;:::i;:::-;21752:25;;21791:20;21809:1;21791:20;:::i;:::-;21786:25;;21835:1;21832;21828:9;21820:17;;21859:1;21853:4;21850:11;21847:37;;;21864:18;;:::i;:::-;21847:37;21697:194;;;;:::o;21897:191::-;21937:3;21956:20;21974:1;21956:20;:::i;:::-;21951:25;;21990:20;22008:1;21990:20;:::i;:::-;21985:25;;22033:1;22030;22026:9;22019:16;;22054:3;22051:1;22048:10;22045:36;;;22061:18;;:::i;:::-;22045:36;21897:191;;;;:::o;22094:177::-;22234:29;22230:1;22222:6;22218:14;22211:53;22094:177;:::o;22277:366::-;22419:3;22440:67;22504:2;22499:3;22440:67;:::i;:::-;22433:74;;22516:93;22605:3;22516:93;:::i;:::-;22634:2;22629:3;22625:12;22618:19;;22277:366;;;:::o;22649:419::-;22815:4;22853:2;22842:9;22838:18;22830:26;;22902:9;22896:4;22892:20;22888:1;22877:9;22873:17;22866:47;22930:131;23056:4;22930:131;:::i;:::-;22922:139;;22649:419;;;:::o;23074:182::-;23214:34;23210:1;23202:6;23198:14;23191:58;23074:182;:::o;23262:366::-;23404:3;23425:67;23489:2;23484:3;23425:67;:::i;:::-;23418:74;;23501:93;23590:3;23501:93;:::i;:::-;23619:2;23614:3;23610:12;23603:19;;23262:366;;;:::o;23634:419::-;23800:4;23838:2;23827:9;23823:18;23815:26;;23887:9;23881:4;23877:20;23873:1;23862:9;23858:17;23851:47;23915:131;24041:4;23915:131;:::i;:::-;23907:139;;23634:419;;;:::o;24059:221::-;24199:34;24195:1;24187:6;24183:14;24176:58;24268:4;24263:2;24255:6;24251:15;24244:29;24059:221;:::o;24286:366::-;24428:3;24449:67;24513:2;24508:3;24449:67;:::i;:::-;24442:74;;24525:93;24614:3;24525:93;:::i;:::-;24643:2;24638:3;24634:12;24627:19;;24286:366;;;:::o;24658:419::-;24824:4;24862:2;24851:9;24847:18;24839:26;;24911:9;24905:4;24901:20;24897:1;24886:9;24882:17;24875:47;24939:131;25065:4;24939:131;:::i;:::-;24931:139;;24658:419;;;:::o
Swarm Source
ipfs://3b83608088ca9c20bec01ab0e7f3dd8a1aceb5edac316f5daef0104de7105fc9
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.