ETH Price: $2,523.59 (+2.83%)

Token

DuckyCoinAI (DuckyAI)
 

Overview

Max Total Supply

1,000,000,000 DuckyAI

Holders

48

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
86,512.501646841029664796 DuckyAI

Value
$0.00
0xd38de430d355a7a8337204c2a4c80392e61475a6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DuckyAI

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/*

 Contract Version 3.2
 sale fee 6%
 buy fee 0%
 transfer fee 0%
 owner can't stop trade.
 owner can't blacklist.
 there is no max limit or max tx in the contract.
 Automatic Swap Function Available, is not enable by default.

*/

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

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

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

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

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

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

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

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

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

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

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

contract DuckyAI is Context, IERC20, Ownable {
    using Address for address;
    //Contract Update Information
    string public constant contractVersion = "3.2";
    string public constant contractDev = "CFG";
    string public constant contractEdition = "SAFU";
    //Definition of Wallets for Marketing or team.
    address payable public marketingWallet =
        payable(0xaeFd3aCC5D81BDF5E13d654Ed9aCC0448e45E6F1);

    //Dead Wallet for SAFU Contract
    address public constant deadWallet =
        0x000000000000000000000000000000000000dEaD;
    //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 = "DuckyCoinAI";
    string public constant symbol = "DuckyAI";
    uint8 public constant decimals = 18;
    //Taxes Definition.
    uint public buyFee = 0;

    uint256 public sellFee = 6;

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

    uint256 public minimumTokensBeforeSwap = 100_000 ether;

    //Oracle Price Update, Manual Process.
    uint256 public swapOutput = 0;
        //Trading Controls added for SAFU Requirements
    bool public tradingEnabled;
    //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 = false;

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

    constructor() {
        _tOwned[_msgSender()] = _tTotal;
        address currentRouter;
        //Adding Variables for all the routers for easier deployment for our customers.
        if (block.chainid == 56) {
            currentRouter = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // PCS Router
        } else if (block.chainid == 97) {
            currentRouter = 0xD99D1c33F9fC3444f8101754aBC46c52416550D1; // PCS Testnet
        } else if (block.chainid == 43114) {
            currentRouter = 0x60aE616a2155Ee3d9A68541Ba4544862310933d4; //Avax Mainnet
        } else if (block.chainid == 137) {
            currentRouter = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; //Polygon Ropsten
        } else if (block.chainid == 6066) {
            currentRouter = 0x4169Db906fcBFB8b12DbD20d98850Aee05B7D889; //Tres Leches Chain
        } else if (block.chainid == 250) {
            currentRouter = 0xF491e7B69E4244ad4002BC14e878a34207E38c29; //SpookySwap FTM
        } else if (block.chainid == 42161) {
            currentRouter = 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506; //Arbitrum Sushi
        } else if (block.chainid == 1 || block.chainid == 5) {
            currentRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; //Mainnet
        } else {
            revert("You're not Blade");
        }

        //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"
        );
        require(tradingEnabled || _isExcludedFromFee[from] || _isExcludedFromFee[to], "Trading not yet enabled!");

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

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

        transferToAddressETH(marketingWallet, ethBalance);

        marketingTokensCollected = 0;
    }

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

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

        emit SwapTokensForETH(tokenAmount, path);
    }

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

        emit Transfer(sender, recipient, amount);
    }

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

    //exclude wallets from fees, this is needed for launch or other contracts.
    function excludeFromFee(address account) external onlyOwner {
        _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);
    }

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

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

    function transferToAddressETH(
        address payable recipient,
        uint256 amount
    ) private {
        (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);
    }
        //Trading Controls for SAFU Contract
        function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        emit AuditLog("We have Enable Trading:", msg.sender);
    }
    //Final Dev notes, this code has been tested and audited, last update to code was done to re-add swapandliquify function to the transfer as option, is recommended to be used manually instead of automatic.
}

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":"contractDev","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractEdition","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inSwapAndLiquify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingTokensCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETHfromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverTokensFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumTokensBeforeSwap","type":"uint256"}],"name":"setTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

60e0604052600180546001600160a01b03191673aefd3acc5d81bdf5e13d654ed9acc0448e45e6f11790556b033b2e3c9fd0803ce80000006005556000600781905560066008556009819055600a81905569152d02c7e14af6800000600b55600c55600d805462ff0000191690553480156200007a57600080fd5b5062000086336200043f565b6005543360009081526002602052604081209190915546603803620000c157507310ed43c718714eb63d5aa57b78b54704e256024e62000213565b46606103620000e6575073d99d1c33f9fc3444f8101754abc46c52416550d162000213565b4661a86a036200010c57507360ae616a2155ee3d9a68541ba4544862310933d462000213565b4660890362000131575073a5e0829caced8ffdd4de3c43696c57f7d7a678ff62000213565b466117b203620001575750734169db906fcbfb8b12dbd20d98850aee05b7d88962000213565b4660fa036200017c575073f491e7b69e4244ad4002bc14e878a34207e38c2962000213565b4661a4b103620001a25750731b02da8cb0d097eb8d57a175b88c7d8b4799750662000213565b4660011480620001b25750466005145b15620001d45750737a250d5630b4cf539739df2c5dacb4c659f2488d62000213565b60405162461bcd60e51b815260206004820152601060248201526f596f75277265206e6f7420426c61646560801b604482015260640160405180910390fd5b6000819050806001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000257573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027d91906200048f565b6001600160a01b031660c0816001600160a01b031681525050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fb91906200048f565b60c0516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156200034d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037391906200048f565b6001600160a01b0390811660a05281166080526001600460006200039f6000546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526004909252902080549091166001179055620003e73390565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6005546040516200042f91815260200190565b60405180910390a35050620004c1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620004a257600080fd5b81516001600160a01b0381168114620004ba57600080fd5b9392505050565b60805160a05160c051611ed16200051460003960006119380152600081816104b5015281816116d90152818161173a01526117b60152600081816103120152818161199001526119cc0152611ed16000f3fe6080604052600436106102555760003560e01c80636ca60bc611610139578063a0a8e460116100b6578063ce831ed51161007a578063ce831ed514610770578063d2d7ad8314610785578063dd62ed3e1461079b578063e6be4a72146107e1578063ea2f0b3714610801578063f2fde38b1461082157600080fd5b8063a0a8e460146106cc578063a457c2d7146106fb578063a9059cbb1461071b578063b29ad50a1461073b578063c49b9a801461075057600080fd5b806385141a77116100fd57806385141a77146106305780638a8c523c146106465780638b4cee081461065b5780638da5cb5b1461067b57806395d89b411461069957600080fd5b80636ca60bc61461058057806370a0823114610596578063715018a6146105cc57806375f0a874146105e15780637724bad81461060157600080fd5b806339509351116101d257806349bd5a5e1161019657806349bd5a5e146104a35780634a74bb02146104d75780634ada218b146104f75780635342acb4146105115780635d098b381461054a5780635eaa82471461056a57600080fd5b806339509351146104175780634076350314610437578063437823ec1461044d578063461d94761461046d578063470624021461048d57600080fd5b8063220f669611610219578063220f66961461036b57806323b872dd1461038a5780632a4a7ba8146103aa5780632b14ca56146103da578063313ce567146103f057600080fd5b806306fdde0314610261578063095ea7b3146102ae5780630cc835a3146102de5780631694505e1461030057806318160ddd1461034c57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b506102986040518060400160405280600b81526020016a4475636b79436f696e414960a81b81525081565b6040516102a59190611ba9565b60405180910390f35b3480156102ba57600080fd5b506102ce6102c9366004611c13565b610841565b60405190151581526020016102a5565b3480156102ea57600080fd5b506102fe6102f9366004611c3d565b610858565b005b34801561030c57600080fd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a5565b34801561035857600080fd5b506005545b6040519081526020016102a5565b34801561037757600080fd5b50600d546102ce90610100900460ff1681565b34801561039657600080fd5b506102ce6103a5366004611c56565b610917565b3480156103b657600080fd5b50610298604051806040016040528060048152602001635341465560e01b81525081565b3480156103e657600080fd5b5061035d60085481565b3480156103fc57600080fd5b50610405601281565b60405160ff90911681526020016102a5565b34801561042357600080fd5b506102ce610432366004611c13565b6109c6565b34801561044357600080fd5b5061035d600a5481565b34801561045957600080fd5b506102fe610468366004611c92565b6109fd565b34801561047957600080fd5b506102fe610488366004611c3d565b610aa0565b34801561049957600080fd5b5061035d60075481565b3480156104af57600080fd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e357600080fd5b50600d546102ce9062010000900460ff1681565b34801561050357600080fd5b50600d546102ce9060ff1681565b34801561051d57600080fd5b506102ce61052c366004611c92565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561055657600080fd5b506102fe610565366004611c92565b610b7f565b34801561057657600080fd5b5061035d600c5481565b34801561058c57600080fd5b5061035d60095481565b3480156105a257600080fd5b5061035d6105b1366004611c92565b6001600160a01b031660009081526002602052604090205490565b3480156105d857600080fd5b506102fe610c5e565b3480156105ed57600080fd5b50600154610334906001600160a01b031681565b34801561060d57600080fd5b506102986040518060400160405280600381526020016243464760e81b81525081565b34801561063c57600080fd5b5061033461dead81565b34801561065257600080fd5b506102fe610c72565b34801561066757600080fd5b506102fe610676366004611c3d565b610d30565b34801561068757600080fd5b506000546001600160a01b0316610334565b3480156106a557600080fd5b50610298604051806040016040528060078152602001664475636b79414960c81b81525081565b3480156106d857600080fd5b506102986040518060400160405280600381526020016219971960e91b81525081565b34801561070757600080fd5b506102ce610716366004611c13565b610de1565b34801561072757600080fd5b506102ce610736366004611c13565b610e18565b34801561074757600080fd5b506102fe610e25565b34801561075c57600080fd5b506102fe61076b366004611cc2565b610e7b565b34801561077c57600080fd5b506102fe610f24565b34801561079157600080fd5b5061035d600b5481565b3480156107a757600080fd5b5061035d6107b6366004611cdf565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107ed57600080fd5b506102fe6107fc366004611c13565b611043565b34801561080d57600080fd5b506102fe61081c366004611c92565b6111e5565b34801561082d57600080fd5b506102fe61083c366004611c92565b61127b565b600061084e3384846112f4565b5060015b92915050565b610860611419565b600a8111156108b65760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b600781905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611e5c833981519152906080015b60405180910390a150565b6001600160a01b03831660009081526003602090815260408083203384529091528120548281101561099c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ad565b6109a7858585611473565b6109bb85336109b68685611d28565b6112f4565b506001949350505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161084e9185906109b6908690611d3b565b610a05611419565b6001600160a01b03811660009081526004602052604090819020805460ff1916600117905551600080516020611e7c8339815191529061090c9083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610aa8611419565b68056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016108ad565b600b81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611e5c8339815191529060a00161090c565b610b87611419565b6001600160a01b038116610bdd5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f000000000000000060448201526064016108ad565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611e7c8339815191529060a00161090c565b610c66611419565b610c706000611891565b565b610c7a611419565b600d5460ff1615610ccd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108ad565b600d805460ff19166001179055604080518181526017818301527f5765206861766520456e61626c652054726164696e673a00000000000000000060608201523360208201529051600080516020611e7c833981519152916080908290030190a1565b610d38611419565b600a811115610d895760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016108ad565b60088190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611e5c8339815191529060800161090c565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161084e9185906109b6908690611d28565b600061084e338484611473565b600d805461ff001916610100179055306000908152600260205260408120549050610e4f816118e1565b6001544790610e67906001600160a01b031682611a6d565b50506000600955600d805461ff0019169055565b610e83611419565b801515600d60029054906101000a900460ff16151503610ed95760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016108ad565b600d8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061090c90831515815260200190565b610f2c611419565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f7d576040519150601f19603f3d011682016040523d82523d6000602084013e610f82565b606091505b5050905080610fc55760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ad565b60015460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611e7c8339815191529060a0015b60405180910390a15050565b61104b611419565b306001600160a01b038316036110c25760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016108ad565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190611d4e565b90508061117c5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ad565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b6080820152602081018490529051600080516020611e5c8339815191529181900360a00190a1505050565b6111ed611419565b6001600160a01b038116600081815260046020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611e7c8339815191529060a00161090c565b611283611419565b6001600160a01b0381166112e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ad565b6112f181611891565b50565b6001600160a01b0383166113565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ad565b6001600160a01b0382166113b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ad565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610c705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ad565b6001600160a01b0383166114d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ad565b6001600160a01b0382166115395760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ad565b6000811161159b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ad565b6001600160a01b0383166000908152600260205260409020548111156116125760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ad565b600d5460ff168061163b57506001600160a01b03831660009081526004602052604090205460ff165b8061165e57506001600160a01b03821660009081526004602052604090205460ff165b6116aa5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108ad565b30600090815260026020526040812054600b54600d5491929083101591610100900460ff1615801561170e57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614155b80156117175750815b801561172b5750600d5462010000900460ff165b1561173857611738610e25565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614801561179257506001600160a01b03861660009081526004602052604090205460ff16155b156117b4576064846008546117a79190611d6b565b6117b19190611d82565b90505b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614801561180e57506001600160a01b03851660009081526004602052604090205460ff16155b15611830576064846007546118239190611d6b565b61182d9190611d82565b90505b61183a8185611d28565b9350801561187e5761184d863083611b08565b806009600082825461185f9190611d3b565b9250508190555080600a60008282546118789190611d3b565b90915550505b611889868686611b08565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061191657611916611da4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061196a5761196a611da4565b60200260200101906001600160a01b031690816001600160a01b0316815250506119b5307f0000000000000000000000000000000000000000000000000000000000000000846112f4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac94790611a0a908590600090869030904290600401611dfe565b600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611037929190611e3a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611aba576040519150601f19603f3d011682016040523d82523d6000602084013e611abf565b606091505b5050905080611b035760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016108ad565b505050565b6001600160a01b03831660009081526002602052604081208054839290611b30908490611d28565b90915550506001600160a01b03821660009081526002602052604081208054839290611b5d908490611d3b565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161140c91815260200190565b600060208083528351808285015260005b81811015611bd657858101830151858201604001528201611bba565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611c0e57600080fd5b919050565b60008060408385031215611c2657600080fd5b611c2f83611bf7565b946020939093013593505050565b600060208284031215611c4f57600080fd5b5035919050565b600080600060608486031215611c6b57600080fd5b611c7484611bf7565b9250611c8260208501611bf7565b9150604084013590509250925092565b600060208284031215611ca457600080fd5b611cad82611bf7565b9392505050565b80151581146112f157600080fd5b600060208284031215611cd457600080fd5b8135611cad81611cb4565b60008060408385031215611cf257600080fd5b611cfb83611bf7565b9150611d0960208401611bf7565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561085257610852611d12565b8082018082111561085257610852611d12565b600060208284031215611d6057600080fd5b8151611cad81611cb4565b808202811582820484141761085257610852611d12565b600082611d9f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611df35781516001600160a01b031687529582019590820190600101611dce565b509495945050505050565b85815284602082015260a060408201526000611e1d60a0830186611dba565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611e536040830184611dba565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a26469706673582212208e9e0f94c6463b9f6a1634b1cff0f1438f7d229137ad0f6e3400fedec22bcb6e64736f6c63430008130033

Deployed Bytecode

0x6080604052600436106102555760003560e01c80636ca60bc611610139578063a0a8e460116100b6578063ce831ed51161007a578063ce831ed514610770578063d2d7ad8314610785578063dd62ed3e1461079b578063e6be4a72146107e1578063ea2f0b3714610801578063f2fde38b1461082157600080fd5b8063a0a8e460146106cc578063a457c2d7146106fb578063a9059cbb1461071b578063b29ad50a1461073b578063c49b9a801461075057600080fd5b806385141a77116100fd57806385141a77146106305780638a8c523c146106465780638b4cee081461065b5780638da5cb5b1461067b57806395d89b411461069957600080fd5b80636ca60bc61461058057806370a0823114610596578063715018a6146105cc57806375f0a874146105e15780637724bad81461060157600080fd5b806339509351116101d257806349bd5a5e1161019657806349bd5a5e146104a35780634a74bb02146104d75780634ada218b146104f75780635342acb4146105115780635d098b381461054a5780635eaa82471461056a57600080fd5b806339509351146104175780634076350314610437578063437823ec1461044d578063461d94761461046d578063470624021461048d57600080fd5b8063220f669611610219578063220f66961461036b57806323b872dd1461038a5780632a4a7ba8146103aa5780632b14ca56146103da578063313ce567146103f057600080fd5b806306fdde0314610261578063095ea7b3146102ae5780630cc835a3146102de5780631694505e1461030057806318160ddd1461034c57600080fd5b3661025c57005b600080fd5b34801561026d57600080fd5b506102986040518060400160405280600b81526020016a4475636b79436f696e414960a81b81525081565b6040516102a59190611ba9565b60405180910390f35b3480156102ba57600080fd5b506102ce6102c9366004611c13565b610841565b60405190151581526020016102a5565b3480156102ea57600080fd5b506102fe6102f9366004611c3d565b610858565b005b34801561030c57600080fd5b506103347f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016102a5565b34801561035857600080fd5b506005545b6040519081526020016102a5565b34801561037757600080fd5b50600d546102ce90610100900460ff1681565b34801561039657600080fd5b506102ce6103a5366004611c56565b610917565b3480156103b657600080fd5b50610298604051806040016040528060048152602001635341465560e01b81525081565b3480156103e657600080fd5b5061035d60085481565b3480156103fc57600080fd5b50610405601281565b60405160ff90911681526020016102a5565b34801561042357600080fd5b506102ce610432366004611c13565b6109c6565b34801561044357600080fd5b5061035d600a5481565b34801561045957600080fd5b506102fe610468366004611c92565b6109fd565b34801561047957600080fd5b506102fe610488366004611c3d565b610aa0565b34801561049957600080fd5b5061035d60075481565b3480156104af57600080fd5b506103347f000000000000000000000000907f830992385fde6b615b8540e8b85e6a6457d181565b3480156104e357600080fd5b50600d546102ce9062010000900460ff1681565b34801561050357600080fd5b50600d546102ce9060ff1681565b34801561051d57600080fd5b506102ce61052c366004611c92565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561055657600080fd5b506102fe610565366004611c92565b610b7f565b34801561057657600080fd5b5061035d600c5481565b34801561058c57600080fd5b5061035d60095481565b3480156105a257600080fd5b5061035d6105b1366004611c92565b6001600160a01b031660009081526002602052604090205490565b3480156105d857600080fd5b506102fe610c5e565b3480156105ed57600080fd5b50600154610334906001600160a01b031681565b34801561060d57600080fd5b506102986040518060400160405280600381526020016243464760e81b81525081565b34801561063c57600080fd5b5061033461dead81565b34801561065257600080fd5b506102fe610c72565b34801561066757600080fd5b506102fe610676366004611c3d565b610d30565b34801561068757600080fd5b506000546001600160a01b0316610334565b3480156106a557600080fd5b50610298604051806040016040528060078152602001664475636b79414960c81b81525081565b3480156106d857600080fd5b506102986040518060400160405280600381526020016219971960e91b81525081565b34801561070757600080fd5b506102ce610716366004611c13565b610de1565b34801561072757600080fd5b506102ce610736366004611c13565b610e18565b34801561074757600080fd5b506102fe610e25565b34801561075c57600080fd5b506102fe61076b366004611cc2565b610e7b565b34801561077c57600080fd5b506102fe610f24565b34801561079157600080fd5b5061035d600b5481565b3480156107a757600080fd5b5061035d6107b6366004611cdf565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b3480156107ed57600080fd5b506102fe6107fc366004611c13565b611043565b34801561080d57600080fd5b506102fe61081c366004611c92565b6111e5565b34801561082d57600080fd5b506102fe61083c366004611c92565b61127b565b600061084e3384846112f4565b5060015b92915050565b610860611419565b600a8111156108b65760405162461bcd60e51b815260206004820152601f60248201527f427579204665652063616e6e6f74206265206d6f7265207468616e203130250060448201526064015b60405180910390fd5b600781905560408051818152601f918101919091527f57652068617665207570646174656420746865206275792066656520746f3a00606082015260208101829052600080516020611e5c833981519152906080015b60405180910390a150565b6001600160a01b03831660009081526003602090815260408083203384529091528120548281101561099c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084016108ad565b6109a7858585611473565b6109bb85336109b68685611d28565b6112f4565b506001949350505050565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161084e9185906109b6908690611d3b565b610a05611419565b6001600160a01b03811660009081526004602052604090819020805460ff1916600117905551600080516020611e7c8339815191529061090c9083906040808252602e908201527f57652068617665206578636c756465642074686520666f6c6c6f77696e67207760608201526d30b63632b21034b7103332b2b99d60911b60808201526001600160a01b0391909116602082015260a00190565b610aa8611419565b68056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152602760248201527f596f75206e65656420746f20656e746572206d6f7265207468616e20313030206044820152663a37b5b2b7399760c91b60648201526084016108ad565b600b81905560408051818152602b918101919091527f576520686176652075706461746564206d696e696d756e546f6b656e7342656660608201526a37b932a9bbb0b8103a379d60a91b608082015260208101829052600080516020611e5c8339815191529060a00161090c565b610b87611419565b6001600160a01b038116610bdd5760405162461bcd60e51b815260206004820152601860248201527f7365746d61726b6574696e6757616c6c65743a205a45524f000000000000000060448201526064016108ad565b600180546001600160a01b0319166001600160a01b038316908117909155604080518181526024918101919091527f57652068617665205570646174656420746865204d61726b6574696e6757616c6060820152633632ba1d60e11b60808201526020810191909152600080516020611e7c8339815191529060a00161090c565b610c66611419565b610c706000611891565b565b610c7a611419565b600d5460ff1615610ccd5760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e000000000000000060448201526064016108ad565b600d805460ff19166001179055604080518181526017818301527f5765206861766520456e61626c652054726164696e673a00000000000000000060608201523360208201529051600080516020611e7c833981519152916080908290030190a1565b610d38611419565b600a811115610d895760405162461bcd60e51b815260206004820181905260248201527f53656c6c204665652063616e6e6f74206265206d6f7265207468616e2031302560448201526064016108ad565b60088190556040805181815260209181018290527f576520686176652075706461746564207468652073656c6c2066656520746f3a6060820152908101829052600080516020611e5c8339815191529060800161090c565b3360008181526003602090815260408083206001600160a01b0387168452909152812054909161084e9185906109b6908690611d28565b600061084e338484611473565b600d805461ff001916610100179055306000908152600260205260408120549050610e4f816118e1565b6001544790610e67906001600160a01b031682611a6d565b50506000600955600d805461ff0019169055565b610e83611419565b801515600d60029054906101000a900460ff16151503610ed95760405162461bcd60e51b815260206004820152601160248201527015985b1d5948185b1c9958591e481cd95d607a1b60448201526064016108ad565b600d8054821515620100000262ff0000199091161790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061090c90831515815260200190565b610f2c611419565b60015460405147916000916001600160a01b039091169083908381818185875af1925050503d8060008114610f7d576040519150601f19603f3d011682016040523d82523d6000602084013e610f82565b606091505b5050905080610fc55760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ad565b60015460408051818152602c918101919091527f57652068617665207265636f766572207468652073746f636b2065746820667260608201526b37b69031b7b73a3930b1ba1760a11b60808201526001600160a01b039091166020820152600080516020611e7c8339815191529060a0015b60405180910390a15050565b61104b611419565b306001600160a01b038316036110c25760405162461bcd60e51b815260206004820152603660248201527f4f776e65722063616e277420636c61696d20636f6e747261637427732062616c604482015275616e6365206f6620697473206f776e20746f6b656e7360501b60648201526084016108ad565b60015460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905260009184169063a9059cbb906044016020604051808303816000875af1158015611117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113b9190611d4e565b90508061117c5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b60448201526064016108ad565b604080518181526027818301527f57652068617665207265636f766572656420746f6b656e732066726f6d20636f606082015266373a3930b1ba1d60c91b6080820152602081018490529051600080516020611e5c8339815191529181900360a00190a1505050565b6111ed611419565b6001600160a01b038116600081815260046020908152604091829020805460ff191690558151828152602f928101929092527f5765206861766520696e636c7564696e672074686520666f6c6c6f77696e672060608301526e3bb0b63632b21034b7103332b2b99d60891b6080830152810191909152600080516020611e7c8339815191529060a00161090c565b611283611419565b6001600160a01b0381166112e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ad565b6112f181611891565b50565b6001600160a01b0383166113565760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108ad565b6001600160a01b0382166113b75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108ad565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000546001600160a01b03163314610c705760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ad565b6001600160a01b0383166114d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108ad565b6001600160a01b0382166115395760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108ad565b6000811161159b5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016108ad565b6001600160a01b0383166000908152600260205260409020548111156116125760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108ad565b600d5460ff168061163b57506001600160a01b03831660009081526004602052604090205460ff165b8061165e57506001600160a01b03821660009081526004602052604090205460ff165b6116aa5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c656421000000000000000060448201526064016108ad565b30600090815260026020526040812054600b54600d5491929083101591610100900460ff1615801561170e57507f000000000000000000000000907f830992385fde6b615b8540e8b85e6a6457d16001600160a01b0316866001600160a01b031614155b80156117175750815b801561172b5750600d5462010000900460ff165b1561173857611738610e25565b7f000000000000000000000000907f830992385fde6b615b8540e8b85e6a6457d16001600160a01b0316856001600160a01b031614801561179257506001600160a01b03861660009081526004602052604090205460ff16155b156117b4576064846008546117a79190611d6b565b6117b19190611d82565b90505b7f000000000000000000000000907f830992385fde6b615b8540e8b85e6a6457d16001600160a01b0316866001600160a01b031614801561180e57506001600160a01b03851660009081526004602052604090205460ff16155b15611830576064846007546118239190611d6b565b61182d9190611d82565b90505b61183a8185611d28565b9350801561187e5761184d863083611b08565b806009600082825461185f9190611d3b565b9250508190555080600a60008282546118789190611d3b565b90915550505b611889868686611b08565b505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061191657611916611da4565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061196a5761196a611da4565b60200260200101906001600160a01b031690816001600160a01b0316815250506119b5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846112f4565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac94790611a0a908590600090869030904290600401611dfe565b600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a78282604051611037929190611e3a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611aba576040519150601f19603f3d011682016040523d82523d6000602084013e611abf565b606091505b5050905080611b035760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016108ad565b505050565b6001600160a01b03831660009081526002602052604081208054839290611b30908490611d28565b90915550506001600160a01b03821660009081526002602052604081208054839290611b5d908490611d3b565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161140c91815260200190565b600060208083528351808285015260005b81811015611bd657858101830151858201604001528201611bba565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611c0e57600080fd5b919050565b60008060408385031215611c2657600080fd5b611c2f83611bf7565b946020939093013593505050565b600060208284031215611c4f57600080fd5b5035919050565b600080600060608486031215611c6b57600080fd5b611c7484611bf7565b9250611c8260208501611bf7565b9150604084013590509250925092565b600060208284031215611ca457600080fd5b611cad82611bf7565b9392505050565b80151581146112f157600080fd5b600060208284031215611cd457600080fd5b8135611cad81611cb4565b60008060408385031215611cf257600080fd5b611cfb83611bf7565b9150611d0960208401611bf7565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561085257610852611d12565b8082018082111561085257610852611d12565b600060208284031215611d6057600080fd5b8151611cad81611cb4565b808202811582820484141761085257610852611d12565b600082611d9f57634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015611df35781516001600160a01b031687529582019590820190600101611dce565b509495945050505050565b85815284602082015260a060408201526000611e1d60a0830186611dba565b6001600160a01b0394909416606083015250608001529392505050565b828152604060208201526000611e536040830184611dba565b94935050505056fedd970dd9b5bfe707922155b058a407655cb18288b807e2216442bca8ad83d6b5025dbd6ad989fe1a64db7dc049e29723ff9d35a97d84ae9aab96196f00ec1a00a26469706673582212208e9e0f94c6463b9f6a1634b1cff0f1438f7d229137ad0f6e3400fedec22bcb6e64736f6c63430008130033

Deployed Bytecode Sourcemap

23144:15033:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24521:43;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24521:43:0;;;;;;;;;;;;:::i;:::-;;;;;;;;28225:186;;;;;;;;;;-1:-1:-1;28225:186:0;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;28225:186:0;1004:187:1;35204:220:0;;;;;;;;;;-1:-1:-1;35204:220:0;;;;;:::i;:::-;;:::i;:::-;;25129:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1572:32:1;;;1554:51;;1542:2;1527:18;25129:51:0;1381:230:1;27495:95:0;;;;;;;;;;-1:-1:-1;27575:7:0;;27495:95;;;1762:25:1;;;1750:2;1735:18;27495:95:0;1616:177:1;25319:28:0;;;;;;;;;;-1:-1:-1;25319:28:0;;;;;;;;;;;28456:478;;;;;;;;;;-1:-1:-1;28456:478:0;;;;;:::i;:::-;;:::i;23365:47::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23365:47:0;;;;;24717:26;;;;;;;;;;;;;;;;24619:35;;;;;;;;;;;;24652:2;24619:35;;;;;2303:4:1;2291:17;;;2273:36;;2261:2;2246:18;24619:35:0;2131:184:1;28984:290:0;;;;;;;;;;-1:-1:-1;28984:290:0;;;;;:::i;:::-;;:::i;24802:48::-;;;;;;;;;;;;;;;;33621:233;;;;;;;;;;-1:-1:-1;33621:233:0;;;;;:::i;:::-;;:::i;34176:428::-;;;;;;;;;;-1:-1:-1;34176:428:0;;;;;:::i;:::-;;:::i;24686:22::-;;;;;;;;;;;;;;;;25187:38;;;;;;;;;;;;;;;25354:41;;;;;;;;;;-1:-1:-1;25354:41:0;;;;;;;;;;;25058:26;;;;;;;;;;-1:-1:-1;25058:26:0;;;;;;;;33407:126;;;;;;;;;;-1:-1:-1;33407:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;33498:27:0;33474:4;33498:27;;;:18;:27;;;;;;;;;33407:126;34902:294;;;;;;;;;;-1:-1:-1;34902:294:0;;;;;:::i;:::-;;:::i;24966:29::-;;;;;;;;;;;;;;;;24752:43;;;;;;;;;;;;;;;;27598:117;;;;;;;;;;-1:-1:-1;27598:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;27691:16:0;27664:7;27691:16;;;:7;:16;;;;;;;27598:117;13264:103;;;;;;;;;;;;;:::i;23471:101::-;;;;;;;;;;-1:-1:-1;23471:101:0;;;;-1:-1:-1;;;;;23471:101:0;;;23316:42;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23316:42:0;;;;;23618:88;;;;;;;;;;;;23664:42;23618:88;;37755:209;;;;;;;;;;;;;:::i;35432:228::-;;;;;;;;;;-1:-1:-1;35432:228:0;;;;;:::i;:::-;;:::i;12616:87::-;;;;;;;;;;-1:-1:-1;12662:7:0;12689:6;-1:-1:-1;;;;;12689:6:0;12616:87;;24571:41;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;24571:41:0;;;;;23263:46;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23263:46:0;;;;;29324:300;;;;;;;;;;-1:-1:-1;29324:300:0;;;;;:::i;:::-;;:::i;27765:192::-;;;;;;;;;;-1:-1:-1;27765:192:0;;;;;:::i;:::-;;:::i;31941:303::-;;;;;;;;;;;;;:::i;34612:247::-;;;;;;;;;;-1:-1:-1;34612:247:0;;;;;:::i;:::-;;:::i;36798:359::-;;;;;;;;;;;;;:::i;24859:54::-;;;;;;;;;;;;;;;;28007:170;;;;;;;;;;-1:-1:-1;28007:170:0;;;;;:::i;:::-;-1:-1:-1;;;;;28141:19:0;;;28114:7;28141:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;28007:170;37234:465;;;;;;;;;;-1:-1:-1;37234:465:0;;;;;:::i;:::-;;:::i;33898:233::-;;;;;;;;;;-1:-1:-1;33898:233:0;;;;;:::i;:::-;;:::i;13522:238::-;;;;;;;;;;-1:-1:-1;13522:238:0;;;;;:::i;:::-;;:::i;28225:186::-;28325:4;28342:39;427:10;28365:7;28374:6;28342:8;:39::i;:::-;-1:-1:-1;28399:4:0;28225:186;;;;;:::o;35204:220::-;12502:13;:11;:13::i;:::-;35289:2:::1;35278:7;:13;;35270:57;;;::::0;-1:-1:-1;;;35270:57:0;;3779:2:1;35270:57:0::1;::::0;::::1;3761:21:1::0;3818:2;3798:18;;;3791:30;3857:33;3837:18;;;3830:61;3908:18;;35270:57:0::1;;;;;;;;;35338:6;:16:::0;;;35370:46:::1;::::0;;4149:21:1;;;4206:2;4186:18;;;4179:30;;;;4245:33;4240:2;4225:18;;4218:61;4346:4;4331:20;;4324:36;;;-1:-1:-1;;;;;;;;;;;35370:46:0;4311:3:1;4296:19;35370:46:0::1;;;;;;;;35204:220:::0;:::o;28456:478::-;-1:-1:-1;;;;;28629:19:0;;28588:4;28629:19;;;:11;:19;;;;;;;;427:10;28629:33;;;;;;;;28695:26;;;;28673:116;;;;-1:-1:-1;;;28673:116:0;;4573:2:1;28673:116:0;;;4555:21:1;4612:2;4592:18;;;4585:30;4651:34;4631:18;;;4624:62;-1:-1:-1;;;4702:18:1;;;4695:38;4750:19;;28673:116:0;4371:404:1;28673:116:0;28800:36;28810:6;28818:9;28829:6;28800:9;:36::i;:::-;28847:57;28856:6;427:10;28878:25;28897:6;28878:16;:25;:::i;:::-;28847:8;:57::i;:::-;-1:-1:-1;28922:4:0;;28456:478;-1:-1:-1;;;;28456:478:0:o;28984:290::-;427:10;29097:4;29186:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29186:34:0;;;;;;;;;;29097:4;;29114:130;;29164:7;;29186:47;;29223:10;;29186:47;:::i;33621:233::-;12502:13;:11;:13::i;:::-;-1:-1:-1;;;;;33692:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;:34;;-1:-1:-1;;33692:34:0::1;33722:4;33692:34;::::0;;33742:104;-1:-1:-1;;;;;;;;;;;33742:104:0;::::1;::::0;33711:7;;5405:2:1;5387:21;;;5444:2;5424:18;;;5417:30;5483:34;5478:2;5463:18;;5456:62;-1:-1:-1;;;5549:3:1;5534:19;;5527:45;-1:-1:-1;;;;;5646:32:1;;;;5639:4;5624:20;;5617:62;5604:3;5589:19;;5175:510;34176:428:0;12502:13;:11;:13::i;:::-;34331:9:::1;34303:24;:37;;34281:126;;;::::0;-1:-1:-1;;;34281:126:0;;5892:2:1;34281:126:0::1;::::0;::::1;5874:21:1::0;5931:2;5911:18;;;5904:30;5970:34;5950:18;;;5943:62;-1:-1:-1;;;6021:18:1;;;6014:37;6068:19;;34281:126:0::1;5690:403:1::0;34281:126:0::1;34418:23;:50:::0;;;34484:112:::1;::::0;;6310:21:1;;;6367:2;6347:18;;;6340:30;;;;6406:34;6401:2;6386:18;;6379:62;-1:-1:-1;;;6472:3:1;6457:19;;6450:42;6559:4;6544:20;;6537:36;;;-1:-1:-1;;;;;;;;;;;34484:112:0;6524:3:1;6509:19;34484:112:0::1;6098:481:1::0;34902:294:0;12502:13;:11;:13::i;:::-;-1:-1:-1;;;;;34994:30:0;::::1;34986:67;;;::::0;-1:-1:-1;;;34986:67:0;;6786:2:1;34986:67:0::1;::::0;::::1;6768:21:1::0;6825:2;6805:18;;;6798:30;6864:26;6844:18;;;6837:54;6908:18;;34986:67:0::1;6584:348:1::0;34986:67:0::1;35064:15;:43:::0;;-1:-1:-1;;;;;;35064:43:0::1;-1:-1:-1::0;;;;;35064:43:0;::::1;::::0;;::::1;::::0;;;35123:65:::1;::::0;;7157:21:1;;;7214:2;7194:18;;;7187:30;;;;7253:34;7248:2;7233:18;;7226:62;-1:-1:-1;;;7319:3:1;7304:19;;7297:35;7399:4;7384:20;;7377:62;;;;-1:-1:-1;;;;;;;;;;;35123:65:0;7364:3:1;7349:19;35123:65:0::1;6937:508:1::0;13264:103:0;12502:13;:11;:13::i;:::-;13329:30:::1;13356:1;13329:18;:30::i;:::-;13264:103::o:0;37755:209::-;12502:13;:11;:13::i;:::-;37818:14:::1;::::0;::::1;;37817:15;37809:52;;;::::0;-1:-1:-1;;;37809:52:0;;7652:2:1;37809:52:0::1;::::0;::::1;7634:21:1::0;7691:2;7671:18;;;7664:30;7730:26;7710:18;;;7703:54;7774:18;;37809:52:0::1;7450:348:1::0;37809:52:0::1;37872:14;:21:::0;;-1:-1:-1;;37872:21:0::1;37889:4;37872:21;::::0;;37909:47:::1;::::0;;8015:21:1;;;8072:2;8052:18;;;8045:30;8111:25;8106:2;8091:18;;8084:53;37945:10:0::1;8204:4:1::0;8189:20;;8182:62;37909:47:0;;-1:-1:-1;;;;;;;;;;;37909:47:0;8169:3:1;37909:47:0;;;;;;::::1;37755:209::o:0;35432:228::-;12502:13;:11;:13::i;:::-;35520:2:::1;35508:8;:14;;35500:59;;;::::0;-1:-1:-1;;;35500:59:0;;8457:2:1;35500:59:0::1;::::0;::::1;8439:21:1::0;;;8476:18;;;8469:30;8535:34;8515:18;;;8508:62;8587:18;;35500:59:0::1;8255:356:1::0;35500:59:0::1;35570:7;:18:::0;;;35604:48:::1;::::0;;8828:21:1;;;8885:2;8865:18;;;8858:30;;;8924:34;8919:2;8904:18;;8897:62;9011:18;;;9004:34;;;-1:-1:-1;;;;;;;;;;;35604:48:0;8991:3:1;8976:19;35604:48:0::1;8616:428:1::0;29324:300:0;427:10;29442:4;29531:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;29531:34:0;;;;;;;;;;29442:4;;29459:135;;29509:7;;29531:52;;29568:15;;29531:52;:::i;27765:192::-;27868:4;27885:42;427:10;27909:9;27920:6;27885:9;:42::i;31941:303::-;25438:16;:23;;-1:-1:-1;;25438:23:0;;;;;32037:4:::1;-1:-1:-1::0;27691:16:0;;;:7;:16;;;;;;31997:46:::1;;32054:29;32071:11;32054:16;:29::i;:::-;32167:15;::::0;32112:21:::1;::::0;32146:49:::1;::::0;-1:-1:-1;;;;;32167:15:0::1;32112:21:::0;32146:20:::1;:49::i;:::-;-1:-1:-1::0;;32235:1:0::1;32208:24;:28:::0;25484:16;:24;;-1:-1:-1;;25484:24:0;;;31941:303::o;34612:247::-;12502:13;:11;:13::i;:::-;34724:8:::1;34699:33;;:21;;;;;;;;;;;:33;;::::0;34691:63:::1;;;::::0;-1:-1:-1;;;34691:63:0;;9251:2:1;34691:63:0::1;::::0;::::1;9233:21:1::0;9290:2;9270:18;;;9263:30;-1:-1:-1;;;9309:18:1;;;9302:47;9366:18;;34691:63:0::1;9049:341:1::0;34691:63:0::1;34765:21;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;34765:32:0;;::::1;;::::0;;34813:38:::1;::::0;::::1;::::0;::::1;::::0;34789:8;1169:14:1;1162:22;1144:41;;1132:2;1117:18;;1004:187;36798:359:0;12502:13;:11;:13::i;:::-;36936:15:::1;::::0;36928:52:::1;::::0;36880:21:::1;::::0;36862:15:::1;::::0;-1:-1:-1;;;;;36936:15:0;;::::1;::::0;36880:21;;36862:15;36928:52;36862:15;36928:52;36880:21;36936:15;36928:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36912:68;;;36999:4;36991:32;;;::::0;-1:-1:-1;;;36991:32:0;;9807:2:1;36991:32:0::1;::::0;::::1;9789:21:1::0;9846:2;9826:18;;;9819:30;-1:-1:-1;;;9865:18:1;;;9858:45;9920:18;;36991:32:0::1;9605:339:1::0;36991:32:0::1;37123:15;::::0;37039:110:::1;::::0;;10169:21:1;;;10226:2;10206:18;;;10199:30;;;;10265:34;10260:2;10245:18;;10238:62;-1:-1:-1;;;10331:3:1;10316:19;;10309:43;-1:-1:-1;;;;;37123:15:0;;::::1;10419:4:1::0;10404:20;;10397:62;-1:-1:-1;;;;;;;;;;;37039:110:0;10384:3:1;10369:19;37039:110:0::1;;;;;;;;36851:306;;36798:359::o:0;37234:465::-;12502:13;:11;:13::i;:::-;37411:4:::1;-1:-1:-1::0;;;;;37386:30:0;::::1;::::0;37364:134:::1;;;::::0;-1:-1:-1;;;37364:134:0;;10672:2:1;37364:134:0::1;::::0;::::1;10654:21:1::0;10711:2;10691:18;;;10684:30;10750:34;10730:18;;;10723:62;-1:-1:-1;;;10801:18:1;;;10794:52;10863:19;;37364:134:0::1;10470:418:1::0;37364:134:0::1;37552:15;::::0;37521:56:::1;::::0;-1:-1:-1;;;37521:56:0;;-1:-1:-1;;;;;37552:15:0;;::::1;37521:56;::::0;::::1;11075:51:1::0;11142:18;;;11135:34;;;37509:9:0::1;::::0;37521:30;::::1;::::0;::::1;::::0;11048:18:1;;37521:56:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37509:68;;37596:4;37588:32;;;::::0;-1:-1:-1;;;37588:32:0;;9807:2:1;37588:32:0::1;::::0;::::1;9789:21:1::0;9846:2;9826:18;;;9819:30;-1:-1:-1;;;9865:18:1;;;9858:45;9920:18;;37588:32:0::1;9605:339:1::0;37588:32:0::1;37636:55;::::0;;11642:21:1;;;11699:2;11679:18;;;11672:30;11738:34;11733:2;11718:18;;11711:62;-1:-1:-1;;;11804:3:1;11789:19;;11782:38;11887:4;11872:20;;11865:36;;;37636:55:0;;-1:-1:-1;;;;;;;;;;;37636:55:0;;;;11852:3:1;37636:55:0;;::::1;37353:346;37234:465:::0;;:::o;33898:233::-;12502:13;:11;:13::i;:::-;-1:-1:-1;;;;;33967:27:0;::::1;33997:5;33967:27:::0;;;:18:::1;:27;::::0;;;;;;;;:35;;-1:-1:-1;;33967:35:0::1;::::0;;34018:105;;12124:21:1;;;12181:2;12161:18;;;12154:30;;;;12220:34;12215:2;12200:18;;12193:62;-1:-1:-1;;;12286:3:1;12271:19;;12264:46;12362:20;;12355:62;;;;-1:-1:-1;;;;;;;;;;;34018:105:0;12342:3:1;12327:19;34018:105:0::1;11912:511:1::0;13522:238:0;12502:13;:11;:13::i;:::-;-1:-1:-1;;;;;13625:22:0;::::1;13603:110;;;::::0;-1:-1:-1;;;13603:110:0;;12630:2:1;13603:110:0::1;::::0;::::1;12612:21:1::0;12669:2;12649:18;;;12642:30;12708:34;12688:18;;;12681:62;-1:-1:-1;;;12759:18:1;;;12752:36;12805:19;;13603:110:0::1;12428:402:1::0;13603:110:0::1;13724:28;13743:8;13724:18;:28::i;:::-;13522:238:::0;:::o;29656:341::-;-1:-1:-1;;;;;29750:20:0;;29742:69;;;;-1:-1:-1;;;29742:69:0;;13037:2:1;29742:69:0;;;13019:21:1;13076:2;13056:18;;;13049:30;13115:34;13095:18;;;13088:62;-1:-1:-1;;;13166:18:1;;;13159:34;13210:19;;29742:69:0;12835:400:1;29742:69:0;-1:-1:-1;;;;;29830:21:0;;29822:68;;;;-1:-1:-1;;;29822:68:0;;13442:2:1;29822:68:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;-1:-1:-1;;;13571:18:1;;;13564:32;13613:19;;29822:68:0;13240:398:1;29822:68:0;-1:-1:-1;;;;;29903:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;29956:33;;1762:25:1;;;29956:33:0;;1735:18:1;29956:33:0;;;;;;;;29656:341;;;:::o;12781:132::-;12662:7;12689:6;-1:-1:-1;;;;;12689:6:0;427:10;12845:23;12837:68;;;;-1:-1:-1;;;12837:68:0;;13845:2:1;12837:68:0;;;13827:21:1;;;13864:18;;;13857:30;13923:34;13903:18;;;13896:62;13975:18;;12837:68:0;13643:356:1;30130:1576:0;-1:-1:-1;;;;;30218:18:0;;30210:68;;;;-1:-1:-1;;;30210:68:0;;14206:2:1;30210:68:0;;;14188:21:1;14245:2;14225:18;;;14218:30;14284:34;14264:18;;;14257:62;-1:-1:-1;;;14335:18:1;;;14328:35;14380:19;;30210:68:0;14004:401:1;30210:68:0;-1:-1:-1;;;;;30297:16:0;;30289:64;;;;-1:-1:-1;;;30289:64:0;;14612:2:1;30289:64:0;;;14594:21:1;14651:2;14631:18;;;14624:30;14690:34;14670:18;;;14663:62;-1:-1:-1;;;14741:18:1;;;14734:33;14784:19;;30289:64:0;14410:399:1;30289:64:0;30381:1;30372:6;:10;30364:64;;;;-1:-1:-1;;;30364:64:0;;15016:2:1;30364:64:0;;;14998:21:1;15055:2;15035:18;;;15028:30;15094:34;15074:18;;;15067:62;-1:-1:-1;;;15145:18:1;;;15138:39;15194:19;;30364:64:0;14814:405:1;30364:64:0;-1:-1:-1;;;;;30461:13:0;;;;;;:7;:13;;;;;;:23;-1:-1:-1;30461:23:0;30439:111;;;;-1:-1:-1;;;30439:111:0;;15426:2:1;30439:111:0;;;15408:21:1;15465:2;15445:18;;;15438:30;15504:34;15484:18;;;15477:62;-1:-1:-1;;;15555:18:1;;;15548:36;15601:19;;30439:111:0;15224:402:1;30439:111:0;30569:14;;;;;:42;;-1:-1:-1;;;;;;30587:24:0;;;;;;:18;:24;;;;;;;;30569:42;:68;;;-1:-1:-1;;;;;;30615:22:0;;;;;;:18;:22;;;;;;;;30569:68;30561:105;;;;-1:-1:-1;;;30561:105:0;;15833:2:1;30561:105:0;;;15815:21:1;15872:2;15852:18;;;15845:30;15911:26;15891:18;;;15884:54;15955:18;;30561:105:0;15631:348:1;30561:105:0;30772:4;30723:28;27691:16;;;:7;:16;;;;;;30857:23;;31017:16;;27691;;30820:60;;;;;31017:16;;;;;31016:17;:55;;;;;31058:13;-1:-1:-1;;;;;31050:21:0;:4;-1:-1:-1;;;;;31050:21:0;;;31016:55;:95;;;;;31088:23;31016:95;:133;;;;-1:-1:-1;31128:21:0;;;;;;;31016:133;30998:206;;;31176:16;:14;:16::i;:::-;31224:13;-1:-1:-1;;;;;31218:19:0;:2;-1:-1:-1;;;;;31218:19:0;;:48;;;;-1:-1:-1;;;;;;31242:24:0;;;;;;:18;:24;;;;;;;;31241:25;31218:48;31214:111;;;31310:3;31300:6;31290:7;;:16;;;;:::i;:::-;31289:24;;;;:::i;:::-;31283:30;;31214:111;31347:13;-1:-1:-1;;;;;31339:21:0;:4;-1:-1:-1;;;;;31339:21:0;;:48;;;;-1:-1:-1;;;;;;31365:22:0;;;;;;:18;:22;;;;;;;;31364:23;31339:48;31335:110;;;31430:3;31420:6;31411;;:15;;;;:::i;:::-;31410:23;;;;:::i;:::-;31404:29;;31335:110;31455:13;31465:3;31455:13;;:::i;:::-;;-1:-1:-1;31483:7:0;;31479:177;;31507:40;31522:4;31536;31543:3;31507:14;:40::i;:::-;31590:3;31562:24;;:31;;;;;;;:::i;:::-;;;;;;;;31641:3;31608:29;;:36;;;;;;;:::i;:::-;;;;-1:-1:-1;;31479:177:0;31666:32;31681:4;31687:2;31691:6;31666:14;:32::i;:::-;30199:1507;;;30130:1576;;;:::o;13920:191::-;13994:16;14013:6;;-1:-1:-1;;;;;14030:17:0;;;-1:-1:-1;;;;;;14030:17:0;;;;;;14063:40;;14013:6;;;;;;;14063:40;;13994:16;14063:40;13983:128;13920:191;:::o;32372:638::-;32522:16;;;32536:1;32522:16;;;;;;;;32498:21;;32522:16;;;;;;;;;;-1:-1:-1;32522:16:0;32498:40;;32567:4;32549;32554:1;32549:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;32549:23:0;;;-1:-1:-1;;;;;32549:23:0;;;;;32593:4;32583;32588:1;32583:7;;;;;;;;:::i;:::-;;;;;;:14;-1:-1:-1;;;;;32583:14:0;;;-1:-1:-1;;;;;32583:14:0;;;;;32608:62;32625:4;32640:15;32658:11;32608:8;:62::i;:::-;32709:240;;-1:-1:-1;;;32709:240:0;;-1:-1:-1;;;;;32709:15:0;:66;;;;:240;;32790:11;;32816:1;;32860:4;;32887;;32923:15;;32709:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32967:35;32984:11;32997:4;32967:35;;;;;;;:::i;35668:218::-;35786:9;35801;-1:-1:-1;;;;;35801:14:0;35823:6;35801:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35785:49;;;35853:4;35845:33;;;;-1:-1:-1;;;35845:33:0;;18235:2:1;35845:33:0;;;18217:21:1;18274:2;18254:18;;;18247:30;-1:-1:-1;;;18293:18:1;;;18286:46;18349:18;;35845:33:0;18033:340:1;35845:33:0;35774:112;35668:218;;:::o;33146:253::-;-1:-1:-1;;;;;33274:15:0;;;;;;:7;:15;;;;;:25;;33293:6;;33274:15;:25;;33293:6;;33274:25;:::i;:::-;;;;-1:-1:-1;;;;;;;33310:18:0;;;;;;:7;:18;;;;;:28;;33332:6;;33310:18;:28;;33332:6;;33310:28;:::i;:::-;;;;;;;;33373:9;-1:-1:-1;;;;;33356:35:0;33365:6;-1:-1:-1;;;;;33356:35:0;;33384:6;33356:35;;;;1762:25:1;;1750:2;1735:18;;1616:177;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1196:180::-;1255:6;1308:2;1296:9;1287:7;1283:23;1279:32;1276:52;;;1324:1;1321;1314:12;1276:52;-1:-1:-1;1347:23:1;;1196:180;-1:-1:-1;1196:180:1:o;1798:328::-;1875:6;1883;1891;1944:2;1932:9;1923:7;1919:23;1915:32;1912:52;;;1960:1;1957;1950:12;1912:52;1983:29;2002:9;1983:29;:::i;:::-;1973:39;;2031:38;2065:2;2054:9;2050:18;2031:38;:::i;:::-;2021:48;;2116:2;2105:9;2101:18;2088:32;2078:42;;1798:328;;;;;:::o;2320:186::-;2379:6;2432:2;2420:9;2411:7;2407:23;2403:32;2400:52;;;2448:1;2445;2438:12;2400:52;2471:29;2490:9;2471:29;:::i;:::-;2461:39;2320:186;-1:-1:-1;;;2320:186: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;4780:127::-;4841:10;4836:3;4832:20;4829:1;4822:31;4872:4;4869:1;4862:15;4896:4;4893:1;4886:15;4912:128;4979:9;;;5000:11;;;4997:37;;;5014:18;;:::i;5045:125::-;5110:9;;;5131:10;;;5128:36;;;5144:18;;:::i;11180:245::-;11247:6;11300:2;11288:9;11279:7;11275:23;11271:32;11268:52;;;11316:1;11313;11306:12;11268:52;11348:9;11342:16;11367:28;11389:5;11367:28;:::i;15984:168::-;16057:9;;;16088;;16105:15;;;16099:22;;16085:37;16075:71;;16126:18;;:::i;16157:217::-;16197:1;16223;16213:132;;16267:10;16262:3;16258:20;16255:1;16248:31;16302:4;16299:1;16292:15;16330:4;16327:1;16320:15;16213:132;-1:-1:-1;16359:9:1;;16157:217::o;16511:127::-;16572:10;16567:3;16563:20;16560:1;16553:31;16603:4;16600:1;16593:15;16627:4;16624:1;16617:15;16643:461;16696:3;16734:5;16728:12;16761:6;16756:3;16749:19;16787:4;16816:2;16811:3;16807:12;16800:19;;16853:2;16846:5;16842:14;16874:1;16884:195;16898:6;16895:1;16892:13;16884:195;;;16963:13;;-1:-1:-1;;;;;16959:39:1;16947:52;;17019:12;;;;17054:15;;;;16995:1;16913:9;16884:195;;;-1:-1:-1;17095:3:1;;16643:461;-1:-1:-1;;;;;16643:461:1:o;17109:582::-;17408:6;17397:9;17390:25;17451:6;17446:2;17435:9;17431:18;17424:34;17494:3;17489:2;17478:9;17474:18;17467:31;17371:4;17515:57;17567:3;17556:9;17552:19;17544:6;17515:57;:::i;:::-;-1:-1:-1;;;;;17608:32:1;;;;17603:2;17588:18;;17581:60;-1:-1:-1;17672:3:1;17657:19;17650:35;17507:65;17109:582;-1:-1:-1;;;17109:582:1:o;17696:332::-;17903:6;17892:9;17885:25;17946:2;17941;17930:9;17926:18;17919:30;17866:4;17966:56;18018:2;18007:9;18003:18;17995:6;17966:56;:::i;:::-;17958:64;17696:332;-1:-1:-1;;;;17696:332:1:o

Swarm Source

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