ETH Price: $3,340.75 (-1.01%)

Token

Resistor AI (TOR)
 

Overview

Max Total Supply

1,000,000,000 TOR

Holders

2,218 (0.00%)

Market

Price

$0.00 @ 0.000001 ETH

Onchain Market Cap

$1,970,760.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.806904289458065561 TOR

Value
$0.00 ( ~0 Eth) [0.0000%]
0x86ec2f44b9997e82f3dcd917c7fff4435625ead2
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Resistor AI is a pioneering Layer 2 Blockchain platform dedicated to reshaping the landscape of artificial intelligence.

Market

Volume (24H):$510.87
Market Capitalization:$0.00
Circulating Supply:0.00 TOR
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TOR

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

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

/*
Resistor AI
Blockchain With AI Resources and Marketplace
Provide and Consume AI Services On-Chain

https://resistorai.org

*/

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract TOR is Context, IERC20, Ownable {
    using Address for address;
    //Mapping section for better tracking.
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) private _isExcludedFromFee;

    //Loging and Event Information for better troubleshooting.
    event Log(string, uint256);
    event AuditLog(string, address);
    event RewardLiquidityProviders(uint256 tokenAmount);
    event SwapAndLiquifyEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );
    event SwapTokensForETH(uint256 amountIn, address[] path);
    //Supply Definition.
    uint256 private _tTotal = 1_000_000_000 ether;
    uint256 private _tFeeTotal;
    //Token Definition.
    string public constant name = "Resistor AI";
    string public constant symbol = "TOR";
    uint8 public constant decimals = 18;
    //Definition of Wallets for Marketing or team.
    address payable public marketingWallet =
        payable(0x0bb3719C674401D665a5418423bf48972B4f9c4f);
    address payable public revenueWallet =
        payable(0x0bb3719C674401D665a5418423bf48972B4f9c4f);
    //Dead Wallet for SAFU Contract
    address public constant deadWallet =
        0x000000000000000000000000000000000000dEaD;

    //Taxes Definition.
    uint public buyFee = 5;

    uint256 public sellFee = 5;
    uint public revenueFee = 1;
    uint public marketingFee = 3;

    uint256 public marketingTokensCollected = 0;

    uint256 public totalMarketingTokensCollected = 0;

    uint256 public minimumTokensBeforeSwap = 10_000 ether;

    //Oracle Price Update, Manual Process.
    uint256 public swapOutput = 0;
    //Router and Pair Configuration.
    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address private immutable WETH;
    //Tracking of Automatic Swap vs Manual Swap.
    bool public inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;

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

    constructor() {
        _tOwned[_msgSender()] = _tTotal;
        address currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        //End of Router Variables.
        //Create Pair in the contructor, this may fail on some blockchains and can be done in a separate line if needed.
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(currentRouter);
        WETH = _uniswapV2Router.WETH();
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH);
        uniswapV2Router = _uniswapV2Router;
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

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

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

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

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

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

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

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

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

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

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

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

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

    function swapAndLiquify() public lockTheSwap {
        uint256 totalTokens = balanceOf(address(this));
        swapTokensForEth(totalTokens);
        uint ethBalance = address(this).balance;
        uint totalFees = revenueFee + marketingFee;
        if (totalFees == 0) totalFees = 1;
        uint revenueAmount = (ethBalance * revenueFee) / totalFees;
        ethBalance -= revenueAmount;
        transferToAddressETH(revenueWallet, revenueAmount);
        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

        emit SwapTokensForETH(tokenAmount, path);
    }

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

        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

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

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

    //set a new team wallet.
    function setRevenueWallet(address _revenueWallet) external onlyOwner {
        require(_revenueWallet != address(0), "setRevenueWallet: ZERO");
        revenueWallet = payable(_revenueWallet);
        emit AuditLog("We have Updated the RarketingWallet:", revenueWallet);
    }



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

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

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

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

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

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

Contract Security Audit

Contract ABI

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

60e06040526b033b2e3c9fd0803ce8000000600455600680546001600160a01b0319908116730bb3719c674401d665a5418423bf48972b4f9c4f908117909255600780549091169091179055600560088190556009556001600a556003600b556000600c819055600d81905569021e19e0c9bab2400000600e55600f556010805461ff0019166101001790553480156200009857600080fd5b50620000a433620002f5565b60048054336000908152600160209081526040918290209290925580516315ab88c960e31b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d938493849363ad5c4648938184019390918290030181865afa1580156200010d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000133919062000345565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b1919062000345565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000229919062000345565b6001600160a01b0390811660a0528116608052600160036000620002556000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260039092529020805490911660011790556200029d3390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600454604051620002e591815260200190565b60405180910390a3505062000377565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156200035857600080fd5b81516001600160a01b03811681146200037057600080fd5b9392505050565b60805160a05160c051611cb0620003ca600039600061172b01526000818161047501528181611473015281816114d3015261154f0152600081816102cf0152818161178301526117bf0152611cb06000f3fe6080604052600436106102345760003560e01c80635eaa82471161012e578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e146106bf578063e6be4a7214610705578063ea2f0b3714610725578063f2fde38b14610745578063fb235f341461076557600080fd5b8063a9059cbb1461063f578063b29ad50a1461065f578063c49b9a8014610674578063ce831ed514610694578063d2d7ad83146106a957600080fd5b806375f0a874116100f257806375f0a8741461059c57806385141a77146105bc5780638da5cb5b146105d257806395d89b41146105f0578063a457c2d71461061f57600080fd5b80635eaa82471461050f5780636b67c4df146105255780636ca60bc61461053b57806370a0823114610551578063715018a61461058757600080fd5b806339509351116101bc5780634706240211610180578063470624021461044d57806349bd5a5e146104635780634a74bb02146104975780635342acb4146104b65780635d098b38146104ef57600080fd5b806339509351146103b557806340763503146103d5578063437823ec146103eb578063444784251461040d578063461d94761461042d57600080fd5b8063220f669611610203578063220f66961461032857806323b872dd146103425780632b14ca5614610362578063313ce5671461037857806336e4ec641461039f57600080fd5b806306fdde0314610240578063095ea7b31461028d5780631694505e146102bd57806318160ddd1461030957600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b506102776040518060400160405280600b81526020016a5265736973746f7220414960a81b81525081565b60405161028491906119a8565b60405180910390f35b34801561029957600080fd5b506102ad6102a8366004611a12565b610785565b6040519015158152602001610284565b3480156102c957600080fd5b506102f17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610284565b34801561031557600080fd5b506004545b604051908152602001610284565b34801561033457600080fd5b506010546102ad9060ff1681565b34801561034e57600080fd5b506102ad61035d366004611a3c565b61079c565b34801561036e57600080fd5b5061031a60095481565b34801561038457600080fd5b5061038d601281565b60405160ff9091168152602001610284565b3480156103ab57600080fd5b5061031a600a5481565b3480156103c157600080fd5b506102ad6103d0366004611a12565b610850565b3480156103e157600080fd5b5061031a600d5481565b3480156103f757600080fd5b5061040b610406366004611a78565b610887565b005b34801561041957600080fd5b506007546102f1906001600160a01b031681565b34801561043957600080fd5b5061040b610448366004611a9a565b610935565b34801561045957600080fd5b5061031a60085481565b34801561046f57600080fd5b506102f17f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a357600080fd5b506010546102ad90610100900460ff1681565b3480156104c257600080fd5b506102ad6104d1366004611a78565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156104fb57600080fd5b5061040b61050a366004611a78565b610a26565b34801561051b57600080fd5b5061031a600f5481565b34801561053157600080fd5b5061031a600b5481565b34801561054757600080fd5b5061031a600c5481565b34801561055d57600080fd5b5061031a61056c366004611a78565b6001600160a01b031660009081526001602052604090205490565b34801561059357600080fd5b5061040b610b05565b3480156105a857600080fd5b506006546102f1906001600160a01b031681565b3480156105c857600080fd5b506102f161dead81565b3480156105de57600080fd5b506000546001600160a01b03166102f1565b3480156105fc57600080fd5b50610277604051806040016040528060038152602001622a27a960e91b81525081565b34801561062b57600080fd5b506102ad61063a366004611a12565b610b19565b34801561064b57600080fd5b506102ad61065a366004611a12565b610b50565b34801561066b57600080fd5b5061040b610b5d565b34801561068057600080fd5b5061040b61068f366004611ac1565b610c24565b3480156106a057600080fd5b5061040b610ccb565b3480156106b557600080fd5b5061031a600e5481565b3480156106cb57600080fd5b5061031a6106da366004611ade565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561071157600080fd5b5061040b610720366004611a12565b610dea565b34801561073157600080fd5b5061040b610740366004611a78565b610f9e565b34801561075157600080fd5b5061040b610760366004611a78565b611034565b34801561077157600080fd5b5061040b610780366004611a78565b6110ad565b6000610792338484611185565b5060015b92915050565b6001600160a01b0383166000908152600260209081526040808320338452909152812054828110156108265760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108318585856112aa565b61084585336108408685611b27565b611185565b506001949350505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610792918590610840908690611b3a565b61088f61162a565b6001600160a01b03811660009081526003602052604090819020805460ff1916600117905551600080516020611c5b8339815191529061092a9083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b60405180910390a150565b61093d61162a565b68056bc75e2d631000008110156109a65760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b606482015260840161081d565b600e81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b6080820152602081018290527fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b59060a00161092a565b610a2e61162a565b6001600160a01b038116610a845760405162461bcd60e51b815260206004820152601860248201527f7365744d61726b6574696e6757616c6c65743a205a45524f0000000000000000604482015260640161081d565b600680546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611c5b8339815191529060a00161092a565b610b0d61162a565b610b176000611684565b565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610792918590610840908690611b27565b60006107923384846112aa565b6010805460ff191660011790556000610b8b306001600160a01b031660009081526001602052604090205490565b9050610b96816116d4565b600b54600a544791600091610bab9190611b3a565b905080600003610bb9575060015b600081600a5484610bca9190611b4d565b610bd49190611b64565b9050610be08184611b27565b600754909350610bf9906001600160a01b031682611860565b600654610c0f906001600160a01b031684611860565b50506000600c5550506010805460ff19169055565b610c2c61162a565b801515601060019054906101000a900460ff16151503610c825760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161081d565b601080548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061092a90831515815260200190565b610cd361162a565b60065460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610d24576040519150601f19603f3d011682016040523d82523d6000602084013e610d29565b606091505b5050905080610d6c5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081d565b60065460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611c5b8339815191529060a0015b60405180910390a15050565b610df261162a565b306001600160a01b03831603610e695760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161081d565b60065460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190611b86565b905080610f235760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081d565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b60808201526020810184905290517fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b59181900360a00190a1505050565b610fa661162a565b6001600160a01b038116600081815260036020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611c5b8339815191529060a00161092a565b61103c61162a565b6001600160a01b0381166110a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081d565b6110aa81611684565b50565b6110b561162a565b6001600160a01b0381166111045760405162461bcd60e51b8152602060048201526016602482015275736574526576656e756557616c6c65743a205a45524f60501b604482015260640161081d565b600780546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865205261726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611c5b8339815191529060a00161092a565b6001600160a01b0383166111e75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081d565b6001600160a01b0382166112485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661130e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161081d565b6001600160a01b0382166113705760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161081d565b600081116113d25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081d565b6001600160a01b0383166000908152600160205260409020548111156114495760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161081d565b30600090815260016020526040812054600e546010549192908310159160ff161580156114a857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156114b15750815b80156114c45750601054610100900460ff165b156114d1576114d1610b5d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614801561152b57506001600160a01b03861660009081526003602052604090205460ff16155b1561154d576064846009546115409190611b4d565b61154a9190611b64565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b03161480156115a757506001600160a01b03851660009081526003602052604090205460ff16155b156115c9576064846008546115bc9190611b4d565b6115c69190611b64565b90505b6115d38185611b27565b93508015611617576115e6863083611907565b80600c60008282546115f89190611b3a565b9250508190555080600d60008282546116119190611b3a565b90915550505b611622868686611907565b505050505050565b6000546001600160a01b03163314610b175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061170957611709611ba3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061175d5761175d611ba3565b60200260200101906001600160a01b031690816001600160a01b0316815250506117a8307f000000000000000000000000000000000000000000000000000000000000000084611185565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906117fd908590600090869030904290600401611bfd565b600060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610dde929190611c39565b8060000361186c575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b50509050806119025760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161081d565b505050565b6001600160a01b0383166000908152600160205260408120805483929061192f908490611b27565b90915550506001600160a01b0382166000908152600160205260408120805483929061195c908490611b3a565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161129d91815260200190565b600060208083528351808285015260005b818110156119d5578581018301518582016040015282016119b9565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611a0d57600080fd5b919050565b60008060408385031215611a2557600080fd5b611a2e836119f6565b946020939093013593505050565b600080600060608486031215611a5157600080fd5b611a5a846119f6565b9250611a68602085016119f6565b9150604084013590509250925092565b600060208284031215611a8a57600080fd5b611a93826119f6565b9392505050565b600060208284031215611aac57600080fd5b5035919050565b80151581146110aa57600080fd5b600060208284031215611ad357600080fd5b8135611a9381611ab3565b60008060408385031215611af157600080fd5b611afa836119f6565b9150611b08602084016119f6565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561079657610796611b11565b8082018082111561079657610796611b11565b808202811582820484141761079657610796611b11565b600082611b8157634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b9857600080fd5b8151611a9381611ab3565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611bf25781516001600160a01b031687529582019590820190600101611bcd565b509495945050505050565b85815284602082015260a060408201526000611c1c60a0830186611bb9565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611c526040830184611bb9565b94935050505056fe025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220c262752b6421380ff774b0f0b79094dfab91819af1605b5f8a144ec72f9b33df64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102345760003560e01c80635eaa82471161012e578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e146106bf578063e6be4a7214610705578063ea2f0b3714610725578063f2fde38b14610745578063fb235f341461076557600080fd5b8063a9059cbb1461063f578063b29ad50a1461065f578063c49b9a8014610674578063ce831ed514610694578063d2d7ad83146106a957600080fd5b806375f0a874116100f257806375f0a8741461059c57806385141a77146105bc5780638da5cb5b146105d257806395d89b41146105f0578063a457c2d71461061f57600080fd5b80635eaa82471461050f5780636b67c4df146105255780636ca60bc61461053b57806370a0823114610551578063715018a61461058757600080fd5b806339509351116101bc5780634706240211610180578063470624021461044d57806349bd5a5e146104635780634a74bb02146104975780635342acb4146104b65780635d098b38146104ef57600080fd5b806339509351146103b557806340763503146103d5578063437823ec146103eb578063444784251461040d578063461d94761461042d57600080fd5b8063220f669611610203578063220f66961461032857806323b872dd146103425780632b14ca5614610362578063313ce5671461037857806336e4ec641461039f57600080fd5b806306fdde0314610240578063095ea7b31461028d5780631694505e146102bd57806318160ddd1461030957600080fd5b3661023b57005b600080fd5b34801561024c57600080fd5b506102776040518060400160405280600b81526020016a5265736973746f7220414960a81b81525081565b60405161028491906119a8565b60405180910390f35b34801561029957600080fd5b506102ad6102a8366004611a12565b610785565b6040519015158152602001610284565b3480156102c957600080fd5b506102f17f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b039091168152602001610284565b34801561031557600080fd5b506004545b604051908152602001610284565b34801561033457600080fd5b506010546102ad9060ff1681565b34801561034e57600080fd5b506102ad61035d366004611a3c565b61079c565b34801561036e57600080fd5b5061031a60095481565b34801561038457600080fd5b5061038d601281565b60405160ff9091168152602001610284565b3480156103ab57600080fd5b5061031a600a5481565b3480156103c157600080fd5b506102ad6103d0366004611a12565b610850565b3480156103e157600080fd5b5061031a600d5481565b3480156103f757600080fd5b5061040b610406366004611a78565b610887565b005b34801561041957600080fd5b506007546102f1906001600160a01b031681565b34801561043957600080fd5b5061040b610448366004611a9a565b610935565b34801561045957600080fd5b5061031a60085481565b34801561046f57600080fd5b506102f17f00000000000000000000000094749e8ae30bc2aa5e127f868409e871f310c10b81565b3480156104a357600080fd5b506010546102ad90610100900460ff1681565b3480156104c257600080fd5b506102ad6104d1366004611a78565b6001600160a01b031660009081526003602052604090205460ff1690565b3480156104fb57600080fd5b5061040b61050a366004611a78565b610a26565b34801561051b57600080fd5b5061031a600f5481565b34801561053157600080fd5b5061031a600b5481565b34801561054757600080fd5b5061031a600c5481565b34801561055d57600080fd5b5061031a61056c366004611a78565b6001600160a01b031660009081526001602052604090205490565b34801561059357600080fd5b5061040b610b05565b3480156105a857600080fd5b506006546102f1906001600160a01b031681565b3480156105c857600080fd5b506102f161dead81565b3480156105de57600080fd5b506000546001600160a01b03166102f1565b3480156105fc57600080fd5b50610277604051806040016040528060038152602001622a27a960e91b81525081565b34801561062b57600080fd5b506102ad61063a366004611a12565b610b19565b34801561064b57600080fd5b506102ad61065a366004611a12565b610b50565b34801561066b57600080fd5b5061040b610b5d565b34801561068057600080fd5b5061040b61068f366004611ac1565b610c24565b3480156106a057600080fd5b5061040b610ccb565b3480156106b557600080fd5b5061031a600e5481565b3480156106cb57600080fd5b5061031a6106da366004611ade565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b34801561071157600080fd5b5061040b610720366004611a12565b610dea565b34801561073157600080fd5b5061040b610740366004611a78565b610f9e565b34801561075157600080fd5b5061040b610760366004611a78565b611034565b34801561077157600080fd5b5061040b610780366004611a78565b6110ad565b6000610792338484611185565b5060015b92915050565b6001600160a01b0383166000908152600260209081526040808320338452909152812054828110156108265760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6108318585856112aa565b61084585336108408685611b27565b611185565b506001949350505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610792918590610840908690611b3a565b61088f61162a565b6001600160a01b03811660009081526003602052604090819020805460ff1916600117905551600080516020611c5b8339815191529061092a9083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b60405180910390a150565b61093d61162a565b68056bc75e2d631000008110156109a65760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b606482015260840161081d565b600e81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b6080820152602081018290527fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b59060a00161092a565b610a2e61162a565b6001600160a01b038116610a845760405162461bcd60e51b815260206004820152601860248201527f7365744d61726b6574696e6757616c6c65743a205a45524f0000000000000000604482015260640161081d565b600680546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611c5b8339815191529060a00161092a565b610b0d61162a565b610b176000611684565b565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610792918590610840908690611b27565b60006107923384846112aa565b6010805460ff191660011790556000610b8b306001600160a01b031660009081526001602052604090205490565b9050610b96816116d4565b600b54600a544791600091610bab9190611b3a565b905080600003610bb9575060015b600081600a5484610bca9190611b4d565b610bd49190611b64565b9050610be08184611b27565b600754909350610bf9906001600160a01b031682611860565b600654610c0f906001600160a01b031684611860565b50506000600c5550506010805460ff19169055565b610c2c61162a565b801515601060019054906101000a900460ff16151503610c825760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b604482015260640161081d565b601080548215156101000261ff00199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061092a90831515815260200190565b610cd361162a565b60065460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610d24576040519150601f19603f3d011682016040523d82523d6000602084013e610d29565b606091505b5050905080610d6c5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081d565b60065460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611c5b8339815191529060a0015b60405180910390a15050565b610df261162a565b306001600160a01b03831603610e695760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b606482015260840161081d565b60065460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015610ebe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee29190611b86565b905080610f235760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015260640161081d565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b60808201526020810184905290517fdd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b59181900360a00190a1505050565b610fa661162a565b6001600160a01b038116600081815260036020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611c5b8339815191529060a00161092a565b61103c61162a565b6001600160a01b0381166110a15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161081d565b6110aa81611684565b50565b6110b561162a565b6001600160a01b0381166111045760405162461bcd60e51b8152602060048201526016602482015275736574526576656e756557616c6c65743a205a45524f60501b604482015260640161081d565b600780546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865205261726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611c5b8339815191529060a00161092a565b6001600160a01b0383166111e75760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161081d565b6001600160a01b0382166112485760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161081d565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661130e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161081d565b6001600160a01b0382166113705760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161081d565b600081116113d25760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161081d565b6001600160a01b0383166000908152600160205260409020548111156114495760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161081d565b30600090815260016020526040812054600e546010549192908310159160ff161580156114a857507f00000000000000000000000094749e8ae30bc2aa5e127f868409e871f310c10b6001600160a01b0316866001600160a01b031614155b80156114b15750815b80156114c45750601054610100900460ff165b156114d1576114d1610b5d565b7f00000000000000000000000094749e8ae30bc2aa5e127f868409e871f310c10b6001600160a01b0316856001600160a01b031614801561152b57506001600160a01b03861660009081526003602052604090205460ff16155b1561154d576064846009546115409190611b4d565b61154a9190611b64565b90505b7f00000000000000000000000094749e8ae30bc2aa5e127f868409e871f310c10b6001600160a01b0316866001600160a01b03161480156115a757506001600160a01b03851660009081526003602052604090205460ff16155b156115c9576064846008546115bc9190611b4d565b6115c69190611b64565b90505b6115d38185611b27565b93508015611617576115e6863083611907565b80600c60008282546115f89190611b3a565b9250508190555080600d60008282546116119190611b3a565b90915550505b611622868686611907565b505050505050565b6000546001600160a01b03163314610b175760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161081d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061170957611709611ba3565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061175d5761175d611ba3565b60200260200101906001600160a01b031690816001600160a01b0316815250506117a8307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611185565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906117fd908590600090869030904290600401611bfd565b600060405180830381600087803b15801561181757600080fd5b505af115801561182b573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051610dde929190611c39565b8060000361186c575050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118b9576040519150601f19603f3d011682016040523d82523d6000602084013e6118be565b606091505b50509050806119025760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b604482015260640161081d565b505050565b6001600160a01b0383166000908152600160205260408120805483929061192f908490611b27565b90915550506001600160a01b0382166000908152600160205260408120805483929061195c908490611b3a565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161129d91815260200190565b600060208083528351808285015260005b818110156119d5578581018301518582016040015282016119b9565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611a0d57600080fd5b919050565b60008060408385031215611a2557600080fd5b611a2e836119f6565b946020939093013593505050565b600080600060608486031215611a5157600080fd5b611a5a846119f6565b9250611a68602085016119f6565b9150604084013590509250925092565b600060208284031215611a8a57600080fd5b611a93826119f6565b9392505050565b600060208284031215611aac57600080fd5b5035919050565b80151581146110aa57600080fd5b600060208284031215611ad357600080fd5b8135611a9381611ab3565b60008060408385031215611af157600080fd5b611afa836119f6565b9150611b08602084016119f6565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561079657610796611b11565b8082018082111561079657610796611b11565b808202811582820484141761079657610796611b11565b600082611b8157634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b9857600080fd5b8151611a9381611ab3565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611bf25781516001600160a01b031687529582019590820190600101611bcd565b509495945050505050565b85815284602082015260a060408201526000611c1c60a0830186611bb9565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611c526040830184611bb9565b94935050505056fe025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a2646970667358221220c262752b6421380ff774b0f0b79094dfab91819af1605b5f8a144ec72f9b33df64736f6c63430008130033

Deployed Bytecode Sourcemap

23036:12944:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23924:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23924:43:0;;;;;;;;;;;;:::i;:::-;;;;;;;;26811:186;;;;;;;;;;-1:-1:-1;26811:186:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;26811:186:0;1004:187:1;24908:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1387:32:1;;;1369:51;;1357:2;1342:18;24908:51:0;1196:230:1;26081:95:0;;;;;;;;;;-1:-1:-1;26161:7:0;;26081:95;;;1577:25:1;;;1565:2;1550:18;26081:95:0;1431:177:1;25098:28:0;;;;;;;;;;-1:-1:-1;25098:28:0;;;;;;;;27042:478;;;;;;;;;;-1:-1:-1;27042:478:0;;;;;:::i;:::-;;:::i;24516:26::-;;;;;;;;;;;;;;;;24018:35;;;;;;;;;;;;24051:2;24018:35;;;;;2118:4:1;2106:17;;;2088:36;;2076:2;2061:18;24018:35:0;1946:184:1;24549:26:0;;;;;;;;;;;;;;;;27570:290;;;;;;;;;;-1:-1:-1;27570:290:0;;;;;:::i;:::-;;:::i;24671:48::-;;;;;;;;;;;;;;;;32007:233;;;;;;;;;;-1:-1:-1;32007:233:0;;;;;:::i;:::-;;:::i;:::-;;24220:99;;;;;;;;;;-1:-1:-1;24220:99:0;;;;-1:-1:-1;;;;;24220:99:0;;;32562:428;;;;;;;;;;-1:-1:-1;32562:428:0;;;;;:::i;:::-;;:::i;24485:22::-;;;;;;;;;;;;;;;;24966:38;;;;;;;;;;;;;;;25133:40;;;;;;;;;;-1:-1:-1;25133:40:0;;;;;;;;;;;31793:126;;;;;;;;;;-1:-1:-1;31793:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;31884:27:0;31860:4;31884:27;;;:18;:27;;;;;;;;;31793:126;33288:294;;;;;;;;;;-1:-1:-1;33288:294:0;;;;;:::i;:::-;;:::i;24834:29::-;;;;;;;;;;;;;;;;24582:28;;;;;;;;;;;;;;;;24619:43;;;;;;;;;;;;;;;;26184:117;;;;;;;;;;-1:-1:-1;26184:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;26277:16:0;26250:7;26277:16;;;:7;:16;;;;;;;26184:117;13156:103;;;;;;;;;;;;;:::i;24112:101::-;;;;;;;;;;-1:-1:-1;24112:101:0;;;;-1:-1:-1;;;;;24112:101:0;;;24363:88;;;;;;;;;;;;24409:42;24363:88;;12508:87;;;;;;;;;;-1:-1:-1;12554:7:0;12581:6;-1:-1:-1;;;;;12581:6:0;12508:87;;23974:37;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23974:37:0;;;;;27910:300;;;;;;;;;;-1:-1:-1;27910:300:0;;;;;:::i;:::-;;:::i;26351:192::-;;;;;;;;;;-1:-1:-1;26351:192:0;;;;;:::i;:::-;;:::i;30184:566::-;;;;;;;;;;;;;:::i;32998:247::-;;;;;;;;;;-1:-1:-1;32998:247:0;;;;;:::i;:::-;;:::i;35076:359::-;;;;;;;;;;;;;:::i;24728:53::-;;;;;;;;;;;;;;;;26593:170;;;;;;;;;;-1:-1:-1;26593:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;26727:19:0;;;26700:7;26727:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;26593:170;35512:465;;;;;;;;;;-1:-1:-1;35512:465:0;;;;;:::i;:::-;;:::i;32284:233::-;;;;;;;;;;-1:-1:-1;32284:233:0;;;;;:::i;:::-;;:::i;13414:238::-;;;;;;;;;;-1:-1:-1;13414:238:0;;;;;:::i;:::-;;:::i;33620:280::-;;;;;;;;;;-1:-1:-1;33620:280:0;;;;;:::i;:::-;;:::i;26811:186::-;26911:4;26928:39;319:10;26951:7;26960:6;26928:8;:39::i;:::-;-1:-1:-1;26985:4:0;26811:186;;;;;:::o;27042:478::-;-1:-1:-1;;;;;27215:19:0;;27174:4;27215:19;;;:11;:19;;;;;;;;319:10;27215:33;;;;;;;;27281:26;;;;27259:116;;;;-1:-1:-1;;;27259:116:0;;3779:2:1;27259:116:0;;;3761:21:1;3818:2;3798:18;;;3791:30;3857:34;3837:18;;;3830:62;-1:-1:-1;;;3908:18:1;;;3901:38;3956:19;;27259:116:0;;;;;;;;;27386:36;27396:6;27404:9;27415:6;27386:9;:36::i;:::-;27433:57;27442:6;319:10;27464:25;27483:6;27464:16;:25;:::i;:::-;27433:8;:57::i;:::-;-1:-1:-1;27508:4:0;;27042:478;-1:-1:-1;;;;27042:478:0:o;27570:290::-;319:10;27683:4;27772:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;27772:34:0;;;;;;;;;;27683:4;;27700:130;;27750:7;;27772:47;;27809:10;;27772:47;:::i;32007:233::-;12394:13;:11;:13::i;:::-;-1:-1:-1;;;;;32078:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;32078:34:0::1;32108:4;32078:34;::::0;;32128:104;-1:-1:-1;;;;;;;;;;;32128:104:0;::::1;::::0;32097:7;;4611:2:1;4593:21;;;4650:2;4630:18;;;4623:30;4689:34;4684:2;4669:18;;4662:62;-1:-1:-1;;;4755:3:1;4740:19;;4733:45;-1:-1:-1;;;;;4852:32:1;;;;4845:4;4830:20;;4823:62;4810:3;4795:19;;4381:510;32128:104:0::1;;;;;;;;32007:233:::0;:::o;32562:428::-;12394:13;:11;:13::i;:::-;32717:9:::1;32689:24;:37;;32667:126;;;::::0;-1:-1:-1;;;32667:126:0;;5098:2:1;32667:126:0::1;::::0;::::1;5080:21:1::0;5137:2;5117:18;;;5110:30;5176:34;5156:18;;;5149:62;-1:-1:-1;;;5227:18:1;;;5220:37;5274:19;;32667:126:0::1;4896:403:1::0;32667:126:0::1;32804:23;:50:::0;;;32870:112:::1;::::0;;5516:21:1;;;5573:2;5553:18;;;5546:30;;;;5612:34;5607:2;5592:18;;5585:62;-1:-1:-1;;;5678:3:1;5663:19;;5656:42;5765:4;5750:20;;5743:36;;;32870:112:0::1;::::0;5730:3:1;5715:19;32870:112:0::1;5304:481:1::0;33288:294:0;12394:13;:11;:13::i;:::-;-1:-1:-1;;;;;33380:30:0;::::1;33372:67;;;::::0;-1:-1:-1;;;33372:67:0;;5992:2:1;33372:67:0::1;::::0;::::1;5974:21:1::0;6031:2;6011:18;;;6004:30;6070:26;6050:18;;;6043:54;6114:18;;33372:67:0::1;5790:348:1::0;33372:67:0::1;33450:15;:43:::0;;-1:-1:-1;;;;;;33450:43:0::1;-1:-1:-1::0;;;;;33450:43:0;::::1;::::0;;::::1;::::0;;;33509:65:::1;::::0;;6363:21:1;;;6420:2;6400:18;;;6393:30;;;;6459:34;6454:2;6439:18;;6432:62;-1:-1:-1;;;6525:3:1;6510:19;;6503:35;6605:4;6590:20;;6583:62;;;;-1:-1:-1;;;;;;;;;;;33509:65:0;6570:3:1;6555:19;33509:65:0::1;6143:508:1::0;13156:103:0;12394:13;:11;:13::i;:::-;13221:30:::1;13248:1;13221:18;:30::i;:::-;13156:103::o:0;27910:300::-;319:10;28028:4;28117:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28117:34:0;;;;;;;;;;28028:4;;28045:135;;28095:7;;28117:52;;28154:15;;28117:52;:::i;26351:192::-;26454:4;26471:42;319:10;26495:9;26506:6;26471:9;:42::i;30184:566::-;25216:16;:23;;-1:-1:-1;;25216:23:0;25235:4;25216:23;;;:16;30262:24:::1;30280:4;-1:-1:-1::0;;;;;26277:16:0;26250:7;26277:16;;;:7;:16;;;;;;;26184:117;30262:24:::1;30240:46;;30297:29;30314:11;30297:16;:29::i;:::-;30417:12;::::0;30404:10:::1;::::0;30355:21:::1;::::0;30337:15:::1;::::0;30404:25:::1;::::0;30417:12;30404:25:::1;:::i;:::-;30387:42;;30444:9;30457:1;30444:14:::0;30440:33:::1;;-1:-1:-1::0;30472:1:0::1;30440:33;30484:18;30533:9;30519:10;;30506;:23;;;;:::i;:::-;30505:37;;;;:::i;:::-;30484:58:::0;-1:-1:-1;30553:27:0::1;30484:58:::0;30553:27;::::1;:::i;:::-;30612:13;::::0;30553:27;;-1:-1:-1;30591:50:0::1;::::0;-1:-1:-1;;;;;30612:13:0::1;30627::::0;30591:20:::1;:50::i;:::-;30673:15;::::0;30652:49:::1;::::0;-1:-1:-1;;;;;30673:15:0::1;30690:10:::0;30652:20:::1;:49::i;:::-;-1:-1:-1::0;;30741:1:0::1;30714:24;:28:::0;-1:-1:-1;;25262:16:0;:24;;-1:-1:-1;;25262:24:0;;;30184:566::o;32998:247::-;12394:13;:11;:13::i;:::-;33110:8:::1;33085:33;;:21;;;;;;;;;;;:33;;::::0;33077:63:::1;;;::::0;-1:-1:-1;;;33077:63:0;;7253:2:1;33077:63:0::1;::::0;::::1;7235:21:1::0;7292:2;7272:18;;;7265:30;-1:-1:-1;;;7311:18:1;;;7304:47;7368:18;;33077:63:0::1;7051:341:1::0;33077:63:0::1;33151:21;:32:::0;;;::::1;;;;-1:-1:-1::0;;33151:32:0;;::::1;;::::0;;33199:38:::1;::::0;::::1;::::0;::::1;::::0;33175:8;1169:14:1;1162:22;1144:41;;1132:2;1117:18;;1004:187;35076:359:0;12394:13;:11;:13::i;:::-;35214:15:::1;::::0;35206:52:::1;::::0;35158:21:::1;::::0;35140:15:::1;::::0;-1:-1:-1;;;;;35214:15:0;;::::1;::::0;35158:21;;35140:15;35206:52;35140:15;35206:52;35158:21;35214:15;35206:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35190:68;;;35277:4;35269:32;;;::::0;-1:-1:-1;;;35269:32:0;;7809:2:1;35269:32:0::1;::::0;::::1;7791:21:1::0;7848:2;7828:18;;;7821:30;-1:-1:-1;;;7867:18:1;;;7860:45;7922:18;;35269:32:0::1;7607:339:1::0;35269:32:0::1;35401:15;::::0;35317:110:::1;::::0;;8171:21:1;;;8228:2;8208:18;;;8201:30;;;;8267:34;8262:2;8247:18;;8240:62;-1:-1:-1;;;8333:3:1;8318:19;;8311:43;-1:-1:-1;;;;;35401:15:0;;::::1;8421:4:1::0;8406:20;;8399:62;-1:-1:-1;;;;;;;;;;;35317:110:0;8386:3:1;8371:19;35317:110:0::1;;;;;;;;35129:306;;35076:359::o:0;35512:465::-;12394:13;:11;:13::i;:::-;35689:4:::1;-1:-1:-1::0;;;;;35664:30:0;::::1;::::0;35642:134:::1;;;::::0;-1:-1:-1;;;35642:134:0;;8674:2:1;35642:134:0::1;::::0;::::1;8656:21:1::0;8713:2;8693:18;;;8686:30;8752:34;8732:18;;;8725:62;-1:-1:-1;;;8803:18:1;;;8796:52;8865:19;;35642:134:0::1;8472:418:1::0;35642:134:0::1;35830:15;::::0;35799:56:::1;::::0;-1:-1:-1;;;35799:56:0;;-1:-1:-1;;;;;35830:15:0;;::::1;35799:56;::::0;::::1;9077:51:1::0;9144:18;;;9137:34;;;35787:9:0::1;::::0;35799:30;::::1;::::0;::::1;::::0;9050:18:1;;35799:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35787:68;;35874:4;35866:32;;;::::0;-1:-1:-1;;;35866:32:0;;7809:2:1;35866:32:0::1;::::0;::::1;7791:21:1::0;7848:2;7828:18;;;7821:30;-1:-1:-1;;;7867:18:1;;;7860:45;7922:18;;35866:32:0::1;7607:339:1::0;35866:32:0::1;35914:55;::::0;;9644:21:1;;;9701:2;9681:18;;;9674:30;9740:34;9735:2;9720:18;;9713:62;-1:-1:-1;;;9806:3:1;9791:19;;9784:38;9889:4;9874:20;;9867:36;;;35914:55:0;;::::1;::::0;;;;9854:3:1;35914:55:0;;::::1;35631:346;35512:465:::0;;:::o;32284:233::-;12394:13;:11;:13::i;:::-;-1:-1:-1;;;;;32353:27:0;::::1;32383:5;32353:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;32353:35:0::1;::::0;;32404:105;;10126:21:1;;;10183:2;10163:18;;;10156:30;;;;10222:34;10217:2;10202:18;;10195:62;-1:-1:-1;;;10288:3:1;10273:19;;10266:46;10364:20;;10357:62;;;;-1:-1:-1;;;;;;;;;;;32404:105:0;10344:3:1;10329:19;32404:105:0::1;9914:511:1::0;13414:238:0;12394:13;:11;:13::i;:::-;-1:-1:-1;;;;;13517:22:0;::::1;13495:110;;;::::0;-1:-1:-1;;;13495:110:0;;10632:2:1;13495:110:0::1;::::0;::::1;10614:21:1::0;10671:2;10651:18;;;10644:30;10710:34;10690:18;;;10683:62;-1:-1:-1;;;10761:18:1;;;10754:36;10807:19;;13495:110:0::1;10430:402:1::0;13495:110:0::1;13616:28;13635:8;13616:18;:28::i;:::-;13414:238:::0;:::o;33620:280::-;12394:13;:11;:13::i;:::-;-1:-1:-1;;;;;33708:28:0;::::1;33700:63;;;::::0;-1:-1:-1;;;33700:63:0;;11039:2:1;33700:63:0::1;::::0;::::1;11021:21:1::0;11078:2;11058:18;;;11051:30;-1:-1:-1;;;11097:18:1;;;11090:52;11159:18;;33700:63:0::1;10837:346:1::0;33700:63:0::1;33774:13;:39:::0;;-1:-1:-1;;;;;;33774:39:0::1;-1:-1:-1::0;;;;;33774:39:0;::::1;::::0;;::::1;::::0;;;33829:63:::1;::::0;;11408:21:1;;;11465:2;11445:18;;;11438:30;;;;11504:34;11499:2;11484:18;;11477:62;-1:-1:-1;;;11570:3:1;11555:19;;11548:35;11650:4;11635:20;;11628:62;;;;-1:-1:-1;;;;;;;;;;;33829:63:0;11615:3:1;11600:19;33829:63:0::1;11188:508:1::0;28242:341:0;-1:-1:-1;;;;;28336:20:0;;28328:69;;;;-1:-1:-1;;;28328:69:0;;11903:2:1;28328:69:0;;;11885:21:1;11942:2;11922:18;;;11915:30;11981:34;11961:18;;;11954:62;-1:-1:-1;;;12032:18:1;;;12025:34;12076:19;;28328:69:0;11701:400:1;28328:69:0;-1:-1:-1;;;;;28416:21:0;;28408:68;;;;-1:-1:-1;;;28408:68:0;;12308:2:1;28408:68:0;;;12290:21:1;12347:2;12327:18;;;12320:30;12386:34;12366:18;;;12359:62;-1:-1:-1;;;12437:18:1;;;12430:32;12479:19;;28408:68:0;12106:398:1;28408:68:0;-1:-1:-1;;;;;28489:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;28542:33;;1577:25:1;;;28542:33:0;;1550:18:1;28542:33:0;;;;;;;;28242:341;;;:::o;28716:1460::-;-1:-1:-1;;;;;28804:18:0;;28796:68;;;;-1:-1:-1;;;28796:68:0;;12711:2:1;28796:68:0;;;12693:21:1;12750:2;12730:18;;;12723:30;12789:34;12769:18;;;12762:62;-1:-1:-1;;;12840:18:1;;;12833:35;12885:19;;28796:68:0;12509:401:1;28796:68:0;-1:-1:-1;;;;;28883:16:0;;28875:64;;;;-1:-1:-1;;;28875:64:0;;13117:2:1;28875:64:0;;;13099:21:1;13156:2;13136:18;;;13129:30;13195:34;13175:18;;;13168:62;-1:-1:-1;;;13246:18:1;;;13239:33;13289:19;;28875:64:0;12915:399:1;28875:64:0;28967:1;28958:6;:10;28950:64;;;;-1:-1:-1;;;28950:64:0;;13521:2:1;28950:64:0;;;13503:21:1;13560:2;13540:18;;;13533:30;13599:34;13579:18;;;13572:62;-1:-1:-1;;;13650:18:1;;;13643:39;13699:19;;28950:64:0;13319:405:1;28950:64:0;-1:-1:-1;;;;;29047:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;29047:23:0;29025:111;;;;-1:-1:-1;;;29025:111:0;;13931:2:1;29025:111:0;;;13913:21:1;13970:2;13950:18;;;13943:30;14009:34;13989:18;;;13982:62;-1:-1:-1;;;14060:18:1;;;14053:36;14106:19;;29025:111:0;13729:402:1;29025:111:0;29242:4;29193:28;26277:16;;;:7;:16;;;;;;29327:23;;29487:16;;26277;;29290:60;;;;;29487:16;;29486:17;:55;;;;;29528:13;-1:-1:-1;;;;;29520:21:0;:4;-1:-1:-1;;;;;29520:21:0;;;29486:55;:95;;;;;29558:23;29486:95;:133;;;;-1:-1:-1;29598:21:0;;;;;;;29486:133;29468:206;;;29646:16;:14;:16::i;:::-;29694:13;-1:-1:-1;;;;;29688:19:0;:2;-1:-1:-1;;;;;29688:19:0;;:48;;;;-1:-1:-1;;;;;;29712:24:0;;;;;;:18;:24;;;;;;;;29711:25;29688:48;29684:111;;;29780:3;29770:6;29760:7;;:16;;;;:::i;:::-;29759:24;;;;:::i;:::-;29753:30;;29684:111;29817:13;-1:-1:-1;;;;;29809:21:0;:4;-1:-1:-1;;;;;29809:21:0;;:48;;;;-1:-1:-1;;;;;;29835:22:0;;;;;;:18;:22;;;;;;;;29834:23;29809:48;29805:110;;;29900:3;29890:6;29881;;:15;;;;:::i;:::-;29880:23;;;;:::i;:::-;29874:29;;29805:110;29925:13;29935:3;29925:13;;:::i;:::-;;-1:-1:-1;29953:7:0;;29949:177;;29977:40;29992:4;30006;30013:3;29977:14;:40::i;:::-;30060:3;30032:24;;:31;;;;;;;:::i;:::-;;;;;;;;30111:3;30078:29;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;29949:177:0;30136:32;30151:4;30157:2;30161:6;30136:14;:32::i;:::-;28785:1391;;;28716:1460;;;:::o;12673:132::-;12554:7;12581:6;-1:-1:-1;;;;;12581:6:0;319:10;12737:23;12729:68;;;;-1:-1:-1;;;12729:68:0;;14338:2:1;12729:68:0;;;14320:21:1;;;14357:18;;;14350:30;14416:34;14396:18;;;14389:62;14468:18;;12729:68:0;14136:356:1;13812:191:0;13886:16;13905:6;;-1:-1:-1;;;;;13922:17:0;;;-1:-1:-1;;;;;;13922:17:0;;;;;;13955:40;;13905:6;;;;;;;13955:40;;13886:16;13955:40;13875:128;13812:191;:::o;30758:638::-;30908:16;;;30922:1;30908:16;;;;;;;;30884:21;;30908:16;;;;;;;;;;-1:-1:-1;30908:16:0;30884:40;;30953:4;30935;30940:1;30935:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;30935:23:0;;;-1:-1:-1;;;;;30935:23:0;;;;;30979:4;30969;30974:1;30969:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;30969:14:0;;;-1:-1:-1;;;;;30969:14:0;;;;;30994:62;31011:4;31026:15;31044:11;30994:8;:62::i;:::-;31095:240;;-1:-1:-1;;;31095:240:0;;-1:-1:-1;;;;;31095:15:0;:66;;;;:240;;31176:11;;31202:1;;31246:4;;31273;;31309:15;;31095:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31353:35;31370:11;31383:4;31353:35;;;;;;;:::i;33912:252::-;34033:6;34043:1;34033:11;34029:24;;33912:252;;:::o;34029:24::-;34064:9;34079;-1:-1:-1;;;;;34079:14:0;34101:6;34079:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34063:49;;;34131:4;34123:33;;;;-1:-1:-1;;;34123:33:0;;16353:2:1;34123:33:0;;;16335:21:1;16392:2;16372:18;;;16365:30;-1:-1:-1;;;16411:18:1;;;16404:46;16467:18;;34123:33:0;16151:340:1;34123:33:0;34018:146;33912:252;;:::o;31532:253::-;-1:-1:-1;;;;;31660:15:0;;;;;;:7;:15;;;;;:25;;31679:6;;31660:15;:25;;31679:6;;31660:25;:::i;:::-;;;;-1:-1:-1;;;;;;;31696:18:0;;;;;;:7;:18;;;;;:28;;31718:6;;31696:18;:28;;31718:6;;31696:28;:::i;:::-;;;;;;;;31759:9;-1:-1:-1;;;;;31742:35:0;31751:6;-1:-1:-1;;;;;31742:35:0;;31770:6;31742:35;;;;1577:25:1;;1565:2;1550:18;;1431:177;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1613:328::-;1690:6;1698;1706;1759:2;1747:9;1738:7;1734:23;1730:32;1727:52;;;1775:1;1772;1765:12;1727:52;1798:29;1817:9;1798:29;:::i;:::-;1788:39;;1846:38;1880:2;1869:9;1865:18;1846:38;:::i;:::-;1836:48;;1931:2;1920:9;1916:18;1903:32;1893:42;;1613:328;;;;;:::o;2135:186::-;2194:6;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2135:186;-1:-1:-1;;;2135:186:1:o;2550:180::-;2609:6;2662:2;2650:9;2641:7;2637:23;2633:32;2630:52;;;2678:1;2675;2668:12;2630:52;-1:-1:-1;2701:23:1;;2550:180;-1:-1:-1;2550:180:1:o;2943:118::-;3029:5;3022:13;3015:21;3008:5;3005:32;2995:60;;3051:1;3048;3041:12;3066:241;3122:6;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3230:9;3217:23;3249:28;3271:5;3249:28;:::i;3312:260::-;3380:6;3388;3441:2;3429:9;3420:7;3416:23;3412:32;3409:52;;;3457:1;3454;3447:12;3409:52;3480:29;3499:9;3480:29;:::i;:::-;3470:39;;3528:38;3562:2;3551:9;3547:18;3528:38;:::i;:::-;3518:48;;3312:260;;;;;:::o;3986:127::-;4047:10;4042:3;4038:20;4035:1;4028:31;4078:4;4075:1;4068:15;4102:4;4099:1;4092:15;4118:128;4185:9;;;4206:11;;;4203:37;;;4220:18;;:::i;4251:125::-;4316:9;;;4337:10;;;4334:36;;;4350:18;;:::i;6656:168::-;6729:9;;;6760;;6777:15;;;6771:22;;6757:37;6747:71;;6798:18;;:::i;6829:217::-;6869:1;6895;6885:132;;6939:10;6934:3;6930:20;6927:1;6920:31;6974:4;6971:1;6964:15;7002:4;6999:1;6992:15;6885:132;-1:-1:-1;7031:9:1;;6829:217::o;9182:245::-;9249:6;9302:2;9290:9;9281:7;9277:23;9273:32;9270:52;;;9318:1;9315;9308:12;9270:52;9350:9;9344:16;9369:28;9391:5;9369:28;:::i;14629:127::-;14690:10;14685:3;14681:20;14678:1;14671:31;14721:4;14718:1;14711:15;14745:4;14742:1;14735:15;14761:461;14814:3;14852:5;14846:12;14879:6;14874:3;14867:19;14905:4;14934:2;14929:3;14925:12;14918:19;;14971:2;14964:5;14960:14;14992:1;15002:195;15016:6;15013:1;15010:13;15002:195;;;15081:13;;-1:-1:-1;;;;;15077:39:1;15065:52;;15137:12;;;;15172:15;;;;15113:1;15031:9;15002:195;;;-1:-1:-1;15213:3:1;;14761:461;-1:-1:-1;;;;;14761:461:1:o;15227:582::-;15526:6;15515:9;15508:25;15569:6;15564:2;15553:9;15549:18;15542:34;15612:3;15607:2;15596:9;15592:18;15585:31;15489:4;15633:57;15685:3;15674:9;15670:19;15662:6;15633:57;:::i;:::-;-1:-1:-1;;;;;15726:32:1;;;;15721:2;15706:18;;15699:60;-1:-1:-1;15790:3:1;15775:19;15768:35;15625:65;15227:582;-1:-1:-1;;;15227:582:1:o;15814:332::-;16021:6;16010:9;16003:25;16064:2;16059;16048:9;16044:18;16037:30;15984:4;16084:56;16136:2;16125:9;16121:18;16113:6;16084:56;:::i;:::-;16076:64;15814:332;-1:-1:-1;;;;15814:332:1:o

Swarm Source

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