ETH Price: $3,400.84 (+2.13%)

Token

Bullet Game Betting Token (BULLET)
 

Overview

Max Total Supply

9,954,580.11021832 BULLET

Holders

1,014

Market

Price

$0.02 @ 0.000005 ETH (+1.43%)

Onchain Market Cap

$169,588.02

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 8 Decimals)

Balance
5,000 BULLET

Value
$85.18 ( ~0.0250467568943495 Eth) [0.0502%]
0xa497e73f7398bd0443bf9ae8a51a62d83930986b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BulletGame

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-02
*/

/*
   Bullet Game - Play Russian Roulette directly in Telegram

               ,___________________________________________/7_
              |-_______------. `\                             |
          _,/ | _______)     |___\____________________________|
     .__/`((  | _______      | (/))_______________=.
        `~) \ | _______)     |   /----------------_/
          `__y|______________|  /
          / ________ __________/
         / /#####\(  \  /     ))
        / /#######|\  \(     //
       / /########|.\______ad/`
      / /###(\)###||`------``
     / /##########||
    / /###########||
   ( (############||
    \ \####(/)####))
     \ \#########//
      \ \#######//
       `---|_|--`
          ((_))
           `-`

   Telegram:  https://t.me/BulletGameDarkPortal
   Twitter/X: https://twitter.com/BulletGameERC
   Docs:      https://bullet-game.gitbook.io/bullet-game
*/
// SPDX-License-Identifier: MIT

pragma solidity 0.8.19;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

// OpenZeppelin Contracts v4.4.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;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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

    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(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    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, uint value);
    event Transfer(address indexed from, address indexed to, uint 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 (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint 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 (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    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 (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint 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,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

/**
 * @title BulletGame
 * @dev Betting token for Bullet Game
 */
contract BulletGame is Ownable, ERC20 {

    IUniswapV2Router02 public router;
    IUniswapV2Factory public factory;
    IUniswapV2Pair public pair;

    uint private constant INITIAL_SUPPLY = 10_000_000 * 10**8;

    // Percent of the initial supply that will go to the LP
    uint constant LP_BPS = 9000;

    // Percent of the initial supply that will go to marketing
    uint constant MARKETING_BPS = 10_000 - LP_BPS;

    //
    // The tax to deduct, in basis points
    //
    uint public buyTaxBps = 500;
    uint public sellTaxBps = 500;
    //
    bool isSellingCollectedTaxes;

    event AntiBotEngaged();
    event AntiBotDisengaged();
    event StealthLaunchEngaged();

    address public rouletteContract;

    bool public isLaunched;

    address public myWallet;
    address public marketingWallet;
    address public revenueWallet;

    bool public engagedOnce;
    bool public disengagedOnce;

    constructor() ERC20("Bullet Game Betting Token", "BULLET", 8) {
        if (isGoerli()) {
            router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        } else if (isSepolia()) {
            router = IUniswapV2Router02(0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008);
        } else {
            require(block.chainid == 1, "expected mainnet");
            router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        }
        factory = IUniswapV2Factory(router.factory());

        // Approve infinite spending by DEX, to sell tokens collected via tax.
        allowance[address(this)][address(router)] = type(uint).max;
        emit Approval(address(this), address(router), type(uint).max);

        isLaunched = false;
    }

    modifier lockTheSwap() {
        isSellingCollectedTaxes = true;
        _;
        isSellingCollectedTaxes = false;
    }

    modifier onlyTestnet() {
        require(isTestnet(), "not testnet");
        _;
    }

    receive() external payable {}

    fallback() external payable {}

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

    /**
     * @dev Allow minting on testnet so I don't have to deal with
     * buying from Uniswap.
     * @param amount the number of tokens to mint
     */
    function mint(uint amount) external onlyTestnet {
        _mint(address(msg.sender), amount);
    }

    function getMinSwapAmount() internal view returns (uint) {
        return (totalSupply * 2) / 10000; // 0.02%
    }

    function isGoerli() public view returns (bool) {
        return block.chainid == 5;
    }

    function isSepolia() public view returns (bool) {
        return block.chainid == 11155111;
    }

    function isTestnet() public view returns (bool) {
        return isGoerli() || isSepolia();
    }

    function enableAntiBotMode() public onlyOwner {
        require(!engagedOnce, "this is a one shot function");
        engagedOnce = true;
        buyTaxBps = 1000;
        sellTaxBps = 1000;
        emit AntiBotEngaged();
    }

    function disableAntiBotMode() public onlyOwner {
        require(!disengagedOnce, "this is a one shot function");
        disengagedOnce = true;
        buyTaxBps = 500;
        sellTaxBps = 500;
        emit AntiBotDisengaged();
    }

    /**
     * @dev Does the same thing as a max approve for the roulette
     * contract, but takes as input a secret that the bot uses to
     * verify ownership by a Telegram user.
     * @param secret The secret that the bot is expecting.
     * @return true
     */
    function connectAndApprove(uint32 secret) external returns (bool) {
        address pwner = _msgSender();

        allowance[pwner][rouletteContract] = type(uint).max;
        emit Approval(pwner, rouletteContract, type(uint).max);

        return true;
    }

    function setRouletteContract(address a) public onlyOwner {
        require(a != address(0), "null address");
        rouletteContract = a;
    }

    function setMyWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        myWallet = wallet;
    }

    function setMarketingWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        marketingWallet = wallet;
    }

    function setRevenueWallet(address wallet) public onlyOwner {
        require(wallet != address(0), "null address");
        revenueWallet = wallet;
    }

    function stealthLaunch() external payable onlyOwner {
        require(!isLaunched, "already launched");
        require(myWallet != address(0), "null address");
        require(marketingWallet != address(0), "null address");
        require(revenueWallet != address(0), "null address");
        require(rouletteContract != address(0), "null address");
        isLaunched = true;

        _mint(address(this), INITIAL_SUPPLY * LP_BPS / 10_000);

        router.addLiquidityETH{ value: msg.value }(
            address(this),
            balanceOf[address(this)],
            0,
            0,
            owner(),
            block.timestamp);

        pair = IUniswapV2Pair(factory.getPair(address(this), router.WETH()));

        _mint(marketingWallet, INITIAL_SUPPLY * MARKETING_BPS / 10_000);

        require(totalSupply == INITIAL_SUPPLY, "numbers don't add up");

        // So I don't have to deal with Uniswap when testing
        if (isTestnet()) {
            _mint(address(msg.sender), 10_000 * 10**decimals);
        }

        emit StealthLaunchEngaged();
    }

    /**
     * @dev Calculate the amount of tax to apply to a transaction.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity of tokens being sent
     * @return the amount of tokens to withhold for taxes
     */
    function calcTax(address from, address to, uint amount) internal view returns (uint) {
        if (from == owner() || to == owner() || from == address(this)) {
            // For adding liquidity at the beginning
            //
            // Also for this contract selling the collected tax.
            return 0;
        } else if (from == address(pair)) {
            // Buy from DEX, or adding liquidity.
            return amount * buyTaxBps / 10_000;
        } else if (to == address(pair)) {
            // Sell from DEX, or removing liquidity.
            return amount * sellTaxBps / 10_000;
        } else {
            // Sending to other wallets (e.g. OTC) is tax-free.
            return 0;
        }
    }

    /**
     * @dev Sell the balance accumulated from taxes.
     */
    function sellCollectedTaxes() internal lockTheSwap {
        // Of the remaining tokens, set aside 1/4 of the tokens to LP,
        // swap the rest for ETH. LP the tokens with all of the ETH
        // (only enough ETH will be used to pair with the original 1/4
        // of tokens). Send the remaining ETH (about half the original
        // balance) to my wallet.

        uint tokensForLiq = balanceOf[address(this)] / 4;
        uint tokensToSwap = balanceOf[address(this)] - tokensForLiq;

        // Sell
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        router.addLiquidityETH{ value: address(this).balance }(
            address(this),
            tokensForLiq,
            0,
            0,
            owner(),
            block.timestamp);

        myWallet.call{value: address(this).balance}("");
    }

    /**
     * @dev Transfer tokens from the caller to another address.
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transfer(address to, uint amount) public override returns (bool) {
        return transferFrom(msg.sender, to, amount);
    }

    /**
     * @dev Transfer tokens from one address to another. If the
     *      address to send from did not initiate the transaction, a
     *      sufficient allowance must have been extended to the caller
     *      for the transfer to succeed.
     * @param from the sender
     * @param to the receiver
     * @param amount the quantity to send
     * @return true if the transfer succeeded, otherwise false
     */
    function transferFrom(
        address from,
        address to,
        uint amount
    ) public override returns (bool) {
        if (from != msg.sender) {
            // This is a typical transferFrom

            uint allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint).max) allowance[from][msg.sender] = allowed - amount;
        }

        // Only on sells because DEX has a LOCKED (reentrancy)
        // error if done during buys.
        //
        // isSellingCollectedTaxes prevents an infinite loop.
        if (balanceOf[address(this)] > getMinSwapAmount() && !isSellingCollectedTaxes && from != address(pair) && from != address(this)) {
            sellCollectedTaxes();
        }

        uint tax = calcTax(from, to, amount);
        uint afterTaxAmount = amount - tax;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint value.
        unchecked {
            balanceOf[to] += afterTaxAmount;
        }

        emit Transfer(from, to, afterTaxAmount);

        if (tax > 0) {
            // Use 1/5 of tax for revenue
            uint revenue = tax / 5;
            tax -= revenue;

            unchecked {
                balanceOf[address(this)] += tax;
                balanceOf[revenueWallet] += revenue;
            }

            // Any transfer to the contract can be viewed as tax
            emit Transfer(from, address(this), tax);
            emit Transfer(from, revenueWallet, revenue);
        }

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"AntiBotDisengaged","type":"event"},{"anonymous":false,"inputs":[],"name":"AntiBotEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"StealthLaunchEngaged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":"buyTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"secret","type":"uint32"}],"name":"connectAndApprove","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disengagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableAntiBotMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"engagedOnce","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGoerli","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSepolia","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTestnet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"myWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rouletteContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMyWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setRevenueWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"a","type":"address"}],"name":"setRouletteContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stealthLaunch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040526101f4600a556101f4600b553480156200001d57600080fd5b506040518060400160405280601981526020017f42756c6c65742047616d652042657474696e6720546f6b656e000000000000008152506040518060400160405280600681526020016510955313115560d21b81525060086200008f62000089620002aa60201b60201c565b620002ae565b60016200009d84826200043f565b506002620000ac83826200043f565b5060ff81166080524660a052620000c2620002fe565b60c05250505060054603620000fd57600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055620001a3565b4662aa36a7036200013457600780546001600160a01b03191673c532a74256d3db42d0bf7a0400fefdbad7694008179055620001a3565b466001146200017c5760405162461bcd60e51b815260206004820152601060248201526f195e1c1958dd1959081b585a5b9b995d60821b604482015260640160405180910390fd5b600780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790555b600760009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021d91906200050b565b600880546001600160a01b0319166001600160a01b039283161790553060008181526005602090815260408083206007805487168552908352928190206000199081905592549051928352909316927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3600c805460ff60a81b19169055620005bb565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516200033291906200053d565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003c557607f821691505b602082108103620003e657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043a57600081815260208120601f850160051c81016020861015620004155750805b601f850160051c820191505b81811015620004365782815560010162000421565b5050505b505050565b81516001600160401b038111156200045b576200045b6200039a565b62000473816200046c8454620003b0565b84620003ec565b602080601f831160018114620004ab5760008415620004925750858301515b600019600386901b1c1916600185901b17855562000436565b600085815260208120601f198616915b82811015620004dc57888601518255948401946001909101908401620004bb565b5085821015620004fb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200051e57600080fd5b81516001600160a01b03811681146200053657600080fd5b9392505050565b60008083546200054d81620003b0565b600182811680156200056857600181146200057e57620005af565b60ff1984168752821515830287019450620005af565b8760005260208060002060005b85811015620005a65781548a8201529084019082016200058b565b50505082870194505b50929695505050505050565b60805160a05160c051612b0b620005f260003960006114e6015260006114b10152600081816103ec0152610f130152612b0b6000f3fe60806040526004361061028f5760003560e01c80637f50ce1711610156578063c473413a116100bf578063f2fde38b11610079578063f98eb6e111610061578063f98eb6e114610802578063fb235f3414610817578063fea9e9421461083757005b8063f2fde38b146107b5578063f887ea40146107d557005b8063d505accf116100a7578063d505accf1461073d578063dd62ed3e1461075d578063eec1c69f1461079557005b8063c473413a14610711578063cffd129c1461072757005b8063a8aa1b3111610110578063b3e5cb45116100f8578063b3e5cb45146106a1578063b880b69a146106b7578063c45a0155146106e457005b8063a8aa1b3114610654578063a9059cbb1461068157005b806392108c861161013e57806392108c861461060a57806395d89b411461061f578063a0712d681461063457005b80637f50ce17146105c75780638da5cb5b146105df57005b80633644e515116101f8578063715018a6116101b25780637ca882b51161019a5780637ca882b5146105365780637d5ea21b146105685780637ecebe001461059a57005b8063715018a6146104f457806375f0a8741461050957005b806344478425116101e057806344478425146104555780635d098b38146104a757806370a08231146104c757005b80633644e5151461042057806342966c681461043557005b806323b872dd116102495780632ca1b45d116102315780632ca1b45d14610392578063307aebc9146103a7578063313ce567146103da57005b806323b872dd1461033f578063270fd20a1461035f57005b8063095ea7b311610277578063095ea7b3146102cb5780630adab99f146102fb57806318160ddd1461031b57005b806306fdde031461029857806307df7a0d146102c357005b3661029657005b005b3480156102a457600080fd5b506102ad610857565b6040516102ba91906124ca565b60405180910390f35b6102966108e5565b3480156102d757600080fd5b506102eb6102e6366004612558565b610f70565b60405190151581526020016102ba565b34801561030757600080fd5b50610296610316366004612584565b610fea565b34801561032757600080fd5b5061033160035481565b6040519081526020016102ba565b34801561034b57600080fd5b506102eb61035a3660046125a1565b6110bb565b34801561036b57600080fd5b50600f546102eb907501000000000000000000000000000000000000000000900460ff1681565b34801561039e57600080fd5b506102966113ab565b3480156103b357600080fd5b50600c546102eb907501000000000000000000000000000000000000000000900460ff1681565b3480156103e657600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016102ba565b34801561042c57600080fd5b506103316114ad565b34801561044157600080fd5b506102966104503660046125e2565b611508565b34801561046157600080fd5b50600f546104829073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ba565b3480156104b357600080fd5b506102966104c2366004612584565b611515565b3480156104d357600080fd5b506103316104e2366004612584565b60046020526000908152604090205481565b34801561050057600080fd5b506102966115e1565b34801561051557600080fd5b50600e546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054257600080fd5b50600c5461048290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561057457600080fd5b50600f546102eb9074010000000000000000000000000000000000000000900460ff1681565b3480156105a657600080fd5b506103316105b5366004612584565b60066020526000908152604090205481565b3480156105d357600080fd5b504662aa36a7146102eb565b3480156105eb57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610482565b34801561061657600080fd5b506102eb6115f5565b34801561062b57600080fd5b506102ad61160b565b34801561064057600080fd5b5061029661064f3660046125e2565b611618565b34801561066057600080fd5b506009546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561068d57600080fd5b506102eb61069c366004612558565b611690565b3480156106ad57600080fd5b50466005146102eb565b3480156106c357600080fd5b50600d546104829073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f057600080fd5b506008546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561071d57600080fd5b50610331600a5481565b34801561073357600080fd5b50610331600b5481565b34801561074957600080fd5b506102966107583660046125fb565b61169d565b34801561076957600080fd5b50610331610778366004612672565b600560209081526000928352604080842090915290825290205481565b3480156107a157600080fd5b506102eb6107b03660046126ab565b6119bc565b3480156107c157600080fd5b506102966107d0366004612584565b611a56565b3480156107e157600080fd5b506007546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561080e57600080fd5b50610296611b0a565b34801561082357600080fd5b50610296610832366004612584565b611c0e565b34801561084357600080fd5b50610296610852366004612584565b611cda565b60018054610864906126d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610890906126d1565b80156108dd5780601f106108b2576101008083540402835291602001916108dd565b820191906000526020600020905b8154815290600101906020018083116108c057829003601f168201915b505050505081565b6108ed611da6565b600c547501000000000000000000000000000000000000000000900460ff1615610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f616c7265616479206c61756e636865640000000000000000000000000000000060448201526064015b60405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff166109f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600e5473ffffffffffffffffffffffffffffffffffffffff16610a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600f5473ffffffffffffffffffffffffffffffffffffffff16610af5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c54610100900473ffffffffffffffffffffffffffffffffffffffff16610b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055610be230612710610bd361232866038d7ea4c68000612753565b610bdd919061276a565b611e27565b6007543060008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff9093169263f305d71992349290919080610c3960005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610cc6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ceb91906127a5565b5050600854600754604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416945063e6a43905933093169163ad5c46489160048083019260209291908290030181865afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906127d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906127d3565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600e54610e8b9116612710610e7a612328826127f0565b610bd39066038d7ea4c68000612753565b66038d7ea4c6800060035414610efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e756d6265727320646f6e277420616464207570000000000000000000000000604482015260640161096f565b610f056115f5565b15610f4557610f4533610f397f0000000000000000000000000000000000000000000000000000000000000000600a612923565b610bdd90612710612753565b6040517f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe90600090a1565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fd89086815260200190565b60405180910390a35060015b92915050565b610ff2611da6565b73ffffffffffffffffffffffffffffffffffffffff811661106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff841633146111705773ffffffffffffffffffffffffffffffffffffffff841660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461116e5761113c83826127f0565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602090815260408083203384529091529020555b505b611178611ea0565b306000908152600460205260409020541180156111985750600c5460ff16155b80156111bf575060095473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156111e1575073ffffffffffffffffffffffffffffffffffffffff84163014155b156111ee576111ee611ebe565b60006111fb85858561223b565b9050600061120982856127f0565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600460205260408120805492935086929091906112439084906127f0565b909155505073ffffffffffffffffffffffffffffffffffffffff808616600081815260046020526040908190208054850190555190918816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112ab9085815260200190565b60405180910390a3811561139d5760006112c660058461276a565b90506112d281846127f0565b306000818152600460209081526040808320805486019055600f5473ffffffffffffffffffffffffffffffffffffffff908116845292819020805487019055518481529396509192908a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600f5460405182815273ffffffffffffffffffffffffffffffffffffffff918216918916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505b6001925050505b9392505050565b6113b3611da6565b600f5474010000000000000000000000000000000000000000900460ff1615611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f746869732069732061206f6e652073686f742066756e6374696f6e0000000000604482015260640161096f565b600f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556103e8600a819055600b556040517fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436890600090a1565b60007f000000000000000000000000000000000000000000000000000000000000000046146114e3576114de61232d565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b61151233826123c7565b50565b61151d611da6565b73ffffffffffffffffffffffffffffffffffffffff811661159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115e9611da6565b6115f36000612455565b565b600046600514806114de57505062aa36a7461490565b60028054610864906126d1565b6116206115f5565b611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420746573746e6574000000000000000000000000000000000000000000604482015260640161096f565b6115123382611e27565b60006113a43384846110bb565b42841015611707576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161096f565b600060016117136114ad565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526006602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611865573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906118e057508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e4552000000000000000000000000000000000000604482015260640161096f565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b336000818152600560209081526040808320600c805473ffffffffffffffffffffffffffffffffffffffff61010091829004811687529285528386207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081905591549351918252949594909204169183917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610fd8565b611a5e611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161096f565b61151281612455565b611b12611da6565b600f547501000000000000000000000000000000000000000000900460ff1615611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f746869732069732061206f6e652073686f742066756e6374696f6e0000000000604482015260640161096f565b600f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556101f4600a819055600b556040517fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a90600090a1565b611c16611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611ce2611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161096f565b8060036000828254611e399190612932565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600460209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60006127106003546002611eb49190612753565b6114de919061276a565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055306000908152600460208190526040822054611f05919061276a565b3060009081526004602052604081205491925090611f249083906127f0565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611f5e57611f5e612945565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152600754604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200191906127d3565b8160018151811061201457612014612945565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526007546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac94790612080908590600090869030904290600401612974565b600060405180830381600087803b15801561209a57600080fd5b505af11580156120ae573d6000803e3d6000fd5b505060075473ffffffffffffffffffffffffffffffffffffffff16915063f305d71990504730866000806120f760005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612184573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121a991906127a5565b5050600d5460405173ffffffffffffffffffffffffffffffffffffffff90911691504790600081818185875af1925050503d8060008114612206576040519150601f19603f3d011682016040523d82523d6000602084013e61220b565b606091505b5050600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8581169116148061227f575060005473ffffffffffffffffffffffffffffffffffffffff8481169116145b8061229f575073ffffffffffffffffffffffffffffffffffffffff841630145b156122ac575060006113a4565b60095473ffffffffffffffffffffffffffffffffffffffff908116908516036122f157612710600a54836122e09190612753565b6122ea919061276a565b90506113a4565b60095473ffffffffffffffffffffffffffffffffffffffff9081169084160361232557612710600b54836122e09190612753565b5060006113a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600160405161235f91906129ff565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080548392906123fc9084906127f0565b909155505060038054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611e94565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b818110156124f7578581018301518582016040015282016124db565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461151257600080fd5b6000806040838503121561256b57600080fd5b823561257681612536565b946020939093013593505050565b60006020828403121561259657600080fd5b81356113a481612536565b6000806000606084860312156125b657600080fd5b83356125c181612536565b925060208401356125d181612536565b929592945050506040919091013590565b6000602082840312156125f457600080fd5b5035919050565b600080600080600080600060e0888a03121561261657600080fd5b873561262181612536565b9650602088013561263181612536565b95506040880135945060608801359350608088013560ff8116811461265557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561268557600080fd5b823561269081612536565b915060208301356126a081612536565b809150509250929050565b6000602082840312156126bd57600080fd5b813563ffffffff811681146113a457600080fd5b600181811c908216806126e557607f821691505b60208210810361271e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610fe457610fe4612724565b6000826127a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806000606084860312156127ba57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156127e557600080fd5b81516113a481612536565b81810381811115610fe457610fe4612724565b600181815b8085111561285c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561284257612842612724565b8085161561284f57918102915b93841c9390800290612808565b509250929050565b60008261287357506001610fe4565b8161288057506000610fe4565b816001811461289657600281146128a0576128bc565b6001915050610fe4565b60ff8411156128b1576128b1612724565b50506001821b610fe4565b5060208310610133831016604e8410600b84101617156128df575081810a610fe4565b6128e98383612803565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561291b5761291b612724565b029392505050565b60006113a460ff841683612864565b80820180821115610fe457610fe4612724565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129d157845173ffffffffffffffffffffffffffffffffffffffff168352938301939183019160010161299f565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600080835481600182811c915080831680612a1b57607f831692505b60208084108203612a53577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612a675760018114612a9a57612ac7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650612ac7565b60008a81526020902060005b86811015612abf5781548b820152908501908301612aa6565b505084890196505b50949897505050505050505056fea2646970667358221220ceafe02b7d273db4776e048f39f41cd2745b9e025df9fbee1dcd1a663a386dac64736f6c63430008130033

Deployed Bytecode

0x60806040526004361061028f5760003560e01c80637f50ce1711610156578063c473413a116100bf578063f2fde38b11610079578063f98eb6e111610061578063f98eb6e114610802578063fb235f3414610817578063fea9e9421461083757005b8063f2fde38b146107b5578063f887ea40146107d557005b8063d505accf116100a7578063d505accf1461073d578063dd62ed3e1461075d578063eec1c69f1461079557005b8063c473413a14610711578063cffd129c1461072757005b8063a8aa1b3111610110578063b3e5cb45116100f8578063b3e5cb45146106a1578063b880b69a146106b7578063c45a0155146106e457005b8063a8aa1b3114610654578063a9059cbb1461068157005b806392108c861161013e57806392108c861461060a57806395d89b411461061f578063a0712d681461063457005b80637f50ce17146105c75780638da5cb5b146105df57005b80633644e515116101f8578063715018a6116101b25780637ca882b51161019a5780637ca882b5146105365780637d5ea21b146105685780637ecebe001461059a57005b8063715018a6146104f457806375f0a8741461050957005b806344478425116101e057806344478425146104555780635d098b38146104a757806370a08231146104c757005b80633644e5151461042057806342966c681461043557005b806323b872dd116102495780632ca1b45d116102315780632ca1b45d14610392578063307aebc9146103a7578063313ce567146103da57005b806323b872dd1461033f578063270fd20a1461035f57005b8063095ea7b311610277578063095ea7b3146102cb5780630adab99f146102fb57806318160ddd1461031b57005b806306fdde031461029857806307df7a0d146102c357005b3661029657005b005b3480156102a457600080fd5b506102ad610857565b6040516102ba91906124ca565b60405180910390f35b6102966108e5565b3480156102d757600080fd5b506102eb6102e6366004612558565b610f70565b60405190151581526020016102ba565b34801561030757600080fd5b50610296610316366004612584565b610fea565b34801561032757600080fd5b5061033160035481565b6040519081526020016102ba565b34801561034b57600080fd5b506102eb61035a3660046125a1565b6110bb565b34801561036b57600080fd5b50600f546102eb907501000000000000000000000000000000000000000000900460ff1681565b34801561039e57600080fd5b506102966113ab565b3480156103b357600080fd5b50600c546102eb907501000000000000000000000000000000000000000000900460ff1681565b3480156103e657600080fd5b5061040e7f000000000000000000000000000000000000000000000000000000000000000881565b60405160ff90911681526020016102ba565b34801561042c57600080fd5b506103316114ad565b34801561044157600080fd5b506102966104503660046125e2565b611508565b34801561046157600080fd5b50600f546104829073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ba565b3480156104b357600080fd5b506102966104c2366004612584565b611515565b3480156104d357600080fd5b506103316104e2366004612584565b60046020526000908152604090205481565b34801561050057600080fd5b506102966115e1565b34801561051557600080fd5b50600e546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054257600080fd5b50600c5461048290610100900473ffffffffffffffffffffffffffffffffffffffff1681565b34801561057457600080fd5b50600f546102eb9074010000000000000000000000000000000000000000900460ff1681565b3480156105a657600080fd5b506103316105b5366004612584565b60066020526000908152604090205481565b3480156105d357600080fd5b504662aa36a7146102eb565b3480156105eb57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610482565b34801561061657600080fd5b506102eb6115f5565b34801561062b57600080fd5b506102ad61160b565b34801561064057600080fd5b5061029661064f3660046125e2565b611618565b34801561066057600080fd5b506009546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561068d57600080fd5b506102eb61069c366004612558565b611690565b3480156106ad57600080fd5b50466005146102eb565b3480156106c357600080fd5b50600d546104829073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f057600080fd5b506008546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561071d57600080fd5b50610331600a5481565b34801561073357600080fd5b50610331600b5481565b34801561074957600080fd5b506102966107583660046125fb565b61169d565b34801561076957600080fd5b50610331610778366004612672565b600560209081526000928352604080842090915290825290205481565b3480156107a157600080fd5b506102eb6107b03660046126ab565b6119bc565b3480156107c157600080fd5b506102966107d0366004612584565b611a56565b3480156107e157600080fd5b506007546104829073ffffffffffffffffffffffffffffffffffffffff1681565b34801561080e57600080fd5b50610296611b0a565b34801561082357600080fd5b50610296610832366004612584565b611c0e565b34801561084357600080fd5b50610296610852366004612584565b611cda565b60018054610864906126d1565b80601f0160208091040260200160405190810160405280929190818152602001828054610890906126d1565b80156108dd5780601f106108b2576101008083540402835291602001916108dd565b820191906000526020600020905b8154815290600101906020018083116108c057829003601f168201915b505050505081565b6108ed611da6565b600c547501000000000000000000000000000000000000000000900460ff1615610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f616c7265616479206c61756e636865640000000000000000000000000000000060448201526064015b60405180910390fd5b600d5473ffffffffffffffffffffffffffffffffffffffff166109f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600e5473ffffffffffffffffffffffffffffffffffffffff16610a76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600f5473ffffffffffffffffffffffffffffffffffffffff16610af5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c54610100900473ffffffffffffffffffffffffffffffffffffffff16610b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055610be230612710610bd361232866038d7ea4c68000612753565b610bdd919061276a565b611e27565b6007543060008181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff9093169263f305d71992349290919080610c3960005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610cc6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ceb91906127a5565b5050600854600754604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff938416945063e6a43905933093169163ad5c46489160048083019260209291908290030181865afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e91906127d3565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604401602060405180830381865afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e2291906127d3565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff928316179055600e54610e8b9116612710610e7a612328826127f0565b610bd39066038d7ea4c68000612753565b66038d7ea4c6800060035414610efd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6e756d6265727320646f6e277420616464207570000000000000000000000000604482015260640161096f565b610f056115f5565b15610f4557610f4533610f397f0000000000000000000000000000000000000000000000000000000000000008600a612923565b610bdd90612710612753565b6040517f0887e4063f397b46bca5f33853dd1a946a3b32547bf9cb3b3063bd9db9d8bdfe90600090a1565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610fd89086815260200190565b60405180910390a35060015b92915050565b610ff2611da6565b73ffffffffffffffffffffffffffffffffffffffff811661106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600c805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff841633146111705773ffffffffffffffffffffffffffffffffffffffff841660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461116e5761113c83826127f0565b73ffffffffffffffffffffffffffffffffffffffff861660009081526005602090815260408083203384529091529020555b505b611178611ea0565b306000908152600460205260409020541180156111985750600c5460ff16155b80156111bf575060095473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156111e1575073ffffffffffffffffffffffffffffffffffffffff84163014155b156111ee576111ee611ebe565b60006111fb85858561223b565b9050600061120982856127f0565b73ffffffffffffffffffffffffffffffffffffffff87166000908152600460205260408120805492935086929091906112439084906127f0565b909155505073ffffffffffffffffffffffffffffffffffffffff808616600081815260046020526040908190208054850190555190918816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906112ab9085815260200190565b60405180910390a3811561139d5760006112c660058461276a565b90506112d281846127f0565b306000818152600460209081526040808320805486019055600f5473ffffffffffffffffffffffffffffffffffffffff908116845292819020805487019055518481529396509192908a16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600f5460405182815273ffffffffffffffffffffffffffffffffffffffff918216918916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505b6001925050505b9392505050565b6113b3611da6565b600f5474010000000000000000000000000000000000000000900460ff1615611438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f746869732069732061206f6e652073686f742066756e6374696f6e0000000000604482015260640161096f565b600f80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556103e8600a819055600b556040517fa1f3078ed9e1e966576844270dda3bb31267ba7d982fc64933d94552630a436890600090a1565b60007f000000000000000000000000000000000000000000000000000000000000000146146114e3576114de61232d565b905090565b507f1191f2257e8ec074cce2f6c7c326cad4ce03f6de964657b1b96a94af604f43a690565b61151233826123c7565b50565b61151d611da6565b73ffffffffffffffffffffffffffffffffffffffff811661159a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6115e9611da6565b6115f36000612455565b565b600046600514806114de57505062aa36a7461490565b60028054610864906126d1565b6116206115f5565b611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420746573746e6574000000000000000000000000000000000000000000604482015260640161096f565b6115123382611e27565b60006113a43384846110bb565b42841015611707576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161096f565b600060016117136114ad565b73ffffffffffffffffffffffffffffffffffffffff8a811660008181526006602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611865573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906118e057508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611946576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e4552000000000000000000000000000000000000604482015260640161096f565b73ffffffffffffffffffffffffffffffffffffffff90811660009081526005602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b336000818152600560209081526040808320600c805473ffffffffffffffffffffffffffffffffffffffff61010091829004811687529285528386207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081905591549351918252949594909204169183917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610fd8565b611a5e611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161096f565b61151281612455565b611b12611da6565b600f547501000000000000000000000000000000000000000000900460ff1615611b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f746869732069732061206f6e652073686f742066756e6374696f6e0000000000604482015260640161096f565b600f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556101f4600a819055600b556040517fc8c66e37e8b41bcc2deecfa7487ae0d5ed2fd626c0544a58c33ba95d90a47d4a90600090a1565b611c16611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611ce2611da6565b73ffffffffffffffffffffffffffffffffffffffff8116611d5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e756c6c20616464726573730000000000000000000000000000000000000000604482015260640161096f565b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146115f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161096f565b8060036000828254611e399190612932565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600460209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60006127106003546002611eb49190612753565b6114de919061276a565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055306000908152600460208190526040822054611f05919061276a565b3060009081526004602052604081205491925090611f249083906127f0565b60408051600280825260608201835292935060009290916020830190803683370190505090503081600081518110611f5e57611f5e612945565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201810191909152600754604080517fad5c46480000000000000000000000000000000000000000000000000000000081529051919093169263ad5c46489260048083019391928290030181865afa158015611fdd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200191906127d3565b8160018151811061201457612014612945565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526007546040517f791ac94700000000000000000000000000000000000000000000000000000000815291169063791ac94790612080908590600090869030904290600401612974565b600060405180830381600087803b15801561209a57600080fd5b505af11580156120ae573d6000803e3d6000fd5b505060075473ffffffffffffffffffffffffffffffffffffffff16915063f305d71990504730866000806120f760005473ffffffffffffffffffffffffffffffffffffffff1690565b60405160e088901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015612184573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906121a991906127a5565b5050600d5460405173ffffffffffffffffffffffffffffffffffffffff90911691504790600081818185875af1925050503d8060008114612206576040519150601f19603f3d011682016040523d82523d6000602084013e61220b565b606091505b5050600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905550505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8581169116148061227f575060005473ffffffffffffffffffffffffffffffffffffffff8481169116145b8061229f575073ffffffffffffffffffffffffffffffffffffffff841630145b156122ac575060006113a4565b60095473ffffffffffffffffffffffffffffffffffffffff908116908516036122f157612710600a54836122e09190612753565b6122ea919061276a565b90506113a4565b60095473ffffffffffffffffffffffffffffffffffffffff9081169084160361232557612710600b54836122e09190612753565b5060006113a4565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600160405161235f91906129ff565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080548392906123fc9084906127f0565b909155505060038054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611e94565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208083528351808285015260005b818110156124f7578581018301518582016040015282016124db565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461151257600080fd5b6000806040838503121561256b57600080fd5b823561257681612536565b946020939093013593505050565b60006020828403121561259657600080fd5b81356113a481612536565b6000806000606084860312156125b657600080fd5b83356125c181612536565b925060208401356125d181612536565b929592945050506040919091013590565b6000602082840312156125f457600080fd5b5035919050565b600080600080600080600060e0888a03121561261657600080fd5b873561262181612536565b9650602088013561263181612536565b95506040880135945060608801359350608088013560ff8116811461265557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561268557600080fd5b823561269081612536565b915060208301356126a081612536565b809150509250929050565b6000602082840312156126bd57600080fd5b813563ffffffff811681146113a457600080fd5b600181811c908216806126e557607f821691505b60208210810361271e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610fe457610fe4612724565b6000826127a0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000806000606084860312156127ba57600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156127e557600080fd5b81516113a481612536565b81810381811115610fe457610fe4612724565b600181815b8085111561285c57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561284257612842612724565b8085161561284f57918102915b93841c9390800290612808565b509250929050565b60008261287357506001610fe4565b8161288057506000610fe4565b816001811461289657600281146128a0576128bc565b6001915050610fe4565b60ff8411156128b1576128b1612724565b50506001821b610fe4565b5060208310610133831016604e8410600b84101617156128df575081810a610fe4565b6128e98383612803565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561291b5761291b612724565b029392505050565b60006113a460ff841683612864565b80820180821115610fe457610fe4612724565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129d157845173ffffffffffffffffffffffffffffffffffffffff168352938301939183019160010161299f565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600080835481600182811c915080831680612a1b57607f831692505b60208084108203612a53577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612a675760018114612a9a57612ac7565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650612ac7565b60008a81526020902060005b86811015612abf5781548b820152908501908301612aa6565b505084890196505b50949897505050505050505056fea2646970667358221220ceafe02b7d273db4776e048f39f41cd2745b9e025df9fbee1dcd1a663a386dac64736f6c63430008130033

Deployed Bytecode Sourcemap

19381:10308:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1954:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23921:1104;;;:::i;3431:217::-;;;;;;;;;;-1:-1:-1;3431:217:0;;;;;:::i;:::-;;:::i;:::-;;;1270:14:1;;1263:22;1245:41;;1233:2;1218:18;3431:217:0;1105:187:1;23280:147:0;;;;;;;;;;-1:-1:-1;23280:147:0;;;;;:::i;:::-;;:::i;2237:26::-;;;;;;;;;;;;;;;;;;;1695:25:1;;;1683:2;1668:18;2237:26:0;1549:177:1;28034:1652:0;;;;;;;;;;-1:-1:-1;28034:1652:0;;;;;:::i;:::-;;:::i;20298:26::-;;;;;;;;;;-1:-1:-1;20298:26:0;;;;;;;;;;;22238:233;;;;;;;;;;;;;:::i;20133:22::-;;;;;;;;;;-1:-1:-1;20133:22:0;;;;;;;;;;;2010:31;;;;;;;;;;;;;;;;;;2364:4:1;2352:17;;;2334:36;;2322:2;2307:18;2010:31:0;2192:184:1;6391:179:0;;;;;;;;;;;;;:::i;21438:80::-;;;;;;;;;;-1:-1:-1;21438:80:0;;;;;:::i;:::-;;:::i;20231:28::-;;;;;;;;;;-1:-1:-1;20231:28:0;;;;;;;;;;;2924:42:1;2912:55;;;2894:74;;2882:2;2867:18;20231:28:0;2748:226:1;23589:160:0;;;;;;;;;;-1:-1:-1;23589:160:0;;;;;:::i;:::-;;:::i;2272:44::-;;;;;;;;;;-1:-1:-1;2272:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;10530:103;;;;;;;;;;;;;:::i;20194:30::-;;;;;;;;;;-1:-1:-1;20194:30:0;;;;;;;;20093:31;;;;;;;;;;-1:-1:-1;20093:31:0;;;;;;;;;;;20268:23;;;;;;;;;;-1:-1:-1;20268:23:0;;;;;;;;;;;2698:41;;;;;;;;;;-1:-1:-1;2698:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;22024:99;;;;;;;;;;-1:-1:-1;22090:13:0;22107:8;22090:25;22024:99;;9882:87;;;;;;;;;;-1:-1:-1;9928:7:0;9955:6;;;9882:87;;22131:99;;;;;;;;;;;;;:::i;1981:20::-;;;;;;;;;;;;;:::i;21691:101::-;;;;;;;;;;-1:-1:-1;21691:101:0;;;;;:::i;:::-;;:::i;19506:26::-;;;;;;;;;;-1:-1:-1;19506:26:0;;;;;;;;27454:136;;;;;;;;;;-1:-1:-1;27454:136:0;;;;;:::i;:::-;;:::i;21925:91::-;;;;;;;;;;-1:-1:-1;21990:13:0;22007:1;21990:18;21925:91;;20164:23;;;;;;;;;;-1:-1:-1;20164:23:0;;;;;;;;19467:32;;;;;;;;;;-1:-1:-1;19467:32:0;;;;;;;;19881:27;;;;;;;;;;;;;;;;19915:28;;;;;;;;;;;;;;;;4856:1527;;;;;;;;;;-1:-1:-1;4856:1527:0;;;;;:::i;:::-;;:::i;2325:64::-;;;;;;;;;;-1:-1:-1;2325:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23006:266;;;;;;;;;;-1:-1:-1;23006:266:0;;;;;:::i;:::-;;:::i;10788:201::-;;;;;;;;;;-1:-1:-1;10788:201:0;;;;;:::i;:::-;;:::i;19428:32::-;;;;;;;;;;-1:-1:-1;19428:32:0;;;;;;;;22479:241;;;;;;;;;;;;;:::i;23757:156::-;;;;;;;;;;-1:-1:-1;23757:156:0;;;;;:::i;:::-;;:::i;23435:146::-;;;;;;;;;;-1:-1:-1;23435:146:0;;;;;:::i;:::-;;:::i;1954:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23921:1104::-;9768:13;:11;:13::i;:::-;23993:10:::1;::::0;;;::::1;;;23992:11;23984:40;;;::::0;::::1;::::0;;5898:2:1;23984:40:0::1;::::0;::::1;5880:21:1::0;5937:2;5917:18;;;5910:30;5976:18;5956;;;5949:46;6012:18;;23984:40:0::1;;;;;;;;;24043:8;::::0;:22:::1;:8;24035:47;;;::::0;::::1;::::0;;6243:2:1;24035:47:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;24035:47:0::1;6041:336:1::0;24035:47:0::1;24101:15;::::0;:29:::1;:15;24093:54;;;::::0;::::1;::::0;;6243:2:1;24093:54:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;24093:54:0::1;6041:336:1::0;24093:54:0::1;24166:13;::::0;:27:::1;:13;24158:52;;;::::0;::::1;::::0;;6243:2:1;24158:52:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;24158:52:0::1;6041:336:1::0;24158:52:0::1;24229:16;::::0;::::1;::::0;::::1;:30;:16;24221:55;;;::::0;::::1;::::0;;6243:2:1;24221:55:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;24221:55:0::1;6041:336:1::0;24221:55:0::1;24287:10;:17:::0;;;::::1;::::0;::::1;::::0;;24317:54:::1;24331:4;24364:6;24338:23;19691:4;19580:18;24338:23;:::i;:::-;:32;;;;:::i;:::-;24317:5;:54::i;:::-;24384:6;::::0;24449:4:::1;24384:6;24469:24:::0;;;:9:::1;:24;::::0;;;;;24384:6:::1;::::0;;::::1;::::0;:22:::1;::::0;24415:9:::1;::::0;24449:4;;24469:24;24384:6;24540:7:::1;9928::::0;9955:6;;;;9882:87;24540:7:::1;24384:194;::::0;::::1;::::0;;;;;;;7336:42:1;7405:15;;;24384:194:0::1;::::0;::::1;7387:34:1::0;7437:18;;;7430:34;;;;7480:18;;;7473:34;;;;7523:18;;;7516:34;7587:15;;;7566:19;;;7559:44;24562:15:0::1;7619:19:1::0;;;7612:35;7298:19;;24384:194:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;24613:7:0::1;::::0;24644:6:::1;::::0;:13:::1;::::0;;;;;;;24613:7:::1;::::0;;::::1;::::0;-1:-1:-1;24613:15:0::1;::::0;24637:4:::1;::::0;24644:6:::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24613:45;::::0;;::::1;::::0;;;;;;8409:42:1;8478:15;;;24613:45:0::1;::::0;::::1;8460:34:1::0;8530:15;;8510:18;;;8503:43;8372:18;;24613:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24591:4;:68:::0;;;::::1;;::::0;;::::1;;::::0;;24678:15:::1;::::0;24672:63:::1;::::0;24678:15:::1;24728:6;19798:15;19691:4;24728:6:::0;19798:15:::1;:::i;:::-;24695:30;::::0;19580:18:::1;24695:30;:::i;24672:63::-;19580:18;24756:11;;:29;24748:62;;;::::0;::::1;::::0;;8892:2:1;24748:62:0::1;::::0;::::1;8874:21:1::0;8931:2;8911:18;;;8904:30;8970:22;8950:18;;;8943:50;9010:18;;24748:62:0::1;8690:344:1::0;24748:62:0::1;24889:11;:9;:11::i;:::-;24885:93;;;24917:49;24931:10;24953:12;24957:8;24953:2;:12;:::i;:::-;24944:21;::::0;:6:::1;:21;:::i;24917:49::-;24995:22;::::0;::::1;::::0;;;::::1;23921:1104::o:0;3431:217::-;3532:10;3505:4;3522:21;;;:9;:21;;;;;;;;;:30;;;;;;;;;;:39;;;3579:37;3505:4;;3522:30;;3579:37;;;;3555:6;1695:25:1;;1683:2;1668:18;;1549:177;3579:37:0;;;;;;;;-1:-1:-1;3636:4:0;3431:217;;;;;:::o;23280:147::-;9768:13;:11;:13::i;:::-;23356:15:::1;::::0;::::1;23348:40;;;::::0;::::1;::::0;;6243:2:1;23348:40:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;23348:40:0::1;6041:336:1::0;23348:40:0::1;23399:16;:20:::0;;::::1;::::0;;::::1;;;::::0;;;::::1;::::0;;;::::1;::::0;;23280:147::o;28034:1652::-;28154:4;28175:18;;;28183:10;28175:18;28171:272;;28274:15;;;28259:12;28274:15;;;:9;:15;;;;;;;;28290:10;28274:27;;;;;;;;28369:14;28358:25;;28354:77;;28415:16;28425:6;28415:7;:16;:::i;:::-;28385:15;;;;;;;:9;:15;;;;;;;;28401:10;28385:27;;;;;;;:46;28354:77;28195:248;28171:272;28664:18;:16;:18::i;:::-;28655:4;28637:24;;;;:9;:24;;;;;;:45;:73;;;;-1:-1:-1;28687:23:0;;;;28686:24;28637:73;:98;;;;-1:-1:-1;28730:4:0;;;28714:21;;;28730:4;;28714:21;;28637:98;:123;;;;-1:-1:-1;28739:21:0;;;28755:4;28739:21;;28637:123;28633:176;;;28777:20;:18;:20::i;:::-;28821:8;28832:25;28840:4;28846:2;28850:6;28832:7;:25::i;:::-;28821:36;-1:-1:-1;28868:19:0;28890:12;28821:36;28890:6;:12;:::i;:::-;28915:15;;;;;;;:9;:15;;;;;:25;;28868:34;;-1:-1:-1;28934:6:0;;28915:15;;;:25;;28934:6;;28915:25;:::i;:::-;;;;-1:-1:-1;;29088:13:0;;;;;;;;:9;:13;;;;;;;:31;;;;;;29148:34;29088:13;;29148:34;;;;;;;29105:14;1695:25:1;;1683:2;1668:18;;1549:177;29148:34:0;;;;;;;;29199:7;;29195:460;;29266:12;29281:7;29287:1;29281:3;:7;:::i;:::-;29266:22;-1:-1:-1;29303:14:0;29266:22;29303:14;;:::i;:::-;29381:4;29363:24;;;;:9;:24;;;;;;;;:31;;;;;;29423:13;;29363:24;29423:13;;;29413:24;;;;;;:35;;;;;;29551:34;1695:25:1;;;29363:31:0;;-1:-1:-1;29381:4:0;;29551:34;;;;;;1668:18:1;29551:34:0;;;;;;;29620:13;;29605:38;;1695:25:1;;;29620:13:0;;;;;29605:38;;;;;1683:2:1;1668:18;29605:38:0;;;;;;;29208:447;29195:460;29674:4;29667:11;;;;28034:1652;;;;;;:::o;22238:233::-;9768:13;:11;:13::i;:::-;22304:11:::1;::::0;;;::::1;;;22303:12;22295:52;;;::::0;::::1;::::0;;10744:2:1;22295:52:0::1;::::0;::::1;10726:21:1::0;10783:2;10763:18;;;10756:30;10822:29;10802:18;;;10795:57;10869:18;;22295:52:0::1;10542:351:1::0;22295:52:0::1;22358:11;:18:::0;;;::::1;::::0;::::1;::::0;;22399:4:::1;22387:9;:16:::0;;;22414:10:::1;:17:::0;22447:16:::1;::::0;::::1;::::0;22358:18;;22447:16:::1;22238:233::o:0;6391:179::-;6448:7;6492:16;6475:13;:33;:87;;6538:24;:22;:24::i;:::-;6468:94;;6391:179;:::o;6475:87::-;-1:-1:-1;6511:24:0;;6391:179::o;21438:80::-;21485:25;21491:10;21503:6;21485:5;:25::i;:::-;21438:80;:::o;23589:160::-;9768:13;:11;:13::i;:::-;23669:20:::1;::::0;::::1;23661:45;;;::::0;::::1;::::0;;6243:2:1;23661:45:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;23661:45:0::1;6041:336:1::0;23661:45:0::1;23717:15;:24:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;23589:160::o;10530:103::-;9768:13;:11;:13::i;:::-;10595:30:::1;10622:1;10595:18;:30::i;:::-;10530:103::o:0;22131:99::-;22173:4;21990:13;22007:1;21990:18;22197:25;;;-1:-1:-1;;22107:8:0;22090:13;:25;;6391:179::o;1981:20::-;;;;;;;:::i;21691:101::-;21308:11;:9;:11::i;:::-;21300:35;;;;;;;11100:2:1;21300:35:0;;;11082:21:1;11139:2;11119:18;;;11112:30;11178:13;11158:18;;;11151:41;11209:18;;21300:35:0;10898:335:1;21300:35:0;21750:34:::1;21764:10;21777:6;21750:5;:34::i;27454:136::-:0;27522:4;27546:36;27559:10;27571:2;27575:6;27546:12;:36::i;4856:1527::-;5084:15;5072:8;:27;;5064:63;;;;;;;11440:2:1;5064:63:0;;;11422:21:1;11479:2;11459:18;;;11452:30;11518:25;11498:18;;;11491:53;11561:18;;5064:63:0;11238:347:1;5064:63:0;5297:24;5324:827;5464:18;:16;:18::i;:::-;5918:13;;;;;;;;:6;:13;;;;;;;;;:15;;;;;;;;5549:458;;5594:167;5549:458;;;11877:25:1;11979:18;;;11972:43;;;;12051:15;;;12031:18;;;12024:43;12083:18;;;12076:34;;;12126:19;;;12119:35;;;;12170:19;;;;12163:35;;;5549:458:0;;;;;;;;;;11849:19:1;;;5549:458:0;;;5509:525;;;;;;;;12479:66:1;5384:673:0;;;12467:79:1;12562:11;;;12555:27;;;;12598:12;;;12591:28;;;;12635:12;;5384:673:0;;;;;;;;;;;;;5352:724;;5384:673;5352:724;;;;5324:827;;;;;;;;;12885:25:1;12958:4;12946:17;;12926:18;;;12919:45;12980:18;;;12973:34;;;13023:18;;;13016:34;;;12857:19;;5324:827:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5324:827:0;;;;;;-1:-1:-1;;6176:30:0;;;;;;;:59;;;6230:5;6210:25;;:16;:25;;;6176:59;6168:86;;;;;;;13263:2:1;6168:86:0;;;13245:21:1;13302:2;13282:18;;;13275:30;13341:16;13321:18;;;13314:44;13375:18;;6168:86:0;13061:338:1;6168:86:0;6271:27;;;;;;;;:9;:27;;;;;;;;:36;;;;;;;;;;;;;:44;;;6344:31;1695:25:1;;;6271:36:0;;6344:31;;;;;1668:18:1;6344:31:0;;;;;;;4856:1527;;;;;;;:::o;23006:266::-;8671:10;23066:4;23124:16;;;:9;:16;;;;;;;;23141;;;23124;23141;;;;;;;23124:34;;;;;;;;23161:14;23124:51;;;;23207:16;;23191:49;;1695:25:1;;;23066:4:0;;8671:10;23207:16;;;;;8671:10;;23191:49;;1668:18:1;23191:49:0;1549:177:1;10788:201:0;9768:13;:11;:13::i;:::-;10877:22:::1;::::0;::::1;10869:73;;;::::0;::::1;::::0;;13606:2:1;10869:73:0::1;::::0;::::1;13588:21:1::0;13645:2;13625:18;;;13618:30;13684:34;13664:18;;;13657:62;13755:8;13735:18;;;13728:36;13781:19;;10869:73:0::1;13404:402:1::0;10869:73:0::1;10953:28;10972:8;10953:18;:28::i;22479:241::-:0;9768:13;:11;:13::i;:::-;22546:14:::1;::::0;;;::::1;;;22545:15;22537:55;;;::::0;::::1;::::0;;10744:2:1;22537:55:0::1;::::0;::::1;10726:21:1::0;10783:2;10763:18;;;10756:30;10822:29;10802:18;;;10795:57;10869:18;;22537:55:0::1;10542:351:1::0;22537:55:0::1;22603:14;:21:::0;;;::::1;::::0;::::1;::::0;;22647:3:::1;22635:9;:15:::0;;;22661:10:::1;:16:::0;22693:19:::1;::::0;::::1;::::0;22603:21;;22693:19:::1;22479:241::o:0;23757:156::-;9768:13;:11;:13::i;:::-;23835:20:::1;::::0;::::1;23827:45;;;::::0;::::1;::::0;;6243:2:1;23827:45:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;23827:45:0::1;6041:336:1::0;23827:45:0::1;23883:13;:22:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;23757:156::o;23435:146::-;9768:13;:11;:13::i;:::-;23508:20:::1;::::0;::::1;23500:45;;;::::0;::::1;::::0;;6243:2:1;23500:45:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:14;6301:18;;;6294:42;6353:18;;23500:45:0::1;6041:336:1::0;23500:45:0::1;23556:8;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;23435:146::o;10047:132::-;9928:7;9955:6;10111:23;9955:6;8671:10;10111:23;10103:68;;;;;;;14013:2:1;10103:68:0;;;13995:21:1;;;14032:18;;;14025:30;14091:34;14071:18;;;14064:62;14143:18;;10103:68:0;13811:356:1;7235:335:0;7321:6;7306:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;7478:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;7530:32;1695:25:1;;;7530:32:0;;1668:18:1;7530:32:0;;;;;;;;7235:335;;:::o;21800:117::-;21851:4;21895:5;21876:11;;21890:1;21876:15;;;;:::i;:::-;21875:25;;;;:::i;26111:1114::-;21166:23;:30;;;;21192:4;21166:30;;;26533:4:::1;21166:23:::0;26515:24;;;26542:1:::1;26515:24;::::0;;;;;;;:28:::1;::::0;26542:1;26515:28:::1;:::i;:::-;26592:4;26554:17;26574:24:::0;;;:9:::1;:24;::::0;;;;;26495:48;;-1:-1:-1;26554:17:0;26574:39:::1;::::0;26495:48;;26574:39:::1;:::i;:::-;26667:16;::::0;;26681:1:::1;26667:16:::0;;;;;::::1;::::0;;26554:59;;-1:-1:-1;26643:21:0::1;::::0;26667:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;26667:16:0::1;26643:40;;26712:4;26694;26699:1;26694:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;;:23;;;;26738:6:::1;::::0;:13:::1;::::0;;;;;;;:6;;;::::1;::::0;:11:::1;::::0;:13:::1;::::0;;::::1;::::0;26694:7;;26738:13;;;;;:6;:13:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26728:4;26733:1;26728:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;26762:6:::1;::::0;:188:::1;::::0;;;;:6;::::1;::::0;:57:::1;::::0;:188:::1;::::0;26834:12;;26762:6:::1;::::0;26877:4;;26904::::1;::::0;26924:15:::1;::::0;26762:188:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;26963:6:0::1;::::0;::::1;;::::0;-1:-1:-1;26963:22:0::1;::::0;-1:-1:-1;26994:21:0::1;27040:4;27060:12:::0;26963:6:::1;::::0;27119:7:::1;9928::::0;9955:6;;;;9882:87;27119:7:::1;26963:194;::::0;::::1;::::0;;;;;;;7336:42:1;7405:15;;;26963:194:0::1;::::0;::::1;7387:34:1::0;7437:18;;;7430:34;;;;7480:18;;;7473:34;;;;7523:18;;;7516:34;7587:15;;;7566:19;;;7559:44;27141:15:0::1;7619:19:1::0;;;7612:35;7298:19;;26963:194:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;27170:8:0::1;::::0;:47:::1;::::0;:8:::1;::::0;;::::1;::::0;-1:-1:-1;27191:21:0::1;::::0;27170:47:::1;::::0;;;27191:21;27170:8;:47:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;21219:23:0;:31;;;;;;-1:-1:-1;;;;26111:1114:0:o;25296:735::-;25375:4;9955:6;;;25396:15;;;9955:6;;25396:15;;:32;;-1:-1:-1;9928:7:0;9955:6;;25415:13;;;9955:6;;25415:13;25396:32;:57;;;-1:-1:-1;25432:21:0;;;25448:4;25432:21;25396:57;25392:632;;;-1:-1:-1;25613:1:0;25606:8;;25392:632;25652:4;;;;;;25636:21;;;;25632:392;;25753:6;25741:9;;25732:6;:18;;;;:::i;:::-;:27;;;;:::i;:::-;25725:34;;;;25632:392;25795:4;;;;;;25781:19;;;;25777:247;;25900:6;25887:10;;25878:6;:19;;;;:::i;25777:247::-;-1:-1:-1;26011:1:0;26004:8;;6578:457;6643:7;6744:95;6878:4;6862:22;;;;;;:::i;:::-;;;;;;;;;;6711:301;;;17562:25:1;;;;17603:18;;17596:34;;;;6907:14:0;17646:18:1;;;17639:34;6944:13:0;17689:18:1;;;17682:34;6988:4:0;17732:19:1;;;17725:84;17534:19;;6711:301:0;;;;;;;;;;;;6683:344;;;;;;6663:364;;6578:457;:::o;7578:338::-;7651:15;;;;;;;:9;:15;;;;;:25;;7670:6;;7651:15;:25;;7670:6;;7651:25;:::i;:::-;;;;-1:-1:-1;;7824:11:0;:21;;;;;;;7874:34;;1695:25:1;;;-1:-1:-1;;7874:34:0;;;;;;1683:2:1;1668:18;7874:34:0;1549:177:1;11149:191:0;11223:16;11242:6;;;11259:17;;;;;;;;;;11292:40;;11242:6;;;;;;;11292:40;;11223:16;11292:40;11212:128;11149:191;:::o;14:607:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;612:2;542:66;537:2;529:6;525:15;521:88;510:9;506:104;502:113;494:121;;;;14:607;;;;:::o;626:154::-;712:42;705:5;701:54;694:5;691:65;681:93;;770:1;767;760:12;785:315;853:6;861;914:2;902:9;893:7;889:23;885:32;882:52;;;930:1;927;920:12;882:52;969:9;956:23;988:31;1013:5;988:31;:::i;:::-;1038:5;1090:2;1075:18;;;;1062:32;;-1:-1:-1;;;785:315:1:o;1297:247::-;1356:6;1409:2;1397:9;1388:7;1384:23;1380:32;1377:52;;;1425:1;1422;1415:12;1377:52;1464:9;1451:23;1483:31;1508:5;1483:31;:::i;1731:456::-;1808:6;1816;1824;1877:2;1865:9;1856:7;1852:23;1848:32;1845:52;;;1893:1;1890;1883:12;1845:52;1932:9;1919:23;1951:31;1976:5;1951:31;:::i;:::-;2001:5;-1:-1:-1;2058:2:1;2043:18;;2030:32;2071:33;2030:32;2071:33;:::i;:::-;1731:456;;2123:7;;-1:-1:-1;;;2177:2:1;2162:18;;;;2149:32;;1731:456::o;2563:180::-;2622:6;2675:2;2663:9;2654:7;2650:23;2646:32;2643:52;;;2691:1;2688;2681:12;2643:52;-1:-1:-1;2714:23:1;;2563:180;-1:-1:-1;2563:180:1:o;3488:829::-;3599:6;3607;3615;3623;3631;3639;3647;3700:3;3688:9;3679:7;3675:23;3671:33;3668:53;;;3717:1;3714;3707:12;3668:53;3756:9;3743:23;3775:31;3800:5;3775:31;:::i;:::-;3825:5;-1:-1:-1;3882:2:1;3867:18;;3854:32;3895:33;3854:32;3895:33;:::i;:::-;3947:7;-1:-1:-1;4001:2:1;3986:18;;3973:32;;-1:-1:-1;4052:2:1;4037:18;;4024:32;;-1:-1:-1;4108:3:1;4093:19;;4080:33;4157:4;4144:18;;4132:31;;4122:59;;4177:1;4174;4167:12;4122:59;3488:829;;;;-1:-1:-1;3488:829:1;;;;4200:7;4254:3;4239:19;;4226:33;;-1:-1:-1;4306:3:1;4291:19;;;4278:33;;3488:829;-1:-1:-1;;3488:829:1:o;4322:388::-;4390:6;4398;4451:2;4439:9;4430:7;4426:23;4422:32;4419:52;;;4467:1;4464;4457:12;4419:52;4506:9;4493:23;4525:31;4550:5;4525:31;:::i;:::-;4575:5;-1:-1:-1;4632:2:1;4617:18;;4604:32;4645:33;4604:32;4645:33;:::i;:::-;4697:7;4687:17;;;4322:388;;;;;:::o;4715:276::-;4773:6;4826:2;4814:9;4805:7;4801:23;4797:32;4794:52;;;4842:1;4839;4832:12;4794:52;4881:9;4868:23;4931:10;4924:5;4920:22;4913:5;4910:33;4900:61;;4957:1;4954;4947:12;5254:437;5333:1;5329:12;;;;5376;;;5397:61;;5451:4;5443:6;5439:17;5429:27;;5397:61;5504:2;5496:6;5493:14;5473:18;5470:38;5467:218;;5541:77;5538:1;5531:88;5642:4;5639:1;5632:15;5670:4;5667:1;5660:15;5467:218;;5254:437;;;:::o;6382:184::-;6434:77;6431:1;6424:88;6531:4;6528:1;6521:15;6555:4;6552:1;6545:15;6571:168;6644:9;;;6675;;6692:15;;;6686:22;;6672:37;6662:71;;6713:18;;:::i;6744:274::-;6784:1;6810;6800:189;;6845:77;6842:1;6835:88;6946:4;6943:1;6936:15;6974:4;6971:1;6964:15;6800:189;-1:-1:-1;7003:9:1;;6744:274::o;7658:306::-;7746:6;7754;7762;7815:2;7803:9;7794:7;7790:23;7786:32;7783:52;;;7831:1;7828;7821:12;7783:52;7860:9;7854:16;7844:26;;7910:2;7899:9;7895:18;7889:25;7879:35;;7954:2;7943:9;7939:18;7933:25;7923:35;;7658:306;;;;;:::o;7969:251::-;8039:6;8092:2;8080:9;8071:7;8067:23;8063:32;8060:52;;;8108:1;8105;8098:12;8060:52;8140:9;8134:16;8159:31;8184:5;8159:31;:::i;8557:128::-;8624:9;;;8645:11;;;8642:37;;;8659:18;;:::i;9039:482::-;9128:1;9171:5;9128:1;9185:330;9206:7;9196:8;9193:21;9185:330;;;9325:4;9257:66;9253:77;9247:4;9244:87;9241:113;;;9334:18;;:::i;:::-;9384:7;9374:8;9370:22;9367:55;;;9404:16;;;;9367:55;9483:22;;;;9443:15;;;;9185:330;;;9189:3;9039:482;;;;;:::o;9526:866::-;9575:5;9605:8;9595:80;;-1:-1:-1;9646:1:1;9660:5;;9595:80;9694:4;9684:76;;-1:-1:-1;9731:1:1;9745:5;;9684:76;9776:4;9794:1;9789:59;;;;9862:1;9857:130;;;;9769:218;;9789:59;9819:1;9810:10;;9833:5;;;9857:130;9894:3;9884:8;9881:17;9878:43;;;9901:18;;:::i;:::-;-1:-1:-1;;9957:1:1;9943:16;;9972:5;;9769:218;;10071:2;10061:8;10058:16;10052:3;10046:4;10043:13;10039:36;10033:2;10023:8;10020:16;10015:2;10009:4;10006:12;10002:35;9999:77;9996:159;;;-1:-1:-1;10108:19:1;;;10140:5;;9996:159;10187:34;10212:8;10206:4;10187:34;:::i;:::-;10317:6;10249:66;10245:79;10236:7;10233:92;10230:118;;;10328:18;;:::i;:::-;10366:20;;9526:866;-1:-1:-1;;;9526:866:1:o;10397:140::-;10455:5;10484:47;10525:4;10515:8;10511:19;10505:4;10484:47;:::i;14172:125::-;14237:9;;;14258:10;;;14255:36;;;14271:18;;:::i;14491:184::-;14543:77;14540:1;14533:88;14640:4;14637:1;14630:15;14664:4;14661:1;14654:15;14680:1026;14942:4;14990:3;14979:9;14975:19;15021:6;15010:9;15003:25;15047:2;15085:6;15080:2;15069:9;15065:18;15058:34;15128:3;15123:2;15112:9;15108:18;15101:31;15152:6;15187;15181:13;15218:6;15210;15203:22;15256:3;15245:9;15241:19;15234:26;;15295:2;15287:6;15283:15;15269:29;;15316:1;15326:218;15340:6;15337:1;15334:13;15326:218;;;15405:13;;15420:42;15401:62;15389:75;;15519:15;;;;15484:12;;;;15362:1;15355:9;15326:218;;;-1:-1:-1;;15612:42:1;15600:55;;;;15595:2;15580:18;;15573:83;-1:-1:-1;;;15687:3:1;15672:19;15665:35;15561:3;14680:1026;-1:-1:-1;;;14680:1026:1:o;16050:1248::-;16180:3;16209:1;16242:6;16236:13;16272:3;16294:1;16322:9;16318:2;16314:18;16304:28;;16382:2;16371:9;16367:18;16404;16394:61;;16448:4;16440:6;16436:17;16426:27;;16394:61;16474:2;16522;16514:6;16511:14;16491:18;16488:38;16485:222;;16561:77;16556:3;16549:90;16662:4;16659:1;16652:15;16692:4;16687:3;16680:17;16485:222;16723:18;16750:191;;;;16955:1;16950:323;;;;16716:557;;16750:191;16798:66;16787:9;16783:82;16778:3;16771:95;16921:6;16914:14;16907:22;16899:6;16895:35;16890:3;16886:45;16879:52;;16750:191;;16950:323;15997:1;15990:14;;;16034:4;16021:18;;17048:1;17062:165;17076:6;17073:1;17070:13;17062:165;;;17154:14;;17141:11;;;17134:35;17197:16;;;;17091:10;;17062:165;;;17066:3;;17256:6;17251:3;17247:16;17240:23;;16716:557;-1:-1:-1;17289:3:1;;16050:1248;-1:-1:-1;;;;;;;;16050:1248:1:o

Swarm Source

ipfs://ceafe02b7d273db4776e048f39f41cd2745b9e025df9fbee1dcd1a663a386dac
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.