ETH Price: $2,444.42 (-3.11%)

Token

BattleBears (BTB)
 

Overview

Max Total Supply

85,000,000,000 BTB

Holders

59

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
173,752,288.332816792904436837 BTB

Value
$0.00
0x5f22eed6291f9108641b1fb6a124a15e9b3c9632
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:
BattleBears

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-07-26
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.19;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                0,
                "Address: low-level call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data
    ) internal view returns (bytes memory) {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data
    ) internal returns (bytes memory) {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return
            verifyCallResultFromTarget(
                target,
                success,
                returndata,
                errorMessage
            );
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(
        bytes memory returndata,
        string memory errorMessage
    ) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

/**
 * @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,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function burn(
        address to
    ) external returns (uint256 amount0, uint256 amount1);

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract BattleBears is Context, IERC20, Ownable {
    using Address for address;

    address payable public marketingWallet =
        payable(0xd58a0aC4746e825291C67818b3aa6104fE6a58b8);

    address payable public cxWallet =
        payable(0x8c514e3363eAdC47BC2b7729bB12e9Badf231dB2);

    address public constant deadWallet =
        0x000000000000000000000000000000000000dEaD;

    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;

    event TransferStatus(string,bool);
    event Log(string, uint256);
    event AuditLog(string, address);
    event RewardLiquidityProviders(uint256 tokenAmount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    //Supply Definition.
    uint256 private _tTotal = 85_000_000_000 ether;
    uint256 private _tFeeTotal;
    //Token Definition.
    string public constant name = "BattleBears";
    string public constant symbol = "BTB";
    uint8 public constant decimals = 18;

    uint public buyFee = 7;

    uint256 public sellFee = 7;

    uint256 public marketingTokensCollected = 0;
    uint256 public totalMarketingTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 30_000 ether;


    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address private immutable WETH;

    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = false;

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

    constructor() {

        address currentRouter;

        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
            _isExcludedFromFee[0x407993575c91ce7643a4d4cCACc9A98c36eE1BBE] = true;
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
            _isExcludedFromFee[0x5E5b9bE5fd939c578ABE5800a90C566eeEbA44a5] = true;
        } else if (block.chainid == 1 || block.chainid == 4) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
            _isExcludedFromFee[0x71B5759d73262FBb223956913ecF4ecC51057641] = true;
        } else {
            revert("Check Router");
        }

        //End of Router Variables.
        //Owner of balance
        _tOwned[cxWallet] = _tTotal;
        //Create Pair in the contructor, this may fail on some blockchains and can be done in a separate line if needed.
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);
        WETH = _uniswapV2Router.WETH();
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Router = _uniswapV2Router;
        //Approve router to be used.
        _approve(msg.sender, address(uniswapV2Router), type(uint256).max);
        _approve(address(this), address(uniswapV2Router), type(uint256).max);
        //Exclude from fees the owner, contract and SAFU.
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[cxWallet] = true;


        emit Transfer(address(0), cxWallet, _tTotal);
        _transferOwnership(cxWallet);
    }

    //Readable Functions.
    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _tOwned[account];
    }

    //ERC 20 Standard Transfer Functions
    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    //ERC 20 Standard Allowance Function
    function allowance(
        address _owner,
        address spender
    ) public view override returns (uint256) {
        return _allowances[_owner][spender];
    }

    //ERC 20 Standard Approve Function
    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    //ERC 20 Standard Transfer From
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        uint currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), currentAllowance - amount);
        return true;
    }

    //ERC 20 Standard increase Allowance
    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    //ERC 20 Standard decrease Allowance
    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] - subtractedValue
        );
        return true;
    }

    //Approve Function
    function _approve(address _owner, address spender, uint256 amount) private {
        require(_owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[_owner][spender] = amount;
        emit Approval(_owner, spender, amount);
    }

    //Transfer function, validate correct wallet structure, take fees, and other custom taxes are done during the transfer.
    function _transfer(address from, address to, uint256 amount) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(
            _tOwned[from] >= amount,
            "ERC20: transfer amount exceeds balance"
        );

        //Adding logic for automatic swap.
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinimumTokenBalance = contractTokenBalance >=
            minimumTokensBeforeSwap;
        uint fee = 0;
        //if any account belongs to _isExcludedFromFee account then remove the fee
        if (
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            overMinimumTokenBalance &&
            swapAndLiquifyEnabled
        ) {
            swapAndLiquify();
        }
        if (to == uniswapV2Pair && !_isExcludedFromFee[from]) {
            fee = (sellFee * amount) / 100;
        }
        if (from == uniswapV2Pair && !_isExcludedFromFee[to]) {
            fee = (buyFee * amount) / 100;
        }
        amount -= fee;
        if (fee > 0) {
            _tokenTransfer(from, address(this), fee);
            marketingTokensCollected += fee;
            totalMarketingTokensCollected += fee;
        }
        _tokenTransfer(from, to, amount);
    }

    //Swap Tokens for BNB or to add liquidity either automatically or manual, by default this is set to manual.
    //Corrected newBalance bug, it sending bnb to wallet and any remaining is on contract and can be recoverred.
    function swapAndLiquify() public lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;

        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

    //swap for eth is to support the converstion of tokens to weth during swapandliquify this is a supporting function
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this), // The contract
            block.timestamp
        );

        emit SwapTokensForETH(tokenAmount, path);
    }

    //ERC 20 standard transfer, only added if taking fees to countup the amount of fees for better tracking and split purpose.
    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        _tOwned[sender] -= amount;
        _tOwned[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function isExcludedFromFee(address account) external view returns (bool) {
        return _isExcludedFromFee[account];
    }

    //exclude wallets from fees, this is needed for launch or other contracts.
    function excludeFromFee(address account) external onlyOwner {
        require(_isExcludedFromFee[account] != true, "The wallet is already excluded!");
        _isExcludedFromFee[account] = true;
        emit AuditLog(
            "We have excluded the following walled in fees:",
            account
        );
    }

    //include wallet back in fees.
    function includeInFee(address account) external onlyOwner {
        require(_isExcludedFromFee[account] != false, "The wallet is already included!");
        _isExcludedFromFee[account] = false;
        emit AuditLog(
            "We have including the following walled in fees:",
            account
        );
    }

    //Automatic Swap Configuration.
    function setTokensToSwap(
        uint256 _minimumTokensBeforeSwap
    ) external onlyOwner {
        require(
            _minimumTokensBeforeSwap >= 100 ether,
            "You need to enter more than 100 tokens."
        );
        minimumTokensBeforeSwap = _minimumTokensBeforeSwap;
        emit Log(
            "We have updated minimunTokensBeforeSwap to:",
            minimumTokensBeforeSwap
        );
    }

    function setSwapAndLiquifyEnabled(bool _enabled) external onlyOwner {
        require(swapAndLiquifyEnabled != _enabled, "Value already set");
        swapAndLiquifyEnabled = _enabled;
        emit SwapAndLiquifyEnabledUpdated(_enabled);
    }

    //set a new marketing wallet.
    function setmarketingWallet(address _marketingWallet) external onlyOwner {
        require(_marketingWallet != address(0), "setmarketingWallet: ZERO");
        marketingWallet = payable(_marketingWallet);
        emit AuditLog("We have Updated the MarketingWallet:", marketingWallet);
    }

    function setBuyFee(uint256 _buyFee) external onlyOwner {
        require(_buyFee <= 10, "Buy Fee cannot be more than 10%");
        buyFee = _buyFee;
        emit Log("We have updated the buy fee to:", buyFee);
    }

    function setSellFee(uint256 _sellFee) external onlyOwner {
        require(_sellFee <= 10, "Sell Fee cannot be more than 10%");
        sellFee = _sellFee;
        emit Log("We have updated the sell fee to:", sellFee);
    }

function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        if (amount == 0) return;
        (bool succ, ) = recipient.call{value: amount}("");
        emit TransferStatus("Transfer Status",succ );
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    /////---fallback--////
    //This cannot be removed as is a fallback to the swapAndLiquify
    event SwapETHForTokens(uint256 amountIn, address[] path);

    function swapETHForTokens(uint256 amount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);
        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(
            0, // accept any amount of Tokens
            path,
            deadWallet, // Burn address
            block.timestamp + 300
        );
        emit SwapETHForTokens(amount, path);
    }

    // Withdraw ETH that's potentially stuck in the Contract
    function recoverETHfromContract() external onlyOwner {
        uint ethBalance = address(this).balance;
        (bool succ, ) = payable(marketingWallet).call{value: ethBalance}("");
        require(succ, "Transfer failed");
        emit AuditLog(
            "We have recover the stuck eth from contract.",
            marketingWallet
        );
    }

    // Withdraw ERC20 tokens that are potentially stuck in Contract
    function recoverTokensFromContract(
        address _tokenAddress,
        uint256 _amount
    ) external onlyOwner {
        require(
            _tokenAddress != address(this),
            "Owner can't claim contract's balance of its own tokens"
        );
        bool succ = IERC20(_tokenAddress).transfer(marketingWallet, _amount);
        require(succ, "Transfer failed");
        emit Log("We have recovered tokens from contract:", _amount);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"address","name":"","type":"address"}],"name":"AuditLog","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Log","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardLiquidityProviders","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapETHForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"TransferStatus","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cxWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setmarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMarketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e0604052600180546001600160a01b031990811673d58a0ac4746e825291c67818b3aa6104fe6a58b81790915560028054909116738c514e3363eadc47bc2b7729bb12e9badf231db21790556c0112a65a21103a943908000000600655600760088190556009556000600a819055600b5569065a4da25d3016c00000600c55600d805461ff00191690553480156200009757600080fd5b50620000a333620004bc565b60004660380362000113575073407993575c91ce7643a4d4ccacc9a98c36ee1bbe60005260056020527f7e99e1e5c40ec22aa71ab68cea1ae3bb6f232576acb26d0b4e86f2583f2d4e3c805460ff191660011790557310ed43c718714eb63d5aa57b78b54704e256024e62000238565b46606103620001815750735e5b9be5fd939c578abe5800a90c566eeeba44a560005260056020527ff82f0651e7e607eebff6c1d3d6f3f615f89d88d1b43fa353246ad10804ccc9e3805460ff1916600117905573d99d1c33f9fc3444f8101754abc46c52416550d162000238565b4660011480620001915750466004145b15620001fc57507371b5759d73262fbb223956913ecf4ecc5105764160005260056020527ff98fd0e7f6efd6fe8e448ee8fb48e788882f12aeb1795b18940ee343139f98b6805460ff19166001179055737a250d5630b4cf539739df2c5dacb4c659f2488d62000238565b60405162461bcd60e51b815260206004820152600c60248201526b21b432b1b5902937baba32b960a11b60448201526064015b60405180910390fd5b6006546002546001600160a01b039081166000908152600360209081526040918290209390935580516315ab88c960e31b8152905184939284169263ad5c464892600480820193918290030181865afa1580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c0919062000634565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000318573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033e919062000634565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000390573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b6919062000634565b6001600160a01b0390811660a05281166080819052620003db9033906000196200050c565b620003f2306080516000196200050c60201b60201c565b6001600560006200040b6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790553081526005845282812080548616600190811790915560028054841683528483208054909716909117909555935460065492519283521692917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600254620004b4906001600160a01b0316620004bc565b505062000666565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620005705760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200022f565b6001600160a01b038216620005d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200022f565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000602082840312156200064757600080fd5b81516001600160a01b03811681146200065f57600080fd5b9392505050565b60805160a05160c051611d7c620006b960003960006117c101526000818161046901528181611563015281816115c3015261163f0152600081816102db0152818161181901526118550152611d7c6000f3fe60806040526004361061021e5760003560e01c80636ca60bc611610123578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e14610687578063e6be4a72146106cd578063e780c045146106ed578063ea2f0b371461070d578063f2fde38b1461072d57600080fd5b8063a9059cbb14610607578063b29ad50a14610627578063c49b9a801461063c578063ce831ed51461065c578063d2d7ad831461067157600080fd5b806385141a77116100f257806385141a77146105645780638b4cee081461057a5780638da5cb5b1461059a57806395d89b41146105b8578063a457c2d7146105e757600080fd5b80636ca60bc6146104e357806370a08231146104f9578063715018a61461052f57806375f0a8741461054457600080fd5b8063313ce567116101a6578063461d947611610175578063461d947614610421578063470624021461044157806349bd5a5e146104575780634a74bb021461048b5780635342acb4146104aa57600080fd5b8063313ce567146103a457806339509351146103cb57806340763503146103eb578063437823ec1461040157600080fd5b806318160ddd116101ed57806318160ddd14610315578063220f669614610334578063224611731461034e57806323b872dd1461036e5780632b14ca561461038e57600080fd5b806306fdde031461022a578063095ea7b3146102775780630cc835a3146102a75780631694505e146102c957600080fd5b3661022557005b600080fd5b34801561023657600080fd5b506102616040518060400160405280600b81526020016a426174746c65426561727360a81b81525081565b60405161026e9190611a54565b60405180910390f35b34801561028357600080fd5b50610297610292366004611abe565b61074d565b604051901515815260200161026e565b3480156102b357600080fd5b506102c76102c2366004611ae8565b610764565b005b3480156102d557600080fd5b506102fd7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161026e565b34801561032157600080fd5b506006545b60405190815260200161026e565b34801561034057600080fd5b50600d546102979060ff1681565b34801561035a57600080fd5b506102c7610369366004611b01565b610823565b34801561037a57600080fd5b50610297610389366004611b23565b610902565b34801561039a57600080fd5b5061032660095481565b3480156103b057600080fd5b506103b9601281565b60405160ff909116815260200161026e565b3480156103d757600080fd5b506102976103e6366004611abe565b6109b1565b3480156103f757600080fd5b50610326600b5481565b34801561040d57600080fd5b506102c761041c366004611b01565b6109e8565b34801561042d57600080fd5b506102c761043c366004611ae8565b610af8565b34801561044d57600080fd5b5061032660085481565b34801561046357600080fd5b506102fd7f000000000000000000000000000000000000000000000000000000000000000081565b34801561049757600080fd5b50600d5461029790610100900460ff1681565b3480156104b657600080fd5b506102976104c5366004611b01565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156104ef57600080fd5b50610326600a5481565b34801561050557600080fd5b50610326610514366004611b01565b6001600160a01b031660009081526003602052604090205490565b34801561053b57600080fd5b506102c7610bd7565b34801561055057600080fd5b506001546102fd906001600160a01b031681565b34801561057057600080fd5b506102fd61dead81565b34801561058657600080fd5b506102c7610595366004611ae8565b610beb565b3480156105a657600080fd5b506000546001600160a01b03166102fd565b3480156105c457600080fd5b5061026160405180604001604052806003815260200162212a2160e91b81525081565b3480156105f357600080fd5b50610297610602366004611abe565b610c9c565b34801561061357600080fd5b50610297610622366004611abe565b610cd3565b34801561063357600080fd5b506102c7610ce0565b34801561064857600080fd5b506102c7610657366004611b6d565b610d33565b34801561066857600080fd5b506102c7610dda565b34801561067d57600080fd5b50610326600c5481565b34801561069357600080fd5b506103266106a2366004611b8a565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b3480156106d957600080fd5b506102c76106e8366004611abe565b610ef9565b3480156106f957600080fd5b506002546102fd906001600160a01b031681565b34801561071957600080fd5b506102c7610728366004611b01565b6110a0565b34801561073957600080fd5b506102c7610748366004611b01565b6111a2565b600061075a33848461121b565b5060015b92915050565b61076c611340565b600a8111156107c25760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b600881905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611d07833981519152906080015b60405180910390a150565b61082b611340565b6001600160a01b0381166108815760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f000000000000000060448201526064016107b9565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611d278339815191529060a001610818565b6001600160a01b0383166000908152600460209081526040808320338452909152812054828110156109875760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016107b9565b61099285858561139a565b6109a685336109a18685611bd3565b61121b565b506001949350505050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161075a9185906109a1908690611be6565b6109f0611340565b6001600160a01b03811660009081526005602052604090205460ff161515600103610a5d5760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c7265616479206578636c75646564210060448201526064016107b9565b6001600160a01b03811660009081526005602052604090819020805460ff1916600117905551600080516020611d27833981519152906108189083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610b00611340565b68056bc75e2d63100000811015610b695760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016107b9565b600c81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611d078339815191529060a001610818565b610bdf611340565b610be9600061171a565b565b610bf3611340565b600a811115610c445760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016107b9565b60098190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611d0783398151915290608001610818565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161075a9185906109a1908690611bd3565b600061075a33848461139a565b600d805460ff19166001179055306000908152600360205260408120549050610d088161176a565b6001544790610d20906001600160a01b0316826118f6565b50506000600a55600d805460ff19169055565b610d3b611340565b801515600d60019054906101000a900460ff16151503610d915760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016107b9565b600d80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061081890831515815260200190565b610de2611340565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610e33576040519150601f19603f3d011682016040523d82523d6000602084013e610e38565b606091505b5050905080610e7b5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107b9565b60015460408051818152602c918101919091527f57652068617665207265636f7665722074686520737475636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611d278339815191529060a0015b60405180910390a15050565b610f01611340565b306001600160a01b03831603610f785760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016107b9565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611bf9565b9050806110325760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107b9565b604080518181526027918101919091527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b608082015260208101839052600080516020611d078339815191529060a0015b60405180910390a1505050565b6110a8611340565b6001600160a01b03811660009081526005602052604081205460ff16151590036111145760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c726561647920696e636c75646564210060448201526064016107b9565b6001600160a01b038116600081815260056020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611d278339815191529060a001610818565b6111aa611340565b6001600160a01b03811661120f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b9565b6112188161171a565b50565b6001600160a01b03831661127d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107b9565b6001600160a01b0382166112de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107b9565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610be95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b6001600160a01b0383166113fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107b9565b6001600160a01b0382166114605760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107b9565b600081116114c25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016107b9565b6001600160a01b0383166000908152600360205260409020548111156115395760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107b9565b30600090815260036020526040812054600c54600d549192908310159160ff1615801561159857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156115a15750815b80156115b45750600d54610100900460ff165b156115c1576115c1610ce0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614801561161b57506001600160a01b03861660009081526005602052604090205460ff16155b1561163d576064846009546116309190611c16565b61163a9190611c2d565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561169757506001600160a01b03851660009081526005602052604090205460ff16155b156116b9576064846008546116ac9190611c16565b6116b69190611c2d565b90505b6116c38185611bd3565b93508015611707576116d68630836119b3565b80600a60008282546116e89190611be6565b9250508190555080600b60008282546117019190611be6565b90915550505b6117128686866119b3565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061179f5761179f611c4f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106117f3576117f3611c4f565b60200260200101906001600160a01b031690816001600160a01b03168152505061183e307f00000000000000000000000000000000000000000000000000000000000000008461121b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611893908590600090869030904290600401611ca9565b600060405180830381600087803b1580156118ad57600080fd5b505af11580156118c1573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610eed929190611ce5565b80600003611902575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461194f576040519150601f19603f3d011682016040523d82523d6000602084013e611954565b606091505b505090507f232b4b3d4096931affa643ef458ec66ca050f6e6f4c2506c93fb2bcd509902128160405161109391906040808252600f908201526e5472616e736665722053746174757360881b6060820152901515602082015260800190565b6001600160a01b038316600090815260036020526040812080548392906119db908490611bd3565b90915550506001600160a01b03821660009081526003602052604081208054839290611a08908490611be6565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161133391815260200190565b600060208083528351808285015260005b81811015611a8157858101830151858201604001528201611a65565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611ab957600080fd5b919050565b60008060408385031215611ad157600080fd5b611ada83611aa2565b946020939093013593505050565b600060208284031215611afa57600080fd5b5035919050565b600060208284031215611b1357600080fd5b611b1c82611aa2565b9392505050565b600080600060608486031215611b3857600080fd5b611b4184611aa2565b9250611b4f60208501611aa2565b9150604084013590509250925092565b801515811461121857600080fd5b600060208284031215611b7f57600080fd5b8135611b1c81611b5f565b60008060408385031215611b9d57600080fd5b611ba683611aa2565b9150611bb460208401611aa2565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561075e5761075e611bbd565b8082018082111561075e5761075e611bbd565b600060208284031215611c0b57600080fd5b8151611b1c81611b5f565b808202811582820484141761075e5761075e611bbd565b600082611c4a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611c9e5781516001600160a01b031687529582019590820190600101611c79565b509495945050505050565b85815284602082015260a060408201526000611cc860a0830186611c65565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611cfe6040830184611c65565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220539ea9c2a053fa734475c5e7a2001c708e3b446bac0311770f677a7ac637464d64736f6c63430008130033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c80636ca60bc611610123578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e14610687578063e6be4a72146106cd578063e780c045146106ed578063ea2f0b371461070d578063f2fde38b1461072d57600080fd5b8063a9059cbb14610607578063b29ad50a14610627578063c49b9a801461063c578063ce831ed51461065c578063d2d7ad831461067157600080fd5b806385141a77116100f257806385141a77146105645780638b4cee081461057a5780638da5cb5b1461059a57806395d89b41146105b8578063a457c2d7146105e757600080fd5b80636ca60bc6146104e357806370a08231146104f9578063715018a61461052f57806375f0a8741461054457600080fd5b8063313ce567116101a6578063461d947611610175578063461d947614610421578063470624021461044157806349bd5a5e146104575780634a74bb021461048b5780635342acb4146104aa57600080fd5b8063313ce567146103a457806339509351146103cb57806340763503146103eb578063437823ec1461040157600080fd5b806318160ddd116101ed57806318160ddd14610315578063220f669614610334578063224611731461034e57806323b872dd1461036e5780632b14ca561461038e57600080fd5b806306fdde031461022a578063095ea7b3146102775780630cc835a3146102a75780631694505e146102c957600080fd5b3661022557005b600080fd5b34801561023657600080fd5b506102616040518060400160405280600b81526020016a426174746c65426561727360a81b81525081565b60405161026e9190611a54565b60405180910390f35b34801561028357600080fd5b50610297610292366004611abe565b61074d565b604051901515815260200161026e565b3480156102b357600080fd5b506102c76102c2366004611ae8565b610764565b005b3480156102d557600080fd5b506102fd7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b03909116815260200161026e565b34801561032157600080fd5b506006545b60405190815260200161026e565b34801561034057600080fd5b50600d546102979060ff1681565b34801561035a57600080fd5b506102c7610369366004611b01565b610823565b34801561037a57600080fd5b50610297610389366004611b23565b610902565b34801561039a57600080fd5b5061032660095481565b3480156103b057600080fd5b506103b9601281565b60405160ff909116815260200161026e565b3480156103d757600080fd5b506102976103e6366004611abe565b6109b1565b3480156103f757600080fd5b50610326600b5481565b34801561040d57600080fd5b506102c761041c366004611b01565b6109e8565b34801561042d57600080fd5b506102c761043c366004611ae8565b610af8565b34801561044d57600080fd5b5061032660085481565b34801561046357600080fd5b506102fd7f000000000000000000000000016a2a14ce1752bd5b4bc76cad66f5d2629315f681565b34801561049757600080fd5b50600d5461029790610100900460ff1681565b3480156104b657600080fd5b506102976104c5366004611b01565b6001600160a01b031660009081526005602052604090205460ff1690565b3480156104ef57600080fd5b50610326600a5481565b34801561050557600080fd5b50610326610514366004611b01565b6001600160a01b031660009081526003602052604090205490565b34801561053b57600080fd5b506102c7610bd7565b34801561055057600080fd5b506001546102fd906001600160a01b031681565b34801561057057600080fd5b506102fd61dead81565b34801561058657600080fd5b506102c7610595366004611ae8565b610beb565b3480156105a657600080fd5b506000546001600160a01b03166102fd565b3480156105c457600080fd5b5061026160405180604001604052806003815260200162212a2160e91b81525081565b3480156105f357600080fd5b50610297610602366004611abe565b610c9c565b34801561061357600080fd5b50610297610622366004611abe565b610cd3565b34801561063357600080fd5b506102c7610ce0565b34801561064857600080fd5b506102c7610657366004611b6d565b610d33565b34801561066857600080fd5b506102c7610dda565b34801561067d57600080fd5b50610326600c5481565b34801561069357600080fd5b506103266106a2366004611b8a565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205490565b3480156106d957600080fd5b506102c76106e8366004611abe565b610ef9565b3480156106f957600080fd5b506002546102fd906001600160a01b031681565b34801561071957600080fd5b506102c7610728366004611b01565b6110a0565b34801561073957600080fd5b506102c7610748366004611b01565b6111a2565b600061075a33848461121b565b5060015b92915050565b61076c611340565b600a8111156107c25760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b600881905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611d07833981519152906080015b60405180910390a150565b61082b611340565b6001600160a01b0381166108815760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f000000000000000060448201526064016107b9565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611d278339815191529060a001610818565b6001600160a01b0383166000908152600460209081526040808320338452909152812054828110156109875760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016107b9565b61099285858561139a565b6109a685336109a18685611bd3565b61121b565b506001949350505050565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161075a9185906109a1908690611be6565b6109f0611340565b6001600160a01b03811660009081526005602052604090205460ff161515600103610a5d5760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c7265616479206578636c75646564210060448201526064016107b9565b6001600160a01b03811660009081526005602052604090819020805460ff1916600117905551600080516020611d27833981519152906108189083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610b00611340565b68056bc75e2d63100000811015610b695760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016107b9565b600c81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611d078339815191529060a001610818565b610bdf611340565b610be9600061171a565b565b610bf3611340565b600a811115610c445760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016107b9565b60098190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611d0783398151915290608001610818565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909161075a9185906109a1908690611bd3565b600061075a33848461139a565b600d805460ff19166001179055306000908152600360205260408120549050610d088161176a565b6001544790610d20906001600160a01b0316826118f6565b50506000600a55600d805460ff19169055565b610d3b611340565b801515600d60019054906101000a900460ff16151503610d915760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016107b9565b600d80548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061081890831515815260200190565b610de2611340565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610e33576040519150601f19603f3d011682016040523d82523d6000602084013e610e38565b606091505b5050905080610e7b5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107b9565b60015460408051818152602c918101919091527f57652068617665207265636f7665722074686520737475636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611d278339815191529060a0015b60405180910390a15050565b610f01611340565b306001600160a01b03831603610f785760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016107b9565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611bf9565b9050806110325760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016107b9565b604080518181526027918101919091527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b608082015260208101839052600080516020611d078339815191529060a0015b60405180910390a1505050565b6110a8611340565b6001600160a01b03811660009081526005602052604081205460ff16151590036111145760405162461bcd60e51b815260206004820152601f60248201527f5468652077616c6c657420697320616c726561647920696e636c75646564210060448201526064016107b9565b6001600160a01b038116600081815260056020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611d278339815191529060a001610818565b6111aa611340565b6001600160a01b03811661120f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b9565b6112188161171a565b50565b6001600160a01b03831661127d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016107b9565b6001600160a01b0382166112de5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016107b9565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610be95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b9565b6001600160a01b0383166113fe5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016107b9565b6001600160a01b0382166114605760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016107b9565b600081116114c25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016107b9565b6001600160a01b0383166000908152600360205260409020548111156115395760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016107b9565b30600090815260036020526040812054600c54600d549192908310159160ff1615801561159857507f000000000000000000000000016a2a14ce1752bd5b4bc76cad66f5d2629315f66001600160a01b0316866001600160a01b031614155b80156115a15750815b80156115b45750600d54610100900460ff165b156115c1576115c1610ce0565b7f000000000000000000000000016a2a14ce1752bd5b4bc76cad66f5d2629315f66001600160a01b0316856001600160a01b031614801561161b57506001600160a01b03861660009081526005602052604090205460ff16155b1561163d576064846009546116309190611c16565b61163a9190611c2d565b90505b7f000000000000000000000000016a2a14ce1752bd5b4bc76cad66f5d2629315f66001600160a01b0316866001600160a01b031614801561169757506001600160a01b03851660009081526005602052604090205460ff16155b156116b9576064846008546116ac9190611c16565b6116b69190611c2d565b90505b6116c38185611bd3565b93508015611707576116d68630836119b3565b80600a60008282546116e89190611be6565b9250508190555080600b60008282546117019190611be6565b90915550505b6117128686866119b3565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061179f5761179f611c4f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106117f3576117f3611c4f565b60200260200101906001600160a01b031690816001600160a01b03168152505061183e307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d8461121b565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611893908590600090869030904290600401611ca9565b600060405180830381600087803b1580156118ad57600080fd5b505af11580156118c1573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610eed929190611ce5565b80600003611902575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461194f576040519150601f19603f3d011682016040523d82523d6000602084013e611954565b606091505b505090507f232b4b3d4096931affa643ef458ec66ca050f6e6f4c2506c93fb2bcd509902128160405161109391906040808252600f908201526e5472616e736665722053746174757360881b6060820152901515602082015260800190565b6001600160a01b038316600090815260036020526040812080548392906119db908490611bd3565b90915550506001600160a01b03821660009081526003602052604081208054839290611a08908490611be6565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161133391815260200190565b600060208083528351808285015260005b81811015611a8157858101830151858201604001528201611a65565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611ab957600080fd5b919050565b60008060408385031215611ad157600080fd5b611ada83611aa2565b946020939093013593505050565b600060208284031215611afa57600080fd5b5035919050565b600060208284031215611b1357600080fd5b611b1c82611aa2565b9392505050565b600080600060608486031215611b3857600080fd5b611b4184611aa2565b9250611b4f60208501611aa2565b9150604084013590509250925092565b801515811461121857600080fd5b600060208284031215611b7f57600080fd5b8135611b1c81611b5f565b60008060408385031215611b9d57600080fd5b611ba683611aa2565b9150611bb460208401611aa2565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561075e5761075e611bbd565b8082018082111561075e5761075e611bbd565b600060208284031215611c0b57600080fd5b8151611b1c81611b5f565b808202811582820484141761075e5761075e611bbd565b600082611c4a57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611c9e5781516001600160a01b031687529582019590820190600101611c79565b509495945050505050565b85815284602082015260a060408201526000611cc860a0830186611c65565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611cfe6040830184611c65565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220539ea9c2a053fa734475c5e7a2001c708e3b446bac0311770f677a7ac637464d64736f6c63430008130033

Deployed Bytecode Sourcemap

22897:13985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24038:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24038:43:0;;;;;;;;;;;;:::i;:::-;;;;;;;;27306:186;;;;;;;;;;-1:-1:-1;27306:186:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;27306:186:0;1004:187:1;34350:220:0;;;;;;;;;;-1:-1:-1;34350:220:0;;;;;:::i;:::-;;:::i;:::-;;24413:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1572:32:1;;;1554:51;;1542:2;1527:18;24413:51:0;1381:230:1;26576:95:0;;;;;;;;;;-1:-1:-1;26656:7:0;;26576:95;;;1762:25:1;;;1750:2;1735:18;26576:95:0;1616:177:1;24555:28:0;;;;;;;;;;-1:-1:-1;24555:28:0;;;;;;;;34048:294;;;;;;;;;;-1:-1:-1;34048:294:0;;;;;:::i;:::-;;:::i;27537:478::-;;;;;;;;;;-1:-1:-1;27537:478:0;;;;;:::i;:::-;;:::i;24207:26::-;;;;;;;;;;;;;;;;24132:35;;;;;;;;;;;;24165:2;24132:35;;;;;2494:4:1;2482:17;;;2464:36;;2452:2;2437:18;24132:35:0;2322:184:1;28065:290:0;;;;;;;;;;-1:-1:-1;28065:290:0;;;;;:::i;:::-;;:::i;24292:48::-;;;;;;;;;;;;;;;;32586:323;;;;;;;;;;-1:-1:-1;32586:323:0;;;;;:::i;:::-;;:::i;33322:428::-;;;;;;;;;;-1:-1:-1;33322:428:0;;;;;:::i;:::-;;:::i;24176:22::-;;;;;;;;;;;;;;;;24471:38;;;;;;;;;;;;;;;24590:41;;;;;;;;;;-1:-1:-1;24590:41:0;;;;;;;;;;;32372:126;;;;;;;;;;-1:-1:-1;32372:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;32463:27:0;32439:4;32463:27;;;:18;:27;;;;;;;;;32372:126;24242:43;;;;;;;;;;;;;;;;26679:117;;;;;;;;;;-1:-1:-1;26679:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;26772:16:0;26745:7;26772:16;;;:7;:16;;;;;;;26679:117;13017:103;;;;;;;;;;;;;:::i;22987:101::-;;;;;;;;;;-1:-1:-1;22987:101:0;;;;-1:-1:-1;;;;;22987:101:0;;;23200:88;;;;;;;;;;;;23246:42;23200:88;;34578:228;;;;;;;;;;-1:-1:-1;34578:228:0;;;;;:::i;:::-;;:::i;12369:87::-;;;;;;;;;;-1:-1:-1;12415:7:0;12442:6;-1:-1:-1;;;;;12442:6:0;12369:87;;24088:37;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24088:37:0;;;;;28405:300;;;;;;;;;;-1:-1:-1;28405:300:0;;;;;:::i;:::-;;:::i;26846:192::-;;;;;;;;;;-1:-1:-1;26846:192:0;;;;;:::i;:::-;;:::i;30906:303::-;;;;;;;;;;;;;:::i;33758:247::-;;;;;;;;;;-1:-1:-1;33758:247:0;;;;;:::i;:::-;;:::i;35976:359::-;;;;;;;;;;;;;:::i;24349:53::-;;;;;;;;;;;;;;;;27088:170;;;;;;;;;;-1:-1:-1;27088:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;27222:19:0;;;27195:7;27222:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;27088:170;36412:465;;;;;;;;;;-1:-1:-1;36412:465:0;;;;;:::i;:::-;;:::i;23097:94::-;;;;;;;;;;-1:-1:-1;23097:94:0;;;;-1:-1:-1;;;;;23097:94:0;;;32953:324;;;;;;;;;;-1:-1:-1;32953:324:0;;;;;:::i;:::-;;:::i;13275:238::-;;;;;;;;;;-1:-1:-1;13275:238:0;;;;;:::i;:::-;;:::i;27306:186::-;27406:4;27423:39;180:10;27446:7;27455:6;27423:8;:39::i;:::-;-1:-1:-1;27480:4:0;27306:186;;;;;:::o;34350:220::-;12255:13;:11;:13::i;:::-;34435:2:::1;34424:7;:13;;34416:57;;;::::0;-1:-1:-1;;;34416:57:0;;3779:2:1;34416:57:0::1;::::0;::::1;3761:21:1::0;3818:2;3798:18;;;3791:30;3857:33;3837:18;;;3830:61;3908:18;;34416:57:0::1;;;;;;;;;34484:6;:16:::0;;;34516:46:::1;::::0;;4149:21:1;;;4206:2;4186:18;;;4179:30;;;;4245:33;4240:2;4225:18;;4218:61;4346:4;4331:20;;4324:36;;;-1:-1:-1;;;;;;;;;;;34516:46:0;4311:3:1;4296:19;34516:46:0::1;;;;;;;;34350:220:::0;:::o;34048:294::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;34140:30:0;::::1;34132:67;;;::::0;-1:-1:-1;;;34132:67:0;;4573:2:1;34132:67:0::1;::::0;::::1;4555:21:1::0;4612:2;4592:18;;;4585:30;4651:26;4631:18;;;4624:54;4695:18;;34132:67:0::1;4371:348:1::0;34132:67:0::1;34210:15;:43:::0;;-1:-1:-1;;;;;;34210:43:0::1;-1:-1:-1::0;;;;;34210:43:0;::::1;::::0;;::::1;::::0;;;34269:65:::1;::::0;;4944:21:1;;;5001:2;4981:18;;;4974:30;;;;5040:34;5035:2;5020:18;;5013:62;-1:-1:-1;;;5106:3:1;5091:19;;5084:35;5186:4;5171:20;;5164:62;;;;-1:-1:-1;;;;;;;;;;;34269:65:0;5151:3:1;5136:19;34269:65:0::1;4724:508:1::0;27537:478:0;-1:-1:-1;;;;;27710:19:0;;27669:4;27710:19;;;:11;:19;;;;;;;;180:10;27710:33;;;;;;;;27776:26;;;;27754:116;;;;-1:-1:-1;;;27754:116:0;;5439:2:1;27754:116:0;;;5421:21:1;5478:2;5458:18;;;5451:30;5517:34;5497:18;;;5490:62;-1:-1:-1;;;5568:18:1;;;5561:38;5616:19;;27754:116:0;5237:404:1;27754:116:0;27881:36;27891:6;27899:9;27910:6;27881:9;:36::i;:::-;27928:57;27937:6;180:10;27959:25;27978:6;27959:16;:25;:::i;:::-;27928:8;:57::i;:::-;-1:-1:-1;28003:4:0;;27537:478;-1:-1:-1;;;;27537:478:0:o;28065:290::-;180:10;28178:4;28267:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28267:34:0;;;;;;;;;;28178:4;;28195:130;;28245:7;;28267:47;;28304:10;;28267:47;:::i;32586:323::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;32665:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:35;;:27:::0;:35;32657:79:::1;;;::::0;-1:-1:-1;;;32657:79:0;;6243:2:1;32657:79:0::1;::::0;::::1;6225:21:1::0;6282:2;6262:18;;;6255:30;6321:33;6301:18;;;6294:61;6372:18;;32657:79:0::1;6041:355:1::0;32657:79:0::1;-1:-1:-1::0;;;;;32747:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;32747:34:0::1;32777:4;32747:34;::::0;;32797:104;-1:-1:-1;;;;;;;;;;;32797:104:0;::::1;::::0;32766:7;;6631:2:1;6613:21;;;6670:2;6650:18;;;6643:30;6709:34;6704:2;6689:18;;6682:62;-1:-1:-1;;;6775:3:1;6760:19;;6753:45;-1:-1:-1;;;;;6872:32:1;;;;6865:4;6850:20;;6843:62;6830:3;6815:19;;6401:510;33322:428:0;12255:13;:11;:13::i;:::-;33477:9:::1;33449:24;:37;;33427:126;;;::::0;-1:-1:-1;;;33427:126:0;;7118:2:1;33427:126:0::1;::::0;::::1;7100:21:1::0;7157:2;7137:18;;;7130:30;7196:34;7176:18;;;7169:62;-1:-1:-1;;;7247:18:1;;;7240:37;7294:19;;33427:126:0::1;6916:403:1::0;33427:126:0::1;33564:23;:50:::0;;;33630:112:::1;::::0;;7536:21:1;;;7593:2;7573:18;;;7566:30;;;;7632:34;7627:2;7612:18;;7605:62;-1:-1:-1;;;7698:3:1;7683:19;;7676:42;7785:4;7770:20;;7763:36;;;-1:-1:-1;;;;;;;;;;;33630:112:0;7750:3:1;7735:19;33630:112:0::1;7324:481:1::0;13017:103:0;12255:13;:11;:13::i;:::-;13082:30:::1;13109:1;13082:18;:30::i;:::-;13017:103::o:0;34578:228::-;12255:13;:11;:13::i;:::-;34666:2:::1;34654:8;:14;;34646:59;;;::::0;-1:-1:-1;;;34646:59:0;;8012:2:1;34646:59:0::1;::::0;::::1;7994:21:1::0;;;8031:18;;;8024:30;8090:34;8070:18;;;8063:62;8142:18;;34646:59:0::1;7810:356:1::0;34646:59:0::1;34716:7;:18:::0;;;34750:48:::1;::::0;;8383:21:1;;;8440:2;8420:18;;;8413:30;;;8479:34;8474:2;8459:18;;8452:62;8566:18;;;8559:34;;;-1:-1:-1;;;;;;;;;;;34750:48:0;8546:3:1;8531:19;34750:48:0::1;8171:428:1::0;28405:300:0;180:10;28523:4;28612:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28612:34:0;;;;;;;;;;28523:4;;28540:135;;28590:7;;28612:52;;28649:15;;28612:52;:::i;26846:192::-;26949:4;26966:42;180:10;26990:9;27001:6;26966:9;:42::i;30906:303::-;24674:16;:23;;-1:-1:-1;;24674:23:0;24693:4;24674:23;;;31002:4:::1;-1:-1:-1::0;26772:16:0;;;:7;:16;;;;;;30962:46:::1;;31019:29;31036:11;31019:16;:29::i;:::-;31132:15;::::0;31077:21:::1;::::0;31111:49:::1;::::0;-1:-1:-1;;;;;31132:15:0::1;31077:21:::0;31111:20:::1;:49::i;:::-;-1:-1:-1::0;;31200:1:0::1;31173:24;:28:::0;24720:16;:24;;-1:-1:-1;;24720:24:0;;;30906:303::o;33758:247::-;12255:13;:11;:13::i;:::-;33870:8:::1;33845:33;;:21;;;;;;;;;;;:33;;::::0;33837:63:::1;;;::::0;-1:-1:-1;;;33837:63:0;;8806:2:1;33837:63:0::1;::::0;::::1;8788:21:1::0;8845:2;8825:18;;;8818:30;-1:-1:-1;;;8864:18:1;;;8857:47;8921:18;;33837:63:0::1;8604:341:1::0;33837:63:0::1;33911:21;:32:::0;;;::::1;;;;-1:-1:-1::0;;33911:32:0;;::::1;;::::0;;33959:38:::1;::::0;::::1;::::0;::::1;::::0;33935:8;1169:14:1;1162:22;1144:41;;1132:2;1117:18;;1004:187;35976:359:0;12255:13;:11;:13::i;:::-;36114:15:::1;::::0;36106:52:::1;::::0;36058:21:::1;::::0;36040:15:::1;::::0;-1:-1:-1;;;;;36114:15:0;;::::1;::::0;36058:21;;36040:15;36106:52;36040:15;36106:52;36058:21;36114:15;36106:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36090:68;;;36177:4;36169:32;;;::::0;-1:-1:-1;;;36169:32:0;;9362:2:1;36169:32:0::1;::::0;::::1;9344:21:1::0;9401:2;9381:18;;;9374:30;-1:-1:-1;;;9420:18:1;;;9413:45;9475:18;;36169:32:0::1;9160:339:1::0;36169:32:0::1;36301:15;::::0;36217:110:::1;::::0;;9724:21:1;;;9781:2;9761:18;;;9754:30;;;;9820:34;9815:2;9800:18;;9793:62;-1:-1:-1;;;9886:3:1;9871:19;;9864:43;-1:-1:-1;;;;;36301:15:0;;::::1;9974:4:1::0;9959:20;;9952:62;-1:-1:-1;;;;;;;;;;;36217:110:0;9939:3:1;9924:19;36217:110:0::1;;;;;;;;36029:306;;35976:359::o:0;36412:465::-;12255:13;:11;:13::i;:::-;36589:4:::1;-1:-1:-1::0;;;;;36564:30:0;::::1;::::0;36542:134:::1;;;::::0;-1:-1:-1;;;36542:134:0;;10227:2:1;36542:134:0::1;::::0;::::1;10209:21:1::0;10266:2;10246:18;;;10239:30;10305:34;10285:18;;;10278:62;-1:-1:-1;;;10356:18:1;;;10349:52;10418:19;;36542:134:0::1;10025:418:1::0;36542:134:0::1;36730:15;::::0;36699:56:::1;::::0;-1:-1:-1;;;36699:56:0;;-1:-1:-1;;;;;36730:15:0;;::::1;36699:56;::::0;::::1;10630:51:1::0;10697:18;;;10690:34;;;36687:9:0::1;::::0;36699:30;::::1;::::0;::::1;::::0;10603:18:1;;36699:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36687:68;;36774:4;36766:32;;;::::0;-1:-1:-1;;;36766:32:0;;9362:2:1;36766:32:0::1;::::0;::::1;9344:21:1::0;9401:2;9381:18;;;9374:30;-1:-1:-1;;;9420:18:1;;;9413:45;9475:18;;36766:32:0::1;9160:339:1::0;36766:32:0::1;36814:55;::::0;;11197:21:1;;;11254:2;11234:18;;;11227:30;;;;11293:34;11288:2;11273:18;;11266:62;-1:-1:-1;;;11359:3:1;11344:19;;11337:38;11442:4;11427:20;;11420:36;;;-1:-1:-1;;;;;;;;;;;36814:55:0;11407:3:1;11392:19;36814:55:0::1;;;;;;;;36531:346;36412:465:::0;;:::o;32953:324::-;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;33030:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;::::1;;:36;;::::0;;33022:80:::1;;;::::0;-1:-1:-1;;;33022:80:0;;11669:2:1;33022:80:0::1;::::0;::::1;11651:21:1::0;11708:2;11688:18;;;11681:30;11747:33;11727:18;;;11720:61;11798:18;;33022:80:0::1;11467:355:1::0;33022:80:0::1;-1:-1:-1::0;;;;;33113:27:0;::::1;33143:5;33113:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;33113:35:0::1;::::0;;33164:105;;12039:21:1;;;12096:2;12076:18;;;12069:30;;;;12135:34;12130:2;12115:18;;12108:62;-1:-1:-1;;;12201:3:1;12186:19;;12179:46;12277:20;;12270:62;;;;-1:-1:-1;;;;;;;;;;;33164:105:0;12257:3:1;12242:19;33164:105:0::1;11827:511:1::0;13275:238:0;12255:13;:11;:13::i;:::-;-1:-1:-1;;;;;13378:22:0;::::1;13356:110;;;::::0;-1:-1:-1;;;13356:110:0;;12545:2:1;13356:110:0::1;::::0;::::1;12527:21:1::0;12584:2;12564:18;;;12557:30;12623:34;12603:18;;;12596:62;-1:-1:-1;;;12674:18:1;;;12667:36;12720:19;;13356:110:0::1;12343:402:1::0;13356:110:0::1;13477:28;13496:8;13477:18;:28::i;:::-;13275:238:::0;:::o;28737:341::-;-1:-1:-1;;;;;28831:20:0;;28823:69;;;;-1:-1:-1;;;28823:69:0;;12952:2:1;28823:69:0;;;12934:21:1;12991:2;12971:18;;;12964:30;13030:34;13010:18;;;13003:62;-1:-1:-1;;;13081:18:1;;;13074:34;13125:19;;28823:69:0;12750:400:1;28823:69:0;-1:-1:-1;;;;;28911:21:0;;28903:68;;;;-1:-1:-1;;;28903:68:0;;13357:2:1;28903:68:0;;;13339:21:1;13396:2;13376:18;;;13369:30;13435:34;13415:18;;;13408:62;-1:-1:-1;;;13486:18:1;;;13479:32;13528:19;;28903:68:0;13155:398:1;28903:68:0;-1:-1:-1;;;;;28984:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;29037:33;;1762:25:1;;;29037:33:0;;1735:18:1;29037:33:0;;;;;;;;28737:341;;;:::o;12534:132::-;12415:7;12442:6;-1:-1:-1;;;;;12442:6:0;180:10;12598:23;12590:68;;;;-1:-1:-1;;;12590:68:0;;13760:2:1;12590:68:0;;;13742:21:1;;;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;13890:18;;12590:68:0;13558:356:1;29211:1460:0;-1:-1:-1;;;;;29299:18:0;;29291:68;;;;-1:-1:-1;;;29291:68:0;;14121:2:1;29291:68:0;;;14103:21:1;14160:2;14140:18;;;14133:30;14199:34;14179:18;;;14172:62;-1:-1:-1;;;14250:18:1;;;14243:35;14295:19;;29291:68:0;13919:401:1;29291:68:0;-1:-1:-1;;;;;29378:16:0;;29370:64;;;;-1:-1:-1;;;29370:64:0;;14527:2:1;29370:64:0;;;14509:21:1;14566:2;14546:18;;;14539:30;14605:34;14585:18;;;14578:62;-1:-1:-1;;;14656:18:1;;;14649:33;14699:19;;29370:64:0;14325:399:1;29370:64:0;29462:1;29453:6;:10;29445:64;;;;-1:-1:-1;;;29445:64:0;;14931:2:1;29445:64:0;;;14913:21:1;14970:2;14950:18;;;14943:30;15009:34;14989:18;;;14982:62;-1:-1:-1;;;15060:18:1;;;15053:39;15109:19;;29445:64:0;14729:405:1;29445:64:0;-1:-1:-1;;;;;29542:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;29542:23:0;29520:111;;;;-1:-1:-1;;;29520:111:0;;15341:2:1;29520:111:0;;;15323:21:1;15380:2;15360:18;;;15353:30;15419:34;15399:18;;;15392:62;-1:-1:-1;;;15470:18:1;;;15463:36;15516:19;;29520:111:0;15139:402:1;29520:111:0;29737:4;29688:28;26772:16;;;:7;:16;;;;;;29822:23;;29982:16;;26772;;29785:60;;;;;29982:16;;29981:17;:55;;;;;30023:13;-1:-1:-1;;;;;30015:21:0;:4;-1:-1:-1;;;;;30015:21:0;;;29981:55;:95;;;;;30053:23;29981:95;:133;;;;-1:-1:-1;30093:21:0;;;;;;;29981:133;29963:206;;;30141:16;:14;:16::i;:::-;30189:13;-1:-1:-1;;;;;30183:19:0;:2;-1:-1:-1;;;;;30183:19:0;;:48;;;;-1:-1:-1;;;;;;30207:24:0;;;;;;:18;:24;;;;;;;;30206:25;30183:48;30179:111;;;30275:3;30265:6;30255:7;;:16;;;;:::i;:::-;30254:24;;;;:::i;:::-;30248:30;;30179:111;30312:13;-1:-1:-1;;;;;30304:21:0;:4;-1:-1:-1;;;;;30304:21:0;;:48;;;;-1:-1:-1;;;;;;30330:22:0;;;;;;:18;:22;;;;;;;;30329:23;30304:48;30300:110;;;30395:3;30385:6;30376;;:15;;;;:::i;:::-;30375:23;;;;:::i;:::-;30369:29;;30300:110;30420:13;30430:3;30420:13;;:::i;:::-;;-1:-1:-1;30448:7:0;;30444:177;;30472:40;30487:4;30501;30508:3;30472:14;:40::i;:::-;30555:3;30527:24;;:31;;;;;;;:::i;:::-;;;;;;;;30606:3;30573:29;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;30444:177:0;30631:32;30646:4;30652:2;30656:6;30631:14;:32::i;:::-;29280:1391;;;29211:1460;;;:::o;13673:191::-;13747:16;13766:6;;-1:-1:-1;;;;;13783:17:0;;;-1:-1:-1;;;;;;13783:17:0;;;;;;13816:40;;13766:6;;;;;;;13816:40;;13747:16;13816:40;13736:128;13673:191;:::o;31337:638::-;31487:16;;;31501:1;31487:16;;;;;;;;31463:21;;31487:16;;;;;;;;;;-1:-1:-1;31487:16:0;31463:40;;31532:4;31514;31519:1;31514:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;31514:23:0;;;-1:-1:-1;;;;;31514:23:0;;;;;31558:4;31548;31553:1;31548:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;31548:14:0;;;-1:-1:-1;;;;;31548:14:0;;;;;31573:62;31590:4;31605:15;31623:11;31573:8;:62::i;:::-;31674:240;;-1:-1:-1;;;31674:240:0;;-1:-1:-1;;;;;31674:15:0;:66;;;;:240;;31755:11;;31781:1;;31825:4;;31852;;31888:15;;31674:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31932:35;31949:11;31962:4;31932:35;;;;;;;:::i;34810:263::-;34931:6;34941:1;34931:11;34927:24;;34810:263;;:::o;34927:24::-;34962:9;34977;-1:-1:-1;;;;;34977:14:0;34999:6;34977:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34961:49;;;35026:39;35059:4;35026:39;;;;;17819:2:1;17801:21;;;17858:2;17838:18;;;17831:30;-1:-1:-1;;;17892:2:1;17877:18;;17870:45;17996:14;;17989:22;17982:4;17967:20;;17960:52;17947:3;17932:19;;17595:423;32111:253:0;-1:-1:-1;;;;;32239:15:0;;;;;;:7;:15;;;;;:25;;32258:6;;32239:15;:25;;32258:6;;32239:25;:::i;:::-;;;;-1:-1:-1;;;;;;;32275:18:0;;;;;;:7;:18;;;;;:28;;32297:6;;32275:18;:28;;32297:6;;32275:28;:::i;:::-;;;;;;;;32338:9;-1:-1:-1;;;;;32321:35:0;32330:6;-1:-1:-1;;;;;32321:35:0;;32349:6;32321:35;;;;1762:25:1;;1750:2;1735:18;;1616:177;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1196:180::-;1255:6;1308:2;1296:9;1287:7;1283:23;1279:32;1276:52;;;1324:1;1321;1314:12;1276:52;-1:-1:-1;1347:23:1;;1196:180;-1:-1:-1;1196:180:1:o;1798:186::-;1857:6;1910:2;1898:9;1889:7;1885:23;1881:32;1878:52;;;1926:1;1923;1916:12;1878:52;1949:29;1968:9;1949:29;:::i;:::-;1939:39;1798:186;-1:-1:-1;;;1798:186:1:o;1989:328::-;2066:6;2074;2082;2135:2;2123:9;2114:7;2110:23;2106:32;2103:52;;;2151:1;2148;2141:12;2103:52;2174:29;2193:9;2174:29;:::i;:::-;2164:39;;2222:38;2256:2;2245:9;2241:18;2222:38;:::i;:::-;2212:48;;2307:2;2296:9;2292:18;2279:32;2269:42;;1989:328;;;;;:::o;2943:118::-;3029:5;3022:13;3015:21;3008:5;3005:32;2995:60;;3051:1;3048;3041:12;3066:241;3122:6;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3230:9;3217:23;3249:28;3271:5;3249:28;:::i;3312:260::-;3380:6;3388;3441:2;3429:9;3420:7;3416:23;3412:32;3409:52;;;3457:1;3454;3447:12;3409:52;3480:29;3499:9;3480:29;:::i;:::-;3470:39;;3528:38;3562:2;3551:9;3547:18;3528:38;:::i;:::-;3518:48;;3312:260;;;;;:::o;5646:127::-;5707:10;5702:3;5698:20;5695:1;5688:31;5738:4;5735:1;5728:15;5762:4;5759:1;5752:15;5778:128;5845:9;;;5866:11;;;5863:37;;;5880:18;;:::i;5911:125::-;5976:9;;;5997:10;;;5994:36;;;6010:18;;:::i;10735:245::-;10802:6;10855:2;10843:9;10834:7;10830:23;10826:32;10823:52;;;10871:1;10868;10861:12;10823:52;10903:9;10897:16;10922:28;10944:5;10922:28;:::i;15546:168::-;15619:9;;;15650;;15667:15;;;15661:22;;15647:37;15637:71;;15688:18;;:::i;15719:217::-;15759:1;15785;15775:132;;15829:10;15824:3;15820:20;15817:1;15810:31;15864:4;15861:1;15854:15;15892:4;15889:1;15882:15;15775:132;-1:-1:-1;15921:9:1;;15719:217::o;16073:127::-;16134:10;16129:3;16125:20;16122:1;16115:31;16165:4;16162:1;16155:15;16189:4;16186:1;16179:15;16205:461;16258:3;16296:5;16290:12;16323:6;16318:3;16311:19;16349:4;16378:2;16373:3;16369:12;16362:19;;16415:2;16408:5;16404:14;16436:1;16446:195;16460:6;16457:1;16454:13;16446:195;;;16525:13;;-1:-1:-1;;;;;16521:39:1;16509:52;;16581:12;;;;16616:15;;;;16557:1;16475:9;16446:195;;;-1:-1:-1;16657:3:1;;16205:461;-1:-1:-1;;;;;16205:461:1:o;16671:582::-;16970:6;16959:9;16952:25;17013:6;17008:2;16997:9;16993:18;16986:34;17056:3;17051:2;17040:9;17036:18;17029:31;16933:4;17077:57;17129:3;17118:9;17114:19;17106:6;17077:57;:::i;:::-;-1:-1:-1;;;;;17170:32:1;;;;17165:2;17150:18;;17143:60;-1:-1:-1;17234:3:1;17219:19;17212:35;17069:65;16671:582;-1:-1:-1;;;16671:582:1:o;17258:332::-;17465:6;17454:9;17447:25;17508:2;17503;17492:9;17488:18;17481:30;17428:4;17528:56;17580:2;17569:9;17565:18;17557:6;17528:56;:::i;:::-;17520:64;17258:332;-1:-1:-1;;;;17258:332:1:o

Swarm Source

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