ETH Price: $3,589.48 (-0.79%)

Token

ERC-20: Ponzi ($PONZI)
 

Overview

Max Total Supply

18,820,303 $PONZI

Holders

195

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
*猛一金狗在哪里.eth
Balance
2,028.918446104551447162 $PONZI

Value
$0.00
0x1e4B024b804b6136BEb0a561f566ab0adaB2e211
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-01
*/

// 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: contracts/Ponzi/PonziToken/DividendDistributor.sol


pragma solidity ^0.8.7;


contract DividendDistributor {
    address public TOKEN;
    IERC20 public USDT;
    
    struct Share {
        uint256 amount;
        uint256 excluded;
        uint256 rewardConfirmed;
        uint256 rewardClaimed;
    }

    address[] public shareholders;
    mapping(address => uint256) public shareholderIndexes;
    
    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);
        _;
    }
    constructor(address USDTToken) {
        TOKEN = msg.sender;
        USDT = IERC20(USDTToken);
        dividendsPerShareAccuracyFactor = 10**36;
    }

    function getTotalShareHoldersAmount() public view returns (uint256) {
        return shareholders.length;
    }
    
    function depositUSDT(uint256 amount) public onlyToken {
        totalDividends = totalDividends + amount;
        dividendsPerShare = dividendsPerShare + dividendsPerShareAccuracyFactor * amount / totalShares;
    }

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

        if (tokenAmount > 0 && shares[shareholder].amount == 0) {
            addShareholder(shareholder);
        }else if (tokenAmount == 0 && shares[shareholder].amount > 0) {
            removeShareholder(shareholder);
        }

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

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

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

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length - 1];
        shareholderIndexes[shareholders[shareholders.length - 1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

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

        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed + amount;
            shares[shareholder].rewardConfirmed = 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(address shareholder) public onlyToken {
        distributeDividend(shareholder);
        require(shares[shareholder].rewardConfirmed > 0, "Nothing Rewards");

        USDT.transfer(shareholder, shares[shareholder].rewardConfirmed);
        shares[shareholder].rewardClaimed = shares[shareholder].rewardClaimed + shares[shareholder].rewardConfirmed;
        shares[shareholder].rewardConfirmed = 0;
    }
}

// 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 = 10000; // 100%
    DividendDistributor public _distributor;

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

    address public immutable USDTToken;
    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%

        USDTToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // Mainnet
        // IUniswapV2Router02 _DEXRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //UniswapV2 Router
        IUniswapV2Router02 _DEXRouter = IUniswapV2Router02(0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F); //SushiSwap Router
        DEXPair = IUniswapV2Factory(_DEXRouter.factory()).createPair(address(this), USDTToken);
        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(USDTToken);
    }

    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 && msg.sender != DEXPair) {
            contractTokenBalance = _minimumTokensBeforeSwap;
            swapTokensToUSDT(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 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(uint8 feePercentForBuy, uint8 feePercentForSell) external onlyOwner {
        _feePercentForBuy = feePercentForBuy;
        _feePercentForSell = feePercentForSell;
    }

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

    /*
    function swapTokens(uint256 contractTokenBalance) private swapping {
       
        uint256 initialBalance = address(this).balance;
        _swapTokensForETH(contractTokenBalance);
        uint256 transferredBalance = address(this).balance - initialBalance;

        //Send ETH to Fee Address
        payable(_distributor).transfer(transferredBalance);
    }
    */

    function swapTokensToUSDT(uint256 contractTokenBalance) private swapping {
        uint256 initialBalance = IERC20(USDTToken).balanceOf(address(_distributor));
        _swapTokensForUSDT(contractTokenBalance);
        uint256 transferredBalance = IERC20(USDTToken).balanceOf(address(_distributor)) - initialBalance;

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

    /*
    function _swapTokensForETH(uint256 tokenAmount) internal {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = DEXRouter.WETH();

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

        // make the swap
        DEXRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
    */

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

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

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

    function claimRewards() external {
        _distributor.claimRewards(msg.sender);

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool overMinTokenBalance = contractTokenBalance >= _minimumTokensBeforeSwap;
        if (overMinTokenBalance) {
            contractTokenBalance = _minimumTokensBeforeSwap;
            swapTokensToUSDT(contractTokenBalance);
        }
    }

    function distributeFeeToUSDT() external {
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance > 0) swapTokensToUSDT(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":"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":"USDTToken","outputs":[{"internalType":"address","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":"claimRewards","outputs":[],"stateMutability":"nonpayable","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":"distributeFeeToUSDT","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":"uint8","name":"feePercentForBuy","type":"uint8"},{"internalType":"uint8","name":"feePercentForSell","type":"uint8"}],"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"}]

610120604052600560e090815264506f6e7a6960d81b6101005260049062000028908262000502565b5060408051808201909152600681526524504f4e5a4960d01b602082015260059062000055908262000502565b506006805460ff191660121790556106d66007556127106008553480156200007c57600080fd5b50620000883362000313565b620000b633600654620000a09060ff16600a620006e3565b620000b09063011f2ccf620006fb565b62000363565b612710600354620000c8919062000715565b600c5573dac17f958d2ee523a2206206994597c13d831ec76080526040805163c45a015560e01b8152905173d9e1ce17f2641f24ae83637ab66a2cca9c378b9f91829163c45a0155916004808201926020929091908290030181865afa15801562000137573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200015d919062000738565b6080516040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620001af573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d5919062000738565b6001600160a01b0390811660c081905290821660a0819052336000908152600a602090815260408083208054600160ff1991821681179092553080865283862080548316841790557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb8054831684179055878652600b85528386208054831684179055855282852080548216831790557f44433eeeda1d04bdae79f62169cdb2ab0a6af287fa15706d3fafdbac5fac3415805490911690911790556003546002835281842094845293909152808220839055928152829020556080519051620002be9062000450565b6001600160a01b039091168152602001604051809103906000f080158015620002eb573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b03929092169190911790555062000779565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003be5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620003d2919062000763565b90915550506001600160a01b038216600090815260016020526040812080548392906200040190849062000763565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b610b708062001de983390190565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200048957607f821691505b602082108103620004aa57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200044b57600081815260208120601f850160051c81016020861015620004d95750805b601f850160051c820191505b81811015620004fa57828155600101620004e5565b505050505050565b81516001600160401b038111156200051e576200051e6200045e565b62000536816200052f845462000474565b84620004b0565b602080601f8311600181146200056e5760008415620005555750858301515b600019600386901b1c1916600185901b178555620004fa565b600085815260208120601f198616915b828110156200059f578886015182559484019460019091019084016200057e565b5085821015620005be5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000625578160001904821115620006095762000609620005ce565b808516156200061757918102915b93841c9390800290620005e9565b509250929050565b6000826200063e57506001620006dd565b816200064d57506000620006dd565b8160018114620006665760028114620006715762000691565b6001915050620006dd565b60ff841115620006855762000685620005ce565b50506001821b620006dd565b5060208310610133831016604e8410600b8410161715620006b6575081810a620006dd565b620006c28383620005e4565b8060001904821115620006d957620006d9620005ce565b0290505b92915050565b6000620006f460ff8416836200062d565b9392505050565b8082028115828204841417620006dd57620006dd620005ce565b6000826200073357634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156200074b57600080fd5b81516001600160a01b0381168114620006f457600080fd5b80820180821115620006dd57620006dd620005ce565b60805160a05160c051611608620007e16000396000818161020b0152818161082c01528181610be50152610c640152600081816102830152818161126601526112a50152600081816103a301528181610f6301528181611000015261120e01526116086000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063658d4b7f116100f9578063a9059cbb11610097578063cf15bbdc11610071578063cf15bbdc146103d8578063dd62ed3e146103e0578063f2fde38b14610419578063f708a64f1461042c57600080fd5b8063a9059cbb1461038b578063ac4b457a1461039e578063b76cde27146103c557600080fd5b806389cc145a116100d357806389cc145a1461034c5780638da5cb5b1461035f57806395d89b4114610370578063a457c2d71461037857600080fd5b8063658d4b7f1461030857806370a082311461031b578063715018a61461034457600080fd5b806323b872dd11610166578063372500ab11610140578063372500ab146102a557806339509351146102af5780633f4218e0146102c25780634355855a146102e557600080fd5b806323b872dd14610256578063313ce567146102695780633211a83d1461027e57600080fd5b806306fdde03146101ae578063095ea7b3146101cc578063100a87bc146101ef578063179795dd1461020657806318160ddd1461024557806320e493e51461024d575b600080fd5b6101b661043f565b6040516101c391906112e7565b60405180910390f35b6101df6101da366004611351565b6104d1565b60405190151581526020016101c3565b6101f860075481565b6040519081526020016101c3565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101c3565b6003546101f8565b6101f860085481565b6101df61026436600461137b565b6104e8565b60065460405160ff90911681526020016101c3565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b6102ad61059e565b005b6101df6102bd366004611351565b61062b565b6101df6102d03660046113b7565b600a6020526000908152604090205460ff1681565b6101df6102f33660046113b7565b600b6020526000908152604090205460ff1681565b6102ad6103163660046113d9565b610662565b6101f86103293660046113b7565b6001600160a01b031660009081526001602052604090205490565b6102ad610695565b6102ad61035a366004611426565b6106a9565b6000546001600160a01b031661022d565b6101b66106bf565b6101df610386366004611351565b6106ce565b6101df610399366004611351565b610769565b61022d7f000000000000000000000000000000000000000000000000000000000000000081565b60095461022d906001600160a01b031681565b6102ad610776565b6101f86103ee366004611459565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6102ad6104273660046113b7565b610798565b6102ad61043a3660046113d9565b61080e565b60606004805461044e90611483565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611483565b80156104c75780601f1061049c576101008083540402835291602001916104c7565b820191906000526020600020905b8154815290600101906020018083116104aa57829003601f168201915b5050505050905090565b60006104de338484610960565b5060015b92915050565b60006104f5848484610a84565b6001600160a01b03841660009081526002602090815260408083203384529091529020548281101561057f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610593853361058e86856114d3565b610960565b506001949350505050565b600954604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c90602401600060405180830381600087803b1580156105e357600080fd5b505af11580156105f7573d6000803e3d6000fd5b505030600090815260016020526040902054600c5490925082108015915061062757600c54915061062782610f31565b5050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104de91859061058e9086906114e6565b61066a6110df565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61069d6110df565b6106a76000611139565b565b6106b16110df565b60ff91821660075516600855565b60606005805461044e90611483565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156107505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610576565b61075f338561058e86856114d3565b5060019392505050565b60006104de338484610a84565b3060009081526001602052604090205480156107955761079581610f31565b50565b6107a06110df565b6001600160a01b0381166108055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610576565b61079581611139565b6108166110df565b6001600160a01b038216301480159061086157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b61086a57600080fd5b6001600160a01b0382166000908152600b60205260409020805460ff1916821580159190911790915561090257600954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b505050505050565b6009546001600160a01b0383811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156108e657600080fd5b6001600160a01b0383166109c25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610576565b6001600160a01b038216610a235760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610576565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610ae85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610576565b6001600160a01b038216610b4a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610576565b60008111610bac5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610576565b30600090815260016020526040902054600c5481108015908190610bd35750600d5460ff16155b8015610c085750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b15610c1b57600c549150610c1b82610f31565b6001600160a01b0385166000908152600a602052604081205460ff16158015610c5d57506001600160a01b0385166000908152600a602052604090205460ff16155b15610cdb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603610cbd5761271060085485610cac91906114f9565b610cb69190611510565b9050610cdb565b61271060075485610cce91906114f9565b610cd89190611510565b90505b6001600160a01b03861660009081526001602052604090205484811015610d535760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610576565b610d5d85826114d3565b6001600160a01b038816600090815260016020526040902055610d8082866114d3565b6001600160a01b03871660009081526001602052604081208054909190610da89084906114e6565b90915550508115610dbc57610dbc82611189565b6001600160a01b0387166000908152600b602052604090205460ff16610e4d576009546001600160a01b0388811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610e3a57600080fd5b505af1925050508015610e4b575060015b505b6001600160a01b0386166000908152600b602052604090205460ff16610ede576009546001600160a01b0387811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610ecb57600080fd5b505af1925050508015610edc575060015b505b6001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610f1785896114d3565b60405190815260200160405180910390a350505050505050565b600d805460ff191660011790556009546040516370a0823160e01b81526001600160a01b0391821660048201526000917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce9190611532565b9050610fd9826111b7565b6009546040516370a0823160e01b81526001600160a01b03918216600482015260009183917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190611532565b61107791906114d3565b60095460405163e7c80f1760e01b8152600481018390529192506001600160a01b03169063e7c80f1790602401600060405180830381600087803b1580156110be57600080fd5b505af19250505080156110cf575060015b505050600d805460ff1916905550565b6000546001600160a01b031633146106a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610576565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b306000908152600160205260409020546111a49082906114e6565b3060009081526001602052604090205550565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106111ec576111ec61154b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106112405761124061154b565b60200260200101906001600160a01b031690816001600160a01b03168152505061128b307f000000000000000000000000000000000000000000000000000000000000000084610960565b600954604051635c11d79560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811692635c11d795926108cc928792600092889291909116904290600401611561565b600060208083528351808285015260005b81811015611314578581018301518582016040015282016112f8565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461134c57600080fd5b919050565b6000806040838503121561136457600080fd5b61136d83611335565b946020939093013593505050565b60008060006060848603121561139057600080fd5b61139984611335565b92506113a760208501611335565b9150604084013590509250925092565b6000602082840312156113c957600080fd5b6113d282611335565b9392505050565b600080604083850312156113ec57600080fd5b6113f583611335565b91506020830135801515811461140a57600080fd5b809150509250929050565b803560ff8116811461134c57600080fd5b6000806040838503121561143957600080fd5b61144283611415565b915061145060208401611415565b90509250929050565b6000806040838503121561146c57600080fd5b61147583611335565b915061145060208401611335565b600181811c9082168061149757607f821691505b6020821081036114b757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104e2576104e26114bd565b808201808211156104e2576104e26114bd565b80820281158282048414176104e2576104e26114bd565b60008261152d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561154457600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156115b15784516001600160a01b03168352938301939183019160010161158c565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c7ee9b3c0a6ee7ac8006130503c22f7a0dcfff9593865abf642aacffc4ae393f64736f6c63430008110033608060405234801561001057600080fd5b50604051610b70380380610b7083398101604081905261002f91610075565b60008054336001600160a01b031991821617909155600180549091166001600160a01b03929092169190911790556ec097ce7bc90715b34b9f10000000006009556100a5565b60006020828403121561008757600080fd5b81516001600160a01b038116811461009e57600080fd5b9392505050565b610abc806100b46000396000f3fe6080604052600436106100f75760003560e01c8063c54e44eb1161008a578063e7c80f1711610059578063e7c80f17146102f0578063ef5cfb8c14610310578063efca2eed14610330578063f0a551791461034657600080fd5b8063c54e44eb1461022b578063ce7c2ac21461024b578063d4fda1f2146102ad578063e2d2e219146102da57600080fd5b806382bfefc8116100c657806382bfefc814610184578063997664d7146101bc578063ab377daa146101d2578063b9e35db0146101f257600080fd5b806311ce023d1461010357806314b6ca961461012c5780633a98ef391461014e57806369a69e291461016457600080fd5b366100fe57005b600080fd5b34801561010f57600080fd5b5061011960095481565b6040519081526020015b60405180910390f35b34801561013857600080fd5b5061014c61014736600461095e565b61035b565b005b34801561015a57600080fd5b5061011960055481565b34801561017057600080fd5b5061011961017f366004610988565b6104d3565b34801561019057600080fd5b506000546101a4906001600160a01b031681565b6040516001600160a01b039091168152602001610123565b3480156101c857600080fd5b5061011960065481565b3480156101de57600080fd5b506101a46101ed3660046109aa565b61050a565b3480156101fe57600080fd5b5061011961020d366004610988565b6001600160a01b031660009081526004602052604090206003015490565b34801561023757600080fd5b506001546101a4906001600160a01b031681565b34801561025757600080fd5b5061028d610266366004610988565b60046020526000908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610123565b3480156102b957600080fd5b506101196102c8366004610988565b60036020526000908152604090205481565b3480156102e657600080fd5b5061011960085481565b3480156102fc57600080fd5b5061014c61030b3660046109aa565b610534565b34801561031c57600080fd5b5061014c61032b366004610988565b61058a565b34801561033c57600080fd5b5061011960075481565b34801561035257600080fd5b50600254610119565b6000546001600160a01b0316331461037257600080fd5b6001600160a01b0382166000908152600460205260409020541561039957610399826106ea565b6000811180156103bf57506001600160a01b038216600090815260046020526040902054155b1561042557600280546001600160a01b0384166000818152600360205260408120839055600183018455929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319169091179055610458565b8015801561044a57506001600160a01b03821660009081526004602052604090205415155b156104585761045882610785565b6001600160a01b038216600090815260046020526040902054600554829161047f916109d9565b61048991906109ec565b6005556001600160a01b03821660009081526004602052604090208190556104b08161089a565b6001600160a01b0390921660009081526004602052604090206001019190915550565b60006104de826108b7565b6001600160a01b03831660009081526004602052604090206002015461050491906109ec565b92915050565b6002818154811061051a57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b0316331461054b57600080fd5b8060065461055991906109ec565b60065560055460095461056d9083906109ff565b6105779190610a16565b60085461058491906109ec565b60085550565b6000546001600160a01b031633146105a157600080fd5b6105aa816106ea565b6001600160a01b0381166000908152600460205260409020600201546106085760405162461bcd60e51b815260206004820152600f60248201526e4e6f7468696e67205265776172647360881b604482015260640160405180910390fd5b6001546001600160a01b0382811660008181526004602081905260409182902060020154915163a9059cbb60e01b815290810192909252602482015291169063a9059cbb906044016020604051808303816000875af115801561066f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106939190610a38565b506001600160a01b038116600090815260046020526040902060028101546003909101546106c191906109ec565b6001600160a01b0390911660009081526004602052604081206003810192909255600290910155565b6001600160a01b038116600090815260046020526040812054900361070c5750565b6000610717826108b7565b90508015610781578060075461072d91906109ec565b6007556001600160a01b0382166000908152600460205260409020600201546107579082906109ec565b6001600160a01b03831660009081526004602052604090206002810191909155546104b09061089a565b5050565b60028054610795906001906109d9565b815481106107a5576107a5610a5a565b60009182526020808320909101546001600160a01b03848116845260039092526040909220546002805492909316929181106107e3576107e3610a5a565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394851617905591831681526003918290526040812054600280549193929161082f906001906109d9565b8154811061083f5761083f610a5a565b60009182526020808320909101546001600160a01b03168352820192909252604001902055600280548061087557610875610a70565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000600954600854836108ad91906109ff565b6105049190610a16565b6001600160a01b03811660009081526004602052604081205481036108de57506000919050565b6001600160a01b0382166000908152600460205260408120546109009061089a565b6001600160a01b038416600090815260046020526040902060010154909150808211610930575060009392505050565b61093a81836109d9565b949350505050565b80356001600160a01b038116811461095957600080fd5b919050565b6000806040838503121561097157600080fd5b61097a83610942565b946020939093013593505050565b60006020828403121561099a57600080fd5b6109a382610942565b9392505050565b6000602082840312156109bc57600080fd5b5035919050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610504576105046109c3565b80820180821115610504576105046109c3565b8082028115828204841417610504576105046109c3565b600082610a3357634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610a4a57600080fd5b815180151581146109a357600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fdfea26469706673582212201872aefa262f7d5c14a11886251db4117448f11d059e4bf50f5978095683d08f64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c8063658d4b7f116100f9578063a9059cbb11610097578063cf15bbdc11610071578063cf15bbdc146103d8578063dd62ed3e146103e0578063f2fde38b14610419578063f708a64f1461042c57600080fd5b8063a9059cbb1461038b578063ac4b457a1461039e578063b76cde27146103c557600080fd5b806389cc145a116100d357806389cc145a1461034c5780638da5cb5b1461035f57806395d89b4114610370578063a457c2d71461037857600080fd5b8063658d4b7f1461030857806370a082311461031b578063715018a61461034457600080fd5b806323b872dd11610166578063372500ab11610140578063372500ab146102a557806339509351146102af5780633f4218e0146102c25780634355855a146102e557600080fd5b806323b872dd14610256578063313ce567146102695780633211a83d1461027e57600080fd5b806306fdde03146101ae578063095ea7b3146101cc578063100a87bc146101ef578063179795dd1461020657806318160ddd1461024557806320e493e51461024d575b600080fd5b6101b661043f565b6040516101c391906112e7565b60405180910390f35b6101df6101da366004611351565b6104d1565b60405190151581526020016101c3565b6101f860075481565b6040519081526020016101c3565b61022d7f000000000000000000000000d6b7406537e43eee23196fafd02021b0c0495bd881565b6040516001600160a01b0390911681526020016101c3565b6003546101f8565b6101f860085481565b6101df61026436600461137b565b6104e8565b60065460405160ff90911681526020016101c3565b61022d7f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b6102ad61059e565b005b6101df6102bd366004611351565b61062b565b6101df6102d03660046113b7565b600a6020526000908152604090205460ff1681565b6101df6102f33660046113b7565b600b6020526000908152604090205460ff1681565b6102ad6103163660046113d9565b610662565b6101f86103293660046113b7565b6001600160a01b031660009081526001602052604090205490565b6102ad610695565b6102ad61035a366004611426565b6106a9565b6000546001600160a01b031661022d565b6101b66106bf565b6101df610386366004611351565b6106ce565b6101df610399366004611351565b610769565b61022d7f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b60095461022d906001600160a01b031681565b6102ad610776565b6101f86103ee366004611459565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6102ad6104273660046113b7565b610798565b6102ad61043a3660046113d9565b61080e565b60606004805461044e90611483565b80601f016020809104026020016040519081016040528092919081815260200182805461047a90611483565b80156104c75780601f1061049c576101008083540402835291602001916104c7565b820191906000526020600020905b8154815290600101906020018083116104aa57829003601f168201915b5050505050905090565b60006104de338484610960565b5060015b92915050565b60006104f5848484610a84565b6001600160a01b03841660009081526002602090815260408083203384529091529020548281101561057f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b610593853361058e86856114d3565b610960565b506001949350505050565b600954604051633bd73ee360e21b81523360048201526001600160a01b039091169063ef5cfb8c90602401600060405180830381600087803b1580156105e357600080fd5b505af11580156105f7573d6000803e3d6000fd5b505030600090815260016020526040902054600c5490925082108015915061062757600c54915061062782610f31565b5050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916104de91859061058e9086906114e6565b61066a6110df565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b61069d6110df565b6106a76000611139565b565b6106b16110df565b60ff91821660075516600855565b60606005805461044e90611483565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156107505760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610576565b61075f338561058e86856114d3565b5060019392505050565b60006104de338484610a84565b3060009081526001602052604090205480156107955761079581610f31565b50565b6107a06110df565b6001600160a01b0381166108055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610576565b61079581611139565b6108166110df565b6001600160a01b038216301480159061086157507f000000000000000000000000d6b7406537e43eee23196fafd02021b0c0495bd86001600160a01b0316826001600160a01b031614155b61086a57600080fd5b6001600160a01b0382166000908152600b60205260409020805460ff1916821580159190911790915561090257600954604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca96906044015b600060405180830381600087803b1580156108e657600080fd5b505af11580156108fa573d6000803e3d6000fd5b505050505050565b6009546001600160a01b0383811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156108e657600080fd5b6001600160a01b0383166109c25760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610576565b6001600160a01b038216610a235760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610576565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610ae85760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610576565b6001600160a01b038216610b4a5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610576565b60008111610bac5760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610576565b30600090815260016020526040902054600c5481108015908190610bd35750600d5460ff16155b8015610c085750336001600160a01b037f000000000000000000000000d6b7406537e43eee23196fafd02021b0c0495bd81614155b15610c1b57600c549150610c1b82610f31565b6001600160a01b0385166000908152600a602052604081205460ff16158015610c5d57506001600160a01b0385166000908152600a602052604090205460ff16155b15610cdb577f000000000000000000000000d6b7406537e43eee23196fafd02021b0c0495bd86001600160a01b0316856001600160a01b031603610cbd5761271060085485610cac91906114f9565b610cb69190611510565b9050610cdb565b61271060075485610cce91906114f9565b610cd89190611510565b90505b6001600160a01b03861660009081526001602052604090205484811015610d535760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610576565b610d5d85826114d3565b6001600160a01b038816600090815260016020526040902055610d8082866114d3565b6001600160a01b03871660009081526001602052604081208054909190610da89084906114e6565b90915550508115610dbc57610dbc82611189565b6001600160a01b0387166000908152600b602052604090205460ff16610e4d576009546001600160a01b0388811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610e3a57600080fd5b505af1925050508015610e4b575060015b505b6001600160a01b0386166000908152600b602052604090205460ff16610ede576009546001600160a01b0387811660008181526001602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015610ecb57600080fd5b505af1925050508015610edc575060015b505b6001600160a01b038087169088167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610f1785896114d3565b60405190815260200160405180910390a350505050505050565b600d805460ff191660011790556009546040516370a0823160e01b81526001600160a01b0391821660048201526000917f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec716906370a0823190602401602060405180830381865afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce9190611532565b9050610fd9826111b7565b6009546040516370a0823160e01b81526001600160a01b03918216600482015260009183917f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7909116906370a0823190602401602060405180830381865afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190611532565b61107791906114d3565b60095460405163e7c80f1760e01b8152600481018390529192506001600160a01b03169063e7c80f1790602401600060405180830381600087803b1580156110be57600080fd5b505af19250505080156110cf575060015b505050600d805460ff1916905550565b6000546001600160a01b031633146106a75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610576565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b306000908152600160205260409020546111a49082906114e6565b3060009081526001602052604090205550565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106111ec576111ec61154b565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7816001815181106112405761124061154b565b60200260200101906001600160a01b031690816001600160a01b03168152505061128b307f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f84610960565b600954604051635c11d79560e01b81526001600160a01b037f000000000000000000000000d9e1ce17f2641f24ae83637ab66a2cca9c378b9f811692635c11d795926108cc928792600092889291909116904290600401611561565b600060208083528351808285015260005b81811015611314578581018301518582016040015282016112f8565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461134c57600080fd5b919050565b6000806040838503121561136457600080fd5b61136d83611335565b946020939093013593505050565b60008060006060848603121561139057600080fd5b61139984611335565b92506113a760208501611335565b9150604084013590509250925092565b6000602082840312156113c957600080fd5b6113d282611335565b9392505050565b600080604083850312156113ec57600080fd5b6113f583611335565b91506020830135801515811461140a57600080fd5b809150509250929050565b803560ff8116811461134c57600080fd5b6000806040838503121561143957600080fd5b61144283611415565b915061145060208401611415565b90509250929050565b6000806040838503121561146c57600080fd5b61147583611335565b915061145060208401611335565b600181811c9082168061149757607f821691505b6020821081036114b757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156104e2576104e26114bd565b808201808211156104e2576104e26114bd565b80820281158282048414176104e2576104e26114bd565b60008261152d57634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561154457600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156115b15784516001600160a01b03168352938301939183019160010161158c565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220c7ee9b3c0a6ee7ac8006130503c22f7a0dcfff9593865abf642aacffc4ae393f64736f6c63430008110033

Deployed Bytecode Sourcemap

29474:10977:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31596:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32516:169;;;;;;:::i;:::-;;:::i;:::-;;;1169:14:1;;1162:22;1144:41;;1132:2;1117:18;32516:169:0;1004:187:1;29949:39:0;;;;;;;;;1342:25:1;;;1330:2;1315:18;29949:39:0;1196:177:1;30308:32:0;;;;;;;;-1:-1:-1;;;;;1542:32:1;;;1524:51;;1512:2;1497:18;30308:32:0;1378:203:1;31923:108:0;32011:12;;31923:108;;30004:41;;;;;;32693:422;;;;;;:::i;:::-;;:::i;31816:99::-;31899:8;;31816:99;;31899:8;;;;2061:36:1;;2049:2;2034:18;31816:99:0;1919:184:1;30256:45:0;;;;;39832:415;;;:::i;:::-;;33123:215;;;;;;:::i;:::-;;:::i;30108:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30158:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37391:119;;;;;;:::i;:::-;;:::i;32039:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32140:18:0;32113:7;32140:18;;;:9;:18;;;;;;;32039:127;20578:103;;;:::i;37518:188::-;;;;;;:::i;:::-;;:::i;19930:87::-;19976:7;20003:6;-1:-1:-1;;;;;20003:6:0;19930:87;;31704:104;;;:::i;33346:377::-;;;;;;:::i;:::-;;:::i;32174:175::-;;;;;;:::i;:::-;;:::i;30215:34::-;;;;;30060:39;;;;;-1:-1:-1;;;;;30060:39:0;;;40255:193;;;:::i;32357:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32473:18:0;;;32446:7;32473:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32357:151;20836:201;;;;;;:::i;:::-;;:::i;37024:355::-;;;;;;:::i;:::-;;:::i;31596:100::-;31650:13;31683:5;31676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31596:100;:::o;32516:169::-;32599:4;32616:39;18561:10;32639:7;32648:6;32616:8;:39::i;:::-;-1:-1:-1;32673:4:0;32516:169;;;;;:::o;32693:422::-;32799:4;32816:36;32826:6;32834:9;32845:6;32816:9;:36::i;:::-;-1:-1:-1;;;;;32892:19:0;;32865:24;32892:19;;;:11;:19;;;;;;;;18561:10;32892:33;;;;;;;;32944:26;;;;32936:79;;;;-1:-1:-1;;;32936:79:0;;4399:2:1;32936:79:0;;;4381:21:1;4438:2;4418:18;;;4411:30;4477:34;4457:18;;;4450:62;-1:-1:-1;;;4528:18:1;;;4521:38;4576:19;;32936:79:0;;;;;;;;;33026:57;33035:6;18561:10;33057:25;33076:6;33057:16;:25;:::i;:::-;33026:8;:57::i;:::-;-1:-1:-1;33103:4:0;;32693:422;-1:-1:-1;;;;32693:422:0:o;39832:415::-;39876:12;;:37;;-1:-1:-1;;;39876:37:0;;39902:10;39876:37;;;1524:51:1;-1:-1:-1;;;;;39876:12:0;;;;:25;;1497:18:1;;39876:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39975:4:0;39926:28;32140:18;;;:9;:18;;;;;;40053:24;;32140:18;;-1:-1:-1;40029:48:0;;;;;-1:-1:-1;40088:152:0;;40151:24;;40128:47;;40190:38;40207:20;40190:16;:38::i;:::-;39865:382;;39832:415::o;33123:215::-;18561:10;33211:4;33260:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33260:34:0;;;;;;;;;;33211:4;;33228:80;;33251:7;;33260:47;;33297:10;;33260:47;:::i;37391:119::-;19816:13;:11;:13::i;:::-;-1:-1:-1;;;;;37474:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;37474:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37391:119::o;20578:103::-;19816:13;:11;:13::i;:::-;20643:30:::1;20670:1;20643:18;:30::i;:::-;20578:103::o:0;37518:188::-;19816:13;:11;:13::i;:::-;37613:36:::1;::::0;;::::1;:17;:36:::0;37660:38:::1;:18;:38:::0;37518:188::o;31704:104::-;31760:13;31793:7;31786:14;;;;;:::i;33346:377::-;18561:10;33439:4;33483:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;33483:34:0;;;;;;;;;;33536:35;;;;33528:85;;;;-1:-1:-1;;;33528:85:0;;5203:2:1;33528:85:0;;;5185:21:1;5242:2;5222:18;;;5215:30;5281:34;5261:18;;;5254:62;-1:-1:-1;;;5332:18:1;;;5325:35;5377:19;;33528:85:0;5001:401:1;33528:85:0;33624:67;18561:10;33647:7;33656:34;33675:15;33656:16;:34;:::i;33624:67::-;-1:-1:-1;33711:4:0;;33346:377;-1:-1:-1;;;33346:377:0:o;32174:175::-;32260:4;32277:42;18561:10;32301:9;32312:6;32277:9;:42::i;40255:193::-;40355:4;40306:28;32140:18;;;:9;:18;;;;;;40376:24;;40372:68;;40402:38;40419:20;40402:16;:38::i;:::-;40295:153;40255:193::o;20836:201::-;19816:13;:11;:13::i;:::-;-1:-1:-1;;;;;20925:22:0;::::1;20917:73;;;::::0;-1:-1:-1;;;20917:73:0;;5609:2:1;20917:73:0::1;::::0;::::1;5591:21:1::0;5648:2;5628:18;;;5621:30;5687:34;5667:18;;;5660:62;-1:-1:-1;;;5738:18:1;;;5731:36;5784:19;;20917:73:0::1;5407:402:1::0;20917:73:0::1;21001:28;21020:8;21001:18;:28::i;37024:355::-:0;19816:13;:11;:13::i;:::-;-1:-1:-1;;;;;37120:23:0;::::1;37138:4;37120:23;::::0;::::1;::::0;:44:::1;;;37157:7;-1:-1:-1::0;;;;;37147:17:0::1;:6;-1:-1:-1::0;;;;;37147:17:0::1;;;37120:44;37112:53;;;::::0;::::1;;-1:-1:-1::0;;;;;37176:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;37176:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;37220:152:::1;;37247:12;::::0;:32:::1;::::0;-1:-1:-1;;;37247:32:0;;-1:-1:-1;;;;;6014:32:1;;;37247::0::1;::::0;::::1;5996:51:1::0;37247:12:0::1;6063:18:1::0;;;6056:34;37247:12:0;;::::1;::::0;:21:::1;::::0;5969:18:1;;37247:32:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;39865:382:::0;;39832:415::o;37220:152::-:1;37312:12;::::0;-1:-1:-1;;;;;37342:17:0;;::::1;37312:12;37342:17:::0;;;37312:12;37342:17:::1;::::0;;;;;;;37312:48;;-1:-1:-1;;;37312:48:0;;::::1;::::0;::::1;5996:51:1::0;;;;6063:18;;;6056:34;37312:12:0;::::1;::::0;:21:::1;::::0;5969:18:1;;37312:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;36324:346:::0;-1:-1:-1;;;;;36426:19:0;;36418:68;;;;-1:-1:-1;;;36418:68:0;;6582:2:1;36418:68:0;;;6564:21:1;6621:2;6601:18;;;6594:30;6660:34;6640:18;;;6633:62;-1:-1:-1;;;6711:18:1;;;6704:34;6755:19;;36418:68:0;6380:400:1;36418:68:0;-1:-1:-1;;;;;36505:21:0;;36497:68;;;;-1:-1:-1;;;36497:68:0;;6987:2:1;36497:68:0;;;6969:21:1;7026:2;7006:18;;;6999:30;7065:34;7045:18;;;7038:62;-1:-1:-1;;;7116:18:1;;;7109:32;7158:19;;36497:68:0;6785:398:1;36497:68:0;-1:-1:-1;;;;;36578:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;36630:32;;1342:25:1;;;36630:32:0;;1315:18:1;36630:32:0;;;;;;;36324:346;;;:::o;33731:1737::-;-1:-1:-1;;;;;33837:20:0;;33829:70;;;;-1:-1:-1;;;33829:70:0;;7390:2:1;33829:70:0;;;7372:21:1;7429:2;7409:18;;;7402:30;7468:34;7448:18;;;7441:62;-1:-1:-1;;;7519:18:1;;;7512:35;7564:19;;33829:70:0;7188:401:1;33829:70:0;-1:-1:-1;;;;;33918:23:0;;33910:71;;;;-1:-1:-1;;;33910:71:0;;7796:2:1;33910:71:0;;;7778:21:1;7835:2;7815:18;;;7808:30;7874:34;7854:18;;;7847:62;-1:-1:-1;;;7925:18:1;;;7918:33;7968:19;;33910:71:0;7594:399:1;33910:71:0;34009:1;34000:6;:10;33992:64;;;;-1:-1:-1;;;33992:64:0;;8200:2:1;33992:64:0;;;8182:21:1;8239:2;8219:18;;;8212:30;8278:34;8258:18;;;8251:62;-1:-1:-1;;;8329:18:1;;;8322:39;8378:19;;33992:64:0;7998:405:1;33992:64:0;34118:4;34069:28;32140:18;;;:9;:18;;;;;;34196:24;;34172:48;;;;;;;34235:30;;-1:-1:-1;34259:6:0;;;;34258:7;34235:30;:55;;;;-1:-1:-1;34269:10:0;-1:-1:-1;;;;;34283:7:0;34269:21;;;34235:55;34231:188;;;34330:24;;34307:47;;34369:38;34386:20;34369:16;:38::i;:::-;-1:-1:-1;;;;;36985:19:0;;34491:17;36985:19;;;:11;:19;;;;;;;;36984:20;34537:49;;;;-1:-1:-1;;;;;;36985:19:0;;36960:4;36985:19;;;:11;:19;;;;;;;;36984:20;34562:24;34533:285;;;34621:7;-1:-1:-1;;;;;34608:20:0;:9;-1:-1:-1;;;;;34608:20:0;;34604:203;;34699:5;34678:18;;34669:6;:27;;;;:::i;:::-;:35;;;;:::i;:::-;34657:47;;34604:203;;;34786:5;34766:17;;34757:6;:26;;;;:::i;:::-;:34;;;;:::i;:::-;34745:46;;34604:203;-1:-1:-1;;;;;34862:17:0;;34838:21;34862:17;;;:9;:17;;;;;;34898:23;;;;34890:74;;;;-1:-1:-1;;;34890:74:0;;9005:2:1;34890:74:0;;;8987:21:1;9044:2;9024:18;;;9017:30;9083:34;9063:18;;;9056:62;-1:-1:-1;;;9134:18:1;;;9127:36;9180:19;;34890:74:0;8803:402:1;34890:74:0;34995:22;35011:6;34995:13;:22;:::i;:::-;-1:-1:-1;;;;;34975:17:0;;;;;;:9;:17;;;;;:42;35052:18;35061:9;35052:6;:18;:::i;:::-;-1:-1:-1;;;;;35028:20:0;;;;;;:9;:20;;;;;:42;;:20;;;:42;;;;;:::i;:::-;;;;-1:-1:-1;;35085:13:0;;35081:41;;35100:22;35112:9;35100:11;:22::i;:::-;-1:-1:-1;;;;;35140:24:0;;;;;;:16;:24;;;;;;;;35135:121;;35185:12;;-1:-1:-1;;;;;35215:17:0;;;35185:12;35215:17;;;35185:12;35215:17;;;;;;;;35185:48;;-1:-1:-1;;;35185:48:0;;;;;5996:51:1;;;;6063:18;;;6056:34;35185:12:0;;;:21;;5969:18:1;;35185:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35181:64;;-1:-1:-1;;;;;35271:27:0;;;;;;:16;:27;;;;;;;;35266:130;;35319:12;;-1:-1:-1;;;;;35352:20:0;;;35319:12;35352:20;;;35319:12;35352:20;;;;;;;;35319:54;;-1:-1:-1;;;35319:54:0;;;;;5996:51:1;;;;6063:18;;;6056:34;35319:12:0;;;:21;;5969:18:1;;35319:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35315:70;;-1:-1:-1;;;;;35413:47:0;;;;;;;35441:18;35450:9;35441:6;:18;:::i;:::-;35413:47;;1342:25:1;;;1330:2;1315:18;35413:47:0;;;;;;;33818:1650;;;;33731:1737;;;:::o;38243:397::-;30459:6;:13;;-1:-1:-1;;30459:13:0;30468:4;30459:13;;;38388:12:::1;::::0;38352:50:::1;::::0;-1:-1:-1;;;38352:50:0;;-1:-1:-1;;;;;38388:12:0;;::::1;38352:50;::::0;::::1;1524:51:1::0;-1:-1:-1;;38359:9:0::1;38352:27;::::0;::::1;::::0;1497:18:1;;38352:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38327:75;;38413:40;38432:20;38413:18;:40::i;:::-;38529:12;::::0;38493:50:::1;::::0;-1:-1:-1;;;38493:50:0;;-1:-1:-1;;;;;38529:12:0;;::::1;38493:50;::::0;::::1;1524:51:1::0;38464:26:0::1;::::0;38546:14;;38500:9:::1;38493:27:::0;;::::1;::::0;::::1;::::0;1497:18:1;;38493:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;;;:::i;:::-;38577:12;::::0;:44:::1;::::0;-1:-1:-1;;;38577:44:0;;::::1;::::0;::::1;1342:25:1::0;;;38464:96:0;;-1:-1:-1;;;;;;38577:12:0::1;::::0;:24:::1;::::0;1315:18:1;;38577:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;38573:60:::0;-1:-1:-1;;30495:6:0;:14;;-1:-1:-1;;30495:14:0;;;-1:-1:-1;38243:397:0:o;20095:132::-;19976:7;20003:6;-1:-1:-1;;;;;20003:6:0;18561:10;20159:23;20151:68;;;;-1:-1:-1;;;20151:68:0;;9601:2:1;20151:68:0;;;9583:21:1;;;9620:18;;;9613:30;9679:34;9659:18;;;9652:62;9731:18;;20151:68:0;9399:356:1;21197:191:0;21271:16;21290:6;;-1:-1:-1;;;;;21307:17:0;;;-1:-1:-1;;;;;;21307:17:0;;;;;;21340:40;;21290:6;;;;;;;21340:40;;21271:16;21340:40;21260:128;21197:191;:::o;37714:130::-;37818:4;37800:24;;;;:9;:24;;;;;;:36;;37827:9;;37800:36;:::i;:::-;37791:4;37773:24;;;;:9;:24;;;;;:63;-1:-1:-1;37714:130:0:o;39245:579::-;39398:16;;;39412:1;39398:16;;;;;;;;39374:21;;39398:16;;;;;;;;;;-1:-1:-1;39398:16:0;39374:40;;39443:4;39425;39430:1;39425:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;39425:23:0;;;-1:-1:-1;;;;;39425:23:0;;;;;39469:9;39459:4;39464:1;39459:7;;;;;;;;:::i;:::-;;;;;;:19;-1:-1:-1;;;;;39459:19:0;;;-1:-1:-1;;;;;39459:19:0;;;;;39491:56;39508:4;39523:9;39535:11;39491:8;:56::i;:::-;39762:12;;39586:230;;-1:-1:-1;;;39586:230:0;;-1:-1:-1;;;;;39586:9:0;:63;;;;;:230;;39664:11;;39690:1;;39735:4;;39762:12;;;;;39790:15;;39586:230;;;:::i;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:173::-;635:20;;-1:-1:-1;;;;;684:31:1;;674:42;;664:70;;730:1;727;720:12;664:70;567:173;;;:::o;745:254::-;813:6;821;874:2;862:9;853:7;849:23;845:32;842:52;;;890:1;887;880:12;842:52;913:29;932:9;913:29;:::i;:::-;903:39;989:2;974:18;;;;961:32;;-1:-1:-1;;;745:254:1:o;1586:328::-;1663:6;1671;1679;1732:2;1720:9;1711:7;1707:23;1703:32;1700:52;;;1748:1;1745;1738:12;1700:52;1771:29;1790:9;1771:29;:::i;:::-;1761:39;;1819:38;1853:2;1842:9;1838:18;1819:38;:::i;:::-;1809:48;;1904:2;1893:9;1889:18;1876:32;1866:42;;1586:328;;;;;:::o;2342:186::-;2401:6;2454:2;2442:9;2433:7;2429:23;2425:32;2422:52;;;2470:1;2467;2460:12;2422:52;2493:29;2512:9;2493:29;:::i;:::-;2483:39;2342:186;-1:-1:-1;;;2342:186:1:o;2533:347::-;2598:6;2606;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:29;2717:9;2698:29;:::i;:::-;2688:39;;2777:2;2766:9;2762:18;2749:32;2824:5;2817:13;2810:21;2803:5;2800:32;2790:60;;2846:1;2843;2836:12;2790:60;2869:5;2859:15;;;2533:347;;;;;:::o;2885:156::-;2951:20;;3011:4;3000:16;;2990:27;;2980:55;;3031:1;3028;3021:12;3046:252;3110:6;3118;3171:2;3159:9;3150:7;3146:23;3142:32;3139:52;;;3187:1;3184;3177:12;3139:52;3210:27;3227:9;3210:27;:::i;:::-;3200:37;;3256:36;3288:2;3277:9;3273:18;3256:36;:::i;:::-;3246:46;;3046:252;;;;;:::o;3547:260::-;3615:6;3623;3676:2;3664:9;3655:7;3651:23;3647:32;3644:52;;;3692:1;3689;3682:12;3644:52;3715:29;3734:9;3715:29;:::i;:::-;3705:39;;3763:38;3797:2;3786:9;3782:18;3763:38;:::i;3812:380::-;3891:1;3887:12;;;;3934;;;3955:61;;4009:4;4001:6;3997:17;3987:27;;3955:61;4062:2;4054:6;4051:14;4031:18;4028:38;4025:161;;4108:10;4103:3;4099:20;4096:1;4089:31;4143:4;4140:1;4133:15;4171:4;4168:1;4161:15;4025:161;;3812:380;;;:::o;4606:127::-;4667:10;4662:3;4658:20;4655:1;4648:31;4698:4;4695:1;4688:15;4722:4;4719:1;4712:15;4738:128;4805:9;;;4826:11;;;4823:37;;;4840:18;;:::i;4871:125::-;4936:9;;;4957:10;;;4954:36;;;4970:18;;:::i;8408:168::-;8481:9;;;8512;;8529:15;;;8523:22;;8509:37;8499:71;;8550:18;;:::i;8581:217::-;8621:1;8647;8637:132;;8691:10;8686:3;8682:20;8679:1;8672:31;8726:4;8723:1;8716:15;8754:4;8751:1;8744:15;8637:132;-1:-1:-1;8783:9:1;;8581:217::o;9210:184::-;9280:6;9333:2;9321:9;9312:7;9308:23;9304:32;9301:52;;;9349:1;9346;9339:12;9301:52;-1:-1:-1;9372:16:1;;9210:184;-1:-1:-1;9210:184:1:o;9892:127::-;9953:10;9948:3;9944:20;9941:1;9934:31;9984:4;9981:1;9974:15;10008:4;10005:1;9998:15;10024:980;10286:4;10334:3;10323:9;10319:19;10365:6;10354:9;10347:25;10391:2;10429:6;10424:2;10413:9;10409:18;10402:34;10472:3;10467:2;10456:9;10452:18;10445:31;10496:6;10531;10525:13;10562:6;10554;10547:22;10600:3;10589:9;10585:19;10578:26;;10639:2;10631:6;10627:15;10613:29;;10660:1;10670:195;10684:6;10681:1;10678:13;10670:195;;;10749:13;;-1:-1:-1;;;;;10745:39:1;10733:52;;10840:15;;;;10805:12;;;;10781:1;10699:9;10670:195;;;-1:-1:-1;;;;;;;10921:32:1;;;;10916:2;10901:18;;10894:60;-1:-1:-1;;;10985:3:1;10970:19;10963:35;10882:3;10024:980;-1:-1:-1;;;10024:980:1:o

Swarm Source

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