ETH Price: $3,483.99 (+2.82%)
Gas: 2 Gwei

Token

Ponzi ($PONZI)
 

Overview

Max Total Supply

18,820,303 $PONZI

Holders

300

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,222 $PONZI

Value
$0.00
0xf6edffd55c1a99fe0ab68b29b960faa15ee0e833
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:
PONZI

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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://diligence.consensys.net/posts/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);
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

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

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

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

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

// File: contracts/Ponzi/PonziToken/DividendDistributor.sol


pragma solidity ^0.8.7;




contract DividendDistributor is Ownable{
    using SafeERC20 for IERC20;
    address public TOKEN;
    IERC20 public DAI;
    
    struct Share {
        uint256 amount;
        uint256 excluded;
        uint256 rewardConfirmed;
        uint256 rewardClaimed;
    }
    
    mapping(address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor;
    
    modifier onlyToken() {
        require(msg.sender == TOKEN || msg.sender == owner());
        _;
    }
    constructor(address DAIToken, address _token, address _owner) {
        TOKEN = _token;
        DAI = IERC20(DAIToken);
        dividendsPerShareAccuracyFactor = 10**36;
        transferOwnership(_owner);
    }

    function depositDAI(uint256 amount) public onlyToken {
        totalDividends += amount;
        dividendsPerShare += (dividendsPerShareAccuracyFactor * amount / totalShares);
    }

    function setShare(address shareholder, uint256 tokenAmount) public onlyToken {
        if (shares[shareholder].amount > 0) {
            distributeDividend(shareholder);
        }

        totalShares = totalShares + tokenAmount - shares[shareholder].amount;

        shares[shareholder].amount = tokenAmount;
        shares[shareholder].excluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share * dividendsPerShare / dividendsPerShareAccuracyFactor;
    }

    function distributeDividend(address shareholder) internal {
        if (shares[shareholder].amount == 0) return;

        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount > 0) {
            totalDistributed += amount;
            shares[shareholder].rewardConfirmed += amount;
            shares[shareholder].excluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }

    function getUnpaidEarnings(address shareholder) internal view returns (uint256) {
        if (shares[shareholder].amount == 0) return 0;

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);

        uint256 shareholderTotalExcluded = shares[shareholder].excluded;

        if (shareholderTotalDividends <= shareholderTotalExcluded) return 0;

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

    function getUnclaimedRewards(address shareholder) public view returns (uint256) {
        return shares[shareholder].rewardConfirmed + getUnpaidEarnings(shareholder);
    }

    function getClaimedRewards(address shareholder) public view returns (uint256) {
        return shares[shareholder].rewardClaimed;
    }
    
    receive() external payable {}

    function claimRewards() public {
        distributeDividend(msg.sender);
        require(shares[msg.sender].rewardConfirmed > 0, "Nothing Rewards");

        DAI.safeTransfer(msg.sender, shares[msg.sender].rewardConfirmed);

        shares[msg.sender].rewardClaimed += shares[msg.sender].rewardConfirmed;
        shares[msg.sender].rewardConfirmed = 0;
    }

    function claimDAIForEmergency() public onlyOwner {
        DAI.safeTransfer(msg.sender, DAI.balanceOf(address(this)));
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

// File: contracts/Ponzi/PonziToken/PonziToken.sol











pragma solidity ^0.8.13;

contract PONZI is Ownable, IERC20Metadata {
    using Address for address;
    
    address private constant DEAD = address(0xdead);
    address private constant ZERO = address(0);

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name = "Ponzi";
    string private _symbol = "$PONZI";
    uint8 private _decimal = 18;

    uint256 public _feePercentForBuy = 1750; // 17.5%
    uint256 public _feePercentForSell = 9900; // 99%
    DividendDistributor public _distributor;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isDividendExempt;

    address public immutable DAIToken;
    IUniswapV2Router02 public immutable DEXRouter;
    address public immutable DEXPair;

    uint256 private _minimumTokensBeforeSwap;
    
    bool private inSwap;
    modifier swapping() {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () {
        _mint(_msgSender(), 18820303 * 10**_decimal);
        _minimumTokensBeforeSwap = _totalSupply / 10000; //0.01%

        DAIToken = 0x6B175474E89094C44Da98b954EedeAC495271d0F; // Mainnet
        // IUniswapV2Router02 _DEXRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //UniswapV2 Router
        IUniswapV2Router02 _DEXRouter = IUniswapV2Router02(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); //SushiSwap Router
        DEXPair = IUniswapV2Factory(_DEXRouter.factory()).createPair(address(this), DAIToken);
        DEXRouter = _DEXRouter;

        isFeeExempt[msg.sender] = true;
        isFeeExempt[address(this)] = true;
        isFeeExempt[DEAD] = true;
        isDividendExempt[DEXPair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;

        _allowances[address(this)][address(DEXRouter)] = _totalSupply;
        _allowances[address(this)][address(DEXPair)] = _totalSupply;

        _distributor = new DividendDistributor(DAIToken, address(this), msg.sender);
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return _decimal;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= _minimumTokensBeforeSwap;
        if (overMinTokenBalance && !inSwap && sender != DEXPair) {
            contractTokenBalance = _minimumTokensBeforeSwap;
            swapTokensToDAI(contractTokenBalance);
        }

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 feeAmount = 0;
        
        if (shouldTakeFee(sender) && shouldTakeFee(recipient) ) {
            if (recipient == DEXPair) { // Sell
                feeAmount = amount * _feePercentForSell / 10000;
            } else {
                feeAmount = amount * _feePercentForBuy / 10000;
            }
        }
        
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount - feeAmount;
        if (feeAmount > 0) _reflectFee(feeAmount);

        if (!isDividendExempt[sender]) {
            try _distributor.setShare(sender, _balances[sender]) {} catch {}
        }
        if (!isDividendExempt[recipient]) {
            try _distributor.setShare(recipient, _balances[recipient]) {} catch {}
        }

        emit Transfer(sender, recipient, amount - feeAmount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

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

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function setDistributer(address payable _distributorAddr) external onlyOwner {
        _distributor = DividendDistributor(_distributorAddr);
    }

    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }
    
    function setIsDividendExempt(address holder, bool exempt) external onlyOwner {
        require(holder != address(this) && holder != DEXPair);
        isDividendExempt[holder] = exempt;
        if (exempt) {
            _distributor.setShare(holder, 0);
        } else {
            _distributor.setShare(holder, _balances[holder]);
        }
    }
    
    function setIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function setFee(uint256 feePercentForBuy, uint256 feePercentForSell) external onlyOwner {
        _feePercentForBuy = feePercentForBuy;
        _feePercentForSell = feePercentForSell;
    }

    function _reflectFee(uint256 feeAmount) private {
        _balances[address(this)] = _balances[address(this)] + feeAmount;
    }

    function swapTokensToDAI(uint256 contractTokenBalance) private swapping {
        uint256 initialBalance = IERC20(DAIToken).balanceOf(address(_distributor));
        _swapTokensForDAI(contractTokenBalance);
        uint256 transferredBalance = IERC20(DAIToken).balanceOf(address(_distributor)) - initialBalance;

        try _distributor.depositDAI(transferredBalance) {} catch {}
    }

    function _swapTokensForDAI(uint256 tokenAmount) internal {
        // generate the uniswap pair path of token -> usdt
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = DAIToken;

        _approve(address(this), address(DEXRouter), tokenAmount);

        // make the swap
        DEXRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of DAI
            path,
            address(_distributor),
            block.timestamp
        );
    }

    function distributeFeeToDAI() external {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) swapTokensToDAI(contractTokenBalance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DAIToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEXRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_distributor","outputs":[{"internalType":"contract DividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feePercentForBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feePercentForSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"distributeFeeToDAI","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":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_distributorAddr","type":"address"}],"name":"setDistributer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feePercentForBuy","type":"uint256"},{"internalType":"uint256","name":"feePercentForSell","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

610120604052600560e090815264506f6e7a6960d81b6101005260049062000028908262000517565b5060408051808201909152600681526524504f4e5a4960d01b602082015260059062000055908262000517565b506006805460ff191660121790556106d66007556126ac6008553480156200007c57600080fd5b50620000883362000328565b620000b633600654620000a09060ff16600a620006f8565b620000b09063011f2ccf62000710565b62000378565b612710600354620000c891906200072a565b600c55736b175474e89094c44da98b954eedeac495271d0f6080526040805163c45a015560e01b8152905173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f91829163c45a0155916004808201926020929091908290030181865afa15801562000137573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015d91906200074d565b6080516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d591906200074d565b6001600160a01b0390811660c081905290821660a0819052336000818152600a602090815260408083208054600160ff1991821681179092553080865283862080548316841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb8054831684179055888652600b8552838620805483168417905580865283862080548316841790557f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac341580549092169092179055600354600284528285209685529590925280832085905594825290849020929092556080519251620002c39062000465565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801562000300573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055506200078e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003d35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620003e7919062000778565b90915550506001600160a01b038216600090815260016020526040812080548392906200041690849062000778565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b610f208062001d7d83390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200049e57607f821691505b602082108103620004bf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200046057600081815260208120601f850160051c81016020861015620004ee5750805b601f850160051c820191505b818110156200050f57828155600101620004fa565b505050505050565b81516001600160401b0381111562000533576200053362000473565b6200054b8162000544845462000489565b84620004c5565b602080601f8311600181146200058357600084156200056a5750858301515b600019600386901b1c1916600185901b1785556200050f565b600085815260208120601f198616915b82811015620005b45788860151825594840194600190910190840162000593565b5085821015620005d35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200063a5781600019048211156200061e576200061e620005e3565b808516156200062c57918102915b93841c9390800290620005fe565b509250929050565b6000826200065357506001620006f2565b816200066257506000620006f2565b81600181146200067b57600281146200068657620006a6565b6001915050620006f2565b60ff8411156200069a576200069a620005e3565b50506001821b620006f2565b5060208310610133831016604e8410600b8410161715620006cb575081810a620006f2565b620006d78383620005f9565b8060001904821115620006ee57620006ee620005e3565b0290505b92915050565b60006200070960ff84168362000642565b9392505050565b8082028115828204841417620006f257620006f2620005e3565b6000826200074857634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200076057600080fd5b81516001600160a01b03811681146200070957600080fd5b80820180821115620006f257620006f2620005e3565b60805160a05160c051611587620007f66000396000818161020b015281816107d101528181610d1a0152610dab0152600081816102b4015281816111d1015261121001526000818161027801528181610a4601528181610ae3015261117901526115876000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80634355855a116100f9578063a457c2d711610097578063dd62ed3e11610071578063dd62ed3e146103d8578063e583077014610411578063f2fde38b14610424578063f708a64f1461043757600080fd5b8063a457c2d71461039f578063a9059cbb146103b2578063b76cde27146103c557600080fd5b806370a08231116100d357806370a0823114610355578063715018a61461037e5780638da5cb5b1461038657806395d89b411461039757600080fd5b80634355855a1461030c57806352f7c9881461032f578063658d4b7f1461034257600080fd5b80632136b5e711610166578063313ce56711610140578063313ce5671461029a5780633211a83d146102af57806339509351146102d65780633f4218e0146102e957600080fd5b80632136b5e71461025657806323b872dd1461026057806326cdc9091461027357600080fd5b806306fdde03146101ae578063095ea7b3146101cc578063100a87bc146101ef578063179795dd1461020657806318160ddd1461024557806320e493e51461024d575b600080fd5b6101b661044a565b6040516101c39190611280565b60405180910390f35b6101df6101da3660046112e3565b6104dc565b60405190151581526020016101c3565b6101f860075481565b6040519081526020016101c3565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c3565b6003546101f8565b6101f860085481565b61025e6104f3565b005b6101df61026e36600461130f565b610515565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b60065460405160ff90911681526020016101c3565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b6101df6102e43660046112e3565b6105cb565b6101df6102f7366004611350565b600a6020526000908152604090205460ff1681565b6101df61031a366004611350565b600b6020526000908152604090205460ff1681565b61025e61033d366004611374565b610602565b61025e610350366004611396565b610615565b6101f8610363366004611350565b6001600160a01b031660009081526001602052604090205490565b61025e610648565b6000546001600160a01b031661022d565b6101b661065c565b6101df6103ad3660046112e3565b61066b565b6101df6103c03660046112e3565b610706565b60095461022d906001600160a01b031681565b6101f86103e63660046113d4565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61025e61041f366004611350565b610713565b61025e610432366004611350565b61073d565b61025e610445366004611396565b6107b3565b60606004805461045990611402565b80601f016020809104026020016040519081016040528092919081815260200182805461048590611402565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b5050505050905090565b60006104e93384846108f0565b5060015b92915050565b3060009081526001602052604090205480156105125761051281610a14565b50565b6000610522848484610bc2565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156105ac5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105c085336105bb8685611452565b6108f0565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104e99185906105bb908690611465565b61060a611078565b600791909155600855565b61061d611078565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610650611078565b61065a60006110d2565b565b60606005805461045990611402565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156106ed5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105a3565b6106fc33856105bb8685611452565b5060019392505050565b60006104e9338484610bc2565b61071b611078565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610745611078565b6001600160a01b0381166107aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a3565b610512816110d2565b6107bb611078565b6001600160a01b038216301480159061080657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b61080f57600080fd5b6001600160a01b0382166000908152600b60205260409020805460ff191682158015919091179091556108a757600954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b15801561088b57600080fd5b505af115801561089f573d6000803e3d6000fd5b505050505050565b6009546001600160a01b0383811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610871565b6001600160a01b0383166109525760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105a3565b6001600160a01b0382166109b35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105a3565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600d805460ff191660011790556009546040516370a0823160e01b81526001600160a01b0391821660048201526000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab19190611478565b9050610abc82611122565b6009546040516370a0823160e01b81526001600160a01b03918216600482015260009183917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190611478565b610b5a9190611452565b60095460405163365833e160e01b8152600481018390529192506001600160a01b03169063365833e190602401600060405180830381600087803b158015610ba157600080fd5b505af1925050508015610bb2575060015b505050600d805460ff1916905550565b6001600160a01b038316610c265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105a3565b6001600160a01b038216610c885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105a3565b60008111610cea5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016105a3565b30600090815260016020526040902054600c5481108015908190610d115750600d5460ff16155b8015610d4f57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b15610d6257600c549150610d6282610a14565b6001600160a01b0385166000908152600a602052604081205460ff16158015610da457506001600160a01b0385166000908152600a602052604090205460ff16155b15610e22577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603610e045761271060085485610df39190611491565b610dfd91906114a8565b9050610e22565b61271060075485610e159190611491565b610e1f91906114a8565b90505b6001600160a01b03861660009081526001602052604090205484811015610e9a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105a3565b610ea48582611452565b6001600160a01b038816600090815260016020526040902055610ec78286611452565b6001600160a01b03871660009081526001602052604081208054909190610eef908490611465565b90915550508115610f0357610f0382611252565b6001600160a01b0387166000908152600b602052604090205460ff16610f94576009546001600160a01b0388811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610f8157600080fd5b505af1925050508015610f92575060015b505b6001600160a01b0386166000908152600b602052604090205460ff16611025576009546001600160a01b0387811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561101257600080fd5b505af1925050508015611023575060015b505b6001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61105e8589611452565b60405190815260200160405180910390a350505050505050565b6000546001600160a01b0316331461065a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611157576111576114ca565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106111ab576111ab6114ca565b60200260200101906001600160a01b031690816001600160a01b0316815250506111f6307f0000000000000000000000000000000000000000000000000000000000000000846108f0565b600954604051635c11d79560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692635c11d795926108719287926000928892919091169042906004016114e0565b3060009081526001602052604090205461126d908290611465565b3060009081526001602052604090205550565b600060208083528351808285015260005b818110156112ad57858101830151858201604001528201611291565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461051257600080fd5b600080604083850312156112f657600080fd5b8235611301816112ce565b946020939093013593505050565b60008060006060848603121561132457600080fd5b833561132f816112ce565b9250602084013561133f816112ce565b929592945050506040919091013590565b60006020828403121561136257600080fd5b813561136d816112ce565b9392505050565b6000806040838503121561138757600080fd5b50508035926020909101359150565b600080604083850312156113a957600080fd5b82356113b4816112ce565b9150602083013580151581146113c957600080fd5b809150509250929050565b600080604083850312156113e757600080fd5b82356113f2816112ce565b915060208301356113c9816112ce565b600181811c9082168061141657607f821691505b60208210810361143657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104ed576104ed61143c565b808201808211156104ed576104ed61143c565b60006020828403121561148a57600080fd5b5051919050565b80820281158282048414176104ed576104ed61143c565b6000826114c557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156115305784516001600160a01b03168352938301939183019160010161150b565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220047b12585b44972a9f4b2a76694b516f36a37157bb18b900d3c3cee858b221eb64736f6c6343000811003360806040523480156200001157600080fd5b5060405162000f2038038062000f208339810160408190526200003491620001e4565b6200003f3362000096565b600180546001600160a01b038085166001600160a01b03199283161790925560028054928616929091169190911790556ec097ce7bc90715b34b9f10000000006008556200008d81620000e6565b5050506200022e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000f062000169565b6001600160a01b0381166200015b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620001668162000096565b50565b6000546001600160a01b03163314620001c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000152565b565b80516001600160a01b0381168114620001df57600080fd5b919050565b600080600060608486031215620001fa57600080fd5b6200020584620001c7565b92506200021560208501620001c7565b91506200022560408501620001c7565b90509250925092565b610ce2806200023e6000396000f3fe6080604052600436106101025760003560e01c80638da5cb5b11610095578063ce7c2ac211610064578063ce7c2ac214610294578063e0bab4c4146102f8578063e2d2e21914610318578063efca2eed1461032e578063f2fde38b1461034457600080fd5b80638da5cb5b14610211578063997664d71461022f578063a1dddd8e14610245578063b9e35db01461025a57600080fd5b80633a98ef39116100d15780633a98ef391461018e57806369a69e29146101a4578063715018a6146101c457806382bfefc8146101d957600080fd5b806311ce023d1461010e57806314b6ca9614610137578063365833e114610159578063372500ab1461017957600080fd5b3661010957005b600080fd5b34801561011a57600080fd5b5061012460085481565b6040519081526020015b60405180910390f35b34801561014357600080fd5b50610157610152366004610b24565b610364565b005b34801561016557600080fd5b50610157610174366004610b4e565b610432565b34801561018557600080fd5b506101576104a9565b34801561019a57600080fd5b5061012460045481565b3480156101b057600080fd5b506101246101bf366004610b67565b610577565b3480156101d057600080fd5b506101576105ae565b3480156101e557600080fd5b506001546101f9906001600160a01b031681565b6040516001600160a01b03909116815260200161012e565b34801561021d57600080fd5b506000546001600160a01b03166101f9565b34801561023b57600080fd5b5061012460055481565b34801561025157600080fd5b506101576105c2565b34801561026657600080fd5b50610124610275366004610b67565b6001600160a01b03166000908152600360208190526040909120015490565b3480156102a057600080fd5b506102d86102af366004610b67565b600360208190526000918252604090912080546001820154600283015492909301549092919084565b60408051948552602085019390935291830152606082015260800161012e565b34801561030457600080fd5b506002546101f9906001600160a01b031681565b34801561032457600080fd5b5061012460075481565b34801561033a57600080fd5b5061012460065481565b34801561035057600080fd5b5061015761035f366004610b67565b61064f565b6001546001600160a01b031633148061038757506000546001600160a01b031633145b61039057600080fd5b6001600160a01b038216600090815260036020526040902054156103b7576103b7826106c8565b6001600160a01b0382166000908152600360205260409020546004546103de908390610b9f565b6103e89190610bb2565b6004556001600160a01b038216600090815260036020526040902081905561040f8161076a565b6001600160a01b0390921660009081526003602052604090206001019190915550565b6001546001600160a01b031633148061045557506000546001600160a01b031633145b61045e57600080fd5b80600560008282546104709190610b9f565b9091555050600454600854610486908390610bc5565b6104909190610bdc565b600760008282546104a19190610b9f565b909155505050565b6104b2336106c8565b336000908152600360205260409020600201546105085760405162461bcd60e51b815260206004820152600f60248201526e4e6f7468696e67205265776172647360881b60448201526064015b60405180910390fd5b3360008181526003602052604090206002908101549054610534926001600160a01b0390911691610787565b33600090815260036020819052604082206002810154910180549192909161055d908490610b9f565b909155505033600090815260036020526040812060020155565b6000610582826107de565b6001600160a01b0383166000908152600360205260409020600201546105a89190610b9f565b92915050565b6105b6610869565b6105c060006108c3565b565b6105ca610869565b6002546040516370a0823160e01b81523060048201526105c09133916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063c9190610bfe565b6002546001600160a01b03169190610787565b610657610869565b6001600160a01b0381166106bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ff565b6106c5816108c3565b50565b6001600160a01b03811660009081526003602052604081205490036106ea5750565b60006106f5826107de565b9050801561076657806006600082825461070f9190610b9f565b90915550506001600160a01b0382166000908152600360205260408120600201805483929061073f908490610b9f565b90915550506001600160a01b03821660009081526003602052604090205461040f9061076a565b5050565b60006008546007548361077d9190610bc5565b6105a89190610bdc565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526107d9908490610913565b505050565b6001600160a01b038116600090815260036020526040812054810361080557506000919050565b6001600160a01b0382166000908152600360205260408120546108279061076a565b6001600160a01b038416600090815260036020526040902060010154909150808211610857575060009392505050565b6108618183610bb2565b949350505050565b6000546001600160a01b031633146105c05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ff565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610968826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166109e59092919063ffffffff16565b8051909150156107d957808060200190518101906109869190610c17565b6107d95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016104ff565b6060610861848460008585600080866001600160a01b03168587604051610a0c9190610c5d565b60006040518083038185875af1925050503d8060008114610a49576040519150601f19603f3d011682016040523d82523d6000602084013e610a4e565b606091505b5091509150610a5f87838387610a6a565b979650505050505050565b60608315610ad9578251600003610ad2576001600160a01b0385163b610ad25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104ff565b5081610861565b6108618383815115610aee5781518083602001fd5b8060405162461bcd60e51b81526004016104ff9190610c79565b80356001600160a01b0381168114610b1f57600080fd5b919050565b60008060408385031215610b3757600080fd5b610b4083610b08565b946020939093013593505050565b600060208284031215610b6057600080fd5b5035919050565b600060208284031215610b7957600080fd5b610b8282610b08565b9392505050565b634e487b7160e01b600052601160045260246000fd5b808201808211156105a8576105a8610b89565b818103818111156105a8576105a8610b89565b80820281158282048414176105a8576105a8610b89565b600082610bf957634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610c1057600080fd5b5051919050565b600060208284031215610c2957600080fd5b81518015158114610b8257600080fd5b60005b83811015610c54578181015183820152602001610c3c565b50506000910152565b60008251610c6f818460208701610c39565b9190910192915050565b6020815260008251806020840152610c98816040850160208701610c39565b601f01601f1916919091016040019291505056fea26469706673582212206e08051477147ac7293ae615cbc0d1c1c8b899a6fb0f487e2d47754d537fa95b64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80634355855a116100f9578063a457c2d711610097578063dd62ed3e11610071578063dd62ed3e146103d8578063e583077014610411578063f2fde38b14610424578063f708a64f1461043757600080fd5b8063a457c2d71461039f578063a9059cbb146103b2578063b76cde27146103c557600080fd5b806370a08231116100d357806370a0823114610355578063715018a61461037e5780638da5cb5b1461038657806395d89b411461039757600080fd5b80634355855a1461030c57806352f7c9881461032f578063658d4b7f1461034257600080fd5b80632136b5e711610166578063313ce56711610140578063313ce5671461029a5780633211a83d146102af57806339509351146102d65780633f4218e0146102e957600080fd5b80632136b5e71461025657806323b872dd1461026057806326cdc9091461027357600080fd5b806306fdde03146101ae578063095ea7b3146101cc578063100a87bc146101ef578063179795dd1461020657806318160ddd1461024557806320e493e51461024d575b600080fd5b6101b661044a565b6040516101c39190611280565b60405180910390f35b6101df6101da3660046112e3565b6104dc565b60405190151581526020016101c3565b6101f860075481565b6040519081526020016101c3565b61022d7f0000000000000000000000005803ca5c704c8e4ad07bcdebde6a87299b3b946981565b6040516001600160a01b0390911681526020016101c3565b6003546101f8565b6101f860085481565b61025e6104f3565b005b6101df61026e36600461130f565b610515565b61022d7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b60065460405160ff90911681526020016101c3565b61022d7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6101df6102e43660046112e3565b6105cb565b6101df6102f7366004611350565b600a6020526000908152604090205460ff1681565b6101df61031a366004611350565b600b6020526000908152604090205460ff1681565b61025e61033d366004611374565b610602565b61025e610350366004611396565b610615565b6101f8610363366004611350565b6001600160a01b031660009081526001602052604090205490565b61025e610648565b6000546001600160a01b031661022d565b6101b661065c565b6101df6103ad3660046112e3565b61066b565b6101df6103c03660046112e3565b610706565b60095461022d906001600160a01b031681565b6101f86103e63660046113d4565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61025e61041f366004611350565b610713565b61025e610432366004611350565b61073d565b61025e610445366004611396565b6107b3565b60606004805461045990611402565b80601f016020809104026020016040519081016040528092919081815260200182805461048590611402565b80156104d25780601f106104a7576101008083540402835291602001916104d2565b820191906000526020600020905b8154815290600101906020018083116104b557829003601f168201915b5050505050905090565b60006104e93384846108f0565b5060015b92915050565b3060009081526001602052604090205480156105125761051281610a14565b50565b6000610522848484610bc2565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156105ac5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105c085336105bb8685611452565b6108f0565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104e99185906105bb908690611465565b61060a611078565b600791909155600855565b61061d611078565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b610650611078565b61065a60006110d2565b565b60606005805461045990611402565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156106ed5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105a3565b6106fc33856105bb8685611452565b5060019392505050565b60006104e9338484610bc2565b61071b611078565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b610745611078565b6001600160a01b0381166107aa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105a3565b610512816110d2565b6107bb611078565b6001600160a01b038216301480159061080657507f0000000000000000000000005803ca5c704c8e4ad07bcdebde6a87299b3b94696001600160a01b0316826001600160a01b031614155b61080f57600080fd5b6001600160a01b0382166000908152600b60205260409020805460ff191682158015919091179091556108a757600954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b15801561088b57600080fd5b505af115801561089f573d6000803e3d6000fd5b505050505050565b6009546001600160a01b0383811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610871565b6001600160a01b0383166109525760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105a3565b6001600160a01b0382166109b35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105a3565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600d805460ff191660011790556009546040516370a0823160e01b81526001600160a01b0391821660048201526000917f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f16906370a0823190602401602060405180830381865afa158015610a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab19190611478565b9050610abc82611122565b6009546040516370a0823160e01b81526001600160a01b03918216600482015260009183917f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f909116906370a0823190602401602060405180830381865afa158015610b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b509190611478565b610b5a9190611452565b60095460405163365833e160e01b8152600481018390529192506001600160a01b03169063365833e190602401600060405180830381600087803b158015610ba157600080fd5b505af1925050508015610bb2575060015b505050600d805460ff1916905550565b6001600160a01b038316610c265760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105a3565b6001600160a01b038216610c885760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105a3565b60008111610cea5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016105a3565b30600090815260016020526040902054600c5481108015908190610d115750600d5460ff16155b8015610d4f57507f0000000000000000000000005803ca5c704c8e4ad07bcdebde6a87299b3b94696001600160a01b0316856001600160a01b031614155b15610d6257600c549150610d6282610a14565b6001600160a01b0385166000908152600a602052604081205460ff16158015610da457506001600160a01b0385166000908152600a602052604090205460ff16155b15610e22577f0000000000000000000000005803ca5c704c8e4ad07bcdebde6a87299b3b94696001600160a01b0316856001600160a01b031603610e045761271060085485610df39190611491565b610dfd91906114a8565b9050610e22565b61271060075485610e159190611491565b610e1f91906114a8565b90505b6001600160a01b03861660009081526001602052604090205484811015610e9a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105a3565b610ea48582611452565b6001600160a01b038816600090815260016020526040902055610ec78286611452565b6001600160a01b03871660009081526001602052604081208054909190610eef908490611465565b90915550508115610f0357610f0382611252565b6001600160a01b0387166000908152600b602052604090205460ff16610f94576009546001600160a01b0388811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610f8157600080fd5b505af1925050508015610f92575060015b505b6001600160a01b0386166000908152600b602052604090205460ff16611025576009546001600160a01b0387811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561101257600080fd5b505af1925050508015611023575060015b505b6001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61105e8589611452565b60405190815260200160405180910390a350505050505050565b6000546001600160a01b0316331461065a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611157576111576114ca565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f816001815181106111ab576111ab6114ca565b60200260200101906001600160a01b031690816001600160a01b0316815250506111f6307f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f846108f0565b600954604051635c11d79560e01b81526001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f811692635c11d795926108719287926000928892919091169042906004016114e0565b3060009081526001602052604090205461126d908290611465565b3060009081526001602052604090205550565b600060208083528351808285015260005b818110156112ad57858101830151858201604001528201611291565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461051257600080fd5b600080604083850312156112f657600080fd5b8235611301816112ce565b946020939093013593505050565b60008060006060848603121561132457600080fd5b833561132f816112ce565b9250602084013561133f816112ce565b929592945050506040919091013590565b60006020828403121561136257600080fd5b813561136d816112ce565b9392505050565b6000806040838503121561138757600080fd5b50508035926020909101359150565b600080604083850312156113a957600080fd5b82356113b4816112ce565b9150602083013580151581146113c957600080fd5b809150509250929050565b600080604083850312156113e757600080fd5b82356113f2816112ce565b915060208301356113c9816112ce565b600181811c9082168061141657607f821691505b60208210810361143657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104ed576104ed61143c565b808201808211156104ed576104ed61143c565b60006020828403121561148a57600080fd5b5051919050565b80820281158282048414176104ed576104ed61143c565b6000826114c557634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156115305784516001600160a01b03168352938301939183019160010161150b565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220047b12585b44972a9f4b2a76694b516f36a37157bb18b900d3c3cee858b221eb64736f6c63430008110033

Deployed Bytecode Sourcemap

35516:9732:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37659:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38579:169;;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;38579:169:0;1023:187:1;35991:39:0;;;;;;;;;1361:25:1;;;1349:2;1334:18;35991:39:0;1215:177:1;36347:32:0;;;;;;;;-1:-1:-1;;;;;1561:32:1;;;1543:51;;1531:2;1516:18;36347:32:0;1397:203:1;37986:108:0;38074:12;;37986:108;;36046:40;;;;;;45054:191;;;:::i;:::-;;38756:422;;;;;;:::i;:::-;;:::i;36255:33::-;;;;;37879:99;37962:8;;37879:99;;37962:8;;;;2208:36:1;;2196:2;2181:18;37879:99:0;2066:184:1;36295:45:0;;;;;39186:215;;;;;;:::i;:::-;;:::i;36148:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36198:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43732:192;;;;;;:::i;:::-;;:::i;43605:119::-;;;;;;:::i;:::-;;:::i;38102:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;38203:18:0;38176:7;38203:18;;;:9;:18;;;;;;;38102:127;22943:103;;;:::i;22295:87::-;22341:7;22368:6;-1:-1:-1;;;;;22368:6:0;22295:87;;37767:104;;;:::i;39409:377::-;;;;;;:::i;:::-;;:::i;38237:175::-;;;;;;:::i;:::-;;:::i;36100:39::-;;;;;-1:-1:-1;;;;;36100:39:0;;;38420:151;;;;;;:::i;:::-;-1:-1:-1;;;;;38536:18:0;;;38509:7;38536:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;38420:151;42956:148;;;;;;:::i;:::-;;:::i;23201:201::-;;;;;;:::i;:::-;;:::i;43238:355::-;;;;;;:::i;:::-;;:::i;37659:100::-;37713:13;37746:5;37739:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37659:100;:::o;38579:169::-;38662:4;38679:39;20926:10;38702:7;38711:6;38679:8;:39::i;:::-;-1:-1:-1;38736:4:0;38579:169;;;;;:::o;45054:191::-;45153:4;45104:28;38203:18;;;:9;:18;;;;;;45174:24;;45170:67;;45200:37;45216:20;45200:15;:37::i;:::-;45093:152;45054:191::o;38756:422::-;38862:4;38879:36;38889:6;38897:9;38908:6;38879:9;:36::i;:::-;-1:-1:-1;;;;;38955:19:0;;38928:24;38955:19;;;:11;:19;;;;;;;;20926:10;38955:33;;;;;;;;39007:26;;;;38999:79;;;;-1:-1:-1;;;38999:79:0;;4899:2:1;38999:79:0;;;4881:21:1;4938:2;4918:18;;;4911:30;4977:34;4957:18;;;4950:62;-1:-1:-1;;;5028:18:1;;;5021:38;5076:19;;38999:79:0;;;;;;;;;39089:57;39098:6;20926:10;39120:25;39139:6;39120:16;:25;:::i;:::-;39089:8;:57::i;:::-;-1:-1:-1;39166:4:0;;38756:422;-1:-1:-1;;;;38756:422:0:o;39186:215::-;20926:10;39274:4;39323:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;39323:34:0;;;;;;;;;;39274:4;;39291:80;;39314:7;;39323:47;;39360:10;;39323:47;:::i;43732:192::-;22181:13;:11;:13::i;:::-;43831:17:::1;:36:::0;;;;43878:18:::1;:38:::0;43732:192::o;43605:119::-;22181:13;:11;:13::i;:::-;-1:-1:-1;;;;;43688:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;43688:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;43605:119::o;22943:103::-;22181:13;:11;:13::i;:::-;23008:30:::1;23035:1;23008:18;:30::i;:::-;22943:103::o:0;37767:104::-;37823:13;37856:7;37849:14;;;;;:::i;39409:377::-;20926:10;39502:4;39546:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;39546:34:0;;;;;;;;;;39599:35;;;;39591:85;;;;-1:-1:-1;;;39591:85:0;;5703:2:1;39591:85:0;;;5685:21:1;5742:2;5722:18;;;5715:30;5781:34;5761:18;;;5754:62;-1:-1:-1;;;5832:18:1;;;5825:35;5877:19;;39591:85:0;5501:401:1;39591:85:0;39687:67;20926:10;39710:7;39719:34;39738:15;39719:16;:34;:::i;39687:67::-;-1:-1:-1;39774:4:0;;39409:377;-1:-1:-1;;;39409:377:0:o;38237:175::-;38323:4;38340:42;20926:10;38364:9;38375:6;38340:9;:42::i;42956:148::-;22181:13;:11;:13::i;:::-;43044:12:::1;:52:::0;;-1:-1:-1;;;;;;43044:52:0::1;-1:-1:-1::0;;;;;43044:52:0;;;::::1;::::0;;;::::1;::::0;;42956:148::o;23201:201::-;22181:13;:11;:13::i;:::-;-1:-1:-1;;;;;23290:22:0;::::1;23282:73;;;::::0;-1:-1:-1;;;23282:73:0;;6109:2:1;23282:73:0::1;::::0;::::1;6091:21:1::0;6148:2;6128:18;;;6121:30;6187:34;6167:18;;;6160:62;-1:-1:-1;;;6238:18:1;;;6231:36;6284:19;;23282:73:0::1;5907:402:1::0;23282:73:0::1;23366:28;23385:8;23366:18;:28::i;43238:355::-:0;22181:13;:11;:13::i;:::-;-1:-1:-1;;;;;43334:23:0;::::1;43352:4;43334:23;::::0;::::1;::::0;:44:::1;;;43371:7;-1:-1:-1::0;;;;;43361:17:0::1;:6;-1:-1:-1::0;;;;;43361:17:0::1;;;43334:44;43326:53;;;::::0;::::1;;-1:-1:-1::0;;;;;43390:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;43390:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;43434:152:::1;;43461:12;::::0;:32:::1;::::0;-1:-1:-1;;;43461:32:0;;-1:-1:-1;;;;;6514:32:1;;;43461::0::1;::::0;::::1;6496:51:1::0;43461:12:0::1;6563:18:1::0;;;6556:34;43461:12:0;;::::1;::::0;:21:::1;::::0;6469:18:1;;43461:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43238:355:::0;;:::o;43434:152::-:1;43526:12;::::0;-1:-1:-1;;;;;43556:17:0;;::::1;43526:12;43556:17:::0;;;43526:12;43556:17:::1;::::0;;;;;;;43526:48;;-1:-1:-1;;;43526:48:0;;::::1;::::0;::::1;6496:51:1::0;;;;6563:18;;;6556:34;43526:12:0;::::1;::::0;:21:::1;::::0;6469:18:1;;43526:48:0::1;6314:282:1::0;42382:346:0;-1:-1:-1;;;;;42484:19:0;;42476:68;;;;-1:-1:-1;;;42476:68:0;;7082:2:1;42476:68:0;;;7064:21:1;7121:2;7101:18;;;7094:30;7160:34;7140:18;;;7133:62;-1:-1:-1;;;7211:18:1;;;7204:34;7255:19;;42476:68:0;6880:400:1;42476:68:0;-1:-1:-1;;;;;42563:21:0;;42555:68;;;;-1:-1:-1;;;42555:68:0;;7487:2:1;42555:68:0;;;7469:21:1;7526:2;7506:18;;;7499:30;7565:34;7545:18;;;7538:62;-1:-1:-1;;;7616:18:1;;;7609:32;7658:19;;42555:68:0;7285:398:1;42555:68:0;-1:-1:-1;;;;;42636:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42688:32;;1361:25:1;;;42688:32:0;;1334:18:1;42688:32:0;;;;;;;42382:346;;;:::o;44070:392::-;36498:6;:13;;-1:-1:-1;;36498:13:0;36507:4;36498:13;;;44213:12:::1;::::0;44178:49:::1;::::0;-1:-1:-1;;;44178:49:0;;-1:-1:-1;;;;;44213:12:0;;::::1;44178:49;::::0;::::1;1543:51:1::0;-1:-1:-1;;44185:8:0::1;44178:26;::::0;::::1;::::0;1516:18:1;;44178:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44153:74;;44238:39;44256:20;44238:17;:39::i;:::-;44352:12;::::0;44317:49:::1;::::0;-1:-1:-1;;;44317:49:0;;-1:-1:-1;;;;;44352:12:0;;::::1;44317:49;::::0;::::1;1543:51:1::0;44288:26:0::1;::::0;44369:14;;44324:8:::1;44317:26:::0;;::::1;::::0;::::1;::::0;1516:18:1;;44317:49:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;44400:12;::::0;:43:::1;::::0;-1:-1:-1;;;44400:43:0;;::::1;::::0;::::1;1361:25:1::0;;;44288:95:0;;-1:-1:-1;;;;;;44400:12:0::1;::::0;:23:::1;::::0;1334:18:1;;44400:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;44396:59:::0;-1:-1:-1;;36534:6:0;:14;;-1:-1:-1;;36534:14:0;;;-1:-1:-1;44070:392:0:o;39794:1732::-;-1:-1:-1;;;;;39900:20:0;;39892:70;;;;-1:-1:-1;;;39892:70:0;;8079:2:1;39892:70:0;;;8061:21:1;8118:2;8098:18;;;8091:30;8157:34;8137:18;;;8130:62;-1:-1:-1;;;8208:18:1;;;8201:35;8253:19;;39892:70:0;7877:401:1;39892:70:0;-1:-1:-1;;;;;39981:23:0;;39973:71;;;;-1:-1:-1;;;39973:71:0;;8485:2:1;39973:71:0;;;8467:21:1;8524:2;8504:18;;;8497:30;8563:34;8543:18;;;8536:62;-1:-1:-1;;;8614:18:1;;;8607:33;8657:19;;39973:71:0;8283:399:1;39973:71:0;40072:1;40063:6;:10;40055:64;;;;-1:-1:-1;;;40055:64:0;;8889:2:1;40055:64:0;;;8871:21:1;8928:2;8908:18;;;8901:30;8967:34;8947:18;;;8940:62;-1:-1:-1;;;9018:18:1;;;9011:39;9067:19;;40055:64:0;8687:405:1;40055:64:0;40181:4;40132:28;38203:18;;;:9;:18;;;;;;40259:24;;40235:48;;;;;;;40298:30;;-1:-1:-1;40322:6:0;;;;40321:7;40298:30;:51;;;;;40342:7;-1:-1:-1;;;;;40332:17:0;:6;-1:-1:-1;;;;;40332:17:0;;;40298:51;40294:183;;;40389:24;;40366:47;;40428:37;40444:20;40428:15;:37::i;:::-;-1:-1:-1;;;;;43199:19:0;;40549:17;43199:19;;;:11;:19;;;;;;;;43198:20;40595:49;;;;-1:-1:-1;;;;;;43199:19:0;;43174:4;43199:19;;;:11;:19;;;;;;;;43198:20;40620:24;40591:285;;;40679:7;-1:-1:-1;;;;;40666:20:0;:9;-1:-1:-1;;;;;40666:20:0;;40662:203;;40757:5;40736:18;;40727:6;:27;;;;:::i;:::-;:35;;;;:::i;:::-;40715:47;;40662:203;;;40844:5;40824:17;;40815:6;:26;;;;:::i;:::-;:34;;;;:::i;:::-;40803:46;;40662:203;-1:-1:-1;;;;;40920:17:0;;40896:21;40920:17;;;:9;:17;;;;;;40956:23;;;;40948:74;;;;-1:-1:-1;;;40948:74:0;;9694:2:1;40948:74:0;;;9676:21:1;9733:2;9713:18;;;9706:30;9772:34;9752:18;;;9745:62;-1:-1:-1;;;9823:18:1;;;9816:36;9869:19;;40948:74:0;9492:402:1;40948:74:0;41053:22;41069:6;41053:13;:22;:::i;:::-;-1:-1:-1;;;;;41033:17:0;;;;;;:9;:17;;;;;:42;41110:18;41119:9;41110:6;:18;:::i;:::-;-1:-1:-1;;;;;41086:20:0;;;;;;:9;:20;;;;;:42;;:20;;;:42;;;;;:::i;:::-;;;;-1:-1:-1;;41143:13:0;;41139:41;;41158:22;41170:9;41158:11;:22::i;:::-;-1:-1:-1;;;;;41198:24:0;;;;;;:16;:24;;;;;;;;41193:121;;41243:12;;-1:-1:-1;;;;;41273:17:0;;;41243:12;41273:17;;;41243:12;41273:17;;;;;;;;41243:48;;-1:-1:-1;;;41243:48:0;;;;;6496:51:1;;;;6563:18;;;6556:34;41243:12:0;;;:21;;6469:18:1;;41243:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41239:64;;-1:-1:-1;;;;;41329:27:0;;;;;;:16;:27;;;;;;;;41324:130;;41377:12;;-1:-1:-1;;;;;41410:20:0;;;41377:12;41410:20;;;41377:12;41410:20;;;;;;;;41377:54;;-1:-1:-1;;;41377:54:0;;;;;6496:51:1;;;;6563:18;;;6556:34;41377:12:0;;;:21;;6469:18:1;;41377:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41373:70;;-1:-1:-1;;;;;41471:47:0;;;;;;;41499:18;41508:9;41499:6;:18;:::i;:::-;41471:47;;1361:25:1;;;1349:2;1334:18;41471:47:0;;;;;;;39881:1645;;;;39794:1732;;;:::o;22460:132::-;22341:7;22368:6;-1:-1:-1;;;;;22368:6:0;20926:10;22524:23;22516:68;;;;-1:-1:-1;;;22516:68:0;;10101:2:1;22516:68:0;;;10083:21:1;;;10120:18;;;10113:30;10179:34;10159:18;;;10152:62;10231:18;;22516:68:0;9899:356:1;23562:191:0;23636:16;23655:6;;-1:-1:-1;;;;;23672:17:0;;;-1:-1:-1;;;;;;23672:17:0;;;;;;23705:40;;23655:6;;;;;;;23705:40;;23636:16;23705:40;23625:128;23562:191;:::o;44470:576::-;44622:16;;;44636:1;44622:16;;;;;;;;44598:21;;44622:16;;;;;;;;;;-1:-1:-1;44622:16:0;44598:40;;44667:4;44649;44654:1;44649:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;44649:23:0;;;-1:-1:-1;;;;;44649:23:0;;;;;44693:8;44683:4;44688:1;44683:7;;;;;;;;:::i;:::-;;;;;;:18;-1:-1:-1;;;;;44683:18:0;;;-1:-1:-1;;;;;44683:18:0;;;;;44714:56;44731:4;44746:9;44758:11;44714:8;:56::i;:::-;44984:12;;44809:229;;-1:-1:-1;;;44809:229:0;;-1:-1:-1;;;;;44809:9:0;:63;;;;;:229;;44887:11;;44913:1;;44957:4;;44984:12;;;;;45012:15;;44809:229;;;:::i;43932:130::-;44036:4;44018:24;;;;:9;:24;;;;;;:36;;44045:9;;44018:36;:::i;:::-;44009:4;43991:24;;;;:9;:24;;;;;:63;-1:-1:-1;43932:130:0:o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;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:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1605:456::-;1682:6;1690;1698;1751:2;1739:9;1730:7;1726:23;1722:32;1719:52;;;1767:1;1764;1757:12;1719:52;1806:9;1793:23;1825:31;1850:5;1825:31;:::i;:::-;1875:5;-1:-1:-1;1932:2:1;1917:18;;1904:32;1945:33;1904:32;1945:33;:::i;:::-;1605:456;;1997:7;;-1:-1:-1;;;2051:2:1;2036:18;;;;2023:32;;1605:456::o;2489:247::-;2548:6;2601:2;2589:9;2580:7;2576:23;2572:32;2569:52;;;2617:1;2614;2607:12;2569:52;2656:9;2643:23;2675:31;2700:5;2675:31;:::i;:::-;2725:5;2489:247;-1:-1:-1;;;2489:247:1:o;2741:248::-;2809:6;2817;2870:2;2858:9;2849:7;2845:23;2841:32;2838:52;;;2886:1;2883;2876:12;2838:52;-1:-1:-1;;2909:23:1;;;2979:2;2964:18;;;2951:32;;-1:-1:-1;2741:248:1:o;2994:416::-;3059:6;3067;3120:2;3108:9;3099:7;3095:23;3091:32;3088:52;;;3136:1;3133;3126:12;3088:52;3175:9;3162:23;3194:31;3219:5;3194:31;:::i;:::-;3244:5;-1:-1:-1;3301:2:1;3286:18;;3273:32;3343:15;;3336:23;3324:36;;3314:64;;3374:1;3371;3364:12;3314:64;3397:7;3387:17;;;2994:416;;;;;:::o;3659:388::-;3727:6;3735;3788:2;3776:9;3767:7;3763:23;3759:32;3756:52;;;3804:1;3801;3794:12;3756:52;3843:9;3830:23;3862:31;3887:5;3862:31;:::i;:::-;3912:5;-1:-1:-1;3969:2:1;3954:18;;3941:32;3982:33;3941:32;3982:33;:::i;4312:380::-;4391:1;4387:12;;;;4434;;;4455:61;;4509:4;4501:6;4497:17;4487:27;;4455:61;4562:2;4554:6;4551:14;4531:18;4528:38;4525:161;;4608:10;4603:3;4599:20;4596:1;4589:31;4643:4;4640:1;4633:15;4671:4;4668:1;4661:15;4525:161;;4312:380;;;:::o;5106:127::-;5167:10;5162:3;5158:20;5155:1;5148:31;5198:4;5195:1;5188:15;5222:4;5219:1;5212:15;5238:128;5305:9;;;5326:11;;;5323:37;;;5340:18;;:::i;5371:125::-;5436:9;;;5457:10;;;5454:36;;;5470:18;;:::i;7688:184::-;7758:6;7811:2;7799:9;7790:7;7786:23;7782:32;7779:52;;;7827:1;7824;7817:12;7779:52;-1:-1:-1;7850:16:1;;7688:184;-1:-1:-1;7688:184:1:o;9097:168::-;9170:9;;;9201;;9218:15;;;9212:22;;9198:37;9188:71;;9239:18;;:::i;9270:217::-;9310:1;9336;9326:132;;9380:10;9375:3;9371:20;9368:1;9361:31;9415:4;9412:1;9405:15;9443:4;9440:1;9433:15;9326:132;-1:-1:-1;9472:9:1;;9270:217::o;10392:127::-;10453:10;10448:3;10444:20;10441:1;10434:31;10484:4;10481:1;10474:15;10508:4;10505:1;10498:15;10524:980;10786:4;10834:3;10823:9;10819:19;10865:6;10854:9;10847:25;10891:2;10929:6;10924:2;10913:9;10909:18;10902:34;10972:3;10967:2;10956:9;10952:18;10945:31;10996:6;11031;11025:13;11062:6;11054;11047:22;11100:3;11089:9;11085:19;11078:26;;11139:2;11131:6;11127:15;11113:29;;11160:1;11170:195;11184:6;11181:1;11178:13;11170:195;;;11249:13;;-1:-1:-1;;;;;11245:39:1;11233:52;;11340:15;;;;11305:12;;;;11281:1;11199:9;11170:195;;;-1:-1:-1;;;;;;;11421:32:1;;;;11416:2;11401:18;;11394:60;-1:-1:-1;;;11485:3:1;11470:19;11463:35;11382:3;10524:980;-1:-1:-1;;;10524:980:1:o

Swarm Source

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