ETH Price: $3,560.59 (+0.70%)
 

Overview

Max Total Supply

347,618,000 BNS

Holders

5,463

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$434,195.74

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
34,849.03060941408883453 BNS

Value
$43.53 ( ~0.0122255166227998 ETH) [0.0100%]
0x703f384b2236dba263383aea44859d70ec008a99
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Base's first name service with address resolve capability.

Contract Source Code Verified (Exact Match)

Contract Name:
BNS

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2023-08-29
*/

// Sources flattened with hardhat v2.7.0 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]


// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]


// OpenZeppelin Contracts v4.4.0 (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/[email protected]


// OpenZeppelin Contracts v4.4.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.zeppelin.solutions/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:
     *
     * - `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);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * 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:
     *
     * - `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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `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;
        _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;
        }
        _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 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 {}
}



pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}



pragma solidity ^0.8.0;
contract BNS is Ownable, ERC20 {
    uint256 public _totalSupply=500000000*10**decimals();
    mapping(uint8 => bytes32) public merkles;
    mapping(uint8 => uint256) public airdropAmounts;
    bool public Active=false;
    mapping(address => bool) public claimed;

    constructor() ERC20("BASE TOKEN", "BNS") {
           _mint(owner(), 250000000*10**decimals()); 
    }


    function setMerkleRoot(bytes32[] calldata _merkle,uint8[] calldata _merkleid, uint256[] calldata _amounts) public onlyOwner {
      for (uint256 i = 0; i < _merkle.length; i++) {
        merkles[_merkleid[i]]=_merkle[i];
        airdropAmounts[_merkleid[i]]=_amounts[i]*10**decimals();
        }
    }


     function setActive(bool _setActive) external onlyOwner {
        Active = _setActive;
    }

    
    function Claim(uint8 merkleId, bytes32[] calldata _merkleProof)
        public
        payable
    {   
        require(Active, "Not ready yet");
        require(airdropAmounts[merkleId]+totalSupply()<_totalSupply,"SOLD OUT!");  
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkles[merkleId], leaf),"Invalid proof!");
        require(claimed[msg.sender]==false,"Claimed!");

        if (msg.value>0) {
        (bool success, ) = payable(owner()).call{value:msg.value}('');    
         }
        claimed[msg.sender]=true;
        _mint(msg.sender, airdropAmounts[merkleId]);
    }

    function burn(uint256 value) external {
        _burn(msg.sender, value);
    }
}

Contract Security Audit

Contract ABI

[{"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":"Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"merkleId","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"Claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"airdropAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"merkles","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkle","type":"bytes32[]"},{"internalType":"uint8[]","name":"_merkleid","type":"uint8[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"setMerkleRoot","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"}]

6080604052620000126012600a62000359565b6200002290631dcd650062000371565b6006556009805460ff191690553480156200003c57600080fd5b506040518060400160405280600a8152602001692120a9a2902a27a5a2a760b11b81525060405180604001604052806003815260200162424e5360e81b8152506200009662000090620000f460201b60201c565b620000f8565b6004620000a483826200042f565b506005620000b382826200042f565b505050620000ee620000ca6200014860201b60201c565b620000d86012600a62000359565b620000e890630ee6b28062000371565b62000157565b62000511565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031690565b6001600160a01b038216620001b25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620001c69190620004fb565b90915550506001600160a01b03821660009081526001602052604081208054839290620001f5908490620004fb565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200029b5781600019048211156200027f576200027f62000244565b808516156200028d57918102915b93841c93908002906200025f565b509250929050565b600082620002b45750600162000353565b81620002c35750600062000353565b8160018114620002dc5760028114620002e75762000307565b600191505062000353565b60ff841115620002fb57620002fb62000244565b50506001821b62000353565b5060208310610133831016604e8410600b84101617156200032c575081810a62000353565b6200033883836200025a565b80600019048211156200034f576200034f62000244565b0290505b92915050565b60006200036a60ff841683620002a3565b9392505050565b808202811582820484141762000353576200035362000244565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003b657607f821691505b602082108103620003d757634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200023f57600081815260208120601f850160051c81016020861015620004065750805b601f850160051c820191505b81811015620004275782815560010162000412565b505050505050565b81516001600160401b038111156200044b576200044b6200038b565b62000463816200045c8454620003a1565b84620003dd565b602080601f8311600181146200049b5760008415620004825750858301515b600019600386901b1c1916600185901b17855562000427565b600085815260208120601f198616915b82811015620004cc57888601518255948401946001909101908401620004ab565b5085821015620004eb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000353576200035362000244565b61160980620005216000396000f3fe6080604052600436106101405760003560e01c8063715018a6116100b6578063be3143c91161006f578063be3143c914610395578063c884ef83146103b5578063c9b0a2a7146103e5578063dd62ed3e146103ff578063f1288d2314610445578063f2fde38b1461045857600080fd5b8063715018a6146102e35780638da5cb5b146102f857806395d89b4114610320578063a457c2d714610335578063a9059cbb14610355578063acec338a1461037557600080fd5b80633444a957116101085780633444a957146101fb57806339509351146102285780633eaaf86b1461024857806342966c681461025e5780636b71e7b01461028057806370a08231146102ad57600080fd5b806306fdde0314610145578063095ea7b31461017057806318160ddd146101a057806323b872dd146101bf578063313ce567146101df575b600080fd5b34801561015157600080fd5b5061015a610478565b6040516101679190611131565b60405180910390f35b34801561017c57600080fd5b5061019061018b36600461119b565b61050a565b6040519015158152602001610167565b3480156101ac57600080fd5b506003545b604051908152602001610167565b3480156101cb57600080fd5b506101906101da3660046111c5565b610521565b3480156101eb57600080fd5b5060405160128152602001610167565b34801561020757600080fd5b506101b1610216366004611212565b60076020526000908152604090205481565b34801561023457600080fd5b5061019061024336600461119b565b6105d0565b34801561025457600080fd5b506101b160065481565b34801561026a57600080fd5b5061027e61027936600461122d565b61060c565b005b34801561028c57600080fd5b506101b161029b366004611212565b60086020526000908152604090205481565b3480156102b957600080fd5b506101b16102c8366004611246565b6001600160a01b031660009081526001602052604090205490565b3480156102ef57600080fd5b5061027e610619565b34801561030457600080fd5b506000546040516001600160a01b039091168152602001610167565b34801561032c57600080fd5b5061015a61064f565b34801561034157600080fd5b5061019061035036600461119b565b61065e565b34801561036157600080fd5b5061019061037036600461119b565b6106f7565b34801561038157600080fd5b5061027e610390366004611261565b610704565b3480156103a157600080fd5b5061027e6103b03660046112cf565b610741565b3480156103c157600080fd5b506101906103d0366004611246565b600a6020526000908152604090205460ff1681565b3480156103f157600080fd5b506009546101909060ff1681565b34801561040b57600080fd5b506101b161041a366004611369565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61027e61045336600461139c565b610857565b34801561046457600080fd5b5061027e610473366004611246565b610a9c565b606060048054610487906113ef565b80601f01602080910402602001604051908101604052809291908181526020018280546104b3906113ef565b80156105005780601f106104d557610100808354040283529160200191610500565b820191906000526020600020905b8154815290600101906020018083116104e357829003601f168201915b5050505050905090565b6000610517338484610b34565b5060015b92915050565b600061052e848484610c59565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156105b85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105c58533858403610b34565b506001949350505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161051791859061060790869061143f565b610b34565b6106163382610e27565b50565b6000546001600160a01b031633146106435760405162461bcd60e51b81526004016105af90611452565b61064d6000610f6d565b565b606060058054610487906113ef565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156106e05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105af565b6106ed3385858403610b34565b5060019392505050565b6000610517338484610c59565b6000546001600160a01b0316331461072e5760405162461bcd60e51b81526004016105af90611452565b6009805460ff1916911515919091179055565b6000546001600160a01b0316331461076b5760405162461bcd60e51b81526004016105af90611452565b60005b8581101561084e5786868281811061078857610788611487565b90506020020135600760008787858181106107a5576107a5611487565b90506020020160208101906107ba9190611212565b60ff1681526020810191909152604001600020556107da6012600a611581565b8383838181106107ec576107ec611487565b905060200201356107fd9190611590565b6008600087878581811061081357610813611487565b90506020020160208101906108289190611212565b60ff16815260208101919091526040016000205580610846816115a7565b91505061076e565b50505050505050565b60095460ff166108995760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b60448201526064016105af565b60065460035460ff85166000908152600860205260409020546108bc919061143f565b106108f55760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b60448201526064016105af565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061097c838380806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060ff8a168152600760205260409020549250859150610fbd9050565b6109b95760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b60448201526064016105af565b336000908152600a602052604090205460ff1615610a045760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b60448201526064016105af565b3415610a6157600080546040516001600160a01b039091169034908381818185875af1925050503d8060008114610a57576040519150601f19603f3d011682016040523d82523d6000602084013e610a5c565b606091505b505050505b336000818152600a60209081526040808320805460ff1916600117905560ff881683526008909152902054610a969190610fd3565b50505050565b6000546001600160a01b03163314610ac65760405162461bcd60e51b81526004016105af90611452565b6001600160a01b038116610b2b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105af565b61061681610f6d565b6001600160a01b038316610b965760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105af565b6001600160a01b038216610bf75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105af565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610cbd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105af565b6001600160a01b038216610d1f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105af565b6001600160a01b03831660009081526001602052604090205481811015610d975760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105af565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610dce90849061143f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e1a91815260200190565b60405180910390a3610a96565b6001600160a01b038216610e875760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105af565b6001600160a01b03821660009081526001602052604090205481811015610efb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105af565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610f2a9084906115c0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610c4c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610fca85846110b2565b14949350505050565b6001600160a01b0382166110295760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105af565b806003600082825461103b919061143f565b90915550506001600160a01b0382166000908152600160205260408120805483929061106890849061143f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600081815b84518110156110f7576110e3828683815181106110d6576110d6611487565b60200260200101516110ff565b9150806110ef816115a7565b9150506110b7565b509392505050565b600081831061111b57600082815260208490526040902061112a565b60008381526020839052604090205b9392505050565b600060208083528351808285015260005b8181101561115e57858101830151858201604001528201611142565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461119657600080fd5b919050565b600080604083850312156111ae57600080fd5b6111b78361117f565b946020939093013593505050565b6000806000606084860312156111da57600080fd5b6111e38461117f565b92506111f16020850161117f565b9150604084013590509250925092565b803560ff8116811461119657600080fd5b60006020828403121561122457600080fd5b61112a82611201565b60006020828403121561123f57600080fd5b5035919050565b60006020828403121561125857600080fd5b61112a8261117f565b60006020828403121561127357600080fd5b8135801515811461112a57600080fd5b60008083601f84011261129557600080fd5b50813567ffffffffffffffff8111156112ad57600080fd5b6020830191508360208260051b85010111156112c857600080fd5b9250929050565b600080600080600080606087890312156112e857600080fd5b863567ffffffffffffffff8082111561130057600080fd5b61130c8a838b01611283565b9098509650602089013591508082111561132557600080fd5b6113318a838b01611283565b9096509450604089013591508082111561134a57600080fd5b5061135789828a01611283565b979a9699509497509295939492505050565b6000806040838503121561137c57600080fd5b6113858361117f565b91506113936020840161117f565b90509250929050565b6000806000604084860312156113b157600080fd5b6113ba84611201565b9250602084013567ffffffffffffffff8111156113d657600080fd5b6113e286828701611283565b9497909650939450505050565b600181811c9082168061140357607f821691505b60208210810361142357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561051b5761051b611429565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156114d85781600019048211156114be576114be611429565b808516156114cb57918102915b93841c93908002906114a2565b509250929050565b6000826114ef5750600161051b565b816114fc5750600061051b565b8160018114611512576002811461151c57611538565b600191505061051b565b60ff84111561152d5761152d611429565b50506001821b61051b565b5060208310610133831016604e8410600b841016171561155b575081810a61051b565b611565838361149d565b806000190482111561157957611579611429565b029392505050565b600061112a60ff8416836114e0565b808202811582820484141761051b5761051b611429565b6000600182016115b9576115b9611429565b5060010190565b8181038181111561051b5761051b61142956fea2646970667358221220e6b3ec3f9a31539ceae50868aa1adb3bfdd9e3479895bf947c0d1f6508210d6964736f6c63430008110033

Deployed Bytecode

0x6080604052600436106101405760003560e01c8063715018a6116100b6578063be3143c91161006f578063be3143c914610395578063c884ef83146103b5578063c9b0a2a7146103e5578063dd62ed3e146103ff578063f1288d2314610445578063f2fde38b1461045857600080fd5b8063715018a6146102e35780638da5cb5b146102f857806395d89b4114610320578063a457c2d714610335578063a9059cbb14610355578063acec338a1461037557600080fd5b80633444a957116101085780633444a957146101fb57806339509351146102285780633eaaf86b1461024857806342966c681461025e5780636b71e7b01461028057806370a08231146102ad57600080fd5b806306fdde0314610145578063095ea7b31461017057806318160ddd146101a057806323b872dd146101bf578063313ce567146101df575b600080fd5b34801561015157600080fd5b5061015a610478565b6040516101679190611131565b60405180910390f35b34801561017c57600080fd5b5061019061018b36600461119b565b61050a565b6040519015158152602001610167565b3480156101ac57600080fd5b506003545b604051908152602001610167565b3480156101cb57600080fd5b506101906101da3660046111c5565b610521565b3480156101eb57600080fd5b5060405160128152602001610167565b34801561020757600080fd5b506101b1610216366004611212565b60076020526000908152604090205481565b34801561023457600080fd5b5061019061024336600461119b565b6105d0565b34801561025457600080fd5b506101b160065481565b34801561026a57600080fd5b5061027e61027936600461122d565b61060c565b005b34801561028c57600080fd5b506101b161029b366004611212565b60086020526000908152604090205481565b3480156102b957600080fd5b506101b16102c8366004611246565b6001600160a01b031660009081526001602052604090205490565b3480156102ef57600080fd5b5061027e610619565b34801561030457600080fd5b506000546040516001600160a01b039091168152602001610167565b34801561032c57600080fd5b5061015a61064f565b34801561034157600080fd5b5061019061035036600461119b565b61065e565b34801561036157600080fd5b5061019061037036600461119b565b6106f7565b34801561038157600080fd5b5061027e610390366004611261565b610704565b3480156103a157600080fd5b5061027e6103b03660046112cf565b610741565b3480156103c157600080fd5b506101906103d0366004611246565b600a6020526000908152604090205460ff1681565b3480156103f157600080fd5b506009546101909060ff1681565b34801561040b57600080fd5b506101b161041a366004611369565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61027e61045336600461139c565b610857565b34801561046457600080fd5b5061027e610473366004611246565b610a9c565b606060048054610487906113ef565b80601f01602080910402602001604051908101604052809291908181526020018280546104b3906113ef565b80156105005780601f106104d557610100808354040283529160200191610500565b820191906000526020600020905b8154815290600101906020018083116104e357829003601f168201915b5050505050905090565b6000610517338484610b34565b5060015b92915050565b600061052e848484610c59565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156105b85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105c58533858403610b34565b506001949350505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161051791859061060790869061143f565b610b34565b6106163382610e27565b50565b6000546001600160a01b031633146106435760405162461bcd60e51b81526004016105af90611452565b61064d6000610f6d565b565b606060058054610487906113ef565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156106e05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105af565b6106ed3385858403610b34565b5060019392505050565b6000610517338484610c59565b6000546001600160a01b0316331461072e5760405162461bcd60e51b81526004016105af90611452565b6009805460ff1916911515919091179055565b6000546001600160a01b0316331461076b5760405162461bcd60e51b81526004016105af90611452565b60005b8581101561084e5786868281811061078857610788611487565b90506020020135600760008787858181106107a5576107a5611487565b90506020020160208101906107ba9190611212565b60ff1681526020810191909152604001600020556107da6012600a611581565b8383838181106107ec576107ec611487565b905060200201356107fd9190611590565b6008600087878581811061081357610813611487565b90506020020160208101906108289190611212565b60ff16815260208101919091526040016000205580610846816115a7565b91505061076e565b50505050505050565b60095460ff166108995760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b60448201526064016105af565b60065460035460ff85166000908152600860205260409020546108bc919061143f565b106108f55760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b60448201526064016105af565b6040516bffffffffffffffffffffffff193360601b16602082015260009060340160405160208183030381529060405280519060200120905061097c838380806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060ff8a168152600760205260409020549250859150610fbd9050565b6109b95760405162461bcd60e51b815260206004820152600e60248201526d496e76616c69642070726f6f662160901b60448201526064016105af565b336000908152600a602052604090205460ff1615610a045760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b60448201526064016105af565b3415610a6157600080546040516001600160a01b039091169034908381818185875af1925050503d8060008114610a57576040519150601f19603f3d011682016040523d82523d6000602084013e610a5c565b606091505b505050505b336000818152600a60209081526040808320805460ff1916600117905560ff881683526008909152902054610a969190610fd3565b50505050565b6000546001600160a01b03163314610ac65760405162461bcd60e51b81526004016105af90611452565b6001600160a01b038116610b2b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105af565b61061681610f6d565b6001600160a01b038316610b965760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105af565b6001600160a01b038216610bf75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105af565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610cbd5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105af565b6001600160a01b038216610d1f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105af565b6001600160a01b03831660009081526001602052604090205481811015610d975760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105af565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610dce90849061143f565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e1a91815260200190565b60405180910390a3610a96565b6001600160a01b038216610e875760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105af565b6001600160a01b03821660009081526001602052604090205481811015610efb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105af565b6001600160a01b0383166000908152600160205260408120838303905560038054849290610f2a9084906115c0565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610c4c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082610fca85846110b2565b14949350505050565b6001600160a01b0382166110295760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105af565b806003600082825461103b919061143f565b90915550506001600160a01b0382166000908152600160205260408120805483929061106890849061143f565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600081815b84518110156110f7576110e3828683815181106110d6576110d6611487565b60200260200101516110ff565b9150806110ef816115a7565b9150506110b7565b509392505050565b600081831061111b57600082815260208490526040902061112a565b60008381526020839052604090205b9392505050565b600060208083528351808285015260005b8181101561115e57858101830151858201604001528201611142565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461119657600080fd5b919050565b600080604083850312156111ae57600080fd5b6111b78361117f565b946020939093013593505050565b6000806000606084860312156111da57600080fd5b6111e38461117f565b92506111f16020850161117f565b9150604084013590509250925092565b803560ff8116811461119657600080fd5b60006020828403121561122457600080fd5b61112a82611201565b60006020828403121561123f57600080fd5b5035919050565b60006020828403121561125857600080fd5b61112a8261117f565b60006020828403121561127357600080fd5b8135801515811461112a57600080fd5b60008083601f84011261129557600080fd5b50813567ffffffffffffffff8111156112ad57600080fd5b6020830191508360208260051b85010111156112c857600080fd5b9250929050565b600080600080600080606087890312156112e857600080fd5b863567ffffffffffffffff8082111561130057600080fd5b61130c8a838b01611283565b9098509650602089013591508082111561132557600080fd5b6113318a838b01611283565b9096509450604089013591508082111561134a57600080fd5b5061135789828a01611283565b979a9699509497509295939492505050565b6000806040838503121561137c57600080fd5b6113858361117f565b91506113936020840161117f565b90509250929050565b6000806000604084860312156113b157600080fd5b6113ba84611201565b9250602084013567ffffffffffffffff8111156113d657600080fd5b6113e286828701611283565b9497909650939450505050565b600181811c9082168061140357607f821691505b60208210810361142357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561051b5761051b611429565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600181815b808511156114d85781600019048211156114be576114be611429565b808516156114cb57918102915b93841c93908002906114a2565b509250929050565b6000826114ef5750600161051b565b816114fc5750600061051b565b8160018114611512576002811461151c57611538565b600191505061051b565b60ff84111561152d5761152d611429565b50506001821b61051b565b5060208310610133831016604e8410600b841016171561155b575081810a61051b565b611565838361149d565b806000190482111561157957611579611429565b029392505050565b600061112a60ff8416836114e0565b808202811582820484141761051b5761051b611429565b6000600182016115b9576115b9611429565b5060010190565b8181038181111561051b5761051b61142956fea2646970667358221220e6b3ec3f9a31539ceae50868aa1adb3bfdd9e3479895bf947c0d1f6508210d6964736f6c63430008110033

Deployed Bytecode Sourcemap

27870:1571:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11479:169;;;;;;;;;;-1:-1:-1;11479:169:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;11479:169:0;1004:187:1;10432:108:0;;;;;;;;;;-1:-1:-1;10520:12:0;;10432:108;;;1342:25:1;;;1330:2;1315:18;10432:108:0;1196:177:1;12130:492:0;;;;;;;;;;-1:-1:-1;12130:492:0;;;;;:::i;:::-;;:::i;10274:93::-;;;;;;;;;;-1:-1:-1;10274:93:0;;10357:2;1853:36:1;;1841:2;1826:18;10274:93:0;1711:184:1;27967:40:0;;;;;;;;;;-1:-1:-1;27967:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;13031:215;;;;;;;;;;-1:-1:-1;13031:215:0;;;;;:::i;:::-;;:::i;27908:52::-;;;;;;;;;;;;;;;;29357:81;;;;;;;;;;-1:-1:-1;29357:81:0;;;;;:::i;:::-;;:::i;:::-;;28014:47;;;;;;;;;;-1:-1:-1;28014:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;10603:127;;;;;;;;;;-1:-1:-1;10603:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10704:18:0;10677:7;10704:18;;;:9;:18;;;;;;;10603:127;2713:103;;;;;;;;;;;;;:::i;2062:87::-;;;;;;;;;;-1:-1:-1;2108:7:0;2135:6;2062:87;;-1:-1:-1;;;;;2135:6:0;;;2952:51:1;;2940:2;2925:18;2062:87:0;2806:203:1;9531:104:0;;;;;;;;;;;;;:::i;13749:413::-;;;;;;;;;;-1:-1:-1;13749:413:0;;;;;:::i;:::-;;:::i;10943:175::-;;;;;;;;;;-1:-1:-1;10943:175:0;;;;;:::i;:::-;;:::i;28578:93::-;;;;;;;;;;-1:-1:-1;28578:93:0;;;;;:::i;:::-;;:::i;28261:306::-;;;;;;;;;;-1:-1:-1;28261:306:0;;;;;:::i;:::-;;:::i;28099:39::-;;;;;;;;;;-1:-1:-1;28099:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28068:24;;;;;;;;;;-1:-1:-1;28068:24:0;;;;;;;;11181:151;;;;;;;;;;-1:-1:-1;11181:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11297:18:0;;;11270:7;11297:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11181:151;28685:664;;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;;;;;-1:-1:-1;2971:201:0;;;;;:::i;:::-;;:::i;9312:100::-;9366:13;9399:5;9392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;:::o;11479:169::-;11562:4;11579:39;860:10;11602:7;11611:6;11579:8;:39::i;:::-;-1:-1:-1;11636:4:0;11479:169;;;;;:::o;12130:492::-;12270:4;12287:36;12297:6;12305:9;12316:6;12287:9;:36::i;:::-;-1:-1:-1;;;;;12363:19:0;;12336:24;12363:19;;;:11;:19;;;;;;;;860:10;12363:33;;;;;;;;12415:26;;;;12407:79;;;;-1:-1:-1;;;12407:79:0;;6119:2:1;12407:79:0;;;6101:21:1;6158:2;6138:18;;;6131:30;6197:34;6177:18;;;6170:62;-1:-1:-1;;;6248:18:1;;;6241:38;6296:19;;12407:79:0;;;;;;;;;12522:57;12531:6;860:10;12572:6;12553:16;:25;12522:8;:57::i;:::-;-1:-1:-1;12610:4:0;;12130:492;-1:-1:-1;;;;12130:492:0:o;13031:215::-;860:10;13119:4;13168:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13168:34:0;;;;;;;;;;13119:4;;13136:80;;13159:7;;13168:47;;13205:10;;13168:47;:::i;:::-;13136:8;:80::i;29357:81::-;29406:24;29412:10;29424:5;29406;:24::i;:::-;29357:81;:::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;9531:104::-;9587:13;9620:7;9613:14;;;;;:::i;13749:413::-;860:10;13842:4;13886:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13886:34:0;;;;;;;;;;13939:35;;;;13931:85;;;;-1:-1:-1;;;13931:85:0;;7151:2:1;13931:85:0;;;7133:21:1;7190:2;7170:18;;;7163:30;7229:34;7209:18;;;7202:62;-1:-1:-1;;;7280:18:1;;;7273:35;7325:19;;13931:85:0;6949:401:1;13931:85:0;14052:67;860:10;14075:7;14103:15;14084:16;:34;14052:8;:67::i;:::-;-1:-1:-1;14150:4:0;;13749:413;-1:-1:-1;;;13749:413:0:o;10943:175::-;11029:4;11046:42;860:10;11070:9;11081:6;11046:9;:42::i;28578:93::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;28644:6:::1;:19:::0;;-1:-1:-1;;28644:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28578:93::o;28261:306::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;28399:9:::1;28394:166;28414:18:::0;;::::1;28394:166;;;28472:7;;28480:1;28472:10;;;;;;;:::i;:::-;;;;;;;28450:7;:21;28458:9;;28468:1;28458:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28450:21;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28450:21:0;:32;28534:14:::1;10357:2:::0;28534::::1;:14;:::i;:::-;28522:8;;28531:1;28522:11;;;;;;;:::i;:::-;;;;;;;:26;;;;:::i;:::-;28493:14;:28;28508:9;;28518:1;28508:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28493:28;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;28493:28:0;:55;28434:3;::::1;::::0;::::1;:::i;:::-;;;;28394:166;;;;28261:306:::0;;;;;;:::o;28685:664::-;28809:6;;;;28801:32;;;;-1:-1:-1;;;28801:32:0;;9385:2:1;28801:32:0;;;9367:21:1;9424:2;9404:18;;;9397:30;-1:-1:-1;;;9443:18:1;;;9436:43;9496:18;;28801:32:0;9183:337:1;28801:32:0;28891:12;;10520;;28852:24;;;;;;;:14;:24;;;;;;:38;;;;:::i;:::-;:51;28844:72;;;;-1:-1:-1;;;28844:72:0;;9727:2:1;28844:72:0;;;9709:21:1;9766:1;9746:18;;;9739:29;-1:-1:-1;;;9784:18:1;;;9777:39;9833:18;;28844:72:0;9525:332:1;28844:72:0;28954:28;;-1:-1:-1;;28971:10:0;10011:2:1;10007:15;10003:53;28954:28:0;;;9991:66:1;28929:12:0;;10073::1;;28954:28:0;;;;;;;;;;;;28944:39;;;;;;28929:54;;29002:57;29021:12;;29002:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29035:17:0;;;;;:7;:17;;;;;;;-1:-1:-1;29054:4:0;;-1:-1:-1;29002:18:0;;-1:-1:-1;29002:57:0:i;:::-;28994:83;;;;-1:-1:-1;;;28994:83:0;;10298:2:1;28994:83:0;;;10280:21:1;10337:2;10317:18;;;10310:30;-1:-1:-1;;;10356:18:1;;;10349:44;10410:18;;28994:83:0;10096:338:1;28994:83:0;29104:10;29096:19;;;;:7;:19;;;;;;;;:26;29088:46;;;;-1:-1:-1;;;29088:46:0;;10641:2:1;29088:46:0;;;10623:21:1;10680:1;10660:18;;;10653:29;-1:-1:-1;;;10698:18:1;;;10691:38;10746:18;;29088:46:0;10439:331:1;29088:46:0;29151:9;:11;29147:106;;29176:12;2135:6;;29194:42;;-1:-1:-1;;;;;2135:6:0;;;;29222:9;;29176:12;29194:42;29176:12;29194:42;29222:9;2135:6;29194:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;29147:106:0;29271:10;29263:19;;;;:7;:19;;;;;;;;:24;;-1:-1:-1;;29263:24:0;29283:4;29263:24;;;;29316;;;;:14;:24;;;;;;29298:43;;29271:10;29298:5;:43::i;:::-;28787:562;28685:664;;;:::o;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;11187:2:1;3052:73:0::1;::::0;::::1;11169:21:1::0;11226:2;11206:18;;;11199:30;11265:34;11245:18;;;11238:62;-1:-1:-1;;;11316:18:1;;;11309:36;11362:19;;3052:73:0::1;10985:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;17433:380::-:0;-1:-1:-1;;;;;17569:19:0;;17561:68;;;;-1:-1:-1;;;17561:68:0;;11594:2:1;17561:68:0;;;11576:21:1;11633:2;11613:18;;;11606:30;11672:34;11652:18;;;11645:62;-1:-1:-1;;;11723:18:1;;;11716:34;11767:19;;17561:68:0;11392:400:1;17561:68:0;-1:-1:-1;;;;;17648:21:0;;17640:68;;;;-1:-1:-1;;;17640:68:0;;11999:2:1;17640:68:0;;;11981:21:1;12038:2;12018:18;;;12011:30;12077:34;12057:18;;;12050:62;-1:-1:-1;;;12128:18:1;;;12121:32;12170:19;;17640:68:0;11797:398:1;17640:68:0;-1:-1:-1;;;;;17721:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17773:32;;1342:25:1;;;17773:32:0;;1315:18:1;17773:32:0;;;;;;;;17433:380;;;:::o;14652:733::-;-1:-1:-1;;;;;14792:20:0;;14784:70;;;;-1:-1:-1;;;14784:70:0;;12402:2:1;14784:70:0;;;12384:21:1;12441:2;12421:18;;;12414:30;12480:34;12460:18;;;12453:62;-1:-1:-1;;;12531:18:1;;;12524:35;12576:19;;14784:70:0;12200:401:1;14784:70:0;-1:-1:-1;;;;;14873:23:0;;14865:71;;;;-1:-1:-1;;;14865:71:0;;12808:2:1;14865:71:0;;;12790:21:1;12847:2;12827:18;;;12820:30;12886:34;12866:18;;;12859:62;-1:-1:-1;;;12937:18:1;;;12930:33;12980:19;;14865:71:0;12606:399:1;14865:71:0;-1:-1:-1;;;;;15033:17:0;;15009:21;15033:17;;;:9;:17;;;;;;15069:23;;;;15061:74;;;;-1:-1:-1;;;15061:74:0;;13212:2:1;15061:74:0;;;13194:21:1;13251:2;13231:18;;;13224:30;13290:34;13270:18;;;13263:62;-1:-1:-1;;;13341:18:1;;;13334:36;13387:19;;15061:74:0;13010:402:1;15061:74:0;-1:-1:-1;;;;;15171:17:0;;;;;;;:9;:17;;;;;;15191:22;;;15171:42;;15235:20;;;;;;;;:30;;15207:6;;15171:17;15235:30;;15207:6;;15235:30;:::i;:::-;;;;;;;;15300:9;-1:-1:-1;;;;;15283:35:0;15292:6;-1:-1:-1;;;;;15283:35:0;;15311:6;15283:35;;;;1342:25:1;;1330:2;1315:18;;1196:177;15283:35:0;;;;;;;;15331:46;16404:591;;-1:-1:-1;;;;;16488:21:0;;16480:67;;;;-1:-1:-1;;;16480:67:0;;13619:2:1;16480:67:0;;;13601:21:1;13658:2;13638:18;;;13631:30;13697:34;13677:18;;;13670:62;-1:-1:-1;;;13748:18:1;;;13741:31;13789:19;;16480:67:0;13417:397:1;16480:67:0;-1:-1:-1;;;;;16647:18:0;;16622:22;16647:18;;;:9;:18;;;;;;16684:24;;;;16676:71;;;;-1:-1:-1;;;16676:71:0;;14021:2:1;16676:71:0;;;14003:21:1;14060:2;14040:18;;;14033:30;14099:34;14079:18;;;14072:62;-1:-1:-1;;;14150:18:1;;;14143:32;14192:19;;16676:71:0;13819:398:1;16676:71:0;-1:-1:-1;;;;;16783:18:0;;;;;;:9;:18;;;;;16804:23;;;16783:44;;16849:12;:22;;16821:6;;16783:18;16849:22;;16821:6;;16849:22;:::i;:::-;;;;-1:-1:-1;;16889:37:0;;1342:25:1;;;16915:1:0;;-1:-1:-1;;;;;16889:37:0;;;;;1330:2:1;1315:18;16889:37:0;1196:177:1;3332:191:0;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;20335:190::-;20460:4;20513;20484:25;20497:5;20504:4;20484:12;:25::i;:::-;:33;;20335:190;-1:-1:-1;;;;20335:190:0:o;15672:399::-;-1:-1:-1;;;;;15756:21:0;;15748:65;;;;-1:-1:-1;;;15748:65:0;;14557:2:1;15748:65:0;;;14539:21:1;14596:2;14576:18;;;14569:30;14635:33;14615:18;;;14608:61;14686:18;;15748:65:0;14355:355:1;15748:65:0;15904:6;15888:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15921:18:0;;;;;;:9;:18;;;;;:28;;15943:6;;15921:18;:28;;15943:6;;15921:28;:::i;:::-;;;;-1:-1:-1;;15965:37:0;;1342:25:1;;;-1:-1:-1;;;;;15965:37:0;;;15982:1;;15965:37;;1330:2:1;1315:18;15965:37:0;;;;;;;15672:399;;:::o;21202:296::-;21285:7;21328:4;21285:7;21343:118;21367:5;:12;21363:1;:16;21343:118;;;21416:33;21426:12;21440:5;21446:1;21440:8;;;;;;;;:::i;:::-;;;;;;;21416:9;:33::i;:::-;21401:48;-1:-1:-1;21381:3:0;;;;:::i;:::-;;;;21343:118;;;-1:-1:-1;21478:12:0;21202:296;-1:-1:-1;;;21202:296:0:o;27409:149::-;27472:7;27503:1;27499;:5;:51;;27634:13;27728:15;;;27764:4;27757:15;;;27811:4;27795:21;;27499:51;;;27634:13;27728:15;;;27764:4;27757:15;;;27811:4;27795:21;;27507:20;27492:58;27409:149;-1:-1:-1;;;27409:149:0:o;14:548: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;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1378:328::-;1455:6;1463;1471;1524:2;1512:9;1503:7;1499:23;1495:32;1492:52;;;1540:1;1537;1530:12;1492:52;1563:29;1582:9;1563:29;:::i;:::-;1553:39;;1611:38;1645:2;1634:9;1630:18;1611:38;:::i;:::-;1601:48;;1696:2;1685:9;1681:18;1668:32;1658:42;;1378:328;;;;;:::o;1900:156::-;1966:20;;2026:4;2015:16;;2005:27;;1995:55;;2046:1;2043;2036:12;2061:182;2118:6;2171:2;2159:9;2150:7;2146:23;2142:32;2139:52;;;2187:1;2184;2177:12;2139:52;2210:27;2227:9;2210:27;:::i;2430:180::-;2489:6;2542:2;2530:9;2521:7;2517:23;2513:32;2510:52;;;2558:1;2555;2548:12;2510:52;-1:-1:-1;2581:23:1;;2430:180;-1:-1:-1;2430:180:1:o;2615:186::-;2674:6;2727:2;2715:9;2706:7;2702:23;2698:32;2695:52;;;2743:1;2740;2733:12;2695:52;2766:29;2785:9;2766:29;:::i;3014:273::-;3070:6;3123:2;3111:9;3102:7;3098:23;3094:32;3091:52;;;3139:1;3136;3129:12;3091:52;3178:9;3165:23;3231:5;3224:13;3217:21;3210:5;3207:32;3197:60;;3253:1;3250;3243:12;3292:367;3355:8;3365:6;3419:3;3412:4;3404:6;3400:17;3396:27;3386:55;;3437:1;3434;3427:12;3386:55;-1:-1:-1;3460:20:1;;3503:18;3492:30;;3489:50;;;3535:1;3532;3525:12;3489:50;3572:4;3564:6;3560:17;3548:29;;3632:3;3625:4;3615:6;3612:1;3608:14;3600:6;3596:27;3592:38;3589:47;3586:67;;;3649:1;3646;3639:12;3586:67;3292:367;;;;;:::o;3664:1086::-;3820:6;3828;3836;3844;3852;3860;3913:2;3901:9;3892:7;3888:23;3884:32;3881:52;;;3929:1;3926;3919:12;3881:52;3969:9;3956:23;3998:18;4039:2;4031:6;4028:14;4025:34;;;4055:1;4052;4045:12;4025:34;4094:70;4156:7;4147:6;4136:9;4132:22;4094:70;:::i;:::-;4183:8;;-1:-1:-1;4068:96:1;-1:-1:-1;4271:2:1;4256:18;;4243:32;;-1:-1:-1;4287:16:1;;;4284:36;;;4316:1;4313;4306:12;4284:36;4355:72;4419:7;4408:8;4397:9;4393:24;4355:72;:::i;:::-;4446:8;;-1:-1:-1;4329:98:1;-1:-1:-1;4534:2:1;4519:18;;4506:32;;-1:-1:-1;4550:16:1;;;4547:36;;;4579:1;4576;4569:12;4547:36;;4618:72;4682:7;4671:8;4660:9;4656:24;4618:72;:::i;:::-;3664:1086;;;;-1:-1:-1;3664:1086:1;;-1:-1:-1;3664:1086:1;;4709:8;;3664:1086;-1:-1:-1;;;3664:1086:1:o;4755:260::-;4823:6;4831;4884:2;4872:9;4863:7;4859:23;4855:32;4852:52;;;4900:1;4897;4890:12;4852:52;4923:29;4942:9;4923:29;:::i;:::-;4913:39;;4971:38;5005:2;4994:9;4990:18;4971:38;:::i;:::-;4961:48;;4755:260;;;;;:::o;5020:507::-;5113:6;5121;5129;5182:2;5170:9;5161:7;5157:23;5153:32;5150:52;;;5198:1;5195;5188:12;5150:52;5221:27;5238:9;5221:27;:::i;:::-;5211:37;;5299:2;5288:9;5284:18;5271:32;5326:18;5318:6;5315:30;5312:50;;;5358:1;5355;5348:12;5312:50;5397:70;5459:7;5450:6;5439:9;5435:22;5397:70;:::i;:::-;5020:507;;5486:8;;-1:-1:-1;5371:96:1;;-1:-1:-1;;;;5020:507:1:o;5532:380::-;5611:1;5607:12;;;;5654;;;5675:61;;5729:4;5721:6;5717:17;5707:27;;5675:61;5782:2;5774:6;5771:14;5751:18;5748:38;5745:161;;5828:10;5823:3;5819:20;5816:1;5809:31;5863:4;5860:1;5853:15;5891:4;5888:1;5881:15;5745:161;;5532:380;;;:::o;6326:127::-;6387:10;6382:3;6378:20;6375:1;6368:31;6418:4;6415:1;6408:15;6442:4;6439:1;6432:15;6458:125;6523:9;;;6544:10;;;6541:36;;;6557:18;;:::i;6588:356::-;6790:2;6772:21;;;6809:18;;;6802:30;6868:34;6863:2;6848:18;;6841:62;6935:2;6920:18;;6588:356::o;7355:127::-;7416:10;7411:3;7407:20;7404:1;7397:31;7447:4;7444:1;7437:15;7471:4;7468:1;7461:15;7487:422;7576:1;7619:5;7576:1;7633:270;7654:7;7644:8;7641:21;7633:270;;;7713:4;7709:1;7705:6;7701:17;7695:4;7692:27;7689:53;;;7722:18;;:::i;:::-;7772:7;7762:8;7758:22;7755:55;;;7792:16;;;;7755:55;7871:22;;;;7831:15;;;;7633:270;;;7637:3;7487:422;;;;;:::o;7914:806::-;7963:5;7993:8;7983:80;;-1:-1:-1;8034:1:1;8048:5;;7983:80;8082:4;8072:76;;-1:-1:-1;8119:1:1;8133:5;;8072:76;8164:4;8182:1;8177:59;;;;8250:1;8245:130;;;;8157:218;;8177:59;8207:1;8198:10;;8221:5;;;8245:130;8282:3;8272:8;8269:17;8266:43;;;8289:18;;:::i;:::-;-1:-1:-1;;8345:1:1;8331:16;;8360:5;;8157:218;;8459:2;8449:8;8446:16;8440:3;8434:4;8431:13;8427:36;8421:2;8411:8;8408:16;8403:2;8397:4;8394:12;8390:35;8387:77;8384:159;;;-1:-1:-1;8496:19:1;;;8528:5;;8384:159;8575:34;8600:8;8594:4;8575:34;:::i;:::-;8645:6;8641:1;8637:6;8633:19;8624:7;8621:32;8618:58;;;8656:18;;:::i;:::-;8694:20;;7914:806;-1:-1:-1;;;7914:806:1:o;8725:140::-;8783:5;8812:47;8853:4;8843:8;8839:19;8833:4;8812:47;:::i;8870:168::-;8943:9;;;8974;;8991:15;;;8985:22;;8971:37;8961:71;;9012:18;;:::i;9043:135::-;9082:3;9103:17;;;9100:43;;9123:18;;:::i;:::-;-1:-1:-1;9170:1:1;9159:13;;9043:135::o;14222:128::-;14289:9;;;14310:11;;;14307:37;;;14324:18;;:::i

Swarm Source

ipfs://e6b3ec3f9a31539ceae50868aa1adb3bfdd9e3479895bf947c0d1f6508210d69
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.