ETH Price: $3,433.55 (-1.14%)
 

Overview

Max Total Supply

9,546,707,489.536761683947453427 MONSTA

Holders

56,598 (0.00%)

Transfers

-
13 ( 30.00%)

Market

Price

$0.00 @ 0.000000 ETH (-5.62%)

Onchain Market Cap

$381,200.03

Circulating Supply Market Cap

$358,885.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Based Monsta is a gamified DeFi ecosystem on Base Chain, featuring burn-to-earn vaults and NFT-based challenges like the Keys to the Vault bonus game. It rewards loyalty, strategy, and engagement while reducing supply and redistributing rewards. Powered by Monsta Corp.

Market

Volume (24H):$744.12
Market Capitalization:$358,885.00
Circulating Supply:8,981,366,986.00 MONSTA
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
MONSTA

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 1 : MONSTA.sol
// SPDX-License-Identifier: MIT

/*
+------------------------------------------------------------------+
|   __       __   ______   __    __   ______   ________  ______    |
|  /  \     /  | /      \ /  \  /  | /      \ /        |/      \   |
|  $$  \   /$$ |/$$$$$$  |$$  \ $$ |/$$$$$$  |$$$$$$$$//$$$$$$  |  |
|  $$$  \ /$$$ |$$ |  $$ |$$$  \$$ |$$ \__$$/    $$ |  $$ |__$$ |  |
|  $$$$  /$$$$ |$$ |  $$ |$$$$  $$ |$$      \    $$ |  $$    $$ |  |
|  $$ $$ $$/$$ |$$ |  $$ |$$ $$ $$ | $$$$$$  |   $$ |  $$$$$$$$ |  |
|  $$ |$$$/ $$ |$$ \__$$ |$$ |$$$$ |/  \__$$ |   $$ |  $$ |  $$ |  |
|  $$ | $/  $$ |$$    $$/ $$ | $$$ |$$    $$/    $$ |  $$ |  $$ |  |
|  $$/      $$/  $$$$$$/  $$/   $$/  $$$$$$/     $$/   $$/   $$/   |
+------------------------------------------------------------------+

                         *****************                         
                   *****%@@@@@@@@@@@@@@@@@%*****                   
      @@@@      ***%@@@@@@@@@@@@***@@@@@@@@@@@@%***      @@@@      
    @@#**@@  ***%@@@@@@@%%@@@@@*****@@@@@%%@@@@@@@%***  @@**#@@    
   @@#****@#*%@@@@@@@@@@%****##*****##****%@@@@@@@@@@%*#@****#@@   
   @@*****#@@@@@@%@%***#%*****************%#***%@%@@@@@@******@@   
   @#******#@@***************************************@@#******%@   
   @%********%%*************************************%%********%@   
   @@*********************************************************@@   
   %@#*******************************************************#@#   
   *#@******************************************************#@#*   
  %@@@@*****************************************************@@@@%  
 *%@***********************************************************@%* 
**%@@#*******************************************************#@@%**
**@@@@@%***************************************************%@@@@@**
**@@@@%*************#%************************#%************%@@@@**
*%@@@***************@@@@@@@@%#*********%%@@@@@@@#************#@@@%*
*%@@%****************%@@@@@@@@@@%***@@@@@@@@@@@***************%@@%*
*%@@@@@****************%@@@@@@#*******%@@@@@@***************@@@@@%*
*%@@@@*******************************************************@@@@%*
**@@@#*******************************************************#@@@**
**@@@*********************************************************@@@**
**%@@*#@***************************************************@#*@@%**
 **@@@@@***************************************************@@@@@** 
  *#@@@@***************************************************@@@@#*  
   *#@@@***************************************************@@@#*   
   **%@@%*#@#*****************************************#@#*%@@%**   
     *#@@@@@@@@@***********************************@@@@@@@@@#*     
      **@@@@@@@@@%*******************************%@@@@@@@@@**      
       **%@@@@@@@@@@#*************************#@@@@@@@@@@%**       
         **%@@@@@@@@@@@%*******************%@@@@@@@@@@@%**         
           **%@@@@@@@@@@@@@@%%%#####%%%@@@@@@@@@@@@@@%**           
             ***%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%***             
               ****%@@@@@@@@@@@@@@@@@@@@@@@@@@@%****               
                   ****#%@@@@@@@@@@@@@@@@@%#****                   
                        *******************                        

/*
    01000010 01001111 01001110 01010101 01010011
    01000011 01001111 01000100 01000101
*/

pragma solidity 0.8.26;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// 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.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

// OpenZeppelin Contracts (last updated v5.1.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 ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(
        address spender,
        uint256 value
    ) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 value
    ) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

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

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

        emit Transfer(from, to, value);
    }

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

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

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

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

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

// src/MONSTA.sol

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

    function WETH() external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external payable;
}

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

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

interface IUniswapV2Pair {
    function token0() external view returns (address);

    function token1() external view returns (address);

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

error RecoverySelfTokenNotAllowed();
error ERC20TransferFailed();
error InvalidTaxPercentage();
error SwapFailed();
error ZeroAddress();
error BurnRemovalNotReady();
error TradingNotEnabled();
error MinimumTokensToSellTooHigh();

contract MONSTA is ERC20, Ownable, ReentrancyGuard {
    uint256 public constant BUY_TAX_BPS = 300; // Hardcoded 3% buy tax
    uint256 public constant SELL_TAX_BPS = 300; // Hardcoded 3% sell tax
    uint256 public immutable BURN_REMOVAL_TIMESTAMP; // Timestamp when burn can be removed
    uint256 private constant TWELVE_MONTHS = 365 days;
    uint256 public constant INITIAL_SUPPLY = 10_000_000_000 ether;
    uint256 public minimumTokensToSell;

    address public taxReceiver;
    bool public burnEnabled = true; // Flag to control burn functionality
    bool public tradingEnabled = false;

    address public immutable WETH;
    address public immutable mainPair;
    IUniswapV2Router public activeRouter;

    mapping(address => bool) public isLpPair;
    mapping(address => bool) public isExempt;

    event TaxRecipientUpdate(address taxReceiver);
    event LpPairUpdated(address pair, bool isActive);
    event TaxBurned(uint256 amount);
    event SellBurnPercentageUpdated(uint256 percentage);
    event ExcludedFromTax(address indexed account, bool isExempt);
    event RouterUpdated(address indexed oldRouter, address indexed newRouter);
    event TradingEnabled();
    event MinimumTokensToSellUpdated(uint256 newMinimum);

    constructor(
        address _router,
        address _receiver
    ) ERC20("Based Monsta", "MONSTA") Ownable(msg.sender) {
        if (_router == address(0)) revert ZeroAddress();
        activeRouter = IUniswapV2Router(_router);
        BURN_REMOVAL_TIMESTAMP = block.timestamp + TWELVE_MONTHS;
        IUniswapV2Factory factory = IUniswapV2Factory(
            IUniswapV2Router(_router).factory()
        );
        WETH = IUniswapV2Router(_router).WETH();
        taxReceiver = _receiver;

        // Set deployer as exempt
        isExempt[address(this)] = true;
        isExempt[msg.sender] = true;
        emit ExcludedFromTax(msg.sender, true);

        _mint(msg.sender, INITIAL_SUPPLY);

        // Calculate minimum tokens to sell as 0.001% of total supply
        minimumTokensToSell = INITIAL_SUPPLY / 100000; // 0.001%

        // Create and set the WETH pair
        mainPair = factory.createPair(address(this), WETH);
        isLpPair[mainPair] = true;
        emit LpPairUpdated(mainPair, true);

        // Approve router for max
        _approve(address(this), _router, type(uint256).max);
    }

    function setLpPair(address pair, bool isActive) external onlyOwner {
        isLpPair[pair] = isActive;
        emit LpPairUpdated(pair, isActive);
    }

    function setTaxReceiver(address _taxReceiver) external onlyOwner {
        taxReceiver = _taxReceiver;
        emit TaxRecipientUpdate(_taxReceiver);
    }

    function sellBurnPercentageRemoved() external onlyOwner {
        if (block.timestamp < BURN_REMOVAL_TIMESTAMP) {
            revert BurnRemovalNotReady();
        }
        burnEnabled = false;
        emit SellBurnPercentageUpdated(0);
    }

    function setExempt(address account, bool exempt) external onlyOwner {
        isExempt[account] = exempt;
        emit ExcludedFromTax(account, exempt);
    }

    function _calculateTaxAmounts(
        uint256 totalTax
    ) private view returns (uint256 burnAmount, uint256 keepAmount) {
        if (!burnEnabled) return (0, totalTax);

        burnAmount = totalTax / 3; // 1/3 of tax is burned when enabled
        keepAmount = totalTax - burnAmount; // 2/3 of tax is kept
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Skip trading check for exempt addresses
        if (isExempt[from] || isExempt[to]) {
            super._update(from, to, amount);
            return;
        }

        // Prevent trading if not enabled
        if (!tradingEnabled) {
            revert TradingNotEnabled();
        }

        uint256 taxAmount = 0;

        // Apply hardcoded taxes
        if (isLpPair[from]) {
            // This is a buy - apply fixed 3% tax
            taxAmount = (amount * BUY_TAX_BPS) / 10000;
            if (taxAmount > 0) {
                super._update(from, address(this), taxAmount);
                super._update(from, to, amount - taxAmount);
            }
        } else if (isLpPair[to]) {
            // sell accumulated tokens before applying tax
            _sellAccumulatedTokens();
            // This is a sell - apply fixed 3% tax with optional burn
            taxAmount = (amount * SELL_TAX_BPS) / 10000;
            if (taxAmount > 0) {
                (uint256 burnAmount, uint256 keepAmount) = _calculateTaxAmounts(
                    taxAmount
                );

                super._update(from, address(this), keepAmount);
                if (burnAmount > 0) {
                    _burn(from, burnAmount);
                    emit TaxBurned(burnAmount);
                }
                super._update(from, to, amount - taxAmount);
            }
        } else {
            super._update(from, to, amount);
        }
    }

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

    function burnFrom(address account, uint256 amount) external {
        uint256 currentAllowance = allowance(account, msg.sender);
        if (currentAllowance < amount) {
            revert ERC20InsufficientAllowance(
                msg.sender,
                currentAllowance,
                amount
            );
        }
        _spendAllowance(account, msg.sender, amount);
        _burn(account, amount);
    }

    function recoverERC20(
        address token,
        address to,
        uint256 amount
    ) external onlyOwner {
        if (token == address(this)) {
            revert RecoverySelfTokenNotAllowed();
        }

        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(ERC20.transfer.selector, to, amount)
        );

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ERC20TransferFailed();
        }
    }

    function sellAccumulatedTokens() external onlyOwner {
        _sellAccumulatedTokens();
    }

    function _sellAccumulatedTokens() private nonReentrant {
        uint256 tokenBalance = balanceOf(address(this));

        // Use configurable minimum threshold
        if (tokenBalance < minimumTokensToSell) return;

        // Setup the path for swapping
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        try
            IUniswapV2Router(activeRouter)
                .swapExactTokensForETHSupportingFeeOnTransferTokens(
                    tokenBalance,
                    0,
                    path,
                    taxReceiver,
                    block.timestamp
                )
        {} catch {
            revert SwapFailed();
        }
    }

    function updateRouter(address newRouter) external onlyOwner {
        if (newRouter == address(0)) revert ZeroAddress();

        // Revoke approval from old router
        _approve(address(this), address(activeRouter), 0);

        // Approve new router
        _approve(address(this), newRouter, type(uint256).max);

        emit RouterUpdated(address(activeRouter), newRouter);
        activeRouter = IUniswapV2Router(newRouter);
    }

    function enableTrading() external onlyOwner {
        if (tradingEnabled) return; // Already enabled, just return
        tradingEnabled = true;
        emit TradingEnabled();
    }

    function setMinimumTokensToSell(
        uint256 _minimumTokensToSell
    ) external onlyOwner {
        if (
            _minimumTokensToSell > INITIAL_SUPPLY / 100 ||
            _minimumTokensToSell < 1 gwei
        ) {
            revert MinimumTokensToSellTooHigh();
        }
        minimumTokensToSell = _minimumTokensToSell;
        emit MinimumTokensToSellUpdated(_minimumTokensToSell);
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "paris",
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BurnRemovalNotReady","type":"error"},{"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":[],"name":"ERC20TransferFailed","type":"error"},{"inputs":[],"name":"MinimumTokensToSellTooHigh","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":[],"name":"RecoverySelfTokenNotAllowed","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"SwapFailed","type":"error"},{"inputs":[],"name":"TradingNotEnabled","type":"error"},{"inputs":[],"name":"ZeroAddress","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExempt","type":"bool"}],"name":"ExcludedFromTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"LpPairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMinimum","type":"uint256"}],"name":"MinimumTokensToSellUpdated","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":"oldRouter","type":"address"},{"indexed":true,"internalType":"address","name":"newRouter","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"SellBurnPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"taxReceiver","type":"address"}],"name":"TaxRecipientUpdate","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURN_REMOVAL_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BUY_TAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELL_TAX_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isLpPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensToSell","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":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellAccumulatedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellBurnPercentageRemoved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setLpPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensToSell","type":"uint256"}],"name":"setMinimumTokensToSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxReceiver","type":"address"}],"name":"setTaxReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateRouter","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e06040526008805461ffff60a01b1916600160a01b17905534801561002457600080fd5b5060405161224b38038061224b833981016040819052610043916109e6565b336040518060400160405280600c81526020016b4261736564204d6f6e73746160a01b815250604051806040016040528060068152602001654d4f4e53544160d01b81525081600390816100979190610ab7565b5060046100a48282610ab7565b5050506001600160a01b0381166100d657604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6100df816103ab565b5060016006556001600160a01b03821661010c5760405163d92e233d60e01b815260040160405180910390fd5b600980546001600160a01b0319166001600160a01b0384161790556101356301e1338042610b8b565b608081815250506000826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801561017c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a09190610ba4565b9050826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102049190610ba4565b6001600160a01b0390811660a052600880546001600160a01b031916918416919091179055306000908152600b60209081526040808320805460ff199081166001908117909255338086529483902080549091168217905590519081527fea5814d1cf99e5f6aee98da410ea4adcdbe5ded97855de3b25144b0898d0be4a910160405180910390a26102a2336b204fce5e3e250261100000006103fd565b6102bb620186a06b204fce5e3e25026110000000610bc6565b60075560a0516040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529082169063c9c65396906044016020604051808303816000875af1158015610310573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103349190610ba4565b6001600160a01b031660c08190526000818152600a6020908152604091829020805460ff191660019081179091558251938452908301527fc0c927953cb93244e68ddeea639563c329a6c1e70531563c944940c75b373359910160405180910390a16103a33084600019610437565b505050610c9a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166104275760405163ec442f0560e01b8152600060048201526024016100cd565b61043360008383610449565b5050565b61044483838360016105f9565b505050565b6001600160a01b0383166000908152600b602052604090205460ff168061048857506001600160a01b0382166000908152600b602052604090205460ff165b15610498576104448383836106ce565b600854600160a81b900460ff166104c2576040516312f1f92360e01b815260040160405180910390fd5b6001600160a01b0383166000908152600a602052604081205460ff1615610528576127106104f261012c84610be8565b6104fc9190610bc6565b905080156105235761050f8430836106ce565b610523848461051e8486610bff565b6106ce565b6105f3565b6001600160a01b0383166000908152600a602052604090205460ff16156105e8576105516107f8565b61271061056061012c84610be8565b61056a9190610bc6565b905080156105235760008061057e8361092e565b909250905061058e8630836106ce565b81156105d25761059e868361096a565b6040518281527f7bc024189123a7a1a3d9dfd02ddea903a7022b7461326ff2bce02e7c5a563cab9060200160405180910390a15b6105e1868661051e8688610bff565b50506105f3565b6105f38484846106ce565b50505050565b6001600160a01b0384166106235760405163e602df0560e01b8152600060048201526024016100cd565b6001600160a01b03831661064d57604051634a1406b160e11b8152600060048201526024016100cd565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156105f357826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106c091815260200190565b60405180910390a350505050565b6001600160a01b0383166106f95780600260008282546106ee9190610b8b565b9091555061076b9050565b6001600160a01b0383166000908152602081905260409020548181101561074c5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100cd565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610787576002805482900390556107a6565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516107eb91815260200190565b60405180910390a3505050565b6108006109a0565b306000908152602081905260409020546007548110156108205750610922565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061085557610855610c12565b60200260200101906001600160a01b031690816001600160a01b03168152505060a0518160018151811061088b5761088b610c12565b6001600160a01b03928316602091820292909201015260095460085460405163791ac94760e01b81529183169263791ac947926108d79287926000928892909116904290600401610c28565b600060405180830381600087803b1580156108f157600080fd5b505af1925050508015610902575060015b61091f5760405163081ceff360e41b815260040160405180910390fd5b50505b61092c6001600655565b565b6008546000908190600160a01b900460ff1661094c57506000929050565b610957600384610bc6565b91506109638284610bff565b9050915091565b6001600160a01b03821661099457604051634b637e8f60e11b8152600060048201526024016100cd565b61043382600083610449565b6002600654036109c357604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b80516001600160a01b03811681146109e157600080fd5b919050565b600080604083850312156109f957600080fd5b610a02836109ca565b9150610a10602084016109ca565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680610a4357607f821691505b602082108103610a6357634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561044457806000526020600020601f840160051c81016020851015610a905750805b601f840160051c820191505b81811015610ab05760008155600101610a9c565b5050505050565b81516001600160401b03811115610ad057610ad0610a19565b610ae481610ade8454610a2f565b84610a69565b6020601f821160018114610b185760008315610b005750848201515b600019600385901b1c1916600184901b178455610ab0565b600084815260208120601f198516915b82811015610b485787850151825560209485019460019092019101610b28565b5084821015610b665786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b9e57610b9e610b75565b92915050565b600060208284031215610bb657600080fd5b610bbf826109ca565b9392505050565b600082610be357634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610b9e57610b9e610b75565b81810381811115610b9e57610b9e610b75565b634e487b7160e01b600052603260045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b81811015610c7a5783516001600160a01b0316835260209384019390920191600101610c53565b50506001600160a01b039590951660608401525050608001529392505050565b60805160a05160c051611574610cd7600039600061038401526000818161043e0152610c060152600081816102f201526108d401526115746000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063b1af79f4116100ad578063dc735b4e1161007c578063dc735b4e146104c5578063dd62ed3e146104d8578063e6ef73d6146104eb578063f2fde38b146104fe578063fd657856146103d757600080fd5b8063b1af79f414610483578063c851cc321461048c578063cd8de42c1461049f578063d22d7adb146104b257600080fd5b80639fde54f5116100f45780639fde54f51461040b578063a55b9d0a1461041e578063a9059cbb14610426578063ad5c464814610439578063ad5dff731461046057600080fd5b80638da5cb5b146103c65780639099bd3f146103d757806395d89b41146103e05780639f0c45d4146103e857600080fd5b80634ada218b116101a8578063715018a611610177578063715018a61461035157806379cc67901461035957806380c581d11461036c57806385af30c51461037f5780638a8c523c146103be57600080fd5b80634ada218b146102d95780635112337a146102ed5780635dc96d161461031457806370a082311461032857600080fd5b806318160ddd116101ef57806318160ddd1461027f57806323b872dd146102915780632ff2e9dc146102a4578063313ce567146102b757806342966c68146102c657600080fd5b806302881c721461022157806306fdde031461022b578063095ea7b3146102495780631171bda91461026c575b600080fd5b610229610511565b005b610233610523565b6040516102409190611265565b60405180910390f35b61025c6102573660046112b4565b6105b5565b6040519015158152602001610240565b61022961027a3660046112de565b6105cf565b6002545b604051908152602001610240565b61025c61029f3660046112de565b6106f1565b6102836b204fce5e3e2502611000000081565b60405160128152602001610240565b6102296102d436600461131b565b610715565b60085461025c90600160a81b900460ff1681565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b60085461025c90600160a01b900460ff1681565b610283610336366004611334565b6001600160a01b031660009081526020819052604090205490565b610229610722565b6102296103673660046112b4565b610734565b61022961037a366004611364565b610792565b6103a67f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610240565b6102296107fd565b6005546001600160a01b03166103a6565b61028361012c81565b610233610854565b61025c6103f6366004611334565b600a6020526000908152604090205460ff1681565b610229610419366004611364565b610863565b6102296108ca565b61025c6104343660046112b4565b610956565b6103a67f000000000000000000000000000000000000000000000000000000000000000081565b61025c61046e366004611334565b600b6020526000908152604090205460ff1681565b61028360075481565b61022961049a366004611334565b610964565b6102296104ad366004611334565b610a15565b6009546103a6906001600160a01b031681565b6102296104d336600461131b565b610a72565b6102836104e636600461139b565b610af4565b6008546103a6906001600160a01b031681565b61022961050c366004611334565b610b1f565b610519610b5a565b610521610b87565b565b606060038054610532906113ce565b80601f016020809104026020016040519081016040528092919081815260200182805461055e906113ce565b80156105ab5780601f10610580576101008083540402835291602001916105ab565b820191906000526020600020905b81548152906001019060200180831161058e57829003601f168201915b5050505050905090565b6000336105c3818585610cd9565b60019150505b92915050565b6105d7610b5a565b306001600160a01b0384160361060057604051630aaa31e760e41b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161065c9190611408565b6000604051808303816000865af19150503d8060008114610699576040519150601f19603f3d011682016040523d82523d6000602084013e61069e565b606091505b50915091508115806106cc57508051158015906106cc5750808060200190518101906106ca9190611424565b155b156106ea57604051633c9fd93960e21b815260040160405180910390fd5b5050505050565b6000336106ff858285610ce6565b61070a858585610d4c565b506001949350505050565b61071f3382610dab565b50565b61072a610b5a565b6105216000610de5565b60006107408333610af4565b90508181101561077857604051637dc7a0d960e11b815233600482015260248101829052604481018390526064015b60405180910390fd5b610783833384610ce6565b61078d8383610dab565b505050565b61079a610b5a565b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527fc0c927953cb93244e68ddeea639563c329a6c1e70531563c944940c75b373359910160405180910390a15050565b610805610b5a565b600854600160a81b900460ff16610521576008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610532906113ce565b61086b610b5a565b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915591519182527fea5814d1cf99e5f6aee98da410ea4adcdbe5ded97855de3b25144b0898d0be4a910160405180910390a25050565b6108d2610b5a565b7f000000000000000000000000000000000000000000000000000000000000000042101561091357604051631fa7660560e31b815260040160405180910390fd5b6008805460ff60a01b19169055604051600081527f4e283e70233c34cb75ef5031b7a37d190dcaac716ec8687bf23c43c6245a36c09060200160405180910390a1565b6000336105c3818585610d4c565b61096c610b5a565b6001600160a01b0381166109935760405163d92e233d60e01b815260040160405180910390fd5b6009546109ac9030906001600160a01b03166000610cd9565b6109b93082600019610cd9565b6009546040516001600160a01b038084169216907f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168490600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b610a1d610b5a565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f53b4c57ab28dab0b5b0b5b5095338f6a76aa28f9005cf6f2963ee3db9869a0e2906020015b60405180910390a150565b610a7a610b5a565b610a9160646b204fce5e3e25026110000000611457565b811180610aa15750633b9aca0081105b15610abf5760405163d1381c1560e01b815260040160405180910390fd5b60078190556040518181527f6c167b1d8a066281f553a571424ece1c23ae284bb2d66ad1409f42f6b23b8d4b90602001610a67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610b27610b5a565b6001600160a01b038116610b5157604051631e4fbdf760e01b81526000600482015260240161076f565b61071f81610de5565b6005546001600160a01b031633146105215760405163118cdaa760e01b815233600482015260240161076f565b610b8f610e37565b30600090815260208190526040902054600754811015610baf5750610ccf565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110610be457610be4611479565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610c3857610c38611479565b6001600160a01b03928316602091820292909201015260095460085460405163791ac94760e01b81529183169263791ac94792610c84928792600092889290911690429060040161148f565b600060405180830381600087803b158015610c9e57600080fd5b505af1925050508015610caf575060015b610ccc5760405163081ceff360e41b815260040160405180910390fd5b50505b6105216001600655565b61078d8383836001610e61565b6000610cf28484610af4565b90506000198114610d465781811015610d3757604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161076f565b610d4684848484036000610e61565b50505050565b6001600160a01b038316610d7657604051634b637e8f60e11b81526000600482015260240161076f565b6001600160a01b038216610da05760405163ec442f0560e01b81526000600482015260240161076f565b61078d838383610f36565b6001600160a01b038216610dd557604051634b637e8f60e11b81526000600482015260240161076f565b610de182600083610f36565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600260065403610e5a57604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b6001600160a01b038416610e8b5760405163e602df0560e01b81526000600482015260240161076f565b6001600160a01b038316610eb557604051634a1406b160e11b81526000600482015260240161076f565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610d4657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f2891815260200190565b60405180910390a350505050565b6001600160a01b0383166000908152600b602052604090205460ff1680610f7557506001600160a01b0382166000908152600b602052604090205460ff165b15610f855761078d8383836110db565b600854600160a81b900460ff16610faf576040516312f1f92360e01b815260040160405180910390fd5b6001600160a01b0383166000908152600a602052604081205460ff161561101557612710610fdf61012c84611501565b610fe99190611457565b9050801561101057610ffc8430836110db565b611010848461100b8486611518565b6110db565b610d46565b6001600160a01b0383166000908152600a602052604090205460ff16156110d45761103e610b87565b61271061104d61012c84611501565b6110579190611457565b905080156110105760008061106b83611205565b9150915061107a8630836110db565b81156110be5761108a8683610dab565b6040518281527f7bc024189123a7a1a3d9dfd02ddea903a7022b7461326ff2bce02e7c5a563cab9060200160405180910390a15b6110cd868661100b8688611518565b5050610d46565b610d468484845b6001600160a01b0383166111065780600260008282546110fb919061152b565b909155506111789050565b6001600160a01b038316600090815260208190526040902054818110156111595760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161076f565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611194576002805482900390556111b3565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111f891815260200190565b60405180910390a3505050565b6008546000908190600160a01b900460ff1661122357506000929050565b61122e600384611457565b915061123a8284611518565b9050915091565b60005b8381101561125c578181015183820152602001611244565b50506000910152565b6020815260008251806020840152611284816040850160208701611241565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146112af57600080fd5b919050565b600080604083850312156112c757600080fd5b6112d083611298565b946020939093013593505050565b6000806000606084860312156112f357600080fd5b6112fc84611298565b925061130a60208501611298565b929592945050506040919091013590565b60006020828403121561132d57600080fd5b5035919050565b60006020828403121561134657600080fd5b61134f82611298565b9392505050565b801515811461071f57600080fd5b6000806040838503121561137757600080fd5b61138083611298565b9150602083013561139081611356565b809150509250929050565b600080604083850312156113ae57600080fd5b6113b783611298565b91506113c560208401611298565b90509250929050565b600181811c908216806113e257607f821691505b60208210810361140257634e487b7160e01b600052602260045260246000fd5b50919050565b6000825161141a818460208701611241565b9190910192915050565b60006020828403121561143657600080fd5b815161134f81611356565b634e487b7160e01b600052601160045260246000fd5b60008261147457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b818110156114e15783516001600160a01b03168352602093840193909201916001016114ba565b50506001600160a01b039590951660608401525050608001529392505050565b80820281158282048414176105c9576105c9611441565b818103818111156105c9576105c9611441565b808201808211156105c9576105c961144156fea2646970667358221220185d54cd93db1a41921a2385b028f19f4758ef2547282e956ee8d4142f9cce1e64736f6c634300081a00330000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000b60c8ffa8f808fff9c604ebbbfcf8a23ff22e385

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80638da5cb5b11610125578063b1af79f4116100ad578063dc735b4e1161007c578063dc735b4e146104c5578063dd62ed3e146104d8578063e6ef73d6146104eb578063f2fde38b146104fe578063fd657856146103d757600080fd5b8063b1af79f414610483578063c851cc321461048c578063cd8de42c1461049f578063d22d7adb146104b257600080fd5b80639fde54f5116100f45780639fde54f51461040b578063a55b9d0a1461041e578063a9059cbb14610426578063ad5c464814610439578063ad5dff731461046057600080fd5b80638da5cb5b146103c65780639099bd3f146103d757806395d89b41146103e05780639f0c45d4146103e857600080fd5b80634ada218b116101a8578063715018a611610177578063715018a61461035157806379cc67901461035957806380c581d11461036c57806385af30c51461037f5780638a8c523c146103be57600080fd5b80634ada218b146102d95780635112337a146102ed5780635dc96d161461031457806370a082311461032857600080fd5b806318160ddd116101ef57806318160ddd1461027f57806323b872dd146102915780632ff2e9dc146102a4578063313ce567146102b757806342966c68146102c657600080fd5b806302881c721461022157806306fdde031461022b578063095ea7b3146102495780631171bda91461026c575b600080fd5b610229610511565b005b610233610523565b6040516102409190611265565b60405180910390f35b61025c6102573660046112b4565b6105b5565b6040519015158152602001610240565b61022961027a3660046112de565b6105cf565b6002545b604051908152602001610240565b61025c61029f3660046112de565b6106f1565b6102836b204fce5e3e2502611000000081565b60405160128152602001610240565b6102296102d436600461131b565b610715565b60085461025c90600160a81b900460ff1681565b6102837f00000000000000000000000000000000000000000000000000000000695c758781565b60085461025c90600160a01b900460ff1681565b610283610336366004611334565b6001600160a01b031660009081526020819052604090205490565b610229610722565b6102296103673660046112b4565b610734565b61022961037a366004611364565b610792565b6103a67f000000000000000000000000a102fbf3e482ea452f9e421403ecdc982b0867c981565b6040516001600160a01b039091168152602001610240565b6102296107fd565b6005546001600160a01b03166103a6565b61028361012c81565b610233610854565b61025c6103f6366004611334565b600a6020526000908152604090205460ff1681565b610229610419366004611364565b610863565b6102296108ca565b61025c6104343660046112b4565b610956565b6103a67f000000000000000000000000420000000000000000000000000000000000000681565b61025c61046e366004611334565b600b6020526000908152604090205460ff1681565b61028360075481565b61022961049a366004611334565b610964565b6102296104ad366004611334565b610a15565b6009546103a6906001600160a01b031681565b6102296104d336600461131b565b610a72565b6102836104e636600461139b565b610af4565b6008546103a6906001600160a01b031681565b61022961050c366004611334565b610b1f565b610519610b5a565b610521610b87565b565b606060038054610532906113ce565b80601f016020809104026020016040519081016040528092919081815260200182805461055e906113ce565b80156105ab5780601f10610580576101008083540402835291602001916105ab565b820191906000526020600020905b81548152906001019060200180831161058e57829003601f168201915b5050505050905090565b6000336105c3818585610cd9565b60019150505b92915050565b6105d7610b5a565b306001600160a01b0384160361060057604051630aaa31e760e41b815260040160405180910390fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161065c9190611408565b6000604051808303816000865af19150503d8060008114610699576040519150601f19603f3d011682016040523d82523d6000602084013e61069e565b606091505b50915091508115806106cc57508051158015906106cc5750808060200190518101906106ca9190611424565b155b156106ea57604051633c9fd93960e21b815260040160405180910390fd5b5050505050565b6000336106ff858285610ce6565b61070a858585610d4c565b506001949350505050565b61071f3382610dab565b50565b61072a610b5a565b6105216000610de5565b60006107408333610af4565b90508181101561077857604051637dc7a0d960e11b815233600482015260248101829052604481018390526064015b60405180910390fd5b610783833384610ce6565b61078d8383610dab565b505050565b61079a610b5a565b6001600160a01b0382166000818152600a6020908152604091829020805460ff19168515159081179091558251938452908301527fc0c927953cb93244e68ddeea639563c329a6c1e70531563c944940c75b373359910160405180910390a15050565b610805610b5a565b600854600160a81b900460ff16610521576008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610532906113ce565b61086b610b5a565b6001600160a01b0382166000818152600b6020908152604091829020805460ff191685151590811790915591519182527fea5814d1cf99e5f6aee98da410ea4adcdbe5ded97855de3b25144b0898d0be4a910160405180910390a25050565b6108d2610b5a565b7f00000000000000000000000000000000000000000000000000000000695c758742101561091357604051631fa7660560e31b815260040160405180910390fd5b6008805460ff60a01b19169055604051600081527f4e283e70233c34cb75ef5031b7a37d190dcaac716ec8687bf23c43c6245a36c09060200160405180910390a1565b6000336105c3818585610d4c565b61096c610b5a565b6001600160a01b0381166109935760405163d92e233d60e01b815260040160405180910390fd5b6009546109ac9030906001600160a01b03166000610cd9565b6109b93082600019610cd9565b6009546040516001600160a01b038084169216907f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168490600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b610a1d610b5a565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527f53b4c57ab28dab0b5b0b5b5095338f6a76aa28f9005cf6f2963ee3db9869a0e2906020015b60405180910390a150565b610a7a610b5a565b610a9160646b204fce5e3e25026110000000611457565b811180610aa15750633b9aca0081105b15610abf5760405163d1381c1560e01b815260040160405180910390fd5b60078190556040518181527f6c167b1d8a066281f553a571424ece1c23ae284bb2d66ad1409f42f6b23b8d4b90602001610a67565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610b27610b5a565b6001600160a01b038116610b5157604051631e4fbdf760e01b81526000600482015260240161076f565b61071f81610de5565b6005546001600160a01b031633146105215760405163118cdaa760e01b815233600482015260240161076f565b610b8f610e37565b30600090815260208190526040902054600754811015610baf5750610ccf565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110610be457610be4611479565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000420000000000000000000000000000000000000681600181518110610c3857610c38611479565b6001600160a01b03928316602091820292909201015260095460085460405163791ac94760e01b81529183169263791ac94792610c84928792600092889290911690429060040161148f565b600060405180830381600087803b158015610c9e57600080fd5b505af1925050508015610caf575060015b610ccc5760405163081ceff360e41b815260040160405180910390fd5b50505b6105216001600655565b61078d8383836001610e61565b6000610cf28484610af4565b90506000198114610d465781811015610d3757604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161076f565b610d4684848484036000610e61565b50505050565b6001600160a01b038316610d7657604051634b637e8f60e11b81526000600482015260240161076f565b6001600160a01b038216610da05760405163ec442f0560e01b81526000600482015260240161076f565b61078d838383610f36565b6001600160a01b038216610dd557604051634b637e8f60e11b81526000600482015260240161076f565b610de182600083610f36565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600260065403610e5a57604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b6001600160a01b038416610e8b5760405163e602df0560e01b81526000600482015260240161076f565b6001600160a01b038316610eb557604051634a1406b160e11b81526000600482015260240161076f565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015610d4657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610f2891815260200190565b60405180910390a350505050565b6001600160a01b0383166000908152600b602052604090205460ff1680610f7557506001600160a01b0382166000908152600b602052604090205460ff165b15610f855761078d8383836110db565b600854600160a81b900460ff16610faf576040516312f1f92360e01b815260040160405180910390fd5b6001600160a01b0383166000908152600a602052604081205460ff161561101557612710610fdf61012c84611501565b610fe99190611457565b9050801561101057610ffc8430836110db565b611010848461100b8486611518565b6110db565b610d46565b6001600160a01b0383166000908152600a602052604090205460ff16156110d45761103e610b87565b61271061104d61012c84611501565b6110579190611457565b905080156110105760008061106b83611205565b9150915061107a8630836110db565b81156110be5761108a8683610dab565b6040518281527f7bc024189123a7a1a3d9dfd02ddea903a7022b7461326ff2bce02e7c5a563cab9060200160405180910390a15b6110cd868661100b8688611518565b5050610d46565b610d468484845b6001600160a01b0383166111065780600260008282546110fb919061152b565b909155506111789050565b6001600160a01b038316600090815260208190526040902054818110156111595760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161076f565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611194576002805482900390556111b3565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111f891815260200190565b60405180910390a3505050565b6008546000908190600160a01b900460ff1661122357506000929050565b61122e600384611457565b915061123a8284611518565b9050915091565b60005b8381101561125c578181015183820152602001611244565b50506000910152565b6020815260008251806020840152611284816040850160208701611241565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146112af57600080fd5b919050565b600080604083850312156112c757600080fd5b6112d083611298565b946020939093013593505050565b6000806000606084860312156112f357600080fd5b6112fc84611298565b925061130a60208501611298565b929592945050506040919091013590565b60006020828403121561132d57600080fd5b5035919050565b60006020828403121561134657600080fd5b61134f82611298565b9392505050565b801515811461071f57600080fd5b6000806040838503121561137757600080fd5b61138083611298565b9150602083013561139081611356565b809150509250929050565b600080604083850312156113ae57600080fd5b6113b783611298565b91506113c560208401611298565b90509250929050565b600181811c908216806113e257607f821691505b60208210810361140257634e487b7160e01b600052602260045260246000fd5b50919050565b6000825161141a818460208701611241565b9190910192915050565b60006020828403121561143657600080fd5b815161134f81611356565b634e487b7160e01b600052601160045260246000fd5b60008261147457634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b818110156114e15783516001600160a01b03168352602093840193909201916001016114ba565b50506001600160a01b039590951660608401525050608001529392505050565b80820281158282048414176105c9576105c9611441565b818103818111156105c9576105c9611441565b808201808211156105c9576105c961144156fea2646970667358221220185d54cd93db1a41921a2385b028f19f4758ef2547282e956ee8d4142f9cce1e64736f6c634300081a0033

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

0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000b60c8ffa8f808fff9c604ebbbfcf8a23ff22e385

-----Decoded View---------------
Arg [0] : _router (address): 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24
Arg [1] : _receiver (address): 0xB60C8ffa8F808FFF9c604ebbBfCF8a23Ff22e385

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24
Arg [1] : 000000000000000000000000b60c8ffa8f808fff9c604ebbbfcf8a23ff22e385


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.