ETH Price: $2,640.29 (+0.80%)

Token

Secured On Blockchain (SOB)
 

Overview

Max Total Supply

1,000,000 SOB

Holders

361 (0.00%)

Market

Price

$0.69 @ 0.000263 ETH (+7.70%)

Onchain Market Cap

$694,702.00

Circulating Supply Market Cap

$691,046.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
503.259080477 SOB

Value
$349.62 ( ~0.132417327130873 Eth) [0.0503%]
0xf87a95983dd41103f8aa175fa0f23dfb5e4e9bfc
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Secured On Blockchain (SOB) is a platform for securely storing and verifying asset information on the blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SecuredOnBlockChainToken

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-10
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

// lib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sol

// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 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 ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-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 ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 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);
}

// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the 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);
}

// lib/openzeppelin-contracts/contracts/utils/Context.sol

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

/**
 * @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;
    }
}

// src/interfaces/IUniswap.sol

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

// lib/openzeppelin-contracts/contracts/access/Ownable.sol

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

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * 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);
    }
}

// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 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);
}

// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol

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

/**
 * @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 ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 */
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}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `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:
     * ```
     * 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);
            }
        }
    }
}

// src/OnSecuredToken.sol

error SOB__InvalidWalletAddress(address invalidWallet);
error SOB__InvalidPairAddress(address invalidPair);
error SOB__InvalidRouterAddress(address invalidRouter);
error SOB__CannotTransfer(uint8 code);
error SOB__InvalidFeeAmount(uint256 fee, uint256 maxFee);
error SOB__InvalidSplit(uint8 errorTotal);
error SOB__InvalidMaxTxAmount();
error SOB__MaxTx();

// code == 0: Cannot transfer 0 ETH
// code == 1: Cannot transfer receiver address failed

contract SecuredOnBlockChainToken is ERC20, Ownable {
    uint256 public constant FEE_BASIS = 100;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    mapping(address => bool) public isExcludedFromFee;
    mapping(address => bool) public isExcludedFromLimit;
    mapping(address => bool) public isPair;
    uint256 public feeOnBuy = 0;
    uint256 public feeOnSell = 0;
    uint256 public swapThreshold;
    uint256 public maxTxAmount;

    IUniswapV2Router02 public router =
        IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
    address public immutable WETH;
    address public marketingWallet;
    address public devWallet;
    address public uniswapV2Pair;

    uint8 public marketingPercent = 8;
    uint8 public devPercent = 2;
    uint8 public totalPercent = 10;
    bool private swapping;

    //------------------------------------------------------------------------
    //---------------------- Events ---------------------
    event MarketingWalletUpdate(
        address indexed previousMarketingWallet,
        address indexed newMarketingWallet
    );
    event DevWalletUpdate(
        address indexed previousDevWallet,
        address indexed newDevWallet
    );
    event PairUpdate(address indexed previousPair, address indexed newPair);
    event RouterUpdate(
        address indexed previousRouter,
        address indexed newRouter
    );
    event InvalidTransfer(address indexed to, uint256 ETHvalue);
    event UpdateExcludedStatus(address indexed wallet, bool status);
    event UpdateLimitStatus(address indexed wallet, bool status);
    event UpdateBuyFee(uint256 prevFee, uint256 fee);
    event UpdateSellFee(uint256 prevFee, uint256 fee);
    event UpdateThreshold(uint256 prevThreshold, uint256 threshold);
    event UpdateFeeSplit(uint8 mktShares, uint8 devShares, uint8 totalShares);
    event MaxTxUpdate(uint256 prevMaxTx, uint256 newMaxTx);

    //------------------------------------------------------------------------
    //-------------------- Modifiers --------------------

    constructor(
        address _ownerWallet,
        address _mktWallet,
        address _devWallet
    ) ERC20("Secured On Blockchain", "SOB") Ownable(_ownerWallet) {
        // Total Supply 1M gwei. 9 decimals
        super._update(address(0), _ownerWallet, 1_000_000 gwei);
        maxTxAmount = totalSupply() / 100; // 1% of total supply
        marketingWallet = _mktWallet;
        devWallet = _devWallet;
        IUniswapV2Factory factory = IUniswapV2Factory(router.factory());
        WETH = router.WETH();
        uniswapV2Pair = factory.createPair(address(this), WETH);
        isPair[uniswapV2Pair] = true;
        swapThreshold = totalSupply() / 5_000;
        // Exclude From Fees
        isExcludedFromFee[_ownerWallet] = true;
        isExcludedFromFee[address(this)] = true;
        // Exclude From Limits
        isExcludedFromLimit[_ownerWallet] = true;
        isExcludedFromLimit[address(this)] = true;
        isExcludedFromLimit[DEAD] = true;
        isExcludedFromLimit[uniswapV2Pair] = true;
        _approve(address(this), address(router), type(uint256).max);
    }

    //------------------------------------------------------------------------
    //-------------------- External/Public functions -------------------------
    //------------------------------------------------------------------------
    receive() external payable {}

    fallback() external payable {}

    //-------------------- onlyOwner functions --------------------

    /**
     * @notice Update the Marketing Wallet
     * @param _newMarketingWallet The new Marketing Wallet address
     * @dev Only the owner can update the Marketing Wallet and the new wallet should not be the zero address or the contract address or the current marketing address
     */
    function updateMarketingWallet(
        address _newMarketingWallet
    ) external onlyOwner {
        if (
            _newMarketingWallet == address(0) ||
            _newMarketingWallet == address(this) ||
            _newMarketingWallet == marketingWallet
        ) revert SOB__InvalidWalletAddress(_newMarketingWallet);
        emit MarketingWalletUpdate(marketingWallet, _newMarketingWallet);
        marketingWallet = _newMarketingWallet;
    }

    /**
     * @notice Update the Dev Wallet
     * @param _devWallet The new Dev Wallet address
     * @dev Only the owner can update the Dev Wallet and the new wallet should not be the zero address or the contract address or the current marketing address
     */
    function updateDevWallet(address _devWallet) external onlyOwner {
        if (
            _devWallet == address(0) ||
            _devWallet == address(this) ||
            _devWallet == devWallet
        ) revert SOB__InvalidWalletAddress(_devWallet);
        emit DevWalletUpdate(devWallet, _devWallet);
        devWallet = _devWallet;
    }

    /**
     * @notice Update the Main Pair to swap for ETH
     * @param _uniswapV2Pair The new UniswapV2Pair address
     * @dev Only the owner can update the Pair and the new wallet should not be the zero address or the contract address or the current address
     *  or the current pair address or be an invalid V2pair
     */
    function updateV2Pair(address _uniswapV2Pair) external onlyOwner {
        address token0 = IUniswapV2Pair(_uniswapV2Pair).token0();
        address token1 = IUniswapV2Pair(_uniswapV2Pair).token1();
        if (token0 != address(this) && token1 != address(this)) {
            revert SOB__InvalidWalletAddress(_uniswapV2Pair);
        }
        emit PairUpdate(uniswapV2Pair, _uniswapV2Pair);
        uniswapV2Pair = _uniswapV2Pair;
    }

    /**
     * @notice Update the UniswapV2Router
     * @param _uniswapV2Router The new UniswapV2Router address
     * @dev Only the owner can update the Router and the new wallet should not be the zero address or the contract address or the current address
     *  or the current pair address or be an invalid v2 router
     */
    function updateV2Router(address _uniswapV2Router) external onlyOwner {
        if (
            _uniswapV2Router == address(0) ||
            _uniswapV2Router == address(this) ||
            _uniswapV2Router == address(router) ||
            IUniswapV2Router02(_uniswapV2Router).WETH() != WETH
        ) revert SOB__InvalidRouterAddress(_uniswapV2Router);
        emit RouterUpdate(address(router), _uniswapV2Router);
        router = IUniswapV2Router02(_uniswapV2Router);
    }

    /**
     * @notice Add a new pair to the list of pairs
     * @param pair The address of the pair to add
     */
    function addPair(address pair) external onlyOwner {
        if (pair == address(0) || pair == address(this))
            revert SOB__InvalidPairAddress(pair);
        isPair[pair] = true;
        isExcludedFromLimit[pair] = true;
    }

    /**
     * @notice Update the exclusion status of a wallet from fees
     * @param wallet The address to update exclusion status from fees
     * @param status The new exclusion status
     */
    function updateWalletExcludeStatus(
        address wallet,
        bool status
    ) external onlyOwner {
        isExcludedFromFee[wallet] = status;
        emit UpdateExcludedStatus(wallet, status);
    }

    /**
     * @notice Update the limit exclusion of a wallet
     * @param wallet The address to update exclusion status from limits
     * @param status The new limit exclusion status
     * @dev Wallet to update cannot be the pair or the router
     */
    function updateWalletLimitStatus(
        address wallet,
        bool status
    ) external onlyOwner {
        if (wallet == uniswapV2Pair || wallet == address(router))
            revert SOB__InvalidWalletAddress(wallet);
        isExcludedFromLimit[wallet] = status;
        emit UpdateLimitStatus(wallet, status);
    }

    /**
     * @notice Swap currently held fees for ETH and distribute to mkt and dev wallets
     */
    function manualSwapFees() external onlyOwner {
        _swapFees();
    }

    /**
     * @notice update the fee taken on BUY transactions
     * @param _fee The new fee to apply
     * @dev The fee cannot be more than 25%
     */
    function updateBuyFee(uint256 _fee) external onlyOwner {
        if (_fee > 25) revert SOB__InvalidFeeAmount(_fee, 25);
        emit UpdateBuyFee(feeOnBuy, _fee);
        feeOnBuy = _fee;
    }

    /**
     * @notice update the fee taken on BUY transactions
     * @param _fee The new fee to apply
     * @dev The fee cannot be more than 25%
     */
    function updateSellFee(uint256 _fee) external onlyOwner {
        if (_fee > 25) revert SOB__InvalidFeeAmount(_fee, 25);
        emit UpdateSellFee(feeOnSell, _fee);
        feeOnSell = _fee;
    }

    /**
     * @notice update the amount to collect before triggering a conversion to ETH
     * @param _threshold The new threshold to apply
     */
    function updateSwapThreshold(uint256 _threshold) external onlyOwner {
        emit UpdateThreshold(swapThreshold, _threshold);
        swapThreshold = _threshold;
    }

    /**
     * Updates the Max Tokens a tx can make in a single TX
     * @param _maxTx The new maxTx to apply
     */
    function updateMaxTx(uint256 _maxTx) external onlyOwner {
        if (_maxTx < totalSupply() / 100) revert SOB__InvalidMaxTxAmount();
        emit MaxTxUpdate(maxTxAmount, _maxTx);
        maxTxAmount = _maxTx;
    }

    /**
     * @notice update the fee split between marketing and dev wallets
     * @param _mktShares The new marketing shares
     * @param _devShares The new dev shares
     * @dev totalPercent cannot be 0. Shares do not change the fees, only the split
     */
    function updateFeeSplit(
        uint8 _mktShares,
        uint8 _devShares
    ) external onlyOwner {
        if (_mktShares + _devShares == 0) revert SOB__InvalidSplit(0);
        totalPercent = _mktShares + _devShares;
        marketingPercent = _mktShares;
        devPercent = _devShares;
    }

    /**
     * @notice remove any ETH from the contract to DEV wallet
     */
    function extractETH() external {
        uint amount = address(this).balance;
        if (amount == 0) revert SOB__CannotTransfer(0);
        (bool success, ) = devWallet.call{value: address(this).balance}("");
        if (!success) revert SOB__CannotTransfer(1);
    }

    /**
     * @notice remove any ERC20 token from the contract to DEV wallet
     * @param token The address of the ERC20 token to extract from this contract
     */
    function extractERC20(address token) external {
        if (token == address(this) || token == address(0))
            revert SOB__InvalidWalletAddress(token);
        ERC20 erc = ERC20(token);
        uint256 balance = erc.balanceOf(address(this));
        if (balance == 0) revert SOB__CannotTransfer(0);
        erc.transfer(devWallet, balance);
    }

    //------------------------------------------------------------------------
    //-------------------- Internal/Private functions ------------------------
    //------------------------------------------------------------------------
    /**
     * @notice Update the balances of the sender and receiver
     * @param from The sender address
     * @param to The receiver address
     * @param value The amount to transfer
     * @dev This function is called by the transfer and transferFrom functions
     * and it updates the balances of the sender and receiver and also takes care of the fees
     * if the threshold is reached it swaps for ETH and splits the fees
     */
    function _update(
        address from,
        address to,
        uint256 value
    ) internal override {
        bool isBuy = isPair[from];
        bool isSell = isPair[to];

        // Check Max TX limits
        if (value > maxTxAmount) {
            if (isBuy && !isExcludedFromLimit[to]) revert SOB__MaxTx();
            else if (isSell && !isExcludedFromLimit[from]) revert SOB__MaxTx();
            else {
                if (!isExcludedFromLimit[from]) revert SOB__MaxTx();
            }
        }

        bool canSwap = !swapping &&
            !isSell &&
            balanceOf(address(this)) >= swapThreshold;

        if (canSwap) {
            _swapFees();
        }

        bool takeFee = !swapping &&
            !(isExcludedFromFee[from] || isExcludedFromFee[to]);
        uint fee = 0;
        if (takeFee) {
            if (isBuy) {
                fee = (value * feeOnBuy) / FEE_BASIS;
            } else if (isSell) {
                fee = (value * feeOnSell) / FEE_BASIS;
            }
            super._update(from, address(this), fee);
            value -= fee;
        }

        super._update(from, to, value);
    }

    /**
     * @notice swap the fees collected in SOB for ETH and send to the marketing and dev wallets respectively
     */
    function _swapFees() private {
        swapping = true;
        uint256 totalFees = balanceOf(address(this));

        // Swapping
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            totalFees,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 ethBalance = address(this).balance;
        if (totalPercent > 0) {
            uint256 marketingFee = (ethBalance * marketingPercent) /
                totalPercent;
            uint256 devFee = (ethBalance * devPercent) / totalPercent;
            (bool success, ) = marketingWallet.call{value: marketingFee}("");
            if (!success) emit InvalidTransfer(marketingWallet, marketingFee);
            (success, ) = devWallet.call{value: devFee}("");
            if (!success) emit InvalidTransfer(marketingWallet, marketingFee);
        }
        swapping = false;
    }

    //-------------------- External/Public VIEW functions --------------------
    function decimals() public pure override returns (uint8) {
        return 9;
    }
    //-------------------- Internal/Private VIEW functions -------------------
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_ownerWallet","type":"address"},{"internalType":"address","name":"_mktWallet","type":"address"},{"internalType":"address","name":"_devWallet","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"},{"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"SOB__CannotTransfer","type":"error"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxFee","type":"uint256"}],"name":"SOB__InvalidFeeAmount","type":"error"},{"inputs":[],"name":"SOB__InvalidMaxTxAmount","type":"error"},{"inputs":[{"internalType":"address","name":"invalidPair","type":"address"}],"name":"SOB__InvalidPairAddress","type":"error"},{"inputs":[{"internalType":"address","name":"invalidRouter","type":"address"}],"name":"SOB__InvalidRouterAddress","type":"error"},{"inputs":[{"internalType":"uint8","name":"errorTotal","type":"uint8"}],"name":"SOB__InvalidSplit","type":"error"},{"inputs":[{"internalType":"address","name":"invalidWallet","type":"address"}],"name":"SOB__InvalidWalletAddress","type":"error"},{"inputs":[],"name":"SOB__MaxTx","type":"error"},{"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":"previousDevWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newDevWallet","type":"address"}],"name":"DevWalletUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"ETHvalue","type":"uint256"}],"name":"InvalidTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"MarketingWalletUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevMaxTx","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxTx","type":"uint256"}],"name":"MaxTxUpdate","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":"previousPair","type":"address"},{"indexed":true,"internalType":"address","name":"newPair","type":"address"}],"name":"PairUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"RouterUpdate","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UpdateBuyFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateExcludedStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"mktShares","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"devShares","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalShares","type":"uint8"}],"name":"UpdateFeeSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"UpdateLimitStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"UpdateSellFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"UpdateThreshold","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"FEE_BASIS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"addPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"extractERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extractETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwapFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"value","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":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mktShares","type":"uint8"},{"internalType":"uint8","name":"_devShares","type":"uint8"}],"name":"updateFeeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMarketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"name":"updateMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"updateSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Pair","type":"address"}],"name":"updateV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_uniswapV2Router","type":"address"}],"name":"updateV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWalletExcludeStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"updateWalletLimitStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040525f6009819055600a55600d80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055601080546201404160a31b62ffffff60a01b1990911617905534801562000058575f80fd5b50604051620027c3380380620027c38339810160408190526200007b9162000674565b826040518060400160405280601581526020017f53656375726564204f6e20426c6f636b636861696e00000000000000000000008152506040518060400160405280600381526020016229a7a160e91b8152508160039081620000df919062000758565b506004620000ee828262000758565b5050506001600160a01b0381166200012057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6200012b81620003eb565b50620001405f8466038d7ea4c680006200043c565b60646200014c60025490565b62000158919062000824565b600c55600e80546001600160a01b038085166001600160a01b031992831617909255600f80548484169216919091179055600d546040805163c45a015560e01b815290515f93929092169163c45a0155916004808201926020929091908290030181865afa158015620001cd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001f3919062000844565b9050600d5f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000246573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200026c919062000844565b6001600160a01b0390811660808190526040516364e329cb60e11b815230600482015260248101919091529082169063c9c65396906044016020604051808303815f875af1158015620002c1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002e7919062000844565b601080546001600160a01b0319166001600160a01b039290921691821790555f908152600860205260409020805460ff191660011790556113886200032b60025490565b62000337919062000824565b600b556001600160a01b038481165f8181526006602090815260408083208054600160ff1991821681179092553080865283862080548316841790559585526007909352818420805484168217905584845281842080548416821790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d805484168217905560105486168452922080549091169091179055600d54620003e192165f196200056b565b505050506200088d565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0383166200046a578060025f8282546200045e919062000867565b90915550620004dc9050565b6001600160a01b0383165f9081526020819052604090205481811015620004be5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000117565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620004fa5760028054829003905562000518565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200055e91815260200190565b60405180910390a3505050565b6200057a83838360016200057f565b505050565b6001600160a01b038416620005aa5760405163e602df0560e01b81525f600482015260240162000117565b6001600160a01b038316620005d557604051634a1406b160e11b81525f600482015260240162000117565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156200065257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200064991815260200190565b60405180910390a35b50505050565b80516001600160a01b03811681146200066f575f80fd5b919050565b5f805f6060848603121562000687575f80fd5b620006928462000658565b9250620006a26020850162000658565b9150620006b26040850162000658565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620006e457607f821691505b6020821081036200070357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200057a57805f5260205f20601f840160051c81016020851015620007305750805b601f840160051c820191505b8181101562000751575f81556001016200073c565b5050505050565b81516001600160401b03811115620007745762000774620006bb565b6200078c81620007858454620006cf565b8462000709565b602080601f831160018114620007c2575f8415620007aa5750858301515b5f19600386901b1c1916600185901b1785556200081c565b5f85815260208120601f198616915b82811015620007f257888601518255948401946001909101908401620007d1565b50858210156200081057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f826200083f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121562000855575f80fd5b620008608262000658565b9392505050565b808201808211156200088757634e487b7160e01b5f52601160045260245ffd5b92915050565b608051611f0f620008b45f395f81816105b301528181610a2401526114cb0152611f0f5ff3fe608060405260043610610247575f3560e01c80638da5cb5b11610137578063c5c0da1a116100af578063dd62ed3e11610076578063dd62ed3e146106f2578063e5e31b1314610736578063f2fde38b14610764578063f887ea4014610783578063fabb71d2146107a2578063fc3c28af146107b657005b8063c5c0da1a14610647578063cc274b2914610666578063cd9f62d414610685578063d8020a18146106a4578063d94160e0146106c457005b8063aacebbe3116100fe578063aacebbe314610583578063ad5c4648146105a2578063b9f72443146105d5578063bb8c3ee0146105f4578063c2b7bbb614610609578063c2d0ffca1461062857005b80638da5cb5b146104f55780638ea5220f146105125780639359a92b1461053157806395d89b4114610550578063a9059cbb1461056457005b8063467abe0a116101ca578063715018a611610191578063715018a61461045a57806375f0a8741461046e57806378ff4fdc1461048d5780637a7c83a6146104ac5780638686ebcc146104cc5780638c0b5e22146104e057005b8063467abe0a1461038d57806349bd5a5e146103ac5780635342acb4146103e357806365048d081461041157806370a082311461042657005b80631d933a4a1161020e5780631d933a4a146102fb57806323b872dd1461031a578063313ce567146103395780633bb25ad41461035a57806343ed59af1461037957005b80630445b6671461025057806306fdde0314610278578063095ea7b31461029957806318160ddd146102c85780631816467f146102dc57005b3661024e57005b005b34801561025b575f80fd5b50610265600b5481565b6040519081526020015b60405180910390f35b348015610283575f80fd5b5061028c6107d6565b60405161026f9190611b8f565b3480156102a4575f80fd5b506102b86102b3366004611bef565b610866565b604051901515815260200161026f565b3480156102d3575f80fd5b50600254610265565b3480156102e7575f80fd5b5061024e6102f6366004611c19565b61087f565b348015610306575f80fd5b5061024e610315366004611c3b565b610946565b348015610325575f80fd5b506102b8610334366004611c52565b6109bb565b348015610344575f80fd5b5060095b60405160ff909116815260200161026f565b348015610365575f80fd5b5061024e610374366004611c19565b6109de565b348015610384575f80fd5b5061024e610b3c565b348015610398575f80fd5b5061024e6103a7366004611c3b565b610b4e565b3480156103b7575f80fd5b506010546103cb906001600160a01b031681565b6040516001600160a01b03909116815260200161026f565b3480156103ee575f80fd5b506102b86103fd366004611c19565b60066020525f908152604090205460ff1681565b34801561041c575f80fd5b50610265600a5481565b348015610431575f80fd5b50610265610440366004611c19565b6001600160a01b03165f9081526020819052604090205490565b348015610465575f80fd5b5061024e610bc3565b348015610479575f80fd5b50600e546103cb906001600160a01b031681565b348015610498575f80fd5b5061024e6104a7366004611ca5565b610bd4565b3480156104b7575f80fd5b5060105461034890600160b01b900460ff1681565b3480156104d7575f80fd5b50610265606481565b3480156104eb575f80fd5b50610265600c5481565b348015610500575f80fd5b506005546001600160a01b03166103cb565b34801561051d575f80fd5b50600f546103cb906001600160a01b031681565b34801561053c575f80fd5b5061024e61054b366004611ce3565b610c5d565b34801561055b575f80fd5b5061028c610cc4565b34801561056f575f80fd5b506102b861057e366004611bef565b610cd3565b34801561058e575f80fd5b5061024e61059d366004611c19565b610ce0565b3480156105ad575f80fd5b506103cb7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e0575f80fd5b5061024e6105ef366004611ce3565b610da2565b3480156105ff575f80fd5b5061026560095481565b348015610614575f80fd5b5061024e610623366004611c19565b610e53565b348015610633575f80fd5b5061024e610642366004611c3b565b610edd565b348015610652575f80fd5b5061024e610661366004611c19565b610f5b565b348015610671575f80fd5b5061024e610680366004611c3b565b6110aa565b348015610690575f80fd5b5061024e61069f366004611c19565b6110f3565b3480156106af575f80fd5b5060105461034890600160a01b900460ff1681565b3480156106cf575f80fd5b506102b86106de366004611c19565b60076020525f908152604090205460ff1681565b3480156106fd575f80fd5b5061026561070c366004611d1a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610741575f80fd5b506102b8610750366004611c19565b60086020525f908152604090205460ff1681565b34801561076f575f80fd5b5061024e61077e366004611c19565b611269565b34801561078e575f80fd5b50600d546103cb906001600160a01b031681565b3480156107ad575f80fd5b5061024e6112a6565b3480156107c1575f80fd5b5060105461034890600160a81b900460ff1681565b6060600380546107e590611d46565b80601f016020809104026020016040519081016040528092919081815260200182805461081190611d46565b801561085c5780601f106108335761010080835404028352916020019161085c565b820191905f5260205f20905b81548152906001019060200180831161083f57829003601f168201915b5050505050905090565b5f33610873818585611342565b60019150505b92915050565b610887611354565b6001600160a01b03811615806108a557506001600160a01b03811630145b806108bd5750600f546001600160a01b038281169116145b156108eb57604051635f9535e560e11b81526001600160a01b03821660048201526024015b60405180910390fd5b600f546040516001600160a01b038084169216907f18fc3ba4f62cf4833f55b864292e6863d464b3d906a761e44ad014bc14a055c6905f90a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61094e611354565b601981111561097a5760405163506f007160e01b815260048101829052601960248201526044016108e2565b600a5460408051918252602082018390527fde4022aab72c416fa5c54f5b02a3d8ce50d8a9418a85c790d51cf759ebb4697d910160405180910390a1600a55565b5f336109c8858285611381565b6109d38585856113f6565b506001949350505050565b6109e6611354565b6001600160a01b0381161580610a0457506001600160a01b03811630145b80610a1c5750600d546001600160a01b038281169116145b80610ab857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aac9190611d7e565b6001600160a01b031614155b15610ae15760405163e2959edb60e01b81526001600160a01b03821660048201526024016108e2565b600d546040516001600160a01b038084169216907f363beda10ebf02584eda9ab4ca38e353bc57591b50714ba84692ed584280672d905f90a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610b44611354565b610b4c611453565b565b610b56611354565b6019811115610b825760405163506f007160e01b815260048101829052601960248201526044016108e2565b60095460408051918252602082018390527fc66f11a4e1af275a2ecb111e96ff29a572358bd3abd0d8851f439ca0f4aa40ac910160405180910390a1600955565b610bcb611354565b610b4c5f611736565b610bdc611354565b610be68183611dad565b60ff165f03610c0a5760405163cc90e88360e01b81525f60048201526024016108e2565b610c148183611dad565b6010805462ff00ff60a01b1916600160b01b60ff9384160260ff60a01b191617600160a01b948316949094029390931760ff60a81b1916600160a81b9290911691909102179055565b610c65611354565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f2c3bf8535205cd5836e82c4509edb0b2d59ca58bfecd1cc0a511828828881dba91015b60405180910390a25050565b6060600480546107e590611d46565b5f336108738185856113f6565b610ce8611354565b6001600160a01b0381161580610d0657506001600160a01b03811630145b80610d1e5750600e546001600160a01b038281169116145b15610d4757604051635f9535e560e11b81526001600160a01b03821660048201526024016108e2565b600e546040516001600160a01b038084169216907f7dba0a5693978c89a298b760efee1931a0b2815b9deb02129ad881e64767cff5905f90a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b610daa611354565b6010546001600160a01b0383811691161480610dd35750600d546001600160a01b038381169116145b15610dfc57604051635f9535e560e11b81526001600160a01b03831660048201526024016108e2565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527f68eb8038e65b90dcf733cc7d3ea22c9b5623b245737f1dba379e61416b094b759101610cb8565b610e5b611354565b6001600160a01b0381161580610e7957506001600160a01b03811630145b15610ea257604051631c75e49760e01b81526001600160a01b03821660048201526024016108e2565b6001600160a01b03165f9081526008602090815260408083208054600160ff1991821681179092556007909352922080549091169091179055565b610ee5611354565b6064610ef060025490565b610efa9190611dc6565b811015610f1a576040516361f717e160e11b815260040160405180910390fd5b600c5460408051918252602082018390527f7a67d9ff36dd9cfc97e4bec7285f664fae66a1fe883052d5b46346773a0057b9910160405180910390a1600c55565b6001600160a01b038116301480610f7957506001600160a01b038116155b15610fa257604051635f9535e560e11b81526001600160a01b03821660048201526024016108e2565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610fe8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100c9190611de5565b9050805f036110305760405163d88b230d60e01b81525f60048201526024016108e2565b600f5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303815f875af1158015611080573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a49190611dfc565b50505050565b6110b2611354565b600b5460408051918252602082018390527fe2f0d2b9bd62fe4d997e442d96308c2084de77174fc94e18e14bf473b030f4dd910160405180910390a1600b55565b6110fb611354565b5f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611138573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115c9190611d7e565b90505f826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bf9190611d7e565b90506001600160a01b03821630148015906111e357506001600160a01b0381163014155b1561120c57604051635f9535e560e11b81526001600160a01b03841660048201526024016108e2565b6010546040516001600160a01b038086169216907f64f805d25d00b4b9f3a22a1ccccdbcc3b12948681a091c3643be5488fbe85a81905f90a35050601080546001600160a01b0319166001600160a01b0392909216919091179055565b611271611354565b6001600160a01b03811661129a57604051631e4fbdf760e01b81525f60048201526024016108e2565b6112a381611736565b50565b475f8190036112ca5760405163d88b230d60e01b81525f60048201526024016108e2565b600f546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611314576040519150601f19603f3d011682016040523d82523d5f602084013e611319565b606091505b505090508061133e5760405163d88b230d60e01b8152600160048201526024016108e2565b5050565b61134f8383836001611787565b505050565b6005546001600160a01b03163314610b4c5760405163118cdaa760e01b81523360048201526024016108e2565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146110a457818110156113e857604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108e2565b6110a484848484035f611787565b6001600160a01b03831661141f57604051634b637e8f60e11b81525f60048201526024016108e2565b6001600160a01b0382166114485760405163ec442f0560e01b81525f60048201526024016108e2565b61134f838383611859565b6010805460ff60b81b1916600160b81b179055305f9081526020818152604080832054815160028082526060820184529194939092908301908036833701905050905030815f815181106114a9576114a9611e17565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106114fd576114fd611e17565b6001600160a01b039283166020918202929092010152600d5460405163791ac94760e01b815291169063791ac947906115429085905f90869030904290600401611e2b565b5f604051808303815f87803b158015611559575f80fd5b505af115801561156b573d5f803e3d5ffd5b5050601054479250600160b01b900460ff16159050611724576010545f9060ff600160b01b82048116916115a891600160a01b9091041684611e9c565b6115b29190611dc6565b6010549091505f9060ff600160b01b82048116916115d991600160a81b9091041685611e9c565b6115e39190611dc6565b600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611632576040519150601f19603f3d011682016040523d82523d5f602084013e611637565b606091505b505090508061168357600e546040518481526001600160a01b03909116907f3aa9c48059ec71098c4c50a2ff39cb5bb4f4be1fc8192f76dbcfe829242a76649060200160405180910390a25b600f546040516001600160a01b039091169083905f81818185875af1925050503d805f81146116cd576040519150601f19603f3d011682016040523d82523d5f602084013e6116d2565b606091505b5050809150508061172057600e546040518481526001600160a01b03909116907f3aa9c48059ec71098c4c50a2ff39cb5bb4f4be1fc8192f76dbcfe829242a76649060200160405180910390a25b5050505b50506010805460ff60b81b1916905550565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166117b05760405163e602df0560e01b81525f60048201526024016108e2565b6001600160a01b0383166117d957604051634a1406b160e11b81525f60048201526024016108e2565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110a457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161184b91815260200190565b60405180910390a350505050565b6001600160a01b038381165f90815260086020526040808220549285168252902054600c5460ff928316929091169083111561194d578180156118b457506001600160a01b0384165f9081526007602052604090205460ff16155b156118d2576040516367a6ec0360e01b815260040160405180910390fd5b8080156118f757506001600160a01b0385165f9081526007602052604090205460ff16155b15611915576040516367a6ec0360e01b815260040160405180910390fd5b6001600160a01b0385165f9081526007602052604090205460ff1661194d576040516367a6ec0360e01b815260040160405180910390fd5b6010545f90600160b81b900460ff16158015611967575081155b80156119835750600b54305f9081526020819052604090205410155b9050801561199357611993611453565b6010545f90600160b81b900460ff161580156119e957506001600160a01b0387165f9081526006602052604090205460ff16806119e757506001600160a01b0386165f9081526006602052604090205460ff165b155b90505f8115611a54578415611a1957606460095487611a089190611e9c565b611a129190611dc6565b9050611a3c565b8315611a3c576064600a5487611a2f9190611e9c565b611a399190611dc6565b90505b611a47883083611a69565b611a518187611eb3565b95505b611a5f888888611a69565b5050505050505050565b6001600160a01b038316611a93578060025f828254611a889190611ec6565b90915550611b039050565b6001600160a01b0383165f9081526020819052604090205481811015611ae55760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108e2565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b1f57600280548290039055611b3d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8291815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015611bbb57858101830151858201604001528201611b9f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146112a3575f80fd5b5f8060408385031215611c00575f80fd5b8235611c0b81611bdb565b946020939093013593505050565b5f60208284031215611c29575f80fd5b8135611c3481611bdb565b9392505050565b5f60208284031215611c4b575f80fd5b5035919050565b5f805f60608486031215611c64575f80fd5b8335611c6f81611bdb565b92506020840135611c7f81611bdb565b929592945050506040919091013590565b803560ff81168114611ca0575f80fd5b919050565b5f8060408385031215611cb6575f80fd5b611cbf83611c90565b9150611ccd60208401611c90565b90509250929050565b80151581146112a3575f80fd5b5f8060408385031215611cf4575f80fd5b8235611cff81611bdb565b91506020830135611d0f81611cd6565b809150509250929050565b5f8060408385031215611d2b575f80fd5b8235611d3681611bdb565b91506020830135611d0f81611bdb565b600181811c90821680611d5a57607f821691505b602082108103611d7857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611d8e575f80fd5b8151611c3481611bdb565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561087957610879611d99565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611df5575f80fd5b5051919050565b5f60208284031215611e0c575f80fd5b8151611c3481611cd6565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611e7b5784516001600160a01b031683529383019391830191600101611e56565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761087957610879611d99565b8181038181111561087957610879611d99565b8082018082111561087957610879611d9956fea2646970667358221220fc515073a64dbdb2bfc1746f50048cf1bbc3e7ac64c5bffd383290c3e818f13d64736f6c634300081800330000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877000000000000000000000000430732094a39c4bda694121e4513041fab878cab0000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877

Deployed Bytecode

0x608060405260043610610247575f3560e01c80638da5cb5b11610137578063c5c0da1a116100af578063dd62ed3e11610076578063dd62ed3e146106f2578063e5e31b1314610736578063f2fde38b14610764578063f887ea4014610783578063fabb71d2146107a2578063fc3c28af146107b657005b8063c5c0da1a14610647578063cc274b2914610666578063cd9f62d414610685578063d8020a18146106a4578063d94160e0146106c457005b8063aacebbe3116100fe578063aacebbe314610583578063ad5c4648146105a2578063b9f72443146105d5578063bb8c3ee0146105f4578063c2b7bbb614610609578063c2d0ffca1461062857005b80638da5cb5b146104f55780638ea5220f146105125780639359a92b1461053157806395d89b4114610550578063a9059cbb1461056457005b8063467abe0a116101ca578063715018a611610191578063715018a61461045a57806375f0a8741461046e57806378ff4fdc1461048d5780637a7c83a6146104ac5780638686ebcc146104cc5780638c0b5e22146104e057005b8063467abe0a1461038d57806349bd5a5e146103ac5780635342acb4146103e357806365048d081461041157806370a082311461042657005b80631d933a4a1161020e5780631d933a4a146102fb57806323b872dd1461031a578063313ce567146103395780633bb25ad41461035a57806343ed59af1461037957005b80630445b6671461025057806306fdde0314610278578063095ea7b31461029957806318160ddd146102c85780631816467f146102dc57005b3661024e57005b005b34801561025b575f80fd5b50610265600b5481565b6040519081526020015b60405180910390f35b348015610283575f80fd5b5061028c6107d6565b60405161026f9190611b8f565b3480156102a4575f80fd5b506102b86102b3366004611bef565b610866565b604051901515815260200161026f565b3480156102d3575f80fd5b50600254610265565b3480156102e7575f80fd5b5061024e6102f6366004611c19565b61087f565b348015610306575f80fd5b5061024e610315366004611c3b565b610946565b348015610325575f80fd5b506102b8610334366004611c52565b6109bb565b348015610344575f80fd5b5060095b60405160ff909116815260200161026f565b348015610365575f80fd5b5061024e610374366004611c19565b6109de565b348015610384575f80fd5b5061024e610b3c565b348015610398575f80fd5b5061024e6103a7366004611c3b565b610b4e565b3480156103b7575f80fd5b506010546103cb906001600160a01b031681565b6040516001600160a01b03909116815260200161026f565b3480156103ee575f80fd5b506102b86103fd366004611c19565b60066020525f908152604090205460ff1681565b34801561041c575f80fd5b50610265600a5481565b348015610431575f80fd5b50610265610440366004611c19565b6001600160a01b03165f9081526020819052604090205490565b348015610465575f80fd5b5061024e610bc3565b348015610479575f80fd5b50600e546103cb906001600160a01b031681565b348015610498575f80fd5b5061024e6104a7366004611ca5565b610bd4565b3480156104b7575f80fd5b5060105461034890600160b01b900460ff1681565b3480156104d7575f80fd5b50610265606481565b3480156104eb575f80fd5b50610265600c5481565b348015610500575f80fd5b506005546001600160a01b03166103cb565b34801561051d575f80fd5b50600f546103cb906001600160a01b031681565b34801561053c575f80fd5b5061024e61054b366004611ce3565b610c5d565b34801561055b575f80fd5b5061028c610cc4565b34801561056f575f80fd5b506102b861057e366004611bef565b610cd3565b34801561058e575f80fd5b5061024e61059d366004611c19565b610ce0565b3480156105ad575f80fd5b506103cb7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b3480156105e0575f80fd5b5061024e6105ef366004611ce3565b610da2565b3480156105ff575f80fd5b5061026560095481565b348015610614575f80fd5b5061024e610623366004611c19565b610e53565b348015610633575f80fd5b5061024e610642366004611c3b565b610edd565b348015610652575f80fd5b5061024e610661366004611c19565b610f5b565b348015610671575f80fd5b5061024e610680366004611c3b565b6110aa565b348015610690575f80fd5b5061024e61069f366004611c19565b6110f3565b3480156106af575f80fd5b5060105461034890600160a01b900460ff1681565b3480156106cf575f80fd5b506102b86106de366004611c19565b60076020525f908152604090205460ff1681565b3480156106fd575f80fd5b5061026561070c366004611d1a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610741575f80fd5b506102b8610750366004611c19565b60086020525f908152604090205460ff1681565b34801561076f575f80fd5b5061024e61077e366004611c19565b611269565b34801561078e575f80fd5b50600d546103cb906001600160a01b031681565b3480156107ad575f80fd5b5061024e6112a6565b3480156107c1575f80fd5b5060105461034890600160a81b900460ff1681565b6060600380546107e590611d46565b80601f016020809104026020016040519081016040528092919081815260200182805461081190611d46565b801561085c5780601f106108335761010080835404028352916020019161085c565b820191905f5260205f20905b81548152906001019060200180831161083f57829003601f168201915b5050505050905090565b5f33610873818585611342565b60019150505b92915050565b610887611354565b6001600160a01b03811615806108a557506001600160a01b03811630145b806108bd5750600f546001600160a01b038281169116145b156108eb57604051635f9535e560e11b81526001600160a01b03821660048201526024015b60405180910390fd5b600f546040516001600160a01b038084169216907f18fc3ba4f62cf4833f55b864292e6863d464b3d906a761e44ad014bc14a055c6905f90a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b61094e611354565b601981111561097a5760405163506f007160e01b815260048101829052601960248201526044016108e2565b600a5460408051918252602082018390527fde4022aab72c416fa5c54f5b02a3d8ce50d8a9418a85c790d51cf759ebb4697d910160405180910390a1600a55565b5f336109c8858285611381565b6109d38585856113f6565b506001949350505050565b6109e6611354565b6001600160a01b0381161580610a0457506001600160a01b03811630145b80610a1c5750600d546001600160a01b038281169116145b80610ab857507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aac9190611d7e565b6001600160a01b031614155b15610ae15760405163e2959edb60e01b81526001600160a01b03821660048201526024016108e2565b600d546040516001600160a01b038084169216907f363beda10ebf02584eda9ab4ca38e353bc57591b50714ba84692ed584280672d905f90a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b610b44611354565b610b4c611453565b565b610b56611354565b6019811115610b825760405163506f007160e01b815260048101829052601960248201526044016108e2565b60095460408051918252602082018390527fc66f11a4e1af275a2ecb111e96ff29a572358bd3abd0d8851f439ca0f4aa40ac910160405180910390a1600955565b610bcb611354565b610b4c5f611736565b610bdc611354565b610be68183611dad565b60ff165f03610c0a5760405163cc90e88360e01b81525f60048201526024016108e2565b610c148183611dad565b6010805462ff00ff60a01b1916600160b01b60ff9384160260ff60a01b191617600160a01b948316949094029390931760ff60a81b1916600160a81b9290911691909102179055565b610c65611354565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f2c3bf8535205cd5836e82c4509edb0b2d59ca58bfecd1cc0a511828828881dba91015b60405180910390a25050565b6060600480546107e590611d46565b5f336108738185856113f6565b610ce8611354565b6001600160a01b0381161580610d0657506001600160a01b03811630145b80610d1e5750600e546001600160a01b038281169116145b15610d4757604051635f9535e560e11b81526001600160a01b03821660048201526024016108e2565b600e546040516001600160a01b038084169216907f7dba0a5693978c89a298b760efee1931a0b2815b9deb02129ad881e64767cff5905f90a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b610daa611354565b6010546001600160a01b0383811691161480610dd35750600d546001600160a01b038381169116145b15610dfc57604051635f9535e560e11b81526001600160a01b03831660048201526024016108e2565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527f68eb8038e65b90dcf733cc7d3ea22c9b5623b245737f1dba379e61416b094b759101610cb8565b610e5b611354565b6001600160a01b0381161580610e7957506001600160a01b03811630145b15610ea257604051631c75e49760e01b81526001600160a01b03821660048201526024016108e2565b6001600160a01b03165f9081526008602090815260408083208054600160ff1991821681179092556007909352922080549091169091179055565b610ee5611354565b6064610ef060025490565b610efa9190611dc6565b811015610f1a576040516361f717e160e11b815260040160405180910390fd5b600c5460408051918252602082018390527f7a67d9ff36dd9cfc97e4bec7285f664fae66a1fe883052d5b46346773a0057b9910160405180910390a1600c55565b6001600160a01b038116301480610f7957506001600160a01b038116155b15610fa257604051635f9535e560e11b81526001600160a01b03821660048201526024016108e2565b6040516370a0823160e01b815230600482015281905f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610fe8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100c9190611de5565b9050805f036110305760405163d88b230d60e01b81525f60048201526024016108e2565b600f5460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303815f875af1158015611080573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a49190611dfc565b50505050565b6110b2611354565b600b5460408051918252602082018390527fe2f0d2b9bd62fe4d997e442d96308c2084de77174fc94e18e14bf473b030f4dd910160405180910390a1600b55565b6110fb611354565b5f816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611138573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115c9190611d7e565b90505f826001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111bf9190611d7e565b90506001600160a01b03821630148015906111e357506001600160a01b0381163014155b1561120c57604051635f9535e560e11b81526001600160a01b03841660048201526024016108e2565b6010546040516001600160a01b038086169216907f64f805d25d00b4b9f3a22a1ccccdbcc3b12948681a091c3643be5488fbe85a81905f90a35050601080546001600160a01b0319166001600160a01b0392909216919091179055565b611271611354565b6001600160a01b03811661129a57604051631e4fbdf760e01b81525f60048201526024016108e2565b6112a381611736565b50565b475f8190036112ca5760405163d88b230d60e01b81525f60048201526024016108e2565b600f546040515f916001600160a01b03169047908381818185875af1925050503d805f8114611314576040519150601f19603f3d011682016040523d82523d5f602084013e611319565b606091505b505090508061133e5760405163d88b230d60e01b8152600160048201526024016108e2565b5050565b61134f8383836001611787565b505050565b6005546001600160a01b03163314610b4c5760405163118cdaa760e01b81523360048201526024016108e2565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146110a457818110156113e857604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016108e2565b6110a484848484035f611787565b6001600160a01b03831661141f57604051634b637e8f60e11b81525f60048201526024016108e2565b6001600160a01b0382166114485760405163ec442f0560e01b81525f60048201526024016108e2565b61134f838383611859565b6010805460ff60b81b1916600160b81b179055305f9081526020818152604080832054815160028082526060820184529194939092908301908036833701905050905030815f815181106114a9576114a9611e17565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106114fd576114fd611e17565b6001600160a01b039283166020918202929092010152600d5460405163791ac94760e01b815291169063791ac947906115429085905f90869030904290600401611e2b565b5f604051808303815f87803b158015611559575f80fd5b505af115801561156b573d5f803e3d5ffd5b5050601054479250600160b01b900460ff16159050611724576010545f9060ff600160b01b82048116916115a891600160a01b9091041684611e9c565b6115b29190611dc6565b6010549091505f9060ff600160b01b82048116916115d991600160a81b9091041685611e9c565b6115e39190611dc6565b600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611632576040519150601f19603f3d011682016040523d82523d5f602084013e611637565b606091505b505090508061168357600e546040518481526001600160a01b03909116907f3aa9c48059ec71098c4c50a2ff39cb5bb4f4be1fc8192f76dbcfe829242a76649060200160405180910390a25b600f546040516001600160a01b039091169083905f81818185875af1925050503d805f81146116cd576040519150601f19603f3d011682016040523d82523d5f602084013e6116d2565b606091505b5050809150508061172057600e546040518481526001600160a01b03909116907f3aa9c48059ec71098c4c50a2ff39cb5bb4f4be1fc8192f76dbcfe829242a76649060200160405180910390a25b5050505b50506010805460ff60b81b1916905550565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0384166117b05760405163e602df0560e01b81525f60048201526024016108e2565b6001600160a01b0383166117d957604051634a1406b160e11b81525f60048201526024016108e2565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110a457826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161184b91815260200190565b60405180910390a350505050565b6001600160a01b038381165f90815260086020526040808220549285168252902054600c5460ff928316929091169083111561194d578180156118b457506001600160a01b0384165f9081526007602052604090205460ff16155b156118d2576040516367a6ec0360e01b815260040160405180910390fd5b8080156118f757506001600160a01b0385165f9081526007602052604090205460ff16155b15611915576040516367a6ec0360e01b815260040160405180910390fd5b6001600160a01b0385165f9081526007602052604090205460ff1661194d576040516367a6ec0360e01b815260040160405180910390fd5b6010545f90600160b81b900460ff16158015611967575081155b80156119835750600b54305f9081526020819052604090205410155b9050801561199357611993611453565b6010545f90600160b81b900460ff161580156119e957506001600160a01b0387165f9081526006602052604090205460ff16806119e757506001600160a01b0386165f9081526006602052604090205460ff165b155b90505f8115611a54578415611a1957606460095487611a089190611e9c565b611a129190611dc6565b9050611a3c565b8315611a3c576064600a5487611a2f9190611e9c565b611a399190611dc6565b90505b611a47883083611a69565b611a518187611eb3565b95505b611a5f888888611a69565b5050505050505050565b6001600160a01b038316611a93578060025f828254611a889190611ec6565b90915550611b039050565b6001600160a01b0383165f9081526020819052604090205481811015611ae55760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016108e2565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216611b1f57600280548290039055611b3d565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8291815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015611bbb57858101830151858201604001528201611b9f565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146112a3575f80fd5b5f8060408385031215611c00575f80fd5b8235611c0b81611bdb565b946020939093013593505050565b5f60208284031215611c29575f80fd5b8135611c3481611bdb565b9392505050565b5f60208284031215611c4b575f80fd5b5035919050565b5f805f60608486031215611c64575f80fd5b8335611c6f81611bdb565b92506020840135611c7f81611bdb565b929592945050506040919091013590565b803560ff81168114611ca0575f80fd5b919050565b5f8060408385031215611cb6575f80fd5b611cbf83611c90565b9150611ccd60208401611c90565b90509250929050565b80151581146112a3575f80fd5b5f8060408385031215611cf4575f80fd5b8235611cff81611bdb565b91506020830135611d0f81611cd6565b809150509250929050565b5f8060408385031215611d2b575f80fd5b8235611d3681611bdb565b91506020830135611d0f81611bdb565b600181811c90821680611d5a57607f821691505b602082108103611d7857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611d8e575f80fd5b8151611c3481611bdb565b634e487b7160e01b5f52601160045260245ffd5b60ff818116838216019081111561087957610879611d99565b5f82611de057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611df5575f80fd5b5051919050565b5f60208284031215611e0c575f80fd5b8151611c3481611cd6565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611e7b5784516001600160a01b031683529383019391830191600101611e56565b50506001600160a01b03969096166060850152505050608001529392505050565b808202811582820484141761087957610879611d99565b8181038181111561087957610879611d99565b8082018082111561087957610879611d9956fea2646970667358221220fc515073a64dbdb2bfc1746f50048cf1bbc3e7ac64c5bffd383290c3e818f13d64736f6c63430008180033

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

0000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877000000000000000000000000430732094a39c4bda694121e4513041fab878cab0000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877

-----Decoded View---------------
Arg [0] : _ownerWallet (address): 0x2FB70Dd1b7677C29103BCD280cF061b81357b877
Arg [1] : _mktWallet (address): 0x430732094A39c4BdA694121E4513041fAb878CaB
Arg [2] : _devWallet (address): 0x2FB70Dd1b7677C29103BCD280cF061b81357b877

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877
Arg [1] : 000000000000000000000000430732094a39c4bda694121e4513041fab878cab
Arg [2] : 0000000000000000000000002fb70dd1b7677c29103bcd280cf061b81357b877


Deployed Bytecode Sourcemap

35344:14458:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35760:28;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;35760:28:0;;;;;;;;25524:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27817:190::-;;;;;;;;;;-1:-1:-1;27817:190:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;27817:190:0;1205:187:1;26626:99:0;;;;;;;;;;-1:-1:-1;26705:12:0;;26626:99;;40015:352;;;;;;;;;;-1:-1:-1;40015:352:0;;;;;:::i;:::-;;:::i;44106:201::-;;;;;;;;;;-1:-1:-1;44106:201:0;;;;;:::i;:::-;;:::i;28585:249::-;;;;;;;;;;-1:-1:-1;28585:249:0;;;;;:::i;:::-;;:::i;49635:84::-;;;;;;;;;;-1:-1:-1;49710:1:0;49635:84;;;2467:4:1;2455:17;;;2437:36;;2425:2;2410:18;49635:84:0;2295:184:1;41502:487:0;;;;;;;;;;-1:-1:-1;41502:487:0;;;;;:::i;:::-;;:::i;43496:75::-;;;;;;;;;;;;;:::i;43740:197::-;;;;;;;;;;-1:-1:-1;43740:197:0;;;;;:::i;:::-;;:::i;36047:28::-;;;;;;;;;;-1:-1:-1;36047:28:0;;;;-1:-1:-1;;;;;36047:28:0;;;;;;-1:-1:-1;;;;;2648:32:1;;;2630:51;;2618:2;2603:18;36047:28:0;2484:203:1;35532:49:0;;;;;;;;;;-1:-1:-1;35532:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35725:28;;;;;;;;;;;;;;;;26788:118;;;;;;;;;;-1:-1:-1;26788:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;26880:18:0;26853:7;26880:18;;;;;;;;;;;;26788:118;22081:103;;;;;;;;;;;;;:::i;35979:30::-;;;;;;;;;;-1:-1:-1;35979:30:0;;;;-1:-1:-1;;;;;35979:30:0;;;45269:307;;;;;;;;;;-1:-1:-1;45269:307:0;;;;;:::i;:::-;;:::i;36158:30::-;;;;;;;;;;-1:-1:-1;36158:30:0;;;;-1:-1:-1;;;36158:30:0;;;;;;35403:39;;;;;;;;;;;;35439:3;35403:39;;35795:26;;;;;;;;;;;;;;;;21406:87;;;;;;;;;;-1:-1:-1;21479:6:0;;-1:-1:-1;;;;;21479:6:0;21406:87;;36016:24;;;;;;;;;;-1:-1:-1;36016:24:0;;;;-1:-1:-1;;;;;36016:24:0;;;42568:213;;;;;;;;;;-1:-1:-1;42568:213:0;;;;;:::i;:::-;;:::i;25734:95::-;;;;;;;;;;;;;:::i;27111:182::-;;;;;;;;;;-1:-1:-1;27111:182:0;;;;;:::i;:::-;;:::i;39276:461::-;;;;;;;;;;-1:-1:-1;39276:461:0;;;;;:::i;:::-;;:::i;35943:29::-;;;;;;;;;;;;;;;43051:332;;;;;;;;;;-1:-1:-1;43051:332:0;;;;;:::i;:::-;;:::i;35691:27::-;;;;;;;;;;;;;;;;42118:240;;;;;;;;;;-1:-1:-1;42118:240:0;;;;;:::i;:::-;;:::i;44771:220::-;;;;;;;;;;-1:-1:-1;44771:220:0;;;;;:::i;:::-;;:::i;46118:361::-;;;;;;;;;;-1:-1:-1;46118:361:0;;;;;:::i;:::-;;:::i;44469:171::-;;;;;;;;;;-1:-1:-1;44469:171:0;;;;;:::i;:::-;;:::i;40712:446::-;;;;;;;;;;-1:-1:-1;40712:446:0;;;;;:::i;:::-;;:::i;36084:33::-;;;;;;;;;;-1:-1:-1;36084:33:0;;;;-1:-1:-1;;;36084:33:0;;;;;;35588:51;;;;;;;;;;-1:-1:-1;35588:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27356:142;;;;;;;;;;-1:-1:-1;27356:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;27463:18:0;;;27436:7;27463:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;27356:142;35646:38;;;;;;;;;;-1:-1:-1;35646:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22339:220;;;;;;;;;;-1:-1:-1;22339:220:0;;;;;:::i;:::-;;:::i;35830:106::-;;;;;;;;;;-1:-1:-1;35830:106:0;;;;-1:-1:-1;;;;;35830:106:0;;;45665:274;;;;;;;;;;;;;:::i;36124:27::-;;;;;;;;;;-1:-1:-1;36124:27:0;;;;-1:-1:-1;;;36124:27:0;;;;;;25524:91;25569:13;25602:5;25595:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25524:91;:::o;27817:190::-;27890:4;10385:10;27946:31;10385:10;27962:7;27971:5;27946:8;:31::i;:::-;27995:4;27988:11;;;27817:190;;;;;:::o;40015:352::-;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;40108:24:0;::::1;::::0;;:68:::1;;-1:-1:-1::0;;;;;;40149:27:0;::::1;40171:4;40149:27;40108:68;:108;;;-1:-1:-1::0;40207:9:0::1;::::0;-1:-1:-1;;;;;40193:23:0;;::::1;40207:9:::0;::::1;40193:23;40108:108;40090:182;;;40235:37;::::0;-1:-1:-1;;;40235:37:0;;-1:-1:-1;;;;;2648:32:1;;40235:37:0::1;::::0;::::1;2630:51:1::0;2603:18;;40235:37:0::1;;;;;;;;40090:182;40304:9;::::0;40288:38:::1;::::0;-1:-1:-1;;;;;40288:38:0;;::::1;::::0;40304:9:::1;::::0;40288:38:::1;::::0;40304:9:::1;::::0;40288:38:::1;40337:9;:22:::0;;-1:-1:-1;;;;;;40337:22:0::1;-1:-1:-1::0;;;;;40337:22:0;;;::::1;::::0;;;::::1;::::0;;40015:352::o;44106:201::-;21292:13;:11;:13::i;:::-;44184:2:::1;44177:4;:9;44173:53;;;44195:31;::::0;-1:-1:-1;;;44195:31:0;;::::1;::::0;::::1;4815:25:1::0;;;44223:2:0::1;4856:18:1::0;;;4849:34;4788:18;;44195:31:0::1;4632:257:1::0;44173:53:0::1;44256:9;::::0;44242:30:::1;::::0;;4815:25:1;;;4871:2;4856:18;;4849:34;;;44242:30:0::1;::::0;4788:18:1;44242:30:0::1;;;;;;;44283:9;:16:::0;44106:201::o;28585:249::-;28672:4;10385:10;28730:37;28746:4;10385:10;28761:5;28730:15;:37::i;:::-;28778:26;28788:4;28794:2;28798:5;28778:9;:26::i;:::-;-1:-1:-1;28822:4:0;;28585:249;-1:-1:-1;;;;28585:249:0:o;41502:487::-;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;41600:30:0;::::1;::::0;;:80:::1;;-1:-1:-1::0;;;;;;41647:33:0;::::1;41675:4;41647:33;41600:80;:132;;;-1:-1:-1::0;41725:6:0::1;::::0;-1:-1:-1;;;;;41697:35:0;;::::1;41725:6:::0;::::1;41697:35;41600:132;:200;;;;41796:4;-1:-1:-1::0;;;;;41749:51:0::1;41768:16;-1:-1:-1::0;;;;;41749:41:0::1;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41749:51:0::1;;;41600:200;41582:280;;;41819:43;::::0;-1:-1:-1;;;41819:43:0;;-1:-1:-1;;;;;2648:32:1;;41819:43:0::1;::::0;::::1;2630:51:1::0;2603:18;;41819:43:0::1;2484:203:1::0;41582:280:0::1;41899:6;::::0;41878:47:::1;::::0;-1:-1:-1;;;;;41878:47:0;;::::1;::::0;41899:6:::1;::::0;41878:47:::1;::::0;41899:6:::1;::::0;41878:47:::1;41936:6;:45:::0;;-1:-1:-1;;;;;;41936:45:0::1;-1:-1:-1::0;;;;;41936:45:0;;;::::1;::::0;;;::::1;::::0;;41502:487::o;43496:75::-;21292:13;:11;:13::i;:::-;43552:11:::1;:9;:11::i;:::-;43496:75::o:0;43740:197::-;21292:13;:11;:13::i;:::-;43817:2:::1;43810:4;:9;43806:53;;;43828:31;::::0;-1:-1:-1;;;43828:31:0;;::::1;::::0;::::1;4815:25:1::0;;;43856:2:0::1;4856:18:1::0;;;4849:34;4788:18;;43828:31:0::1;4632:257:1::0;43806:53:0::1;43888:8;::::0;43875:28:::1;::::0;;4815:25:1;;;4871:2;4856:18;;4849:34;;;43875:28:0::1;::::0;4788:18:1;43875:28:0::1;;;;;;;43914:8;:15:::0;43740:197::o;22081:103::-;21292:13;:11;:13::i;:::-;22146:30:::1;22173:1;22146:18;:30::i;45269:307::-:0;21292:13;:11;:13::i;:::-;45388:23:::1;45401:10:::0;45388;:23:::1;:::i;:::-;:28;;45415:1;45388:28:::0;45384:61:::1;;45425:20;::::0;-1:-1:-1;;;45425:20:0;;45443:1:::1;45425:20;::::0;::::1;2437:36:1::0;2410:18;;45425:20:0::1;2295:184:1::0;45384:61:0::1;45471:23;45484:10:::0;45471;:23:::1;:::i;:::-;45456:12;:38:::0;;-1:-1:-1;;;;45505:29:0;-1:-1:-1;;;45456:38:0::1;::::0;;::::1;;-1:-1:-1::0;;;;45505:29:0;;-1:-1:-1;;;45505:29:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;45545:23:0::1;-1:-1:-1::0;;;45545:23:0;;;::::1;::::0;;;::::1;;::::0;;45269:307::o;42568:213::-;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;42687:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;;;;:34;;-1:-1:-1;;42687:34:0::1;::::0;::::1;;::::0;;::::1;::::0;;;42737:36;;1345:41:1;;;42737:36:0::1;::::0;1318:18:1;42737:36:0::1;;;;;;;;42568:213:::0;;:::o;25734:95::-;25781:13;25814:7;25807:14;;;;;:::i;27111:182::-;27180:4;10385:10;27236:27;10385:10;27253:2;27257:5;27236:9;:27::i;39276:461::-;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;39400:33:0;::::1;::::0;;:86:::1;;-1:-1:-1::0;;;;;;39450:36:0;::::1;39481:4;39450:36;39400:86;:141;;;-1:-1:-1::0;39526:15:0::1;::::0;-1:-1:-1;;;;;39503:38:0;;::::1;39526:15:::0;::::1;39503:38;39400:141;39382:224;;;39560:46;::::0;-1:-1:-1;;;39560:46:0;;-1:-1:-1;;;;;2648:32:1;;39560:46:0::1;::::0;::::1;2630:51:1::0;2603:18;;39560:46:0::1;2484:203:1::0;39382:224:0::1;39644:15;::::0;39622:59:::1;::::0;-1:-1:-1;;;;;39622:59:0;;::::1;::::0;39644:15:::1;::::0;39622:59:::1;::::0;39644:15:::1;::::0;39622:59:::1;39692:15;:37:::0;;-1:-1:-1;;;;;;39692:37:0::1;-1:-1:-1::0;;;;;39692:37:0;;;::::1;::::0;;;::::1;::::0;;39276:461::o;43051:332::-;21292:13;:11;:13::i;:::-;43182::::1;::::0;-1:-1:-1;;;;;43172:23:0;;::::1;43182:13:::0;::::1;43172:23;::::0;:52:::1;;-1:-1:-1::0;43217:6:0::1;::::0;-1:-1:-1;;;;;43199:25:0;;::::1;43217:6:::0;::::1;43199:25;43172:52;43168:111;;;43246:33;::::0;-1:-1:-1;;;43246:33:0;;-1:-1:-1;;;;;2648:32:1;;43246:33:0::1;::::0;::::1;2630:51:1::0;2603:18;;43246:33:0::1;2484:203:1::0;43168:111:0::1;-1:-1:-1::0;;;;;43290:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:36;;-1:-1:-1;;43290:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43342:33;;1345:41:1;;;43342:33:0::1;::::0;1318:18:1;43342:33:0::1;1205:187:1::0;42118:240:0;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;42183:18:0;::::1;::::0;;:43:::1;;-1:-1:-1::0;;;;;;42205:21:0;::::1;42221:4;42205:21;42183:43;42179:98;;;42248:29;::::0;-1:-1:-1;;;42248:29:0;;-1:-1:-1;;;;;2648:32:1;;42248:29:0::1;::::0;::::1;2630:51:1::0;2603:18;;42248:29:0::1;2484:203:1::0;42179:98:0::1;-1:-1:-1::0;;;;;42288:12:0::1;;::::0;;;:6:::1;:12;::::0;;;;;;;:19;;42303:4:::1;-1:-1:-1::0;;42288:19:0;;::::1;::::0;::::1;::::0;;;42318::::1;:25:::0;;;;;:32;;;;::::1;::::0;;::::1;::::0;;42118:240::o;44771:220::-;21292:13;:11;:13::i;:::-;44867:3:::1;44851:13;26705:12:::0;;;26626:99;44851:13:::1;:19;;;;:::i;:::-;44842:6;:28;44838:66;;;44879:25;;-1:-1:-1::0;;;44879:25:0::1;;;;;;;;;;;44838:66;44932:11;::::0;44920:32:::1;::::0;;4815:25:1;;;4871:2;4856:18;;4849:34;;;44920:32:0::1;::::0;4788:18:1;44920:32:0::1;;;;;;;44963:11;:20:::0;44771:220::o;46118:361::-;-1:-1:-1;;;;;46179:22:0;;46196:4;46179:22;;:45;;-1:-1:-1;;;;;;46205:19:0;;;46179:45;46175:103;;;46246:32;;-1:-1:-1;;;46246:32:0;;-1:-1:-1;;;;;2648:32:1;;46246::0;;;2630:51:1;2603:18;;46246:32:0;2484:203:1;46175:103:0;46342:28;;-1:-1:-1;;;46342:28:0;;46364:4;46342:28;;;2630:51:1;46307:5:0;;46289:9;;-1:-1:-1;;;;;46342:13:0;;;;;2603:18:1;;46342:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46324:46;;46385:7;46396:1;46385:12;46381:47;;46406:22;;-1:-1:-1;;;46406:22:0;;46426:1;46406:22;;;2437:36:1;2410:18;;46406:22:0;2295:184:1;46381:47:0;46452:9;;46439:32;;-1:-1:-1;;;46439:32:0;;-1:-1:-1;;;;;46452:9:0;;;46439:32;;;6472:51:1;6539:18;;;6532:34;;;46439:12:0;;;;;;6445:18:1;;46439:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;46164:315;;46118:361;:::o;44469:171::-;21292:13;:11;:13::i;:::-;44569::::1;::::0;44553:42:::1;::::0;;4815:25:1;;;4871:2;4856:18;;4849:34;;;44553:42:0::1;::::0;4788:18:1;44553:42:0::1;;;;;;;44606:13;:26:::0;44469:171::o;40712:446::-;21292:13;:11;:13::i;:::-;40788:14:::1;40820;-1:-1:-1::0;;;;;40805:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40788:56;;40855:14;40887;-1:-1:-1::0;;;;;40872:37:0::1;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40855:56:::0;-1:-1:-1;;;;;;40926:23:0;::::1;40944:4;40926:23;::::0;::::1;::::0;:50:::1;;-1:-1:-1::0;;;;;;40953:23:0;::::1;40971:4;40953:23;;40926:50;40922:131;;;41000:41;::::0;-1:-1:-1;;;41000:41:0;;-1:-1:-1;;;;;2648:32:1;;41000:41:0::1;::::0;::::1;2630:51:1::0;2603:18;;41000:41:0::1;2484:203:1::0;40922:131:0::1;41079:13;::::0;41068:41:::1;::::0;-1:-1:-1;;;;;41068:41:0;;::::1;::::0;41079:13:::1;::::0;41068:41:::1;::::0;41079:13:::1;::::0;41068:41:::1;-1:-1:-1::0;;41120:13:0::1;:30:::0;;-1:-1:-1;;;;;;41120:30:0::1;-1:-1:-1::0;;;;;41120:30:0;;;::::1;::::0;;;::::1;::::0;;40712:446::o;22339:220::-;21292:13;:11;:13::i;:::-;-1:-1:-1;;;;;22424:22:0;::::1;22420:93;;22470:31;::::0;-1:-1:-1;;;22470:31:0;;22498:1:::1;22470:31;::::0;::::1;2630:51:1::0;2603:18;;22470:31:0::1;2484:203:1::0;22420:93:0::1;22523:28;22542:8;22523:18;:28::i;:::-;22339:220:::0;:::o;45665:274::-;45721:21;45707:11;45757;;;45753:46;;45777:22;;-1:-1:-1;;;45777:22:0;;45797:1;45777:22;;;2437:36:1;2410:18;;45777:22:0;2295:184:1;45753:46:0;45829:9;;:48;;45811:12;;-1:-1:-1;;;;;45829:9:0;;45851:21;;45811:12;45829:48;45811:12;45829:48;45851:21;45829:9;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45810:67;;;45893:7;45888:43;;45909:22;;-1:-1:-1;;;45909:22:0;;45929:1;45909:22;;;2437:36:1;2410:18;;45909:22:0;2295:184:1;45888:43:0;45696:243;;45665:274::o;32644:130::-;32729:37;32738:5;32745:7;32754:5;32761:4;32729:8;:37::i;:::-;32644:130;;;:::o;21571:166::-;21479:6;;-1:-1:-1;;;;;21479:6:0;10385:10;21631:23;21627:103;;21678:40;;-1:-1:-1;;;21678:40:0;;10385:10;21678:40;;;2630:51:1;2603:18;;21678:40:0;2484:203:1;34360:487:0;-1:-1:-1;;;;;27463:18:0;;;34460:24;27463:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;34527:37:0;;34523:317;;34604:5;34585:16;:24;34581:132;;;34637:60;;-1:-1:-1;;;34637:60:0;;-1:-1:-1;;;;;7456:32:1;;34637:60:0;;;7438:51:1;7505:18;;;7498:34;;;7548:18;;;7541:34;;;7411:18;;34637:60:0;7236:345:1;34581:132:0;34756:57;34765:5;34772:7;34800:5;34781:16;:24;34807:5;34756:8;:57::i;29219:308::-;-1:-1:-1;;;;;29303:18:0;;29299:88;;29345:30;;-1:-1:-1;;;29345:30:0;;29372:1;29345:30;;;2630:51:1;2603:18;;29345:30:0;2484:203:1;29299:88:0;-1:-1:-1;;;;;29401:16:0;;29397:88;;29441:32;;-1:-1:-1;;;29441:32:0;;29470:1;29441:32;;;2630:51:1;2603:18;;29441:32:0;2484:203:1;29397:88:0;29495:24;29503:4;29509:2;29513:5;29495:7;:24::i;48498:1049::-;48538:8;:15;;-1:-1:-1;;;;48538:15:0;-1:-1:-1;;;48538:15:0;;;48602:4;-1:-1:-1;26880:18:0;;;;;;;;;;;;48666:16;;48680:1;48666:16;;;;;;;;26880:18;;-1:-1:-1;48666:16:0;;;;;;26880:18;48666:16;;;;;-1:-1:-1;48666:16:0;48642:40;;48711:4;48693;48698:1;48693:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;48693:23:0;;;-1:-1:-1;;;;;48693:23:0;;;;;48737:4;48727;48732:1;48727:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;48727:14:0;;;:7;;;;;;;;;:14;48754:6;;:185;;-1:-1:-1;;;48754:185:0;;:6;;;:57;;:185;;48826:9;;48754:6;;48866:4;;48893;;48913:15;;48754:185;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49009:12:0;;48973:21;;-1:-1:-1;;;;49009:12:0;;;;:16;;-1:-1:-1;49005:508:0;;49116:12;;49042:20;;49116:12;-1:-1:-1;;;49116:12:0;;;;;49066:29;;-1:-1:-1;;;49079:16:0;;;;49066:10;:29;:::i;:::-;49065:63;;;;:::i;:::-;49188:12;;49042:86;;-1:-1:-1;49143:14:0;;49188:12;-1:-1:-1;;;49188:12:0;;;;;49161:23;;-1:-1:-1;;;49174:10:0;;;;49161;:23;:::i;:::-;49160:40;;;;:::i;:::-;49234:15;;:45;;49143:57;;-1:-1:-1;49216:12:0;;-1:-1:-1;;;;;49234:15:0;;;;49262:12;;49216;49234:45;49216:12;49234:45;49262:12;49234:15;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49215:64;;;49299:7;49294:65;;49329:15;;49313:46;;160:25:1;;;-1:-1:-1;;;;;49329:15:0;;;;49313:46;;148:2:1;133:18;49313:46:0;;;;;;;49294:65;49388:9;;:33;;-1:-1:-1;;;;;49388:9:0;;;;49410:6;;49388:33;;;;49410:6;49388:9;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49374:47;;;;;49441:7;49436:65;;49471:15;;49455:46;;160:25:1;;;-1:-1:-1;;;;;49471:15:0;;;;49455:46;;148:2:1;133:18;49455:46:0;;;;;;;49436:65;49027:486;;;49005:508;-1:-1:-1;;49523:8:0;:16;;-1:-1:-1;;;;49523:16:0;;;-1:-1:-1;48498:1049:0:o;22719:191::-;22812:6;;;-1:-1:-1;;;;;22829:17:0;;;-1:-1:-1;;;;;;22829:17:0;;;;;;;22862:40;;22812:6;;;22829:17;22812:6;;22862:40;;22793:16;;22862:40;22782:128;22719:191;:::o;33625:443::-;-1:-1:-1;;;;;33738:19:0;;33734:91;;33781:32;;-1:-1:-1;;;33781:32:0;;33810:1;33781:32;;;2630:51:1;2603:18;;33781:32:0;2484:203:1;33734:91:0;-1:-1:-1;;;;;33839:21:0;;33835:92;;33884:31;;-1:-1:-1;;;33884:31:0;;33912:1;33884:31;;;2630:51:1;2603:18;;33884:31:0;2484:203:1;33835:92:0;-1:-1:-1;;;;;33937:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;33983:78;;;;34034:7;-1:-1:-1;;;;;34018:31:0;34027:5;-1:-1:-1;;;;;34018:31:0;;34043:5;34018:31;;;;160:25:1;;148:2;133:18;;14:177;34018:31:0;;;;;;;;33625:443;;;;:::o;47178:1184::-;-1:-1:-1;;;;;47312:12:0;;;47299:10;47312:12;;;:6;:12;;;;;;;47349:10;;;;;;;;47416:11;;47312:12;;;;;47349:10;;;;47408:19;;47404:296;;;47448:5;:33;;;;-1:-1:-1;;;;;;47458:23:0;;;;;;:19;:23;;;;;;;;47457:24;47448:33;47444:245;;;47490:12;;-1:-1:-1;;;47490:12:0;;;;;;;;;;;47444:245;47526:6;:36;;;;-1:-1:-1;;;;;;47537:25:0;;;;;;:19;:25;;;;;;;;47536:26;47526:36;47522:167;;;47571:12;;-1:-1:-1;;;47571:12:0;;;;;;;;;;;47522:167;-1:-1:-1;;;;;47627:25:0;;;;;;:19;:25;;;;;;;;47622:51;;47661:12;;-1:-1:-1;;;47661:12:0;;;;;;;;;;;47622:51;47728:8;;47712:12;;-1:-1:-1;;;47728:8:0;;;;47727:9;:33;;;;;47754:6;47753:7;47727:33;:91;;;;-1:-1:-1;47805:13:0;;47795:4;26853:7;26880:18;;;;;;;;;;;47777:41;;47727:91;47712:106;;47835:7;47831:51;;;47859:11;:9;:11::i;:::-;47910:8;;47894:12;;-1:-1:-1;;;47910:8:0;;;;47909:9;:77;;;;-1:-1:-1;;;;;;47937:23:0;;;;;;:17;:23;;;;;;;;;:48;;-1:-1:-1;;;;;;47964:21:0;;;;;;:17;:21;;;;;;;;47937:48;47935:51;47909:77;47894:92;;47997:8;48024:7;48020:292;;;48052:5;48048:172;;;35439:3;48093:8;;48085:5;:16;;;;:::i;:::-;48084:30;;;;:::i;:::-;48078:36;;48048:172;;;48140:6;48136:84;;;35439:3;48182:9;;48174:5;:17;;;;:::i;:::-;48173:31;;;;:::i;:::-;48167:37;;48136:84;48234:39;48248:4;48262;48269:3;48234:13;:39::i;:::-;48288:12;48297:3;48288:12;;:::i;:::-;;;48020:292;48324:30;48338:4;48344:2;48348:5;48324:13;:30::i;:::-;47288:1074;;;;;47178:1184;;;:::o;29851:1135::-;-1:-1:-1;;;;;29941:18:0;;29937:552;;30095:5;30079:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;29937:552:0;;-1:-1:-1;29937:552:0;;-1:-1:-1;;;;;30155:15:0;;30133:19;30155:15;;;;;;;;;;;30189:19;;;30185:117;;;30236:50;;-1:-1:-1;;;30236:50:0;;-1:-1:-1;;;;;7456:32:1;;30236:50:0;;;7438:51:1;7505:18;;;7498:34;;;7548:18;;;7541:34;;;7411:18;;30236:50:0;7236:345:1;30185:117:0;-1:-1:-1;;;;;30425:15:0;;:9;:15;;;;;;;;;;30443:19;;;;30425:37;;29937:552;-1:-1:-1;;;;;30505:16:0;;30501:435;;30671:12;:21;;;;;;;30501:435;;;-1:-1:-1;;;;;30887:13:0;;:9;:13;;;;;;;;;;:22;;;;;;30501:435;30968:2;-1:-1:-1;;;;;30953:25:0;30962:4;-1:-1:-1;;;;;30953:25:0;;30972:5;30953:25;;;;160::1;;148:2;133:18;;14:177;30953:25:0;;;;;;;;29851:1135;;;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:247::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;1564:9;1551:23;1583:31;1608:5;1583:31;:::i;:::-;1633:5;1397:247;-1:-1:-1;;;1397:247:1:o;1649:180::-;1708:6;1761:2;1749:9;1740:7;1736:23;1732:32;1729:52;;;1777:1;1774;1767:12;1729:52;-1:-1:-1;1800:23:1;;1649:180;-1:-1:-1;1649:180:1:o;1834:456::-;1911:6;1919;1927;1980:2;1968:9;1959:7;1955:23;1951:32;1948:52;;;1996:1;1993;1986:12;1948:52;2035:9;2022:23;2054:31;2079:5;2054:31;:::i;:::-;2104:5;-1:-1:-1;2161:2:1;2146:18;;2133:32;2174:33;2133:32;2174:33;:::i;:::-;1834:456;;2226:7;;-1:-1:-1;;;2280:2:1;2265:18;;;;2252:32;;1834:456::o;2692:156::-;2758:20;;2818:4;2807:16;;2797:27;;2787:55;;2838:1;2835;2828:12;2787:55;2692:156;;;:::o;2853:252::-;2917:6;2925;2978:2;2966:9;2957:7;2953:23;2949:32;2946:52;;;2994:1;2991;2984:12;2946:52;3017:27;3034:9;3017:27;:::i;:::-;3007:37;;3063:36;3095:2;3084:9;3080:18;3063:36;:::i;:::-;3053:46;;2853:252;;;;;:::o;3110:118::-;3196:5;3189:13;3182:21;3175:5;3172:32;3162:60;;3218:1;3215;3208:12;3233:382;3298:6;3306;3359:2;3347:9;3338:7;3334:23;3330:32;3327:52;;;3375:1;3372;3365:12;3327:52;3414:9;3401:23;3433:31;3458:5;3433:31;:::i;:::-;3483:5;-1:-1:-1;3540:2:1;3525:18;;3512:32;3553:30;3512:32;3553:30;:::i;:::-;3602:7;3592:17;;;3233:382;;;;;:::o;3620:388::-;3688:6;3696;3749:2;3737:9;3728:7;3724:23;3720:32;3717:52;;;3765:1;3762;3755:12;3717:52;3804:9;3791:23;3823:31;3848:5;3823:31;:::i;:::-;3873:5;-1:-1:-1;3930:2:1;3915:18;;3902:32;3943:33;3902:32;3943:33;:::i;4247:380::-;4326:1;4322:12;;;;4369;;;4390:61;;4444:4;4436:6;4432:17;4422:27;;4390:61;4497:2;4489:6;4486:14;4466:18;4463:38;4460:161;;4543:10;4538:3;4534:20;4531:1;4524:31;4578:4;4575:1;4568:15;4606:4;4603:1;4596:15;4460:161;;4247:380;;;:::o;5147:251::-;5217:6;5270:2;5258:9;5249:7;5245:23;5241:32;5238:52;;;5286:1;5283;5276:12;5238:52;5318:9;5312:16;5337:31;5362:5;5337:31;:::i;5403:127::-;5464:10;5459:3;5455:20;5452:1;5445:31;5495:4;5492:1;5485:15;5519:4;5516:1;5509:15;5535:148;5623:4;5602:12;;;5616;;;5598:31;;5641:13;;5638:39;;;5657:18;;:::i;5887:217::-;5927:1;5953;5943:132;;5997:10;5992:3;5988:20;5985:1;5978:31;6032:4;6029:1;6022:15;6060:4;6057:1;6050:15;5943:132;-1:-1:-1;6089:9:1;;5887:217::o;6109:184::-;6179:6;6232:2;6220:9;6211:7;6207:23;6203:32;6200:52;;;6248:1;6245;6238:12;6200:52;-1:-1:-1;6271:16:1;;6109:184;-1:-1:-1;6109:184:1:o;6577:245::-;6644:6;6697:2;6685:9;6676:7;6672:23;6668:32;6665:52;;;6713:1;6710;6703:12;6665:52;6745:9;6739:16;6764:28;6786:5;6764:28;:::i;7718:127::-;7779:10;7774:3;7770:20;7767:1;7760:31;7810:4;7807:1;7800:15;7834:4;7831:1;7824:15;7850:980;8112:4;8160:3;8149:9;8145:19;8191:6;8180:9;8173:25;8217:2;8255:6;8250:2;8239:9;8235:18;8228:34;8298:3;8293:2;8282:9;8278:18;8271:31;8322:6;8357;8351:13;8388:6;8380;8373:22;8426:3;8415:9;8411:19;8404:26;;8465:2;8457:6;8453:15;8439:29;;8486:1;8496:195;8510:6;8507:1;8504:13;8496:195;;;8575:13;;-1:-1:-1;;;;;8571:39:1;8559:52;;8666:15;;;;8631:12;;;;8607:1;8525:9;8496:195;;;-1:-1:-1;;;;;;;8747:32:1;;;;8742:2;8727:18;;8720:60;-1:-1:-1;;;8811:3:1;8796:19;8789:35;8708:3;7850:980;-1:-1:-1;;;7850:980:1:o;8835:168::-;8908:9;;;8939;;8956:15;;;8950:22;;8936:37;8926:71;;8977:18;;:::i;9008:128::-;9075:9;;;9096:11;;;9093:37;;;9110:18;;:::i;9141:125::-;9206:9;;;9227:10;;;9224:36;;;9240:18;;:::i

Swarm Source

ipfs://fc515073a64dbdb2bfc1746f50048cf1bbc3e7ac64c5bffd383290c3e818f13d
Loading...
Loading
Loading...
Loading
[ 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.