ETH Price: $3,232.04 (-3.07%)

Token

AlgoTrade (ALGT)
 

Overview

Max Total Supply

100,000,000 ALGT

Holders

544

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
614,810.394391193370865841 ALGT

Value
$0.00
0x455e0b84987c90f636160ab5986d4f64fe5604b8
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:
AlgoTrade

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-11-23
*/

pragma solidity 0.8.25;

// SPDX-License-Identifier: MIT

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

interface IERC20Metadata is IERC20{
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        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);
    }

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

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    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");
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

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

library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }
}

interface IPriceFeed {
    function latestAnswer() external view returns (int256);
}

interface ILpPair {
    function sync() external;
    function mint(address to) external;
}

interface IWETH {
    function deposit() external payable; 
}

interface IDexRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
}

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

contract AlgoTrade is ERC20, Ownable {

    mapping (address => bool) public exemptFromFees;
    mapping (address => bool) public exemptFromLimits;

    bool public tradingAllowed;

    mapping (address => bool) public isAMMPair;

    address public developmentAddress;
    address public marketingAndBuyBackAddress;

    uint24 public buyTax;
    uint24 public sellTax;

    uint24 public buyTaxPhase1;
    uint24 public sellTaxPhase1;
    uint128 public maxWalletPhase1;
    bool public phase1Activated;

    uint24 public buyTaxPhase2;
    uint24 public sellTaxPhase2;
    uint128 public maxWalletPhase2;
    bool public phase2Activated;

    uint24 public buyTaxPhase3;
    uint24 public sellTaxPhase3;
    uint128 public maxWalletPhase3;
    bool public phase3Activated;

    uint24 public buyTaxPhaseFinal;
    uint24 public sellTaxPhaseFinal;
    uint128 public maxWalletPhaseFinal;

    uint256 public lastSwapBackBlock;
    mapping(address => uint256) private _holderLastTransferBlock;

    bool public limited = true;
    uint256 public maxWallet;

    uint256 public immutable swapTokensAtAmt;

    address public immutable lpPair;
    IDexRouter public immutable dexRouter;
    address public immutable WETH;

    uint64 public constant FEE_DIVISOR = 10000;

    uint256 public launchTimestamp;
    bool public dynamicTaxOn;

    bool public transferDelayEnabled = false;

    // constructor

    constructor()
        ERC20("AlgoTrade", "ALGT")
    {   
        uint256 _totalSupply = 100_000_000 * 1e18;
       
        developmentAddress = 0x7d29C19BCe8E2aF1F539e8ac75DAfF10367baACb;
        marketingAndBuyBackAddress = 0x5FA11C368E859a2F4BFeE48e38e5E79b6C3DC61d;

        address _v2Router;

        dynamicTaxOn = true;

        // @dev assumes WETH pair
        if(block.chainid == 1){
            _v2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if(block.chainid == 11155111){
            _v2Router = 0xa3D89E5B9C7a863BF4535F349Bc5619ABe72fb09;
        } else if(block.chainid == 8453){ // BASE
            _v2Router = 0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24;
        } else {
            revert("Chain not configured");
        }

        dexRouter = IDexRouter(_v2Router);

         _mint(address(msg.sender), _totalSupply);
        swapTokensAtAmt = totalSupply() * 25 / 100000;

        // first phase (0-5 minutes)
        buyTaxPhase1 = 3000;
        sellTaxPhase1 = 3000;
        maxWalletPhase1 = uint128(totalSupply() * 5 / 1000);

        // second phase (10-15 minutes)
        buyTaxPhase2 = 2000;
        sellTaxPhase2 = 2000;
        maxWalletPhase2 = uint128(totalSupply() * 5 / 1000);

        // third phase (15-20 minutes)
        buyTaxPhase3 = 1000;
        sellTaxPhase3 = 1000;
        maxWalletPhase3 = uint128(totalSupply() * 10 / 1000);

        // final phase (20+ minutes)
        buyTaxPhaseFinal = 500;
        sellTaxPhaseFinal = 500;
        maxWalletPhaseFinal = uint128(totalSupply() * 20 / 1000);

        WETH = dexRouter.WETH();
        lpPair = IDexFactory(dexRouter.factory()).createPair(address(this), WETH);

        isAMMPair[lpPair] = true;

        exemptFromLimits[lpPair] = true;
        exemptFromLimits[msg.sender] = true;
        exemptFromLimits[address(this)] = true;
        exemptFromLimits[address(0xdead)] = true;

        exemptFromFees[msg.sender] = true;
        exemptFromFees[address(this)] = true;
        exemptFromFees[address(dexRouter)] = true;
        exemptFromFees[address(0xdead)] = true;
 
        _approve(address(this), address(dexRouter), type(uint256).max);
        _approve(address(msg.sender), address(dexRouter), totalSupply());
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        
        if(!exemptFromFees[from] && !exemptFromFees[to]){
            require(tradingAllowed, "Trading not active");
            amount -= handleTax(from, to, amount);
            checkLimits(from, to, amount);
        }

        super._transfer(from,to,amount);
    }

    function checkLimits(address from, address to, uint256 amount) internal {
        if(limited){
            
            bool exFromLimitsTo = exemptFromLimits[to];
            uint256 balanceOfTo = balanceOf(to);

            // buy
            if (isAMMPair[from] && !exFromLimitsTo) {
                require(amount + balanceOfTo <= maxWallet, "Max Wallet");
            }
            else if(!exFromLimitsTo) {
                require(amount + balanceOfTo <= maxWallet, "Max Wallet");
            }

            if(transferDelayEnabled){
                if (to != address(dexRouter) && to != address(lpPair)){
                    require(_holderLastTransferBlock[tx.origin] < block.number, "Transfer Delay");
                    if(from == address(lpPair)){
                        require(tx.origin == to, "no buying to external wallets yet");
                    }
                    _holderLastTransferBlock[to] = block.number;
                    _holderLastTransferBlock[tx.origin] = block.number;
                }
            }
        }
    }

    function handleTax(address from, address to, uint256 amount) internal returns (uint256){

        if(balanceOf(address(this)) >= swapTokensAtAmt && !isAMMPair[from] && lastSwapBackBlock + 1 <= block.number) {
            convertTaxes();
        }

        if(dynamicTaxOn){
            setInternalTaxes();
        }
        
        uint128 tax = 0;

        uint24 taxes;

        if (isAMMPair[to]){
            taxes = sellTax;
        } else if(isAMMPair[from]){
            taxes = buyTax;
        }

        if(taxes > 0){
            tax = uint128(amount * taxes / FEE_DIVISOR);
            super._transfer(from, address(this), tax);
        }
        
        return tax;
    }

    function swapTokensForETH(uint256 tokenAmt) private {

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

        dexRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmt,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function convertTaxes() private {

        uint256 contractBalance = balanceOf(address(this));
        
        if(contractBalance == 0) {return;}

        lastSwapBackBlock = block.number;

        if(contractBalance > swapTokensAtAmt * 10){
            contractBalance = swapTokensAtAmt * 10;
        }

        if(contractBalance > 0){

            swapTokensForETH(contractBalance);
            
            uint256 ethBalance = address(this).balance;

            bool success;

            if(marketingAndBuyBackAddress != address(0)){
                uint256 amountForMarketing = ethBalance * 2 / 5;
                (success,) = marketingAndBuyBackAddress.call{value: amountForMarketing}("");
                ethBalance -= amountForMarketing;
            }

            (success,) = developmentAddress.call{value: ethBalance}("");
        }
    }

    function enableTrading() external onlyOwner {
        require(!tradingAllowed, "Trading already enabled");
        tradingAllowed = true;
        launchTimestamp = block.timestamp;
        transferDelayEnabled = true;
        buyTax = buyTaxPhase1;
        sellTax = sellTaxPhase1;
        maxWallet = maxWalletPhase1;
        phase1Activated = true;
    }

    function updateTax(uint24 _buyTax, uint24 _sellTax) external onlyOwner {
        require(_buyTax < buyTax || _buyTax <= 500, "Cannot raise buy tax over 5%");
        require(_sellTax < sellTax || _sellTax <= 500, "Cannot raise buy tax over 5%");
        buyTax = _buyTax;
        sellTax = _sellTax;
    }

    function removeLimits() external onlyOwner {
        require(limited, "Limits already removed");
        limited = false;
    }

    receive() payable external {}

    function setInternalTaxes() internal {

        uint256 currentTimestamp = block.timestamp;

        uint256 timeSinceLaunch;
        
        if(currentTimestamp >= launchTimestamp){
            timeSinceLaunch = currentTimestamp - launchTimestamp;
        }

        if(transferDelayEnabled && timeSinceLaunch >= 1 minutes){
            transferDelayEnabled = false;
        }

        if(timeSinceLaunch >= 20 minutes){
            dynamicTaxOn = false;
            buyTax = buyTaxPhaseFinal;
            sellTax = sellTaxPhaseFinal;
            maxWallet = maxWalletPhaseFinal;
            //if(maxWallet == totalSupply()){
            //    limited = false;
            //}
        } else if(timeSinceLaunch >= 10 minutes){
            if(!phase3Activated){
                buyTax = buyTaxPhase3;
                sellTax = sellTaxPhase3;
                maxWallet = maxWalletPhase3;
                phase3Activated = true;
            }
        } else if(timeSinceLaunch >= 5 minutes){
            if(!phase2Activated){
                buyTax = buyTaxPhase2;
                sellTax = sellTaxPhase2;
                maxWallet = maxWalletPhase2;
                phase2Activated = true;
            }
        }
    }
}

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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FEE_DIVISOR","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxPhase1","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxPhase2","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxPhase3","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxPhaseFinal","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"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":[],"name":"developmentAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IDexRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicTaxOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exemptFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"","type":"address"}],"name":"isAMMPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapBackBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingAndBuyBackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPhase1","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPhase2","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPhase3","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletPhaseFinal","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"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":"phase1Activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase2Activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phase3Activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxPhase1","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxPhase2","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxPhase3","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTaxPhaseFinal","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_buyTax","type":"uint24"},{"internalType":"uint24","name":"_sellTax","type":"uint24"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101006040526012805460ff191660011790556015805461ff0019169055348015610028575f80fd5b5060405180604001604052806009815260200168416c676f547261646560b81b81525060405180604001604052806004815260200163105311d560e21b81525081600390816100779190610896565b5060046100848282610896565b5050505f61009661061460201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600a80546001600160a01b0319908116737d29c19bce8e2af1f539e8ac75daff10367baacb17909155600b8054909116735fa11c368e859a2f4bfee48e38e5e79b6c3dc61d1790556015805460ff191660019081179091556a52b7d2dcc80cd2e4000000905f9046900361016c5750737a250d5630b4cf539739df2c5dacb4c659f2488d610202565b4662aa36a703610191575073a3d89e5b9c7a863bf4535f349bc5619abe72fb09610202565b46612105036101b55750734752ba5dbc23f44d87826276bf6fd6b1c372ad24610202565b60405162461bcd60e51b815260206004820152601460248201527f436861696e206e6f7420636f6e6669677572656400000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03811660c0526102193383610618565b620186a061022660025490565b610231906019610969565b61023b9190610986565b608052600b80546001600160d01b031664017700017760d31b1790556103e861026360025490565b61026e906005610969565b6102789190610986565b600c80546001600160801b0392909216600163ffffff0160801b031990921691909117607d608c1b1762ffffff60a01b1916607d60a41b1790556103e86102be60025490565b6102c9906005610969565b6102d39190610986565b600d80546001600160801b0392909216600163ffffff0160801b031990921691909117607d608b1b1762ffffff60a01b1916607d60a31b1790556103e861031960025490565b61032490600a610969565b61032e9190610986565b600e80546001600160801b0392909216600163ffffff0160801b031990921691909117607d608a1b1762ffffff60a01b1916607d60a21b1790556103e861037460025490565b61037f906014610969565b6103899190610986565b600f5f6101000a8154816001600160801b0302191690836001600160801b0316021790555060c0516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061041091906109a5565b6001600160a01b031660e0816001600160a01b03168152505060c0516001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610467573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048b91906109a5565b60e0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303815f875af11580156104d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104fd91906109a5565b6001600160a01b0390811660a08190525f9081526009602090815260408083208054600160ff1991821681179092556007845282852080548216831790553380865283862080548316841790553080875284872080548416851790557fb0c2646e02af70b79e3fe9277b98373379f54150e4e26b2b5650139f7a75a65d805484168517905590865260069094528285208054821683179055838552828520805482168317905560c0519586168552918420805483168217905561dead9093527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e2280549091169092179091556105f3915f196106db565b61060d3360c0516106086106d560201b60201c565b6106db565b50506109e5565b3390565b6001600160a01b03821661066e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016101f9565b8060025f82825461067f91906109d2565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b60025490565b6001600160a01b03831661073d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016101f9565b6001600160a01b03821661079e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016101f9565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061082657607f821691505b60208210810361084457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561089157805f5260205f20601f840160051c8101602085101561086f5750805b601f840160051c820191505b8181101561088e575f815560010161087b565b50505b505050565b81516001600160401b038111156108af576108af6107fe565b6108c3816108bd8454610812565b8461084a565b602080601f8311600181146108f6575f84156108df5750858301515b5f19600386901b1c1916600185901b17855561094d565b5f85815260208120601f198616915b8281101561092457888601518255948401946001909101908401610905565b508582101561094157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761098057610980610955565b92915050565b5f826109a057634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156109b5575f80fd5b81516001600160a01b03811681146109cb575f80fd5b9392505050565b8082018082111561098057610980610955565b60805160a05160c05160e051611ec1610a505f395f81816107da0152611b2e01525f81816103220152818161146a0152611b8501525f81816104bb015281816114a7015261153101525f81816108bb01528181611235015281816117bb01526117ed0152611ec15ff3fe6080604052600436106102dc575f3560e01c80637e160c5811610189578063b32f6cae116100d8578063cc1776d311610092578063e8ac5c1b1161006d578063e8ac5c1b1461095e578063f2fde38b1461097d578063f8b45b051461099c578063fc9371ee146109b1575f80fd5b8063cc1776d3146108fb578063dd62ed3e1461091d578063e50daa4f1461093c575f80fd5b8063b32f6cae1461082a578063b7cbae8714610849578063bcb42b9614610869578063be1103f41461088b578063c78d0fa0146108aa578063c876d0b9146108dd575f80fd5b806395d89b4111610143578063a4cb41011161011e578063a4cb410114610788578063a9059cbb146107aa578063ad5c4648146107c9578063b0249cc6146107fc575f80fd5b806395d89b41146107275780639e93ad8e1461073b578063a457c2d714610769575f80fd5b80637e160c5814610670578063860a32ec146106905780638a8c523c146106a95780638d3e6e40146106bd5780638da5cb5b146106eb5780638deee5fc14610708575f80fd5b8063452ed4f111610245578063638b1b14116101ff57806370a08231116101da57806370a08231146105dd578063715018a614610611578063724f8e0c14610625578063751039fc1461065c575f80fd5b8063638b1b141461058957806365cf7c9b146105a85780637068150e146105bd575f80fd5b8063452ed4f1146104aa5780634b356f47146104dd5780634f7041a5146104fe578063517ab17b1461052057806353371be0146105425780635a90a49e1461055b575f80fd5b806323b872dd1161029657806323b872dd14610401578063313ce56714610420578063362919a71461043b57806339509351146104545780633f7de11214610473578063432e95a514610495575f80fd5b806306fdde03146102e75780630758d92414610311578063095ea7b31461035c57806318160ddd1461038b578063187648c3146103a95780631f40f5b8146103df575f80fd5b366102e357005b5f80fd5b3480156102f2575f80fd5b506102fb6109d3565b6040516103089190611bed565b60405180910390f35b34801561031c575f80fd5b506103447f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610308565b348015610367575f80fd5b5061037b610376366004611c3d565b610a63565b6040519015158152602001610308565b348015610396575f80fd5b506002545b604051908152602001610308565b3480156103b4575f80fd5b50600b546103cb90600160d01b900462ffffff1681565b60405162ffffff9091168152602001610308565b3480156103ea575f80fd5b50600e546103cb90600160a01b900462ffffff1681565b34801561040c575f80fd5b5061037b61041b366004611c65565b610a7c565b34801561042b575f80fd5b5060405160128152602001610308565b348015610446575f80fd5b5060155461037b9060ff1681565b34801561045f575f80fd5b5061037b61046e366004611c3d565b610a9f565b34801561047e575f80fd5b50600d546103cb90600160a01b900462ffffff1681565b3480156104a0575f80fd5b5061039b60105481565b3480156104b5575f80fd5b506103447f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e8575f80fd5b506104fc6104f7366004611cb0565b610ac0565b005b348015610509575f80fd5b50600b546103cb90600160a01b900462ffffff1681565b34801561052b575f80fd5b50600d546103cb90600160881b900462ffffff1681565b34801561054d575f80fd5b5060085461037b9060ff1681565b348015610566575f80fd5b5061037b610575366004611ce1565b60066020525f908152604090205460ff1681565b348015610594575f80fd5b50600a54610344906001600160a01b031681565b3480156105b3575f80fd5b5061039b60145481565b3480156105c8575f80fd5b50600c5461037b90600160801b900460ff1681565b3480156105e8575f80fd5b5061039b6105f7366004611ce1565b6001600160a01b03165f9081526020819052604090205490565b34801561061c575f80fd5b506104fc610c15565b348015610630575f80fd5b50600f54610644906001600160801b031681565b6040516001600160801b039091168152602001610308565b348015610667575f80fd5b506104fc610c88565b34801561067b575f80fd5b50600e5461037b90600160801b900460ff1681565b34801561069b575f80fd5b5060125461037b9060ff1681565b3480156106b4575f80fd5b506104fc610d09565b3480156106c8575f80fd5b5061037b6106d7366004611ce1565b60076020525f908152604090205460ff1681565b3480156106f6575f80fd5b506005546001600160a01b0316610344565b348015610713575f80fd5b50600c54610644906001600160801b031681565b348015610732575f80fd5b506102fb610e21565b348015610746575f80fd5b5061075061271081565b60405167ffffffffffffffff9091168152602001610308565b348015610774575f80fd5b5061037b610783366004611c3d565b610e30565b348015610793575f80fd5b50600b546103cb90600160e81b900462ffffff1681565b3480156107b5575f80fd5b5061037b6107c4366004611c3d565b610eaa565b3480156107d4575f80fd5b506103447f000000000000000000000000000000000000000000000000000000000000000081565b348015610807575f80fd5b5061037b610816366004611ce1565b60096020525f908152604090205460ff1681565b348015610835575f80fd5b50600d54610644906001600160801b031681565b348015610854575f80fd5b50600d5461037b90600160801b900460ff1681565b348015610874575f80fd5b50600c546103cb90600160881b900462ffffff1681565b348015610896575f80fd5b50600b54610344906001600160a01b031681565b3480156108b5575f80fd5b5061039b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108e8575f80fd5b5060155461037b90610100900460ff1681565b348015610906575f80fd5b50600b546103cb90600160b81b900462ffffff1681565b348015610928575f80fd5b5061039b610937366004611d01565b610eb7565b348015610947575f80fd5b50600c546103cb90600160a01b900462ffffff1681565b348015610969575f80fd5b50600e54610644906001600160801b031681565b348015610988575f80fd5b506104fc610997366004611ce1565b610ee1565b3480156109a7575f80fd5b5061039b60135481565b3480156109bc575f80fd5b50600e546103cb90600160881b900462ffffff1681565b6060600380546109e290611d29565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90611d29565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b5f33610a70818585610fcb565b60019150505b92915050565b5f33610a898582856110ee565b610a94858585611166565b506001949350505050565b5f33610a70818585610ab18383610eb7565b610abb9190611d75565b610fcb565b6005546001600160a01b03163314610af35760405162461bcd60e51b8152600401610aea90611d88565b60405180910390fd5b600b5462ffffff600160a01b90910481169083161080610b1a57506101f48262ffffff1611155b610b665760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072616973652062757920746178206f766572203525000000006044820152606401610aea565b600b5462ffffff600160b81b90910481169082161080610b8d57506101f48162ffffff1611155b610bd95760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072616973652062757920746178206f766572203525000000006044820152606401610aea565b600b805465ffffffffffff60a01b1916600160a01b62ffffff9485160262ffffff60b81b191617600160b81b9290931691909102919091179055565b6005546001600160a01b03163314610c3f5760405162461bcd60e51b8152600401610aea90611d88565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610cb25760405162461bcd60e51b8152600401610aea90611d88565b60125460ff16610cfd5760405162461bcd60e51b8152602060048201526016602482015275131a5b5a5d1cc8185b1c9958591e481c995b5bdd995960521b6044820152606401610aea565b6012805460ff19169055565b6005546001600160a01b03163314610d335760405162461bcd60e51b8152600401610aea90611d88565b60085460ff1615610d865760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610aea565b6008805460ff19166001179055426014556015805461ff001916610100179055600b8054600160b81b600160e81b600160a01b62ffffff600160d01b850481169190910262ffffff60a01b198516811792909204169190910262ffffff60b81b1990911665ffffffffffff60a01b1990921691909117179055600c80546001600160801b03811660135560ff60801b1916600160801b179055565b6060600480546109e290611d29565b5f3381610e3d8286610eb7565b905083811015610e9d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610aea565b610a948286868403610fcb565b5f33610a70818585611166565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610aea90611d88565b6001600160a01b038116610f705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aea565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661102d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aea565b6001600160a01b03821661108e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aea565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6110f98484610eb7565b90505f19811461116057818110156111535760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610aea565b6111608484848403610fcb565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff161580156111a657506001600160a01b0382165f9081526006602052604090205460ff16155b156112145760085460ff166111f25760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610aea565b6111fd838383611224565b6112079082611dbd565b905061121483838361136b565b61121f8383836115f5565b505050565b305f908152602081905260408120547f00000000000000000000000000000000000000000000000000000000000000001115801561127a57506001600160a01b0384165f9081526009602052604090205460ff16155b801561129457504360105460016112919190611d75565b11155b156112a1576112a1611798565b60155460ff16156112b4576112b461190e565b6001600160a01b0383165f90815260096020526040812054819060ff16156112eb5750600b54600160b81b900462ffffff1661131c565b6001600160a01b0386165f9081526009602052604090205460ff161561131c5750600b54600160a01b900462ffffff165b62ffffff8116156113595761271061133962ffffff831686611dd0565b6113439190611de7565b91506113598630846001600160801b03166115f5565b506001600160801b0316949350505050565b60125460ff161561121f576001600160a01b038281165f9081526007602090815260408083205483835281842054948816845260099092529091205460ff91821692911680156113b9575081155b1561140b576013546113cb8285611d75565b11156114065760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610aea565b611458565b816114585760135461141d8285611d75565b11156114585760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610aea565b601554610100900460ff16156115ee577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316141580156114dc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031614155b156115ee57325f90815260116020526040902054431161152f5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722044656c617960901b6044820152606401610aea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316036115ca57326001600160a01b038516146115ca5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610aea565b6001600160a01b0384165f9081526011602052604080822043908190553283529120555b5050505050565b6001600160a01b0383166116595760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aea565b6001600160a01b0382166116bb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aea565b6001600160a01b0383165f90815260208190526040902054818110156117325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610aea565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b305f90815260208190526040812054908190036117b25750565b436010556117e17f0000000000000000000000000000000000000000000000000000000000000000600a611dd0565b811115611816576118137f0000000000000000000000000000000000000000000000000000000000000000600a611dd0565b90505b801561190b5761182581611ad9565b600b5447905f906001600160a01b0316156118b6575f6005611848846002611dd0565b6118529190611de7565b600b546040519192506001600160a01b03169082905f81818185875af1925050503d805f811461189d576040519150601f19603f3d011682016040523d82523d5f602084013e6118a2565b606091505b509092506118b290508184611dbd565b9250505b600a546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611900576040519150601f19603f3d011682016040523d82523d5f602084013e611905565b606091505b50505050505b50565b60145442905f90821061192b576014546119289083611dbd565b90505b601554610100900460ff1680156119435750603c8110155b15611954576015805461ff00191690555b6104b081106119c4576015805460ff19169055600e54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600f546001600160801b03166013555050565b6102588110611a4f57600e54600160801b900460ff16611a4b57600d54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600e80546001600160801b038116601355600160801b60ff60801b199091161790555b5050565b61012c8110611a4b57600d54600160801b900460ff16611a4b57600c54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600d80546001600160801b038116601355600160801b60ff60801b199091161790555050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b0c57611b0c611e06565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611b6057611b60611e06565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac94790611bc49085905f90869030904290600401611e1a565b5f604051808303815f87803b158015611bdb575f80fd5b505af1158015611905573d5f803e3d5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611c38575f80fd5b919050565b5f8060408385031215611c4e575f80fd5b611c5783611c22565b946020939093013593505050565b5f805f60608486031215611c77575f80fd5b611c8084611c22565b9250611c8e60208501611c22565b9150604084013590509250925092565b803562ffffff81168114611c38575f80fd5b5f8060408385031215611cc1575f80fd5b611cca83611c9e565b9150611cd860208401611c9e565b90509250929050565b5f60208284031215611cf1575f80fd5b611cfa82611c22565b9392505050565b5f8060408385031215611d12575f80fd5b611d1b83611c22565b9150611cd860208401611c22565b600181811c90821680611d3d57607f821691505b602082108103611d5b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7657610a76611d61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81810381811115610a7657610a76611d61565b8082028115828204841417610a7657610a76611d61565b5f82611e0157634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611e6a5784516001600160a01b031683529383019391830191600101611e45565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212201e820e7a1ca503c87fb196b90dcb468b0d198afbc07d3194c4a70d05f1409ecd64736f6c63430008190033

Deployed Bytecode

0x6080604052600436106102dc575f3560e01c80637e160c5811610189578063b32f6cae116100d8578063cc1776d311610092578063e8ac5c1b1161006d578063e8ac5c1b1461095e578063f2fde38b1461097d578063f8b45b051461099c578063fc9371ee146109b1575f80fd5b8063cc1776d3146108fb578063dd62ed3e1461091d578063e50daa4f1461093c575f80fd5b8063b32f6cae1461082a578063b7cbae8714610849578063bcb42b9614610869578063be1103f41461088b578063c78d0fa0146108aa578063c876d0b9146108dd575f80fd5b806395d89b4111610143578063a4cb41011161011e578063a4cb410114610788578063a9059cbb146107aa578063ad5c4648146107c9578063b0249cc6146107fc575f80fd5b806395d89b41146107275780639e93ad8e1461073b578063a457c2d714610769575f80fd5b80637e160c5814610670578063860a32ec146106905780638a8c523c146106a95780638d3e6e40146106bd5780638da5cb5b146106eb5780638deee5fc14610708575f80fd5b8063452ed4f111610245578063638b1b14116101ff57806370a08231116101da57806370a08231146105dd578063715018a614610611578063724f8e0c14610625578063751039fc1461065c575f80fd5b8063638b1b141461058957806365cf7c9b146105a85780637068150e146105bd575f80fd5b8063452ed4f1146104aa5780634b356f47146104dd5780634f7041a5146104fe578063517ab17b1461052057806353371be0146105425780635a90a49e1461055b575f80fd5b806323b872dd1161029657806323b872dd14610401578063313ce56714610420578063362919a71461043b57806339509351146104545780633f7de11214610473578063432e95a514610495575f80fd5b806306fdde03146102e75780630758d92414610311578063095ea7b31461035c57806318160ddd1461038b578063187648c3146103a95780631f40f5b8146103df575f80fd5b366102e357005b5f80fd5b3480156102f2575f80fd5b506102fb6109d3565b6040516103089190611bed565b60405180910390f35b34801561031c575f80fd5b506103447f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610308565b348015610367575f80fd5b5061037b610376366004611c3d565b610a63565b6040519015158152602001610308565b348015610396575f80fd5b506002545b604051908152602001610308565b3480156103b4575f80fd5b50600b546103cb90600160d01b900462ffffff1681565b60405162ffffff9091168152602001610308565b3480156103ea575f80fd5b50600e546103cb90600160a01b900462ffffff1681565b34801561040c575f80fd5b5061037b61041b366004611c65565b610a7c565b34801561042b575f80fd5b5060405160128152602001610308565b348015610446575f80fd5b5060155461037b9060ff1681565b34801561045f575f80fd5b5061037b61046e366004611c3d565b610a9f565b34801561047e575f80fd5b50600d546103cb90600160a01b900462ffffff1681565b3480156104a0575f80fd5b5061039b60105481565b3480156104b5575f80fd5b506103447f000000000000000000000000fde4aa664521fa2467ccec0d3ad4d2875dbf2a7d81565b3480156104e8575f80fd5b506104fc6104f7366004611cb0565b610ac0565b005b348015610509575f80fd5b50600b546103cb90600160a01b900462ffffff1681565b34801561052b575f80fd5b50600d546103cb90600160881b900462ffffff1681565b34801561054d575f80fd5b5060085461037b9060ff1681565b348015610566575f80fd5b5061037b610575366004611ce1565b60066020525f908152604090205460ff1681565b348015610594575f80fd5b50600a54610344906001600160a01b031681565b3480156105b3575f80fd5b5061039b60145481565b3480156105c8575f80fd5b50600c5461037b90600160801b900460ff1681565b3480156105e8575f80fd5b5061039b6105f7366004611ce1565b6001600160a01b03165f9081526020819052604090205490565b34801561061c575f80fd5b506104fc610c15565b348015610630575f80fd5b50600f54610644906001600160801b031681565b6040516001600160801b039091168152602001610308565b348015610667575f80fd5b506104fc610c88565b34801561067b575f80fd5b50600e5461037b90600160801b900460ff1681565b34801561069b575f80fd5b5060125461037b9060ff1681565b3480156106b4575f80fd5b506104fc610d09565b3480156106c8575f80fd5b5061037b6106d7366004611ce1565b60076020525f908152604090205460ff1681565b3480156106f6575f80fd5b506005546001600160a01b0316610344565b348015610713575f80fd5b50600c54610644906001600160801b031681565b348015610732575f80fd5b506102fb610e21565b348015610746575f80fd5b5061075061271081565b60405167ffffffffffffffff9091168152602001610308565b348015610774575f80fd5b5061037b610783366004611c3d565b610e30565b348015610793575f80fd5b50600b546103cb90600160e81b900462ffffff1681565b3480156107b5575f80fd5b5061037b6107c4366004611c3d565b610eaa565b3480156107d4575f80fd5b506103447f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b348015610807575f80fd5b5061037b610816366004611ce1565b60096020525f908152604090205460ff1681565b348015610835575f80fd5b50600d54610644906001600160801b031681565b348015610854575f80fd5b50600d5461037b90600160801b900460ff1681565b348015610874575f80fd5b50600c546103cb90600160881b900462ffffff1681565b348015610896575f80fd5b50600b54610344906001600160a01b031681565b3480156108b5575f80fd5b5061039b7f00000000000000000000000000000000000000000000054b40b1f852bda0000081565b3480156108e8575f80fd5b5060155461037b90610100900460ff1681565b348015610906575f80fd5b50600b546103cb90600160b81b900462ffffff1681565b348015610928575f80fd5b5061039b610937366004611d01565b610eb7565b348015610947575f80fd5b50600c546103cb90600160a01b900462ffffff1681565b348015610969575f80fd5b50600e54610644906001600160801b031681565b348015610988575f80fd5b506104fc610997366004611ce1565b610ee1565b3480156109a7575f80fd5b5061039b60135481565b3480156109bc575f80fd5b50600e546103cb90600160881b900462ffffff1681565b6060600380546109e290611d29565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0e90611d29565b8015610a595780601f10610a3057610100808354040283529160200191610a59565b820191905f5260205f20905b815481529060010190602001808311610a3c57829003601f168201915b5050505050905090565b5f33610a70818585610fcb565b60019150505b92915050565b5f33610a898582856110ee565b610a94858585611166565b506001949350505050565b5f33610a70818585610ab18383610eb7565b610abb9190611d75565b610fcb565b6005546001600160a01b03163314610af35760405162461bcd60e51b8152600401610aea90611d88565b60405180910390fd5b600b5462ffffff600160a01b90910481169083161080610b1a57506101f48262ffffff1611155b610b665760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072616973652062757920746178206f766572203525000000006044820152606401610aea565b600b5462ffffff600160b81b90910481169082161080610b8d57506101f48162ffffff1611155b610bd95760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f742072616973652062757920746178206f766572203525000000006044820152606401610aea565b600b805465ffffffffffff60a01b1916600160a01b62ffffff9485160262ffffff60b81b191617600160b81b9290931691909102919091179055565b6005546001600160a01b03163314610c3f5760405162461bcd60e51b8152600401610aea90611d88565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610cb25760405162461bcd60e51b8152600401610aea90611d88565b60125460ff16610cfd5760405162461bcd60e51b8152602060048201526016602482015275131a5b5a5d1cc8185b1c9958591e481c995b5bdd995960521b6044820152606401610aea565b6012805460ff19169055565b6005546001600160a01b03163314610d335760405162461bcd60e51b8152600401610aea90611d88565b60085460ff1615610d865760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720616c726561647920656e61626c65640000000000000000006044820152606401610aea565b6008805460ff19166001179055426014556015805461ff001916610100179055600b8054600160b81b600160e81b600160a01b62ffffff600160d01b850481169190910262ffffff60a01b198516811792909204169190910262ffffff60b81b1990911665ffffffffffff60a01b1990921691909117179055600c80546001600160801b03811660135560ff60801b1916600160801b179055565b6060600480546109e290611d29565b5f3381610e3d8286610eb7565b905083811015610e9d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610aea565b610a948286868403610fcb565b5f33610a70818585611166565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6005546001600160a01b03163314610f0b5760405162461bcd60e51b8152600401610aea90611d88565b6001600160a01b038116610f705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610aea565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661102d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610aea565b6001600160a01b03821661108e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610aea565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f6110f98484610eb7565b90505f19811461116057818110156111535760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610aea565b6111608484848403610fcb565b50505050565b6001600160a01b0383165f9081526006602052604090205460ff161580156111a657506001600160a01b0382165f9081526006602052604090205460ff16155b156112145760085460ff166111f25760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610aea565b6111fd838383611224565b6112079082611dbd565b905061121483838361136b565b61121f8383836115f5565b505050565b305f908152602081905260408120547f00000000000000000000000000000000000000000000054b40b1f852bda000001115801561127a57506001600160a01b0384165f9081526009602052604090205460ff16155b801561129457504360105460016112919190611d75565b11155b156112a1576112a1611798565b60155460ff16156112b4576112b461190e565b6001600160a01b0383165f90815260096020526040812054819060ff16156112eb5750600b54600160b81b900462ffffff1661131c565b6001600160a01b0386165f9081526009602052604090205460ff161561131c5750600b54600160a01b900462ffffff165b62ffffff8116156113595761271061133962ffffff831686611dd0565b6113439190611de7565b91506113598630846001600160801b03166115f5565b506001600160801b0316949350505050565b60125460ff161561121f576001600160a01b038281165f9081526007602090815260408083205483835281842054948816845260099092529091205460ff91821692911680156113b9575081155b1561140b576013546113cb8285611d75565b11156114065760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610aea565b611458565b816114585760135461141d8285611d75565b11156114585760405162461bcd60e51b815260206004820152600a60248201526913585e0815d85b1b195d60b21b6044820152606401610aea565b601554610100900460ff16156115ee577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316846001600160a01b0316141580156114dc57507f000000000000000000000000fde4aa664521fa2467ccec0d3ad4d2875dbf2a7d6001600160a01b0316846001600160a01b031614155b156115ee57325f90815260116020526040902054431161152f5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722044656c617960901b6044820152606401610aea565b7f000000000000000000000000fde4aa664521fa2467ccec0d3ad4d2875dbf2a7d6001600160a01b0316856001600160a01b0316036115ca57326001600160a01b038516146115ca5760405162461bcd60e51b815260206004820152602160248201527f6e6f20627579696e6720746f2065787465726e616c2077616c6c6574732079656044820152601d60fa1b6064820152608401610aea565b6001600160a01b0384165f9081526011602052604080822043908190553283529120555b5050505050565b6001600160a01b0383166116595760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610aea565b6001600160a01b0382166116bb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610aea565b6001600160a01b0383165f90815260208190526040902054818110156117325760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610aea565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b305f90815260208190526040812054908190036117b25750565b436010556117e17f00000000000000000000000000000000000000000000054b40b1f852bda00000600a611dd0565b811115611816576118137f00000000000000000000000000000000000000000000054b40b1f852bda00000600a611dd0565b90505b801561190b5761182581611ad9565b600b5447905f906001600160a01b0316156118b6575f6005611848846002611dd0565b6118529190611de7565b600b546040519192506001600160a01b03169082905f81818185875af1925050503d805f811461189d576040519150601f19603f3d011682016040523d82523d5f602084013e6118a2565b606091505b509092506118b290508184611dbd565b9250505b600a546040516001600160a01b039091169083905f81818185875af1925050503d805f8114611900576040519150601f19603f3d011682016040523d82523d5f602084013e611905565b606091505b50505050505b50565b60145442905f90821061192b576014546119289083611dbd565b90505b601554610100900460ff1680156119435750603c8110155b15611954576015805461ff00191690555b6104b081106119c4576015805460ff19169055600e54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600f546001600160801b03166013555050565b6102588110611a4f57600e54600160801b900460ff16611a4b57600d54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600e80546001600160801b038116601355600160801b60ff60801b199091161790555b5050565b61012c8110611a4b57600d54600160801b900460ff16611a4b57600c54600b805465ffffffffffff60a01b1916600160881b830462ffffff908116600160a01b90810262ffffff60b81b1916929092179190930492909216600160b81b02919091179055600d80546001600160801b038116601355600160801b60ff60801b199091161790555050565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110611b0c57611b0c611e06565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611b6057611b60611e06565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063791ac94790611bc49085905f90869030904290600401611e1a565b5f604051808303815f87803b158015611bdb575f80fd5b505af1158015611905573d5f803e3d5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611c38575f80fd5b919050565b5f8060408385031215611c4e575f80fd5b611c5783611c22565b946020939093013593505050565b5f805f60608486031215611c77575f80fd5b611c8084611c22565b9250611c8e60208501611c22565b9150604084013590509250925092565b803562ffffff81168114611c38575f80fd5b5f8060408385031215611cc1575f80fd5b611cca83611c9e565b9150611cd860208401611c9e565b90509250929050565b5f60208284031215611cf1575f80fd5b611cfa82611c22565b9392505050565b5f8060408385031215611d12575f80fd5b611d1b83611c22565b9150611cd860208401611c22565b600181811c90821680611d3d57607f821691505b602082108103611d5b57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7657610a76611d61565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b81810381811115610a7657610a76611d61565b8082028115828204841417610a7657610a76611d61565b5f82611e0157634e487b7160e01b5f52601260045260245ffd5b500490565b634e487b7160e01b5f52603260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b81811015611e6a5784516001600160a01b031683529383019391830191600101611e45565b50506001600160a01b0396909616606085015250505060800152939250505056fea26469706673582212201e820e7a1ca503c87fb196b90dcb468b0d198afbc07d3194c4a70d05f1409ecd64736f6c63430008190033

Deployed Bytecode Sourcemap

21906:9400:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23096:37;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;620:32:1;;;602:51;;590:2;575:18;23096:37:0;437:222:1;6549:201:0;;;;;;;;;;-1:-1:-1;6549:201:0;;;;;:::i;:::-;;:::i;:::-;;;1266:14:1;;1259:22;1241:41;;1229:2;1214:18;6549:201:0;1101:187:1;5318:108:0;;;;;;;;;;-1:-1:-1;5406:12:0;;5318:108;;;1439:25:1;;;1427:2;1412:18;5318:108:0;1293:177:1;22297:26:0;;;;;;;;;;-1:-1:-1;22297:26:0;;;;-1:-1:-1;;;22297:26:0;;;;;;;;;1649:8:1;1637:21;;;1619:40;;1607:2;1592:18;22297:26:0;1475:190:1;22754:31:0;;;;;;;;;;-1:-1:-1;22754:31:0;;;;-1:-1:-1;;;22754:31:0;;;;;;7330:261;;;;;;;;;;-1:-1:-1;7330:261:0;;;;;:::i;:::-;;:::i;5160:93::-;;;;;;;;;;-1:-1:-1;5160:93:0;;5243:2;2145:36:1;;2133:2;2118:18;5160:93:0;2003:184:1;23266:24:0;;;;;;;;;;-1:-1:-1;23266:24:0;;;;;;;;8000:238;;;;;;;;;;-1:-1:-1;8000:238:0;;;;;:::i;:::-;;:::i;22610:27::-;;;;;;;;;;-1:-1:-1;22610:27:0;;;;-1:-1:-1;;;22610:27:0;;;;;;22835:32;;;;;;;;;;;;;;;;23058:31;;;;;;;;;;;;;;;29554:310;;;;;;;;;;-1:-1:-1;29554:310:0;;;;;:::i;:::-;;:::i;:::-;;22240:20;;;;;;;;;;-1:-1:-1;22240:20:0;;;;-1:-1:-1;;;22240:20:0;;;;;;22577:26;;;;;;;;;;-1:-1:-1;22577:26:0;;;;-1:-1:-1;;;22577:26:0;;;;;;22064;;;;;;;;;;-1:-1:-1;22064:26:0;;;;;;;;21952:47;;;;;;;;;;-1:-1:-1;21952:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22150:33;;;;;;;;;;-1:-1:-1;22150:33:0;;;;-1:-1:-1;;;;;22150:33:0;;;23229:30;;;;;;;;;;;;;;;;22401:27;;;;;;;;;;-1:-1:-1;22401:27:0;;;;-1:-1:-1;;;22401:27:0;;;;;;5489:127;;;;;;;;;;-1:-1:-1;5489:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;5590:18:0;5563:7;5590:18;;;;;;;;;;;;5489:127;13103:148;;;;;;;;;;;;;:::i;22792:34::-;;;;;;;;;;-1:-1:-1;22792:34:0;;;;-1:-1:-1;;;;;22792:34:0;;;;;;-1:-1:-1;;;;;3182:47:1;;;3164:66;;3152:2;3137:18;22792:34:0;3018:218:1;29872:130:0;;;;;;;;;;;;;:::i;22681:27::-;;;;;;;;;;-1:-1:-1;22681:27:0;;;;-1:-1:-1;;;22681:27:0;;;;;;22943:26;;;;;;;;;;-1:-1:-1;22943:26:0;;;;;;;;29181:365;;;;;;;;;;;;;:::i;22006:49::-;;;;;;;;;;-1:-1:-1;22006:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;12889:79;;;;;;;;;;-1:-1:-1;12954:6:0;;-1:-1:-1;;;;;12954:6:0;12889:79;;22364:30;;;;;;;;;;-1:-1:-1;22364:30:0;;;;-1:-1:-1;;;;;22364:30:0;;;4408:104;;;;;;;;;;;;;:::i;23178:42::-;;;;;;;;;;;;23215:5;23178:42;;;;;3415:18:1;3403:31;;;3385:50;;3373:2;3358:18;23178:42:0;3241:200:1;8741:436:0;;;;;;;;;;-1:-1:-1;8741:436:0;;;;;:::i;:::-;;:::i;22330:27::-;;;;;;;;;;-1:-1:-1;22330:27:0;;;;-1:-1:-1;;;22330:27:0;;;;;;5822:193;;;;;;;;;;-1:-1:-1;5822:193:0;;;;;:::i;:::-;;:::i;23140:29::-;;;;;;;;;;;;;;;22099:42;;;;;;;;;;-1:-1:-1;22099:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22504:30;;;;;;;;;;-1:-1:-1;22504:30:0;;;;-1:-1:-1;;;;;22504:30:0;;;22541:27;;;;;;;;;;-1:-1:-1;22541:27:0;;;;-1:-1:-1;;;22541:27:0;;;;;;22437:26;;;;;;;;;;-1:-1:-1;22437:26:0;;;;-1:-1:-1;;;22437:26:0;;;;;;22190:41;;;;;;;;;;-1:-1:-1;22190:41:0;;;;-1:-1:-1;;;;;22190:41:0;;;23009:40;;;;;;;;;;;;;;;23299;;;;;;;;;;-1:-1:-1;23299:40:0;;;;;;;;;;;22267:21;;;;;;;;;;-1:-1:-1;22267:21:0;;;;-1:-1:-1;;;22267:21:0;;;;;;6078:151;;;;;;;;;;-1:-1:-1;6078:151:0;;;;;:::i;:::-;;:::i;22470:27::-;;;;;;;;;;-1:-1:-1;22470:27:0;;;;-1:-1:-1;;;22470:27:0;;;;;;22644:30;;;;;;;;;;-1:-1:-1;22644:30:0;;;;-1:-1:-1;;;;;22644:30:0;;;13259:244;;;;;;;;;;-1:-1:-1;13259:244:0;;;;;:::i;:::-;;:::i;22976:24::-;;;;;;;;;;;;;;;;22717:30;;;;;;;;;;-1:-1:-1;22717:30:0;;;;-1:-1:-1;;;22717:30:0;;;;;;4189:100;4243:13;4276:5;4269:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4189:100;:::o;6549:201::-;6632:4;175:10;6688:32;175:10;6704:7;6713:6;6688:8;:32::i;:::-;6738:4;6731:11;;;6549:201;;;;;:::o;7330:261::-;7427:4;175:10;7485:38;7501:4;175:10;7516:6;7485:15;:38::i;:::-;7534:27;7544:4;7550:2;7554:6;7534:9;:27::i;:::-;-1:-1:-1;7579:4:0;;7330:261;-1:-1:-1;;;;7330:261:0:o;8000:238::-;8088:4;175:10;8144:64;175:10;8160:7;8197:10;8169:25;175:10;8160:7;8169:9;:25::i;:::-;:38;;;;:::i;:::-;8144:8;:64::i;29554:310::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;;;;;;;;;29654:6:::1;::::0;::::1;-1:-1:-1::0;;;29654:6:0;;::::1;::::0;::::1;29644:16:::0;;::::1;;::::0;:34:::1;;;29675:3;29664:7;:14;;;;29644:34;29636:75;;;::::0;-1:-1:-1;;;29636:75:0;;4921:2:1;29636:75:0::1;::::0;::::1;4903:21:1::0;4960:2;4940:18;;;4933:30;4999;4979:18;;;4972:58;5047:18;;29636:75:0::1;4719:352:1::0;29636:75:0::1;29741:7;::::0;::::1;-1:-1:-1::0;;;29741:7:0;;::::1;::::0;::::1;29730:18:::0;;::::1;;::::0;:37:::1;;;29764:3;29752:8;:15;;;;29730:37;29722:78;;;::::0;-1:-1:-1;;;29722:78:0;;4921:2:1;29722:78:0::1;::::0;::::1;4903:21:1::0;4960:2;4940:18;;;4933:30;4999;4979:18;;;4972:58;5047:18;;29722:78:0::1;4719:352:1::0;29722:78:0::1;29811:6;:16:::0;;-1:-1:-1;;;;29838:18:0;-1:-1:-1;;;29811:16:0::1;::::0;;::::1;;-1:-1:-1::0;;;;29838:18:0;;-1:-1:-1;;;29838:18:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;29554:310::o;13103:148::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;13194:6:::1;::::0;13173:40:::1;::::0;13210:1:::1;::::0;-1:-1:-1;;;;;13194:6:0::1;::::0;13173:40:::1;::::0;13210:1;;13173:40:::1;13224:6;:19:::0;;-1:-1:-1;;;;;;13224:19:0::1;::::0;;13103:148::o;29872:130::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;29934:7:::1;::::0;::::1;;29926:42;;;::::0;-1:-1:-1;;;29926:42:0;;5278:2:1;29926:42:0::1;::::0;::::1;5260:21:1::0;5317:2;5297:18;;;5290:30;-1:-1:-1;;;5336:18:1;;;5329:52;5398:18;;29926:42:0::1;5076:346:1::0;29926:42:0::1;29979:7;:15:::0;;-1:-1:-1;;29979:15:0::1;::::0;;29872:130::o;29181:365::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;29245:14:::1;::::0;::::1;;29244:15;29236:51;;;::::0;-1:-1:-1;;;29236:51:0;;5629:2:1;29236:51:0::1;::::0;::::1;5611:21:1::0;5668:2;5648:18;;;5641:30;5707:25;5687:18;;;5680:53;5750:18;;29236:51:0::1;5427:347:1::0;29236:51:0::1;29298:14;:21:::0;;-1:-1:-1;;29298:21:0::1;29315:4;29298:21;::::0;;29348:15:::1;29330;:33:::0;29374:20:::1;:27:::0;;-1:-1:-1;;29374:27:0::1;29298:21;29374:27;::::0;;29421:12:::1;::::0;;-1:-1:-1;;;;;;;;;29421:12:0::1;-1:-1:-1::0;;;29421:12:0;::::1;::::0;::::1;29412:21:::0;;;::::1;-1:-1:-1::0;;;;29412:21:0;::::1;::::0;::::1;29454:13:::0;;;::::1;;29444:23:::0;;;::::1;-1:-1:-1::0;;;;29444:23:0;;;-1:-1:-1;;;;29444:23:0;;;;;;;::::1;::::0;;29490:15:::1;::::0;;-1:-1:-1;;;;;29490:15:0;::::1;29478:9;:27:::0;-1:-1:-1;;;;29516:22:0::1;-1:-1:-1::0;;;29516:22:0::1;::::0;;29181:365::o;4408:104::-;4464:13;4497:7;4490:14;;;;;:::i;8741:436::-;8834:4;175:10;8834:4;8917:25;175:10;8934:7;8917:9;:25::i;:::-;8890:52;;8981:15;8961:16;:35;;8953:85;;;;-1:-1:-1;;;8953:85:0;;5981:2:1;8953:85:0;;;5963:21:1;6020:2;6000:18;;;5993:30;6059:34;6039:18;;;6032:62;-1:-1:-1;;;6110:18:1;;;6103:35;6155:19;;8953:85:0;5779:401:1;8953:85:0;9074:60;9083:5;9090:7;9118:15;9099:16;:34;9074:8;:60::i;5822:193::-;5901:4;175:10;5957:28;175:10;5974:2;5978:6;5957:9;:28::i;6078:151::-;-1:-1:-1;;;;;6194:18:0;;;6167:7;6194:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6078:151::o;13259:244::-;13016:6;;-1:-1:-1;;;;;13016:6:0;175:10;13016:22;13008:67;;;;-1:-1:-1;;;13008:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13348:22:0;::::1;13340:73;;;::::0;-1:-1:-1;;;13340:73:0;;6387:2:1;13340:73:0::1;::::0;::::1;6369:21:1::0;6426:2;6406:18;;;6399:30;6465:34;6445:18;;;6438:62;-1:-1:-1;;;6516:18:1;;;6509:36;6562:19;;13340:73:0::1;6185:402:1::0;13340:73:0::1;13450:6;::::0;13429:38:::1;::::0;-1:-1:-1;;;;;13429:38:0;;::::1;::::0;13450:6:::1;::::0;13429:38:::1;::::0;13450:6:::1;::::0;13429:38:::1;13478:6;:17:::0;;-1:-1:-1;;;;;;13478:17:0::1;-1:-1:-1::0;;;;;13478:17:0;;;::::1;::::0;;;::::1;::::0;;13259:244::o;11502:346::-;-1:-1:-1;;;;;11604:19:0;;11596:68;;;;-1:-1:-1;;;11596:68:0;;6794:2:1;11596:68:0;;;6776:21:1;6833:2;6813:18;;;6806:30;6872:34;6852:18;;;6845:62;-1:-1:-1;;;6923:18:1;;;6916:34;6967:19;;11596:68:0;6592:400:1;11596:68:0;-1:-1:-1;;;;;11683:21:0;;11675:68;;;;-1:-1:-1;;;11675:68:0;;7199:2:1;11675:68:0;;;7181:21:1;7238:2;7218:18;;;7211:30;7277:34;7257:18;;;7250:62;-1:-1:-1;;;7328:18:1;;;7321:32;7370:19;;11675:68:0;6997:398:1;11675:68:0;-1:-1:-1;;;;;11756:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11808:32;;1439:25:1;;;11808:32:0;;1412:18:1;11808:32:0;;;;;;;11502:346;;;:::o;12139:419::-;12240:24;12267:25;12277:5;12284:7;12267:9;:25::i;:::-;12240:52;;-1:-1:-1;;12307:16:0;:37;12303:248;;12389:6;12369:16;:26;;12361:68;;;;-1:-1:-1;;;12361:68:0;;7602:2:1;12361:68:0;;;7584:21:1;7641:2;7621:18;;;7614:30;7680:31;7660:18;;;7653:59;7729:18;;12361:68:0;7400:353:1;12361:68:0;12473:51;12482:5;12489:7;12517:6;12498:16;:25;12473:8;:51::i;:::-;12229:329;12139:419;;;:::o;25689:409::-;-1:-1:-1;;;;;25835:20:0;;;;;;:14;:20;;;;;;;;25834:21;:44;;;;-1:-1:-1;;;;;;25860:18:0;;;;;;:14;:18;;;;;;;;25859:19;25834:44;25831:216;;;25902:14;;;;25894:45;;;;-1:-1:-1;;;25894:45:0;;7960:2:1;25894:45:0;;;7942:21:1;7999:2;7979:18;;;7972:30;-1:-1:-1;;;8018:18:1;;;8011:48;8076:18;;25894:45:0;7758:342:1;25894:45:0;25964:27;25974:4;25980:2;25984:6;25964:9;:27::i;:::-;25954:37;;;;:::i;:::-;;;26006:29;26018:4;26024:2;26028:6;26006:11;:29::i;:::-;26059:31;26075:4;26080:2;26083:6;26059:15;:31::i;:::-;25689:409;;;:::o;27193:711::-;27314:4;27272:7;5590:18;;;;;;;;;;;27324:15;-1:-1:-1;27296:43:0;:63;;;;-1:-1:-1;;;;;;27344:15:0;;;;;;:9;:15;;;;;;;;27343:16;27296:63;:104;;;;;27388:12;27363:17;;27383:1;27363:21;;;;:::i;:::-;:37;;27296:104;27293:150;;;27417:14;:12;:14::i;:::-;27458:12;;;;27455:61;;;27486:18;:16;:18::i;:::-;-1:-1:-1;;;;;27593:13:0;;27536:11;27593:13;;;:9;:13;;;;;;27536:11;;27593:13;;27589:126;;;-1:-1:-1;27630:7:0;;-1:-1:-1;;;27630:7:0;;;;27589:126;;;-1:-1:-1;;;;;27658:15:0;;;;;;:9;:15;;;;;;;;27655:60;;;-1:-1:-1;27697:6:0;;-1:-1:-1;;;27697:6:0;;;;27655:60;27730:9;;;;27727:139;;23215:5;27769:14;;;;:6;:14;:::i;:::-;:28;;;;:::i;:::-;27755:43;;27813:41;27829:4;27843;27850:3;-1:-1:-1;;;;;27813:41:0;:15;:41::i;:::-;-1:-1:-1;;;;;;27886:10:0;;27193:711;-1:-1:-1;;;;27193:711:0:o;26106:1079::-;26192:7;;;;26189:989;;;-1:-1:-1;;;;;26251:20:0;;;26229:19;26251:20;;;:16;:20;;;;;;;;;5590:18;;;;;;;26362:15;;;;;:9;:15;;;;;;;26251:20;;;;;5590:18;26362:15;:34;;;;;26382:14;26381:15;26362:34;26358:261;;;26449:9;;26425:20;26434:11;26425:6;:20;:::i;:::-;:33;;26417:56;;;;-1:-1:-1;;;26417:56:0;;8835:2:1;26417:56:0;;;8817:21:1;8874:2;8854:18;;;8847:30;-1:-1:-1;;;8893:18:1;;;8886:40;8943:18;;26417:56:0;8633:334:1;26417:56:0;26358:261;;;26512:14;26508:111;;26579:9;;26555:20;26564:11;26555:6;:20;:::i;:::-;:33;;26547:56;;;;-1:-1:-1;;;26547:56:0;;8835:2:1;26547:56:0;;;8817:21:1;8874:2;8854:18;;;8847:30;-1:-1:-1;;;8893:18:1;;;8886:40;8943:18;;26547:56:0;8633:334:1;26547:56:0;26638:20;;;;;;;26635:532;;;26696:9;-1:-1:-1;;;;;26682:24:0;:2;-1:-1:-1;;;;;26682:24:0;;;:49;;;;;26724:6;-1:-1:-1;;;;;26710:21:0;:2;-1:-1:-1;;;;;26710:21:0;;;26682:49;26678:474;;;26788:9;26763:35;;;;:24;:35;;;;;;26801:12;-1:-1:-1;26755:77:0;;;;-1:-1:-1;;;26755:77:0;;9174:2:1;26755:77:0;;;9156:21:1;9213:2;9193:18;;;9186:30;-1:-1:-1;;;9232:18:1;;;9225:44;9286:18;;26755:77:0;8972:338:1;26755:77:0;26874:6;-1:-1:-1;;;;;26858:23:0;:4;-1:-1:-1;;;;;26858:23:0;;26855:139;;26917:9;-1:-1:-1;;;;;26917:15:0;;;26909:61;;;;-1:-1:-1;;;26909:61:0;;9517:2:1;26909:61:0;;;9499:21:1;9556:2;9536:18;;;9529:30;9595:34;9575:18;;;9568:62;-1:-1:-1;;;9646:18:1;;;9639:31;9687:19;;26909:61:0;9315:397:1;26909:61:0;-1:-1:-1;;;;;27016:28:0;;;;;;:24;:28;;;;;;27047:12;27016:43;;;;27107:9;27082:35;;;;:50;26678:474;26200:978;;26106:1079;;;:::o;9647:705::-;-1:-1:-1;;;;;9744:18:0;;9736:68;;;;-1:-1:-1;;;9736:68:0;;9919:2:1;9736:68:0;;;9901:21:1;9958:2;9938:18;;;9931:30;9997:34;9977:18;;;9970:62;-1:-1:-1;;;10048:18:1;;;10041:35;10093:19;;9736:68:0;9717:401:1;9736:68:0;-1:-1:-1;;;;;9823:16:0;;9815:64;;;;-1:-1:-1;;;9815:64:0;;10325:2:1;9815:64:0;;;10307:21:1;10364:2;10344:18;;;10337:30;10403:34;10383:18;;;10376:62;-1:-1:-1;;;10454:18:1;;;10447:33;10497:19;;9815:64:0;10123:399:1;9815:64:0;-1:-1:-1;;;;;9914:15:0;;9892:19;9914:15;;;;;;;;;;;9948:21;;;;9940:72;;;;-1:-1:-1;;;9940:72:0;;10729:2:1;9940:72:0;;;10711:21:1;10768:2;10748:18;;;10741:30;10807:34;10787:18;;;10780:62;-1:-1:-1;;;10858:18:1;;;10851:36;10904:19;;9940:72:0;10527:402:1;9940:72:0;-1:-1:-1;;;;;10048:15:0;;;:9;:15;;;;;;;;;;;10066:20;;;10048:38;;10266:13;;;;;;;;;;:23;;;;;;10318:26;;1439:25:1;;;10266:13:0;;10318:26;;1412:18:1;10318:26:0;;;;;;;9725:627;9647:705;;;:::o;28292:881::-;28381:4;28337:23;5590:18;;;;;;;;;;;;28411:20;;;28408:34;;28434:7;28292:881::o;28408:34::-;28474:12;28454:17;:32;28520:20;:15;28538:2;28520:20;:::i;:::-;28502:15;:38;28499:107;;;28574:20;:15;28592:2;28574:20;:::i;:::-;28556:38;;28499:107;28621:19;;28618:548;;28658:33;28675:15;28658:16;:33::i;:::-;28811:26;;28741:21;;28720:18;;-1:-1:-1;;;;;28811:26:0;:40;28808:271;;28871:26;28917:1;28900:14;:10;28913:1;28900:14;:::i;:::-;:18;;;;:::i;:::-;28950:26;;:62;;28871:47;;-1:-1:-1;;;;;;28950:26:0;;28871:47;;28950:62;;;;28871:47;28950:26;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28937:75:0;;-1:-1:-1;29031:32:0;;-1:-1:-1;29045:18:0;29031:32;;:::i;:::-;;;28852:227;28808:271;29108:18;;:46;;-1:-1:-1;;;;;29108:18:0;;;;29139:10;;29108:46;;;;29139:10;29108:18;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28618:548:0;28324:849;28292:881::o;30047:1256::-;30219:15;;30124;;30097:24;;30199:35;;30196:118;;30287:15;;30268:34;;:16;:34;:::i;:::-;30250:52;;30196:118;30329:20;;;;;;;:52;;;;;30372:9;30353:15;:28;;30329:52;30326:111;;;30397:20;:28;;-1:-1:-1;;30397:28:0;;;30326:111;30471:10;30452:15;:29;30449:847;;30497:12;:20;;-1:-1:-1;;30497:20:0;;;30541:16;;30532:6;:25;;-1:-1:-1;;;;30572:27:0;-1:-1:-1;;;30541:16:0;;;;;;-1:-1:-1;;;30532:25:0;;;-1:-1:-1;;;;30572:27:0;;;;;30582:17;;;;;;;;-1:-1:-1;;;30572:27:0;;;;;;;30626:19;;-1:-1:-1;;;;;30626:19:0;30614:9;:31;30084:1219;;30047:1256::o;30449:847::-;30785:10;30766:15;:29;30763:533;;30815:15;;-1:-1:-1;;;30815:15:0;;;;30811:205;;30859:12;;30850:6;:21;;-1:-1:-1;;;;30890:23:0;-1:-1:-1;;;30859:12:0;;;;;;-1:-1:-1;;;30850:21:0;;;-1:-1:-1;;;;30890:23:0;;;;;30900:13;;;;;;;;-1:-1:-1;;;30890:23:0;;;;;;;30944:15;;;-1:-1:-1;;;;;30944:15:0;;30932:9;:27;-1:-1:-1;;;;;;;30978:22:0;;;;;;30811:205;30084:1219;;30047:1256::o;30763:533::-;31055:9;31036:15;:28;31033:263;;31084:15;;-1:-1:-1;;;31084:15:0;;;;31080:205;;31128:12;;31119:6;:21;;-1:-1:-1;;;;31159:23:0;-1:-1:-1;;;31128:12:0;;;;;;-1:-1:-1;;;31119:21:0;;;-1:-1:-1;;;;31159:23:0;;;;;31169:13;;;;;;;;-1:-1:-1;;;31159:23:0;;;;;;;31213:15;;;-1:-1:-1;;;;;31213:15:0;;31201:9;:27;-1:-1:-1;;;;;;;31247:22:0;;;;;;30084:1219;;30047:1256::o;27912:372::-;28001:16;;;28015:1;28001:16;;;;;;;;27977:21;;28001:16;;;;;;;;;;-1:-1:-1;28001:16:0;27977:40;;28046:4;28028;28033:1;28028:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;28028:23:0;;;-1:-1:-1;;;;;28028:23:0;;;;;28072:4;28062;28067:1;28062:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28062:14:0;;;:7;;;;;;;;;:14;28089:187;;-1:-1:-1;;;28089:187:0;;:9;:60;;;;;;:187;;28164:8;;28187:1;;28203:4;;28230;;28250:15;;28089:187;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:418:1;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;664:173::-;732:20;;-1:-1:-1;;;;;781:31:1;;771:42;;761:70;;827:1;824;817:12;761:70;664:173;;;:::o;842:254::-;910:6;918;971:2;959:9;950:7;946:23;942:32;939:52;;;987:1;984;977:12;939:52;1010:29;1029:9;1010:29;:::i;:::-;1000:39;1086:2;1071:18;;;;1058:32;;-1:-1:-1;;;842:254:1:o;1670:328::-;1747:6;1755;1763;1816:2;1804:9;1795:7;1791:23;1787:32;1784:52;;;1832:1;1829;1822:12;1784:52;1855:29;1874:9;1855:29;:::i;:::-;1845:39;;1903:38;1937:2;1926:9;1922:18;1903:38;:::i;:::-;1893:48;;1988:2;1977:9;1973:18;1960:32;1950:42;;1670:328;;;;;:::o;2400:161::-;2467:20;;2527:8;2516:20;;2506:31;;2496:59;;2551:1;2548;2541:12;2566:256;2632:6;2640;2693:2;2681:9;2672:7;2668:23;2664:32;2661:52;;;2709:1;2706;2699:12;2661:52;2732:28;2750:9;2732:28;:::i;:::-;2722:38;;2779:37;2812:2;2801:9;2797:18;2779:37;:::i;:::-;2769:47;;2566:256;;;;;:::o;2827:186::-;2886:6;2939:2;2927:9;2918:7;2914:23;2910:32;2907:52;;;2955:1;2952;2945:12;2907:52;2978:29;2997:9;2978:29;:::i;:::-;2968:39;2827:186;-1:-1:-1;;;2827:186:1:o;3446:260::-;3514:6;3522;3575:2;3563:9;3554:7;3550:23;3546:32;3543:52;;;3591:1;3588;3581:12;3543:52;3614:29;3633:9;3614:29;:::i;:::-;3604:39;;3662:38;3696:2;3685:9;3681:18;3662:38;:::i;3711:380::-;3790:1;3786:12;;;;3833;;;3854:61;;3908:4;3900:6;3896:17;3886:27;;3854:61;3961:2;3953:6;3950:14;3930:18;3927:38;3924:161;;4007:10;4002:3;3998:20;3995:1;3988:31;4042:4;4039:1;4032:15;4070:4;4067:1;4060:15;3924:161;;3711:380;;;:::o;4096:127::-;4157:10;4152:3;4148:20;4145:1;4138:31;4188:4;4185:1;4178:15;4212:4;4209:1;4202:15;4228:125;4293:9;;;4314:10;;;4311:36;;;4327:18;;:::i;4358:356::-;4560:2;4542:21;;;4579:18;;;4572:30;4638:34;4633:2;4618:18;;4611:62;4705:2;4690:18;;4358:356::o;8105:128::-;8172:9;;;8193:11;;;8190:37;;;8207:18;;:::i;8238:168::-;8311:9;;;8342;;8359:15;;;8353:22;;8339:37;8329:71;;8380:18;;:::i;8411:217::-;8451:1;8477;8467:132;;8521:10;8516:3;8512:20;8509:1;8502:31;8556:4;8553:1;8546:15;8584:4;8581:1;8574:15;8467:132;-1:-1:-1;8613:9:1;;8411:217::o;11276:127::-;11337:10;11332:3;11328:20;11325:1;11318:31;11368:4;11365:1;11358:15;11392:4;11389:1;11382:15;11408:980;11670:4;11718:3;11707:9;11703:19;11749:6;11738:9;11731:25;11775:2;11813:6;11808:2;11797:9;11793:18;11786:34;11856:3;11851:2;11840:9;11836:18;11829:31;11880:6;11915;11909:13;11946:6;11938;11931:22;11984:3;11973:9;11969:19;11962:26;;12023:2;12015:6;12011:15;11997:29;;12044:1;12054:195;12068:6;12065:1;12062:13;12054:195;;;12133:13;;-1:-1:-1;;;;;12129:39:1;12117:52;;12224:15;;;;12189:12;;;;12165:1;12083:9;12054:195;;;-1:-1:-1;;;;;;;12305:32:1;;;;12300:2;12285:18;;12278:60;-1:-1:-1;;;12369:3:1;12354:19;12347:35;12266:3;11408:980;-1:-1:-1;;;11408:980:1:o

Swarm Source

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