Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 10 from a total of 10 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Balance | 17389016 | 1024 days ago | IN | 0 ETH | 0.00105087 | ||||
| Set Merkle Root | 17388986 | 1024 days ago | IN | 0 ETH | 0.00154144 | ||||
| Contribute Publi... | 17388933 | 1024 days ago | IN | 0.03 ETH | 0.0038429 | ||||
| Contribute Publi... | 17388931 | 1024 days ago | IN | 0.2 ETH | 0.00372679 | ||||
| Contribute Publi... | 17388929 | 1024 days ago | IN | 0.5 ETH | 0.00383179 | ||||
| Contribute Publi... | 17388928 | 1024 days ago | IN | 0.5 ETH | 0.00382459 | ||||
| Contribute Publi... | 17388928 | 1024 days ago | IN | 0.5 ETH | 0.00382459 | ||||
| Contribute Publi... | 17388928 | 1024 days ago | IN | 0.04 ETH | 0.00382459 | ||||
| Contribute Publi... | 17388926 | 1024 days ago | IN | 0.04 ETH | 0.00552999 | ||||
| Start Presale | 17388774 | 1024 days ago | IN | 0 ETH | 0.00273052 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 17389016 | 1024 days ago | 1.81 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
POP
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2023-06-01
*/
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)
pragma solidity ^0.8.0;
/**
* @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.
*/
library MerkleProof {
/**
* @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
* defined by `root`. For this, a `proof` must be provided, containing
* sibling hashes on the branch from the leaf to the root of the tree. Each
* pair of leaves and each pair of pre-images are assumed to be sorted.
*/
function verify(
bytes32[] memory proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
/**
* @dev Calldata version of {verify}
*
* _Available since v4.7._
*/
function verifyCalldata(
bytes32[] calldata proof,
bytes32 root,
bytes32 leaf
) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
/**
* @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
* from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
* hash matches the root of the tree. When processing the proof, the pairs
* of leafs & pre-images are assumed to be sorted.
*
* _Available since v4.4._
*/
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Calldata version of {processProof}
*
* _Available since v4.7._
*/
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
/**
* @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
* `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
/**
* @dev Calldata version of {multiProofVerify}
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
/**
* @dev Returns the root of a tree reconstructed from `leaves` and 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.
*
* 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).
*
* _Available since v4.7._
*/
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
/**
* @dev Calldata version of {processMultiProof}.
*
* CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
*
* _Available since v4.7._
*/
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
// This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
// consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
// `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
// the merkle tree.
uint256 leavesLen = leaves.length;
uint256 totalHashes = proofFlags.length;
// Check proof validity.
require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");
// The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
// `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
// At each step, we compute the next hash using two values:
// - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
// get the next hash.
// - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
// `proof` array.
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
return hashes[totalHashes - 1];
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
/// @solidity memory-safe-assembly
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}
// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
/**
* @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead 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, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override 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 this function is
* overridden;
*
* 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 virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, 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}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, 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}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
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) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases 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.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This 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:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, 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:
*
* - `account` 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 += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(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);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @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 Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @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 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 Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
// File: contracts/contracts/POP.sol
pragma solidity ^0.8.9;
contract POP is ERC20, Ownable {
bool public isPresaleActive = false;
bool public presaleAirdroped = false;
bool public lpMinted = false;
uint256 public constant MIN_CONTRIBUTION = .025 ether;
uint256 public constant MAX_CONTRIBUTION = .5 ether;
uint256 public constant SOFT_CAP = 10 ether;
uint256 public constant HARD_CAP = 40 ether;
uint256 public constant MAX_SUPPLY = 1000000000 * 10 ** 18;
uint256 public constant PRESALE_SUPPLY = 600000000 * 10 ** 18;
uint256 public constant LP_SUPPLY = 300000000 * 10 ** 18;
uint256 public total_contributed;
address[] public presale_wallets;
mapping(address => uint256) public presale_contribution;
uint256 public presaleStartTime;
bytes32 private merkleRoot;
constructor() ERC20("POP CLUB", "POP"){}
function contribute(bytes32[] calldata _merkleProof) external payable {
require(isPresaleActive, "Presale hasn't started yet");
bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not on the WL");
require(msg.value >= MIN_CONTRIBUTION, "Contribution too low");
require (presale_contribution[msg.sender] + msg.value <= MAX_CONTRIBUTION,"Contribution too high");
require (msg.value + total_contributed <= HARD_CAP, "Contribution exceeds hard cap");
total_contributed = total_contributed + msg.value;
presale_wallets.push(msg.sender);
presale_contribution[msg.sender] += msg.value;
}
function contributePublic() external payable {
require(isPresaleActive, "Presale hasn't started yet");
require(block.timestamp - presaleStartTime >= 1800, "Public presale hasn't started yet");
require(msg.value >= MIN_CONTRIBUTION, "Contribution too low");
require (presale_contribution[msg.sender] + msg.value <= MAX_CONTRIBUTION, "Contribution too high");
require (msg.value + total_contributed <= HARD_CAP, "Contribution exceeds hard cap");
total_contributed = total_contributed + msg.value;
presale_wallets.push(msg.sender);
presale_contribution[msg.sender] += msg.value;
}
function airdropPresale() external onlyOwner {
require(!presaleAirdroped, "Presale airdropped");
presaleAirdroped = true;
for (uint256 i = 0; i < presale_wallets.length;) {
if (presale_contribution[presale_wallets[i]] > 0) {
uint256 numberOfTokensToMint = PRESALE_SUPPLY * presale_contribution[presale_wallets[i]] / HARD_CAP;
_mint(presale_wallets[i], numberOfTokensToMint);
}
unchecked {i++;}
}
}
function devMint(address _address) external onlyOwner {
require(lpMinted);
require(presaleAirdroped);
require(totalSupply() < MAX_SUPPLY);
uint256 numberToMint = MAX_SUPPLY - totalSupply();
_mint(_address, numberToMint);
}
function refund() external {
require (total_contributed < SOFT_CAP, "SOFT CAP reached");
require(presale_contribution[msg.sender] > 0);
payable(msg.sender).transfer(presale_contribution[msg.sender]);
total_contributed = total_contributed - presale_contribution[msg.sender];
presale_contribution[msg.sender] = 0;
}
function startPresale() external onlyOwner {
require(!isPresaleActive);
isPresaleActive = true;
presaleStartTime = block.timestamp;
}
function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
merkleRoot = _merkleRoot;
}
function mintLPAmount() external onlyOwner {
require(!lpMinted, "LP Minted");
lpMinted = true;
_mint(msg.sender, LP_SUPPLY);
}
function withdrawBalance() external onlyOwner {
(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
require(success);
}
function burn(uint256 value) external {
_burn(msg.sender, value);
}
}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":"HARD_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LP_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_CONTRIBUTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SOFT_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropPresale","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"contribute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"contributePublic","outputs":[],"stateMutability":"payable","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLPAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAirdroped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presale_contribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"presale_wallets","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","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":[],"name":"total_contributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526005805462ffffff60a01b191690553480156200002057600080fd5b50604051806040016040528060088152602001672827a81021a62aa160c11b815250604051806040016040528060038152602001620504f560ec1b81525081600390805190602001906200007692919062000105565b5080516200008c90600490602084019062000105565b505050620000a9620000a3620000af60201b60201c565b620000b3565b620001e8565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011390620001ab565b90600052602060002090601f01602090048101928262000137576000855562000182565b82601f106200015257805160ff191683800117855562000182565b8280016001018555821562000182579182015b828111156200018257825182559160200191906001019062000165565b506200019092915062000194565b5090565b5b8082111562000190576000815560010162000195565b600181811c90821680620001c057607f821691505b60208210811415620001e257634e487b7160e01b600052602260045260246000fd5b50919050565b611b3280620001f86000396000f3fe6080604052600436106102255760003560e01c8063715018a611610123578063a88ab886116100ab578063c21ca41c1161006f578063c21ca41c14610606578063dd62ed3e14610633578063e2cf298014610653578063f2fde38b14610674578063f7bdc4f71461069457600080fd5b8063a88ab8861461057e578063a9059cbb1461059f578063b652dc2f146105bf578063b8214969146105db578063bdf8a69d146105f157600080fd5b80638da5cb5b116100f25780638da5cb5b146104f957806394d95f8f1461051757806395d89b4114610533578063a457c2d714610548578063a82524b21461056857600080fd5b8063715018a61461048f57806373138e4f146104a45780637cb64759146104c45780638512747d146104e457600080fd5b80633a03171c116101b1578063590e1ae311610175578063590e1ae3146103ef5780635fd8c7101461040457806360d938dc14610419578063670171fd1461043a57806370a082311461045957600080fd5b80633a03171c1461033f5780633c8a2ff31461035c57806340650c911461039457806341ee05f7146103af57806342966c68146103cf57600080fd5b806323b872dd116101f857806323b872dd146102bb578063313ce567146102db57806332cb6b0c146102f757806336335e1914610317578063395093511461031f57600080fd5b806304c98b2b1461022a57806306fdde0314610241578063095ea7b31461026c57806318160ddd1461029c575b600080fd5b34801561023657600080fd5b5061023f6106a7565b005b34801561024d57600080fd5b506102566106df565b6040516102639190611857565b60405180910390f35b34801561027857600080fd5b5061028c6102873660046118c8565b610771565b6040519015158152602001610263565b3480156102a857600080fd5b506002545b604051908152602001610263565b3480156102c757600080fd5b5061028c6102d63660046118f2565b610789565b3480156102e757600080fd5b5060405160128152602001610263565b34801561030357600080fd5b506102ad6b033b2e3c9fd0803ce800000081565b61023f6107ad565b34801561032b57600080fd5b5061028c61033a3660046118c8565b610a09565b34801561034b57600080fd5b506102ad68022b1c8c1227a0000081565b34801561036857600080fd5b5061037c61037736600461192e565b610a2b565b6040516001600160a01b039091168152602001610263565b3480156103a057600080fd5b506102ad6658d15e1762800081565b3480156103bb57600080fd5b5061023f6103ca366004611947565b610a55565b3480156103db57600080fd5b5061023f6103ea36600461192e565b610ada565b3480156103fb57600080fd5b5061023f610ae7565b34801561041057600080fd5b5061023f610bb6565b34801561042557600080fd5b5060055461028c90600160a01b900460ff1681565b34801561044657600080fd5b506102ad6af8277896582678ac00000081565b34801561046557600080fd5b506102ad610474366004611947565b6001600160a01b031660009081526020819052604090205490565b34801561049b57600080fd5b5061023f610c13565b3480156104b057600080fd5b506102ad6b01f04ef12cb04cf15800000081565b3480156104d057600080fd5b5061023f6104df36600461192e565b610c27565b3480156104f057600080fd5b5061023f610c34565b34801561050557600080fd5b506005546001600160a01b031661037c565b34801561052357600080fd5b506102ad6706f05b59d3b2000081565b34801561053f57600080fd5b50610256610d94565b34801561055457600080fd5b5061028c6105633660046118c8565b610da3565b34801561057457600080fd5b506102ad60095481565b34801561058a57600080fd5b5060055461028c90600160b01b900460ff1681565b3480156105ab57600080fd5b5061028c6105ba3660046118c8565b610e1e565b3480156105cb57600080fd5b506102ad678ac7230489e8000081565b3480156105e757600080fd5b506102ad60065481565b3480156105fd57600080fd5b5061023f610e2c565b34801561061257600080fd5b506102ad610621366004611947565b60086020526000908152604090205481565b34801561063f57600080fd5b506102ad61064e366004611962565b610ea2565b34801561065f57600080fd5b5060055461028c90600160a81b900460ff1681565b34801561068057600080fd5b5061023f61068f366004611947565b610ecd565b61023f6106a2366004611995565b610f43565b6106af6111ea565b600554600160a01b900460ff16156106c657600080fd5b6005805460ff60a01b1916600160a01b17905542600955565b6060600380546106ee90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461071a90611a0a565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b5050505050905090565b60003361077f818585611244565b5060019392505050565b600033610797858285611369565b6107a28585856113e3565b506001949350505050565b600554600160a01b900460ff1661080b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206861736e277420737461727465642079657400000000000060448201526064015b60405180910390fd5b6107086009544261081c9190611a5b565b10156108745760405162461bcd60e51b815260206004820152602160248201527f5075626c69632070726573616c65206861736e277420737461727465642079656044820152601d60fa1b6064820152608401610802565b6658d15e176280003410156108c25760405162461bcd60e51b8152602060048201526014602482015273436f6e747269627574696f6e20746f6f206c6f7760601b6044820152606401610802565b336000908152600860205260409020546706f05b59d3b20000906108e7903490611a72565b111561092d5760405162461bcd60e51b8152602060048201526015602482015274086dedce8e4d2c4eae8d2dedc40e8dede40d0d2ced605b1b6044820152606401610802565b68022b1c8c1227a00000600654346109459190611a72565b11156109935760405162461bcd60e51b815260206004820152601d60248201527f436f6e747269627574696f6e20657863656564732068617264206361700000006044820152606401610802565b346006546109a19190611a72565b60065560078054600181019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319163390811790915560009081526008602052604081208054349290610a02908490611a72565b9091555050565b60003361077f818585610a1c8383610ea2565b610a269190611a72565b611244565b60078181548110610a3b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a5d6111ea565b600554600160b01b900460ff16610a7357600080fd5b600554600160a81b900460ff16610a8957600080fd5b6b033b2e3c9fd0803ce8000000610a9f60025490565b10610aa957600080fd5b6000610ab460025490565b610aca906b033b2e3c9fd0803ce8000000611a5b565b9050610ad68282611587565b5050565b610ae43382611646565b50565b678ac7230489e8000060065410610b335760405162461bcd60e51b815260206004820152601060248201526f14d3d1950810d054081c995858da195960821b6044820152606401610802565b33600090815260086020526040902054610b4c57600080fd5b3360008181526008602052604080822054905181156108fc0292818181858888f19350505050158015610b83573d6000803e3d6000fd5b5033600090815260086020526040902054600654610ba19190611a5b565b60065533600090815260086020526040812055565b610bbe6111ea565b604051600090339047908381818185875af1925050503d8060008114610c00576040519150601f19603f3d011682016040523d82523d6000602084013e610c05565b606091505b5050905080610ae457600080fd5b610c1b6111ea565b610c256000611770565b565b610c2f6111ea565b600a55565b610c3c6111ea565b600554600160a81b900460ff1615610c8b5760405162461bcd60e51b8152602060048201526012602482015271141c995cd85b1948185a5c991c9bdc1c195960721b6044820152606401610802565b6005805460ff60a81b1916600160a81b17905560005b600754811015610ae45760006008600060078481548110610cc457610cc4611a8a565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115610d8c57600068022b1c8c1227a000006008600060078581548110610d1257610d12611a8a565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610d4d906b01f04ef12cb04cf158000000611aa0565b610d579190611abf565b9050610d8a60078381548110610d6f57610d6f611a8a565b6000918252602090912001546001600160a01b031682611587565b505b600101610ca1565b6060600480546106ee90611a0a565b60003381610db18286610ea2565b905083811015610e115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610802565b6107a28286868403611244565b60003361077f8185856113e3565b610e346111ea565b600554600160b01b900460ff1615610e7a5760405162461bcd60e51b8152602060048201526009602482015268131408135a5b9d195960ba1b6044820152606401610802565b6005805460ff60b01b1916600160b01b179055610c25336af8277896582678ac000000611587565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ed56111ea565b6001600160a01b038116610f3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610802565b610ae481611770565b600554600160a01b900460ff16610f9c5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206861736e27742073746172746564207965740000000000006044820152606401610802565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061101683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506117c2565b6110525760405162461bcd60e51b815260206004820152600d60248201526c139bdd081bdb881d1a194815d3609a1b6044820152606401610802565b6658d15e176280003410156110a05760405162461bcd60e51b8152602060048201526014602482015273436f6e747269627574696f6e20746f6f206c6f7760601b6044820152606401610802565b336000908152600860205260409020546706f05b59d3b20000906110c5903490611a72565b111561110b5760405162461bcd60e51b8152602060048201526015602482015274086dedce8e4d2c4eae8d2dedc40e8dede40d0d2ced605b1b6044820152606401610802565b68022b1c8c1227a00000600654346111239190611a72565b11156111715760405162461bcd60e51b815260206004820152601d60248201527f436f6e747269627574696f6e20657863656564732068617264206361700000006044820152606401610802565b3460065461117f9190611a72565b60065560078054600181019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191633908117909155600090815260086020526040812080543492906111e0908490611a72565b9091555050505050565b6005546001600160a01b03163314610c255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610802565b6001600160a01b0383166112a65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610802565b6001600160a01b0382166113075760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610802565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006113758484610ea2565b905060001981146113dd57818110156113d05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610802565b6113dd8484848403611244565b50505050565b6001600160a01b0383166114475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610802565b6001600160a01b0382166114a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610802565b6001600160a01b038316600090815260208190526040902054818110156115215760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610802565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36113dd565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610802565b80600260008282546115ef9190611a72565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0382166116a65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610802565b6001600160a01b0382166000908152602081905260409020548181101561171a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610802565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161135c565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826117cf85846117d8565b14949350505050565b600081815b845181101561181d57611809828683815181106117fc576117fc611a8a565b6020026020010151611825565b91508061181581611ae1565b9150506117dd565b509392505050565b6000818310611841576000828152602084905260409020611850565b60008381526020839052604090205b9392505050565b600060208083528351808285015260005b8181101561188457858101830151858201604001528201611868565b81811115611896576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146118c357600080fd5b919050565b600080604083850312156118db57600080fd5b6118e4836118ac565b946020939093013593505050565b60008060006060848603121561190757600080fd5b611910846118ac565b925061191e602085016118ac565b9150604084013590509250925092565b60006020828403121561194057600080fd5b5035919050565b60006020828403121561195957600080fd5b611850826118ac565b6000806040838503121561197557600080fd5b61197e836118ac565b915061198c602084016118ac565b90509250929050565b600080602083850312156119a857600080fd5b823567ffffffffffffffff808211156119c057600080fd5b818501915085601f8301126119d457600080fd5b8135818111156119e357600080fd5b8660208260051b85010111156119f857600080fd5b60209290920196919550909350505050565b600181811c90821680611a1e57607f821691505b60208210811415611a3f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611a6d57611a6d611a45565b500390565b60008219821115611a8557611a85611a45565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611aba57611aba611a45565b500290565b600082611adc57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415611af557611af5611a45565b506001019056fea26469706673582212202ae03fa878fcb260b96a0936f3b61718d7a15cd42d78267451da1ff1c061dbe464736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063715018a611610123578063a88ab886116100ab578063c21ca41c1161006f578063c21ca41c14610606578063dd62ed3e14610633578063e2cf298014610653578063f2fde38b14610674578063f7bdc4f71461069457600080fd5b8063a88ab8861461057e578063a9059cbb1461059f578063b652dc2f146105bf578063b8214969146105db578063bdf8a69d146105f157600080fd5b80638da5cb5b116100f25780638da5cb5b146104f957806394d95f8f1461051757806395d89b4114610533578063a457c2d714610548578063a82524b21461056857600080fd5b8063715018a61461048f57806373138e4f146104a45780637cb64759146104c45780638512747d146104e457600080fd5b80633a03171c116101b1578063590e1ae311610175578063590e1ae3146103ef5780635fd8c7101461040457806360d938dc14610419578063670171fd1461043a57806370a082311461045957600080fd5b80633a03171c1461033f5780633c8a2ff31461035c57806340650c911461039457806341ee05f7146103af57806342966c68146103cf57600080fd5b806323b872dd116101f857806323b872dd146102bb578063313ce567146102db57806332cb6b0c146102f757806336335e1914610317578063395093511461031f57600080fd5b806304c98b2b1461022a57806306fdde0314610241578063095ea7b31461026c57806318160ddd1461029c575b600080fd5b34801561023657600080fd5b5061023f6106a7565b005b34801561024d57600080fd5b506102566106df565b6040516102639190611857565b60405180910390f35b34801561027857600080fd5b5061028c6102873660046118c8565b610771565b6040519015158152602001610263565b3480156102a857600080fd5b506002545b604051908152602001610263565b3480156102c757600080fd5b5061028c6102d63660046118f2565b610789565b3480156102e757600080fd5b5060405160128152602001610263565b34801561030357600080fd5b506102ad6b033b2e3c9fd0803ce800000081565b61023f6107ad565b34801561032b57600080fd5b5061028c61033a3660046118c8565b610a09565b34801561034b57600080fd5b506102ad68022b1c8c1227a0000081565b34801561036857600080fd5b5061037c61037736600461192e565b610a2b565b6040516001600160a01b039091168152602001610263565b3480156103a057600080fd5b506102ad6658d15e1762800081565b3480156103bb57600080fd5b5061023f6103ca366004611947565b610a55565b3480156103db57600080fd5b5061023f6103ea36600461192e565b610ada565b3480156103fb57600080fd5b5061023f610ae7565b34801561041057600080fd5b5061023f610bb6565b34801561042557600080fd5b5060055461028c90600160a01b900460ff1681565b34801561044657600080fd5b506102ad6af8277896582678ac00000081565b34801561046557600080fd5b506102ad610474366004611947565b6001600160a01b031660009081526020819052604090205490565b34801561049b57600080fd5b5061023f610c13565b3480156104b057600080fd5b506102ad6b01f04ef12cb04cf15800000081565b3480156104d057600080fd5b5061023f6104df36600461192e565b610c27565b3480156104f057600080fd5b5061023f610c34565b34801561050557600080fd5b506005546001600160a01b031661037c565b34801561052357600080fd5b506102ad6706f05b59d3b2000081565b34801561053f57600080fd5b50610256610d94565b34801561055457600080fd5b5061028c6105633660046118c8565b610da3565b34801561057457600080fd5b506102ad60095481565b34801561058a57600080fd5b5060055461028c90600160b01b900460ff1681565b3480156105ab57600080fd5b5061028c6105ba3660046118c8565b610e1e565b3480156105cb57600080fd5b506102ad678ac7230489e8000081565b3480156105e757600080fd5b506102ad60065481565b3480156105fd57600080fd5b5061023f610e2c565b34801561061257600080fd5b506102ad610621366004611947565b60086020526000908152604090205481565b34801561063f57600080fd5b506102ad61064e366004611962565b610ea2565b34801561065f57600080fd5b5060055461028c90600160a81b900460ff1681565b34801561068057600080fd5b5061023f61068f366004611947565b610ecd565b61023f6106a2366004611995565b610f43565b6106af6111ea565b600554600160a01b900460ff16156106c657600080fd5b6005805460ff60a01b1916600160a01b17905542600955565b6060600380546106ee90611a0a565b80601f016020809104026020016040519081016040528092919081815260200182805461071a90611a0a565b80156107675780601f1061073c57610100808354040283529160200191610767565b820191906000526020600020905b81548152906001019060200180831161074a57829003601f168201915b5050505050905090565b60003361077f818585611244565b5060019392505050565b600033610797858285611369565b6107a28585856113e3565b506001949350505050565b600554600160a01b900460ff1661080b5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206861736e277420737461727465642079657400000000000060448201526064015b60405180910390fd5b6107086009544261081c9190611a5b565b10156108745760405162461bcd60e51b815260206004820152602160248201527f5075626c69632070726573616c65206861736e277420737461727465642079656044820152601d60fa1b6064820152608401610802565b6658d15e176280003410156108c25760405162461bcd60e51b8152602060048201526014602482015273436f6e747269627574696f6e20746f6f206c6f7760601b6044820152606401610802565b336000908152600860205260409020546706f05b59d3b20000906108e7903490611a72565b111561092d5760405162461bcd60e51b8152602060048201526015602482015274086dedce8e4d2c4eae8d2dedc40e8dede40d0d2ced605b1b6044820152606401610802565b68022b1c8c1227a00000600654346109459190611a72565b11156109935760405162461bcd60e51b815260206004820152601d60248201527f436f6e747269627574696f6e20657863656564732068617264206361700000006044820152606401610802565b346006546109a19190611a72565b60065560078054600181019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b0319163390811790915560009081526008602052604081208054349290610a02908490611a72565b9091555050565b60003361077f818585610a1c8383610ea2565b610a269190611a72565b611244565b60078181548110610a3b57600080fd5b6000918252602090912001546001600160a01b0316905081565b610a5d6111ea565b600554600160b01b900460ff16610a7357600080fd5b600554600160a81b900460ff16610a8957600080fd5b6b033b2e3c9fd0803ce8000000610a9f60025490565b10610aa957600080fd5b6000610ab460025490565b610aca906b033b2e3c9fd0803ce8000000611a5b565b9050610ad68282611587565b5050565b610ae43382611646565b50565b678ac7230489e8000060065410610b335760405162461bcd60e51b815260206004820152601060248201526f14d3d1950810d054081c995858da195960821b6044820152606401610802565b33600090815260086020526040902054610b4c57600080fd5b3360008181526008602052604080822054905181156108fc0292818181858888f19350505050158015610b83573d6000803e3d6000fd5b5033600090815260086020526040902054600654610ba19190611a5b565b60065533600090815260086020526040812055565b610bbe6111ea565b604051600090339047908381818185875af1925050503d8060008114610c00576040519150601f19603f3d011682016040523d82523d6000602084013e610c05565b606091505b5050905080610ae457600080fd5b610c1b6111ea565b610c256000611770565b565b610c2f6111ea565b600a55565b610c3c6111ea565b600554600160a81b900460ff1615610c8b5760405162461bcd60e51b8152602060048201526012602482015271141c995cd85b1948185a5c991c9bdc1c195960721b6044820152606401610802565b6005805460ff60a81b1916600160a81b17905560005b600754811015610ae45760006008600060078481548110610cc457610cc4611a8a565b60009182526020808320909101546001600160a01b031683528201929092526040019020541115610d8c57600068022b1c8c1227a000006008600060078581548110610d1257610d12611a8a565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610d4d906b01f04ef12cb04cf158000000611aa0565b610d579190611abf565b9050610d8a60078381548110610d6f57610d6f611a8a565b6000918252602090912001546001600160a01b031682611587565b505b600101610ca1565b6060600480546106ee90611a0a565b60003381610db18286610ea2565b905083811015610e115760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610802565b6107a28286868403611244565b60003361077f8185856113e3565b610e346111ea565b600554600160b01b900460ff1615610e7a5760405162461bcd60e51b8152602060048201526009602482015268131408135a5b9d195960ba1b6044820152606401610802565b6005805460ff60b01b1916600160b01b179055610c25336af8277896582678ac000000611587565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610ed56111ea565b6001600160a01b038116610f3a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610802565b610ae481611770565b600554600160a01b900460ff16610f9c5760405162461bcd60e51b815260206004820152601a60248201527f50726573616c65206861736e27742073746172746564207965740000000000006044820152606401610802565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061101683838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a5491508490506117c2565b6110525760405162461bcd60e51b815260206004820152600d60248201526c139bdd081bdb881d1a194815d3609a1b6044820152606401610802565b6658d15e176280003410156110a05760405162461bcd60e51b8152602060048201526014602482015273436f6e747269627574696f6e20746f6f206c6f7760601b6044820152606401610802565b336000908152600860205260409020546706f05b59d3b20000906110c5903490611a72565b111561110b5760405162461bcd60e51b8152602060048201526015602482015274086dedce8e4d2c4eae8d2dedc40e8dede40d0d2ced605b1b6044820152606401610802565b68022b1c8c1227a00000600654346111239190611a72565b11156111715760405162461bcd60e51b815260206004820152601d60248201527f436f6e747269627574696f6e20657863656564732068617264206361700000006044820152606401610802565b3460065461117f9190611a72565b60065560078054600181019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880180546001600160a01b03191633908117909155600090815260086020526040812080543492906111e0908490611a72565b9091555050505050565b6005546001600160a01b03163314610c255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610802565b6001600160a01b0383166112a65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610802565b6001600160a01b0382166113075760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610802565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006113758484610ea2565b905060001981146113dd57818110156113d05760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610802565b6113dd8484848403611244565b50505050565b6001600160a01b0383166114475760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610802565b6001600160a01b0382166114a95760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610802565b6001600160a01b038316600090815260208190526040902054818110156115215760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610802565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36113dd565b6001600160a01b0382166115dd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610802565b80600260008282546115ef9190611a72565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0382166116a65760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610802565b6001600160a01b0382166000908152602081905260409020548181101561171a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610802565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161135c565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826117cf85846117d8565b14949350505050565b600081815b845181101561181d57611809828683815181106117fc576117fc611a8a565b6020026020010151611825565b91508061181581611ae1565b9150506117dd565b509392505050565b6000818310611841576000828152602084905260409020611850565b60008381526020839052604090205b9392505050565b600060208083528351808285015260005b8181101561188457858101830151858201604001528201611868565b81811115611896576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146118c357600080fd5b919050565b600080604083850312156118db57600080fd5b6118e4836118ac565b946020939093013593505050565b60008060006060848603121561190757600080fd5b611910846118ac565b925061191e602085016118ac565b9150604084013590509250925092565b60006020828403121561194057600080fd5b5035919050565b60006020828403121561195957600080fd5b611850826118ac565b6000806040838503121561197557600080fd5b61197e836118ac565b915061198c602084016118ac565b90509250929050565b600080602083850312156119a857600080fd5b823567ffffffffffffffff808211156119c057600080fd5b818501915085601f8301126119d457600080fd5b8135818111156119e357600080fd5b8660208260051b85010111156119f857600080fd5b60209290920196919550909350505050565b600181811c90821680611a1e57607f821691505b60208210811415611a3f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015611a6d57611a6d611a45565b500390565b60008219821115611a8557611a85611a45565b500190565b634e487b7160e01b600052603260045260246000fd5b6000816000190483118215151615611aba57611aba611a45565b500290565b600082611adc57634e487b7160e01b600052601260045260246000fd5b500490565b6000600019821415611af557611af5611a45565b506001019056fea26469706673582212202ae03fa878fcb260b96a0936f3b61718d7a15cd42d78267451da1ff1c061dbe464736f6c63430008090033
Deployed Bytecode Sourcemap
30175:4140:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33601:165;;;;;;;;;;;;;:::i;:::-;;18912:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21263:201;;;;;;;;;;-1:-1:-1;21263:201:0;;;;;:::i;:::-;;:::i;:::-;;;1218:14:1;;1211:22;1193:41;;1181:2;1166:18;21263:201:0;1053:187:1;20032:108:0;;;;;;;;;;-1:-1:-1;20120:12:0;;20032:108;;;1391:25:1;;;1379:2;1364:18;20032:108:0;1245:177:1;22044:295:0;;;;;;;;;;-1:-1:-1;22044:295:0;;;;;:::i;:::-;;:::i;19874:93::-;;;;;;;;;;-1:-1:-1;19874:93:0;;19957:2;1902:36:1;;1890:2;1875:18;19874:93:0;1760:184:1;30555:58:0;;;;;;;;;;;;30592:21;30555:58;;31760:659;;;:::i;22748:238::-;;;;;;;;;;-1:-1:-1;22748:238:0;;;;;:::i;:::-;;:::i;30503:43::-;;;;;;;;;;;;30538:8;30503:43;;30792:32;;;;;;;;;;-1:-1:-1;30792:32:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2298:32:1;;;2280:51;;2268:2;2253:18;30792:32:0;2134:203:1;30335:53:0;;;;;;;;;;;;30378:10;30335:53;;32946:272;;;;;;;;;;-1:-1:-1;32946:272:0;;;;;:::i;:::-;;:::i;34231:81::-;;;;;;;;;;-1:-1:-1;34231:81:0;;;;;:::i;:::-;;:::i;33230:363::-;;;;;;;;;;;;;:::i;34054:169::-;;;;;;;;;;;;;:::i;30213:35::-;;;;;;;;;;-1:-1:-1;30213:35:0;;;;-1:-1:-1;;;30213:35:0;;;;;;30688:56;;;;;;;;;;;;30724:20;30688:56;;20203:127;;;;;;;;;;-1:-1:-1;20203:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;20304:18:0;20277:7;20304:18;;;;;;;;;;;;20203:127;12337:103;;;;;;;;;;;;;:::i;30620:61::-;;;;;;;;;;;;30661:20;30620:61;;33774:106;;;;;;;;;;-1:-1:-1;33774:106:0;;;;;:::i;:::-;;:::i;32427:511::-;;;;;;;;;;;;;:::i;11689:87::-;;;;;;;;;;-1:-1:-1;11762:6:0;;-1:-1:-1;;;;;11762:6:0;11689:87;;30395:51;;;;;;;;;;;;30438:8;30395:51;;19131:104;;;;;;;;;;;;;:::i;23489:436::-;;;;;;;;;;-1:-1:-1;23489:436:0;;;;;:::i;:::-;;:::i;30893:31::-;;;;;;;;;;;;;;;;30298:28;;;;;;;;;;-1:-1:-1;30298:28:0;;;;-1:-1:-1;;;30298:28:0;;;;;;20536:193;;;;;;;;;;-1:-1:-1;20536:193:0;;;;;:::i;:::-;;:::i;30453:43::-;;;;;;;;;;;;30488:8;30453:43;;30753:32;;;;;;;;;;;;;;;;33888:158;;;;;;;;;;;;;:::i;30831:55::-;;;;;;;;;;-1:-1:-1;30831:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;20792:151;;;;;;;;;;-1:-1:-1;20792:151:0;;;;;:::i;:::-;;:::i;30255:36::-;;;;;;;;;;-1:-1:-1;30255:36:0;;;;-1:-1:-1;;;30255:36:0;;;;;;12595:201;;;;;;;;;;-1:-1:-1;12595:201:0;;;;;:::i;:::-;;:::i;31016:736::-;;;;;;:::i;:::-;;:::i;33601:165::-;11575:13;:11;:13::i;:::-;33664:15:::1;::::0;-1:-1:-1;;;33664:15:0;::::1;;;33663:16;33655:25;;;::::0;::::1;;33691:15;:22:::0;;-1:-1:-1;;;;33691:22:0::1;-1:-1:-1::0;;;33691:22:0::1;::::0;;33743:15:::1;33724:16;:34:::0;33601:165::o;18912:100::-;18966:13;18999:5;18992:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18912:100;:::o;21263:201::-;21346:4;10320:10;21402:32;10320:10;21418:7;21427:6;21402:8;:32::i;:::-;-1:-1:-1;21452:4:0;;21263:201;-1:-1:-1;;;21263:201:0:o;22044:295::-;22175:4;10320:10;22233:38;22249:4;10320:10;22264:6;22233:15;:38::i;:::-;22282:27;22292:4;22298:2;22302:6;22282:9;:27::i;:::-;-1:-1:-1;22327:4:0;;22044:295;-1:-1:-1;;;;22044:295:0:o;31760:659::-;31824:15;;-1:-1:-1;;;31824:15:0;;;;31816:54;;;;-1:-1:-1;;;31816:54:0;;4190:2:1;31816:54:0;;;4172:21:1;4229:2;4209:18;;;4202:30;4268:28;4248:18;;;4241:56;4314:18;;31816:54:0;;;;;;;;;31927:4;31907:16;;31889:15;:34;;;;:::i;:::-;:42;;31881:88;;;;-1:-1:-1;;;31881:88:0;;4807:2:1;31881:88:0;;;4789:21:1;4846:2;4826:18;;;4819:30;4885:34;4865:18;;;4858:62;-1:-1:-1;;;4936:18:1;;;4929:31;4977:19;;31881:88:0;4605:397:1;31881:88:0;30378:10;31988:9;:29;;31980:62;;;;-1:-1:-1;;;31980:62:0;;5209:2:1;31980:62:0;;;5191:21:1;5248:2;5228:18;;;5221:30;-1:-1:-1;;;5267:18:1;;;5260:50;5327:18;;31980:62:0;5007:344:1;31980:62:0;32083:10;32062:32;;;;:20;:32;;;;;;30438:8;;32062:44;;32097:9;;32062:44;:::i;:::-;:64;;32053:99;;;;-1:-1:-1;;;32053:99:0;;5691:2:1;32053:99:0;;;5673:21:1;5730:2;5710:18;;;5703:30;-1:-1:-1;;;5749:18:1;;;5742:51;5810:18;;32053:99:0;5489:345:1;32053:99:0;30538:8;32184:17;;32172:9;:29;;;;:::i;:::-;:41;;32163:84;;;;-1:-1:-1;;;32163:84:0;;6041:2:1;32163:84:0;;;6023:21:1;6080:2;6060:18;;;6053:30;6119:31;6099:18;;;6092:59;6168:18;;32163:84:0;5839:353:1;32163:84:0;32301:9;32281:17;;:29;;;;:::i;:::-;32261:17;:49;32323:15;:32;;;;;;;;;;;;-1:-1:-1;;;;;;32323:32:0;32344:10;32323:32;;;;;;-1:-1:-1;32366:32:0;;;:20;32323:32;32366;;;;:45;;32402:9;;-1:-1:-1;32366:45:0;;32402:9;;32366:45;:::i;:::-;;;;-1:-1:-1;;31760:659:0:o;22748:238::-;22836:4;10320:10;22892:64;10320:10;22908:7;22945:10;22917:25;10320:10;22908:7;22917:9;:25::i;:::-;:38;;;;:::i;:::-;22892:8;:64::i;30792:32::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30792:32:0;;-1:-1:-1;30792:32:0;:::o;32946:272::-;11575:13;:11;:13::i;:::-;33019:8:::1;::::0;-1:-1:-1;;;33019:8:0;::::1;;;33011:17;;;::::0;::::1;;33047:16;::::0;-1:-1:-1;;;33047:16:0;::::1;;;33039:25;;;::::0;::::1;;30592:21;33083:13;20120:12:::0;;;20032:108;33083:13:::1;:26;33075:35;;;::::0;::::1;;33121:20;33157:13;20120:12:::0;;;20032:108;33157:13:::1;33144:26;::::0;30592:21:::1;33144:26;:::i;:::-;33121:49;;33181:29;33187:8;33197:12;33181:5;:29::i;:::-;33000:218;32946:272:::0;:::o;34231:81::-;34280:24;34286:10;34298:5;34280;:24::i;:::-;34231:81;:::o;33230:363::-;30488:8;33277:17;;:28;33268:58;;;;-1:-1:-1;;;33268:58:0;;6399:2:1;33268:58:0;;;6381:21:1;6438:2;6418:18;;;6411:30;-1:-1:-1;;;6457:18:1;;;6450:46;6513:18;;33268:58:0;6197:340:1;33268:58:0;33366:10;33380:1;33345:32;;;:20;:32;;;;;;33337:45;;;;;;33401:10;33422:32;;;;:20;:32;;;;;;;33393:62;;;;;;;;33422:32;33393:62;33422:32;33401:10;33393:62;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33527:10:0;33506:32;;;;:20;:32;;;;;;33486:17;;:52;;33506:32;33486:52;:::i;:::-;33466:17;:72;33570:10;33584:1;33549:32;;;:20;:32;;;;;:36;33230:363::o;34054:169::-;11575:13;:11;:13::i;:::-;34130:58:::1;::::0;34112:12:::1;::::0;34138:10:::1;::::0;34162:21:::1;::::0;34112:12;34130:58;34112:12;34130:58;34162:21;34138:10;34130:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34111:77;;;34207:7;34199:16;;;::::0;::::1;12337:103:::0;11575:13;:11;:13::i;:::-;12402:30:::1;12429:1;12402:18;:30::i;:::-;12337:103::o:0;33774:106::-;11575:13;:11;:13::i;:::-;33848:10:::1;:24:::0;33774:106::o;32427:511::-;11575:13;:11;:13::i;:::-;32492:16:::1;::::0;-1:-1:-1;;;32492:16:0;::::1;;;32491:17;32483:48;;;::::0;-1:-1:-1;;;32483:48:0;;6954:2:1;32483:48:0::1;::::0;::::1;6936:21:1::0;6993:2;6973:18;;;6966:30;-1:-1:-1;;;7012:18:1;;;7005:48;7070:18;;32483:48:0::1;6752:342:1::0;32483:48:0::1;32542:16;:23:::0;;-1:-1:-1;;;;32542:23:0::1;-1:-1:-1::0;;;32542:23:0::1;::::0;;;32576:355:::1;32600:15;:22:::0;32596:26;::::1;32576:355;;;32687:1;32644:20;:40;32665:15;32681:1;32665:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;32665:18:0::1;32644:40:::0;;;::::1;::::0;;;;;;;;;:44:::1;32640:250;;;32709:28;30538:8;32757:20;:40;32778:15;32794:1;32778:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;32778:18:0::1;32757:40:::0;;;::::1;::::0;;;;;;;;;32740:57:::1;::::0;30661:20:::1;32740:57;:::i;:::-;:68;;;;:::i;:::-;32709:99;;32827:47;32833:15;32849:1;32833:18;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;32833:18:0::1;32853:20:::0;32827:5:::1;:47::i;:::-;32690:200;32640:250;32915:3;;32576:355;;19131:104:::0;19187:13;19220:7;19213:14;;;;;:::i;23489:436::-;23582:4;10320:10;23582:4;23665:25;10320:10;23682:7;23665:9;:25::i;:::-;23638:52;;23729:15;23709:16;:35;;23701:85;;;;-1:-1:-1;;;23701:85:0;;7828:2:1;23701:85:0;;;7810:21:1;7867:2;7847:18;;;7840:30;7906:34;7886:18;;;7879:62;-1:-1:-1;;;7957:18:1;;;7950:35;8002:19;;23701:85:0;7626:401:1;23701:85:0;23822:60;23831:5;23838:7;23866:15;23847:16;:34;23822:8;:60::i;20536:193::-;20615:4;10320:10;20671:28;10320:10;20688:2;20692:6;20671:9;:28::i;33888:158::-;11575:13;:11;:13::i;:::-;33951:8:::1;::::0;-1:-1:-1;;;33951:8:0;::::1;;;33950:9;33942:31;;;::::0;-1:-1:-1;;;33942:31:0;;8234:2:1;33942:31:0::1;::::0;::::1;8216:21:1::0;8273:1;8253:18;;;8246:29;-1:-1:-1;;;8291:18:1;;;8284:39;8340:18;;33942:31:0::1;8032:332:1::0;33942:31:0::1;33984:8;:15:::0;;-1:-1:-1;;;;33984:15:0::1;-1:-1:-1::0;;;33984:15:0::1;::::0;;34010:28:::1;34016:10;30724:20;34010:5;:28::i;20792:151::-:0;-1:-1:-1;;;;;20908:18:0;;;20881:7;20908:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;20792:151::o;12595:201::-;11575:13;:11;:13::i;:::-;-1:-1:-1;;;;;12684:22:0;::::1;12676:73;;;::::0;-1:-1:-1;;;12676:73:0;;8571:2:1;12676:73:0::1;::::0;::::1;8553:21:1::0;8610:2;8590:18;;;8583:30;8649:34;8629:18;;;8622:62;-1:-1:-1;;;8700:18:1;;;8693:36;8746:19;;12676:73:0::1;8369:402:1::0;12676:73:0::1;12760:28;12779:8;12760:18;:28::i;31016:736::-:0;31105:15;;-1:-1:-1;;;31105:15:0;;;;31097:54;;;;-1:-1:-1;;;31097:54:0;;4190:2:1;31097:54:0;;;4172:21:1;4229:2;4209:18;;;4202:30;4268:28;4248:18;;;4241:56;4314:18;;31097:54:0;3988:350:1;31097:54:0;31187:28;;-1:-1:-1;;31204:10:0;8925:2:1;8921:15;8917:53;31187:28:0;;;8905:66:1;31162:12:0;;8987::1;;31187:28:0;;;;;;;;;;;;31177:39;;;;;;31162:54;;31235:50;31254:12;;31235:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31268:10:0;;;-1:-1:-1;31280:4:0;;-1:-1:-1;31235:18:0;:50::i;:::-;31227:76;;;;-1:-1:-1;;;31227:76:0;;9212:2:1;31227:76:0;;;9194:21:1;9251:2;9231:18;;;9224:30;-1:-1:-1;;;9270:18:1;;;9263:43;9323:18;;31227:76:0;9010:337:1;31227:76:0;30378:10;31322:9;:29;;31314:62;;;;-1:-1:-1;;;31314:62:0;;5209:2:1;31314:62:0;;;5191:21:1;5248:2;5228:18;;;5221:30;-1:-1:-1;;;5267:18:1;;;5260:50;5327:18;;31314:62:0;5007:344:1;31314:62:0;31417:10;31396:32;;;;:20;:32;;;;;;30438:8;;31396:44;;31431:9;;31396:44;:::i;:::-;:64;;31387:98;;;;-1:-1:-1;;;31387:98:0;;5691:2:1;31387:98:0;;;5673:21:1;5730:2;5710:18;;;5703:30;-1:-1:-1;;;5749:18:1;;;5742:51;5810:18;;31387:98:0;5489:345:1;31387:98:0;30538:8;31517:17;;31505:9;:29;;;;:::i;:::-;:41;;31496:84;;;;-1:-1:-1;;;31496:84:0;;6041:2:1;31496:84:0;;;6023:21:1;6080:2;6060:18;;;6053:30;6119:31;6099:18;;;6092:59;6168:18;;31496:84:0;5839:353:1;31496:84:0;31634:9;31614:17;;:29;;;;:::i;:::-;31594:17;:49;31656:15;:32;;;;;;;;;;;;-1:-1:-1;;;;;;31656:32:0;31677:10;31656:32;;;;;;-1:-1:-1;31699:32:0;;;:20;31656:32;31699;;;;:45;;31735:9;;-1:-1:-1;31699:45:0;;31735:9;;31699:45;:::i;:::-;;;;-1:-1:-1;;;;;31016:736:0:o;11854:132::-;11762:6;;-1:-1:-1;;;;;11762:6:0;10320:10;11918:23;11910:68;;;;-1:-1:-1;;;11910:68:0;;9554:2:1;11910:68:0;;;9536:21:1;;;9573:18;;;9566:30;9632:34;9612:18;;;9605:62;9684:18;;11910:68:0;9352:356:1;27516:380:0;-1:-1:-1;;;;;27652:19:0;;27644:68;;;;-1:-1:-1;;;27644:68:0;;9915:2:1;27644:68:0;;;9897:21:1;9954:2;9934:18;;;9927:30;9993:34;9973:18;;;9966:62;-1:-1:-1;;;10044:18:1;;;10037:34;10088:19;;27644:68:0;9713:400:1;27644:68:0;-1:-1:-1;;;;;27731:21:0;;27723:68;;;;-1:-1:-1;;;27723:68:0;;10320:2:1;27723:68:0;;;10302:21:1;10359:2;10339:18;;;10332:30;10398:34;10378:18;;;10371:62;-1:-1:-1;;;10449:18:1;;;10442:32;10491:19;;27723:68:0;10118:398:1;27723:68:0;-1:-1:-1;;;;;27804:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;27856:32;;1391:25:1;;;27856:32:0;;1364:18:1;27856:32:0;;;;;;;;27516:380;;;:::o;28187:453::-;28322:24;28349:25;28359:5;28366:7;28349:9;:25::i;:::-;28322:52;;-1:-1:-1;;28389:16:0;:37;28385:248;;28471:6;28451:16;:26;;28443:68;;;;-1:-1:-1;;;28443:68:0;;10723:2:1;28443:68:0;;;10705:21:1;10762:2;10742:18;;;10735:30;10801:31;10781:18;;;10774:59;10850:18;;28443:68:0;10521:353:1;28443:68:0;28555:51;28564:5;28571:7;28599:6;28580:16;:25;28555:8;:51::i;:::-;28311:329;28187:453;;;:::o;24395:840::-;-1:-1:-1;;;;;24526:18:0;;24518:68;;;;-1:-1:-1;;;24518:68:0;;11081:2:1;24518:68:0;;;11063:21:1;11120:2;11100:18;;;11093:30;11159:34;11139:18;;;11132:62;-1:-1:-1;;;11210:18:1;;;11203:35;11255:19;;24518:68:0;10879:401:1;24518:68:0;-1:-1:-1;;;;;24605:16:0;;24597:64;;;;-1:-1:-1;;;24597:64:0;;11487:2:1;24597:64:0;;;11469:21:1;11526:2;11506:18;;;11499:30;11565:34;11545:18;;;11538:62;-1:-1:-1;;;11616:18:1;;;11609:33;11659:19;;24597:64:0;11285:399:1;24597:64:0;-1:-1:-1;;;;;24747:15:0;;24725:19;24747:15;;;;;;;;;;;24781:21;;;;24773:72;;;;-1:-1:-1;;;24773:72:0;;11891:2:1;24773:72:0;;;11873:21:1;11930:2;11910:18;;;11903:30;11969:34;11949:18;;;11942:62;-1:-1:-1;;;12020:18:1;;;12013:36;12066:19;;24773:72:0;11689:402:1;24773:72:0;-1:-1:-1;;;;;24881:15:0;;;:9;:15;;;;;;;;;;;24899:20;;;24881:38;;25099:13;;;;;;;;;;:23;;;;;;25151:26;;1391:25:1;;;25099:13:0;;25151:26;;1364:18:1;25151:26:0;;;;;;;25190:37;26403:675;25522:548;-1:-1:-1;;;;;25606:21:0;;25598:65;;;;-1:-1:-1;;;25598:65:0;;12298:2:1;25598:65:0;;;12280:21:1;12337:2;12317:18;;;12310:30;12376:33;12356:18;;;12349:61;12427:18;;25598:65:0;12096:355:1;25598:65:0;25754:6;25738:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;25909:18:0;;:9;:18;;;;;;;;;;;:28;;;;;;25964:37;1391:25:1;;;25964:37:0;;1364:18:1;25964:37:0;;;;;;;33000:218:::1;32946:272:::0;:::o;26403:675::-;-1:-1:-1;;;;;26487:21:0;;26479:67;;;;-1:-1:-1;;;26479:67:0;;12658:2:1;26479:67:0;;;12640:21:1;12697:2;12677:18;;;12670:30;12736:34;12716:18;;;12709:62;-1:-1:-1;;;12787:18:1;;;12780:31;12828:19;;26479:67:0;12456:397:1;26479:67:0;-1:-1:-1;;;;;26646:18:0;;26621:22;26646:18;;;;;;;;;;;26683:24;;;;26675:71;;;;-1:-1:-1;;;26675:71:0;;13060:2:1;26675:71:0;;;13042:21:1;13099:2;13079:18;;;13072:30;13138:34;13118:18;;;13111:62;-1:-1:-1;;;13189:18:1;;;13182:32;13231:19;;26675:71:0;12858:398:1;26675:71:0;-1:-1:-1;;;;;26782:18:0;;:9;:18;;;;;;;;;;;26803:23;;;26782:44;;26921:12;:22;;;;;;;26972:37;1391:25:1;;;26782:9:0;;:18;26972:37;;1364:18:1;26972:37:0;1245:177:1;12956:191:0;13049:6;;;-1:-1:-1;;;;;13066:17:0;;;-1:-1:-1;;;;;;13066:17:0;;;;;;;13099:40;;13049:6;;;13066:17;13049:6;;13099:40;;13030:16;;13099:40;13019:128;12956:191;:::o;1222:190::-;1347:4;1400;1371:25;1384:5;1391:4;1371:12;:25::i;:::-;:33;;1222:190;-1:-1:-1;;;;1222:190:0:o;2089:296::-;2172:7;2215:4;2172:7;2230:118;2254:5;:12;2250:1;:16;2230:118;;;2303:33;2313:12;2327:5;2333:1;2327:8;;;;;;;;:::i;:::-;;;;;;;2303:9;:33::i;:::-;2288:48;-1:-1:-1;2268:3:0;;;;:::i;:::-;;;;2230:118;;;-1:-1:-1;2365:12:0;2089:296;-1:-1:-1;;;2089:296:0:o;9129:149::-;9192:7;9223:1;9219;:5;:51;;9354:13;9448:15;;;9484:4;9477:15;;;9531:4;9515:21;;9219:51;;;9354:13;9448:15;;;9484:4;9477:15;;;9531:4;9515:21;;9227:20;9212:58;9129:149;-1:-1:-1;;;9129:149:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:173::-;684:20;;-1:-1:-1;;;;;733:31:1;;723:42;;713:70;;779:1;776;769:12;713:70;616:173;;;:::o;794:254::-;862:6;870;923:2;911:9;902:7;898:23;894:32;891:52;;;939:1;936;929:12;891:52;962:29;981:9;962:29;:::i;:::-;952:39;1038:2;1023:18;;;;1010:32;;-1:-1:-1;;;794:254:1:o;1427:328::-;1504:6;1512;1520;1573:2;1561:9;1552:7;1548:23;1544:32;1541:52;;;1589:1;1586;1579:12;1541:52;1612:29;1631:9;1612:29;:::i;:::-;1602:39;;1660:38;1694:2;1683:9;1679:18;1660:38;:::i;:::-;1650:48;;1745:2;1734:9;1730:18;1717:32;1707:42;;1427:328;;;;;:::o;1949:180::-;2008:6;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;-1:-1:-1;2100:23:1;;1949:180;-1:-1:-1;1949:180:1:o;2342:186::-;2401:6;2454:2;2442:9;2433:7;2429:23;2425:32;2422:52;;;2470:1;2467;2460:12;2422:52;2493:29;2512:9;2493:29;:::i;2718:260::-;2786:6;2794;2847:2;2835:9;2826:7;2822:23;2818:32;2815:52;;;2863:1;2860;2853:12;2815:52;2886:29;2905:9;2886:29;:::i;:::-;2876:39;;2934:38;2968:2;2957:9;2953:18;2934:38;:::i;:::-;2924:48;;2718:260;;;;;:::o;2983:615::-;3069:6;3077;3130:2;3118:9;3109:7;3105:23;3101:32;3098:52;;;3146:1;3143;3136:12;3098:52;3186:9;3173:23;3215:18;3256:2;3248:6;3245:14;3242:34;;;3272:1;3269;3262:12;3242:34;3310:6;3299:9;3295:22;3285:32;;3355:7;3348:4;3344:2;3340:13;3336:27;3326:55;;3377:1;3374;3367:12;3326:55;3417:2;3404:16;3443:2;3435:6;3432:14;3429:34;;;3459:1;3456;3449:12;3429:34;3512:7;3507:2;3497:6;3494:1;3490:14;3486:2;3482:23;3478:32;3475:45;3472:65;;;3533:1;3530;3523:12;3472:65;3564:2;3556:11;;;;;3586:6;;-1:-1:-1;2983:615:1;;-1:-1:-1;;;;2983:615:1:o;3603:380::-;3682:1;3678:12;;;;3725;;;3746:61;;3800:4;3792:6;3788:17;3778:27;;3746:61;3853:2;3845:6;3842:14;3822:18;3819:38;3816:161;;;3899:10;3894:3;3890:20;3887:1;3880:31;3934:4;3931:1;3924:15;3962:4;3959:1;3952:15;3816:161;;3603:380;;;:::o;4343:127::-;4404:10;4399:3;4395:20;4392:1;4385:31;4435:4;4432:1;4425:15;4459:4;4456:1;4449:15;4475:125;4515:4;4543:1;4540;4537:8;4534:34;;;4548:18;;:::i;:::-;-1:-1:-1;4585:9:1;;4475:125::o;5356:128::-;5396:3;5427:1;5423:6;5420:1;5417:13;5414:39;;;5433:18;;:::i;:::-;-1:-1:-1;5469:9:1;;5356:128::o;7099:127::-;7160:10;7155:3;7151:20;7148:1;7141:31;7191:4;7188:1;7181:15;7215:4;7212:1;7205:15;7231:168;7271:7;7337:1;7333;7329:6;7325:14;7322:1;7319:21;7314:1;7307:9;7300:17;7296:45;7293:71;;;7344:18;;:::i;:::-;-1:-1:-1;7384:9:1;;7231:168::o;7404:217::-;7444:1;7470;7460:132;;7514:10;7509:3;7505:20;7502:1;7495:31;7549:4;7546:1;7539:15;7577:4;7574:1;7567:15;7460:132;-1:-1:-1;7606:9:1;;7404:217::o;13261:135::-;13300:3;-1:-1:-1;;13321:17:1;;13318:43;;;13341:18;;:::i;:::-;-1:-1:-1;13388:1:1;13377:13;;13261:135::o
Swarm Source
ipfs://2ae03fa878fcb260b96a0936f3b61718d7a15cd42d78267451da1ff1c061dbe4
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 ]
[ 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.