ETH Price: $3,060.85 (-1.38%)

Token

UNODEX (UNDX)
 

Overview

Max Total Supply

100,000,000 UNDX

Holders

942 (0.00%)

Market

Price

$0.00 @ 0.000001 ETH (-1.31%)

Onchain Market Cap

$182,863.99

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 UNDX

Value
$0.00
0x47b6484d9679bccfefbfab4abde07237e0658626
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

UNODEX is a hybrid trading platform (between DEX and CEX) using its own Ethereum NODE and RPC. Users have access to classic trading functions such as BUY/SELL limit orders, as well as the sniper function, a dedicated dashboard that allows to track their journey and progress in DeFi.

Market

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

# Exchange Pair Price  24H Volume % Volume
1
Uniswap V2 (Ethereum)
0X185ECE9BC75164F9FC0FBE44738E8DD1863F8464-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.0018
0.0000006 Eth
$584.55
320,513.011 0X185ECE9BC75164F9FC0FBE44738E8DD1863F8464
100.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
Unodex

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-27
*/

//SPDX-License-Identifier: UNLICENSED

pragma solidity 0.8.7;

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
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IOwnable {
    function owner() external view returns (address);
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

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

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

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

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    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 swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
}

interface ITaxDistributorLight {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function distribute() external payable;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function getTaxWallet(string memory taxName) external view returns(address);
    function setTaxWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

interface ITaxDistributor is ITaxDistributorLight {
    function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external;
    function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external; 
}


interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

interface IRewards {
    function sendFeeToHolders(uint256 feeEpoch) external payable;
    function setNewBalance(address a1, uint256 a1Balance, address a2, uint256 a2balance) external;
}

interface IRewardsTaxDistributor {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function inSwap() external view returns (bool);
    function distribute() external payable;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function getTaxWallet() external view returns(address);
    function setTaxWallet(address wallet) external;
    function setSellTax(uint256 taxPercentage) external;
    function setBuyTax(uint256 taxPercentage) external;
    function setRewardPercentage(uint256 amount) external;
    function setRewardContract(address who) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}



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

/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

abstract contract BaseErc20 is IERC20, Ownable {
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowed;
    uint256 internal _totalSupply;
    
    string public symbol;
    string public name;
    uint8 public decimals;
    
    bool public launched;
    uint256 public launchBlock;
    
    mapping (address => bool) internal exchanges;

    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) virtual {
        require(launched || from == owner(), "trading not enabled");
        _;
    }
    
    constructor(address _owner) Ownable(_owner) {

    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowed[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * 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
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    // Virtual methods
    function launch() virtual external onlyOwner {
        require(launched == false, "contract already launched");
        launched = true;
        launchBlock = block.number;
    }

    function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) virtual internal { }

    // Admin methods

    function setExchange(address who, bool on) external onlyOwner {
        require(exchanges[who] != on, "already set");
        exchanges[who] = on;
    }

    // Private methods

    function getRouterAddress() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4  || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM
        } else if (block.chainid == 11155111) {
             routerAddress = 0xC532a74256D3Db42D0Bf7a0400fEFDbad7694008; // SEPOLIA
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET
         } else if (block.chainid == 8453) {
            routerAddress = 0xfCD3842f85ed87ba2889b4D35893403796e67FF1; // BASE
        } else {
            revert("Unknown Chain ID");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");

        preTransfer(from, to, value);

        uint256 modifiedAmount = calculateTransferAmount(from, to, value);
        _balances[from] = _balances[from] - value;
        _balances[to] = _balances[to] + modifiedAmount;

        postTransfer(from, _balances[from], to, _balances[to]);

        emit Transfer(from, to, modifiedAmount);
    }
}

abstract contract Taxable is BaseErc20 {
    
    IRewardsTaxDistributor internal taxDistributor;
    IRewards internal rewardContract;

    bool internal autoSwapTax;
    uint256 internal deadBlocks = 3;
    uint256 internal minimumTimeBetweenSwaps;
    uint256 internal minimumTokensBeforeSwap;
    mapping (address => bool) internal excludedFromTax;
    uint256 private swapStartTime;
    
    // Overrides
    constructor (address owner, address rewards) BaseErc20(owner) {
        rewardContract = IRewards(rewards);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = taxDistributor.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = taxDistributor.takeSellTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount;
        }

        return super.calculateTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime();
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 60 <= block.timestamp &&
            timeSinceLastSwap >= minimumTimeBetweenSwaps &&
            _balances[address(taxDistributor)] >= minimumTokensBeforeSwap &&
            taxDistributor.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            try taxDistributor.distribute() {} catch {}
        }
        super.preTransfer(from, to, value);
    }

    function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) override virtual internal { 
        rewardContract.setNewBalance(from, fromBalance, to, toBalance);
        super.postTransfer(from, fromBalance, to, toBalance);
    }
    
    
    // Public methods
    
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return taxDistributor.getSellTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return taxDistributor.getBuyTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function taxDistributorAddress() external view returns (address) {
        return address(taxDistributor);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
    }
    
    function setSellTax(uint256 taxAmount) external onlyOwner {
        taxDistributor.setSellTax(taxAmount);
    }

    function setBuyTax(uint256 taxAmount) external onlyOwner {
        taxDistributor.setBuyTax(taxAmount);
    }
    
    function setTaxWallet(address who) external onlyOwner {
        taxDistributor.setTaxWallet(who);
    }

    function setRewardPercentage(uint256 amount) external onlyOwner {
        taxDistributor.setRewardPercentage(amount);
    }

    function setRewardContract(address who) external onlyOwner {
        taxDistributor.setRewardContract(who);
        rewardContract = IRewards(who);
    }

    function runSwapManually() external isLaunched {
        taxDistributor.distribute();
    }
}

contract RewardTaxDistributor is IRewardsTaxDistributor {
    using Address for address;

    address immutable private tokenPair;
    address immutable private routerAddress;
    address immutable private _token;
    address immutable private _wbnb;

    IDEXRouter private _router;

    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable private maxSellTax;
    uint256 immutable private maxBuyTax;

    uint256 buyTaxPercentage;
    uint256 sellTaxPercentage;
    address location;

    uint256 rewardShare;
    IRewards rewardContract;

    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);
    event DistributionError(string text);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax, address rewards) {
        require(wbnb != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _wbnb = wbnb;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
        rewardContract = IRewards(rewards);
    }

    receive() external override payable {}

    function currentEpoch() private view returns(uint256) {
        return block.timestamp / 3 hours;
    }

    function distribute() external payable override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _wbnb;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        totalTokens = token.balanceOf(address(this));

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );

        uint256 balance = address(this).balance;

        uint256 ownerShare = balance * (100_00 - rewardShare) / 100_00;
        uint256 holderShare = balance - ownerShare;
        payable(location).transfer(ownerShare);
        if (holderShare > 0) {
            rewardContract.sendFeeToHolders{ value: holderShare }(currentEpoch() - 1);
        }

        emit TaxesDistributed(totalTokens, amts[1]);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        return sellTaxPercentage;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        return buyTaxPercentage;
    }

    function getTaxWallet()external override view onlyToken returns (address)  {
        return location;
    }
    
    function setTaxWallet(address wallet) external override onlyToken {
        location = wallet;
    }

    function setSellTax(uint256 taxPercentage) external override onlyToken {
        sellTaxPercentage = taxPercentage;
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(uint256 taxPercentage) external override onlyToken {
        buyTaxPercentage = taxPercentage;
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function setRewardPercentage(uint256 taxPercentage) external override onlyToken {
        rewardShare = taxPercentage;
        require(taxPercentage <= 100_00, "Cannot be higher than 100%");
    }

    function setRewardContract(address who) external override onlyToken {
        rewardContract = IRewards(who);
    }

    function takeSellTax(uint256 value) external view override onlyToken returns (uint256) {
        if (sellTaxPercentage > 0) {
            uint256 taxAmount = (value * sellTaxPercentage) / 10000;
            value = value - taxAmount;
        }
        return value;
    }

    function takeBuyTax(uint256 value) view external override onlyToken returns (uint256) {
        if (buyTaxPercentage > 0) {
            uint256 taxAmount = (value * buyTaxPercentage) / 10000;
            value = value - taxAmount;
        }
        return value;
    }
}

contract Unodex is BaseErc20, Taxable {

    uint256 immutable public mhAmount;

    constructor () Taxable(msg.sender, 0x0130D3A9E98812159EdFa037F4Ad1Cf0E46645E7) {
        symbol = "UNDX";
        name = "UNODEX";
        decimals = 18;

        // Swap
        address routerAddress = getRouterAddress();
        IDEXRouter router = IDEXRouter(routerAddress);
        address native = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(native, address(this));
        exchanges[pair] = true;
        taxDistributor = new RewardTaxDistributor(routerAddress, pair, native, 30_00, 30_00, 0x0130D3A9E98812159EdFa037F4Ad1Cf0E46645E7);

        // Tax
        minimumTimeBetweenSwaps = 30 seconds;
        minimumTokensBeforeSwap = 160_000 * 10 ** decimals;
        excludedFromTax[address(taxDistributor)] = true;
        excludedFromTax[owner()] = true;
        taxDistributor.setBuyTax(30_00);
        taxDistributor.setSellTax(30_00);
        taxDistributor.setRewardPercentage(0);
        taxDistributor.setTaxWallet(0x9EA06865fd1b1808660cCfdd9224e017742dEcE8);
        autoSwapTax = true;
   
        // Max Hold
        mhAmount = 1_000_005  * 10 ** decimals;

        // Finalise
        _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1;
        _totalSupply = _totalSupply + (100_000_000 * 10 ** decimals);
        _balances[owner()] = _balances[owner()] + _totalSupply;
        emit Transfer(address(0), owner(), _totalSupply); 
    }

    // Overrides
   
    function preTransfer(address from, address to, uint256 value) override(Taxable, BaseErc20) internal {      
        if (launched && 
            from != owner() && to != owner() && 
            exchanges[to] == false && 
            to != getRouterAddress() &&
            to != address(taxDistributor) &&
            from != address(taxDistributor)
        ) {
            require (_balances[to] + value <= mhAmount, "this is over the max hold amount");
        }
        
        super.preTransfer(from, to, value);
    }
    
    function postTransfer(address from, uint256 fromBalance, address to, uint256 toBalance) override(Taxable, BaseErc20) internal { 
        return super.postTransfer(from, fromBalance, to, toBalance);
    }
    
    function calculateTransferAmount(address from, address to, uint256 value) override(Taxable, BaseErc20) internal returns (uint256) {
        return super.calculateTransferAmount(from, to, value);
    }

    function setTax(uint256 taxAmount) external onlyOwner {
        taxDistributor.setSellTax(taxAmount);
        taxDistributor.setBuyTax(taxAmount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":[{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setRewardContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","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"}]

60a06040526003600b553480156200001657600080fd5b5033730130d3a9e98812159edfa037f4ad1cf0e46645e78180806200005657604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200006181620006dd565b5050600a80546001600160a01b0319166001600160a01b039290921691909117905550604080518082019091526004808252630aa9c88b60e31b6020909201918252620000af91816200081e565b50604080518082019091526006808252650aa9c9e888ab60d31b6020909201918252620000df916005916200081e565b506006805460ff191660121790556000620000f96200072d565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200013c57600080fd5b505afa15801562000151573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001779190620008d2565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001b557600080fd5b505afa158015620001ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f09190620008d2565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200023c57600080fd5b505af115801562000251573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002779190620008d2565b6001600160a01b03811660009081526008602052604090819020805460ff1916600117905551909150849082908490610bb8908190730130d3a9e98812159edfa037f4ad1cf0e46645e790620002cd90620008ad565b6001600160a01b039687168152948616602086015292851660408501526060840191909152608083015290911660a082015260c001604051809103906000f0801580156200031f573d6000803e3d6000fd5b50600980546001600160a01b0319166001600160a01b0392909216919091179055601e600c55600654620003589060ff16600a62000968565b62000367906202710062000a29565b600d556009546001600160a01b03166000908152600e602081905260408220805460ff1916600190811790915591620003a86000546001600160a01b031690565b6001600160a01b03908116825260208201929092526040908101600020805460ff1916931515939093179092556009549151636e08297160e11b8152610bb8600482015291169063dc1052e290602401600060405180830381600087803b1580156200041357600080fd5b505af115801562000428573d6000803e3d6000fd5b50506009546040516308cd09d560e41b8152610bb860048201526001600160a01b039091169250638cd09d509150602401600060405180830381600087803b1580156200047457600080fd5b505af115801562000489573d6000803e3d6000fd5b50506009546040516302594d9d60e21b8152600060048201526001600160a01b03909116925063096536749150602401600060405180830381600087803b158015620004d457600080fd5b505af1158015620004e9573d6000803e3d6000fd5b5050600954604051631d48296560e31b8152739ea06865fd1b1808660ccfdd9224e017742dece860048201526001600160a01b03909116925063ea414b289150602401600060405180830381600087803b1580156200054757600080fd5b505af11580156200055c573d6000803e3d6000fd5b5050600a805460ff60a01b1916600160a01b17815560065462000585935060ff16915062000968565b6200059490620f424562000a29565b6080526009546001600160a01b0390811660009081526002602090815260408083209388168352929052206000199055600654620005d79060ff16600a62000968565b620005e7906305f5e10062000a29565b600354620005f6919062000904565b600381905560016000620006126000546001600160a01b031690565b6001600160a01b03166001600160a01b03168152602001908152602001600020546200063f919062000904565b60016000620006566000546001600160a01b031690565b6001600160a01b03168152602081019190915260400160002055620006836000546001600160a01b031690565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600354604051620006cb91815260200190565b60405180910390a35050505062000a9e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600046600114806200073f5750466003145b806200074b5750466004145b80620007575750466005145b15620007765750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a714156200079b575073c532a74256d3db42d0bf7a0400fefdbad769400890565b4660381415620007be57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466121051415620007e2575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016200004d565b8280546200082c9062000a4b565b90600052602060002090601f0160209004810192826200085057600085556200089b565b82601f106200086b57805160ff19168380011785556200089b565b828001600101855582156200089b579182015b828111156200089b5782518255916020019190600101906200087e565b50620008a9929150620008bb565b5090565b6110af806200244483390190565b5b80821115620008a95760008155600101620008bc565b600060208284031215620008e557600080fd5b81516001600160a01b0381168114620008fd57600080fd5b9392505050565b600082198211156200091a576200091a62000a88565b500190565b600181815b808511156200096057816000190482111562000944576200094462000a88565b808516156200095257918102915b93841c939080029062000924565b509250929050565b6000620008fd60ff841683600082620009845750600162000a23565b81620009935750600062000a23565b8160018114620009ac5760028114620009b757620009d7565b600191505062000a23565b60ff841115620009cb57620009cb62000a88565b50506001821b62000a23565b5060208310610133831016604e8410600b8410161715620009fc575081810a62000a23565b62000a0883836200091f565b806000190482111562000a1f5762000a1f62000a88565b0290505b92915050565b600081600019048311821515161562000a465762000a4662000a88565b500290565b600181811c9082168062000a6057607f821691505b6020821081141562000a8257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805161198362000ac160003960008181610307015261100601526119836000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c2ed286b116100a2578063dc1052e211610071578063dc1052e2146103e2578063dd62ed3e146103f5578063ea414b281461042e578063f2fde38b1461044157600080fd5b8063c2ed286b146103ab578063cc1776d3146103be578063d00efb2f146103c6578063d31acb28146103cf57600080fd5b80638cd09d50116100de5780638cd09d501461036c5780638da5cb5b1461037f57806395d89b4114610390578063a9059cbb1461039857600080fd5b806370a0823114610329578063715018a6146103525780638091f3bf1461035a57600080fd5b806328be90381161017c5780634f7041a51161014b5780634f7041a5146102d45780634f72e2a2146102dc57806351508f0a146102ef5780636331bf651461030257600080fd5b806328be9038146102875780632e5bb6ff1461029a578063313ce567146102ad578063442ef7d2146102cc57600080fd5b806309653674116101b8578063096536741461022a57806318160ddd1461023d578063185511081461024f57806323b872dd1461027457600080fd5b806301339c21146101df57806306fdde03146101e9578063095ea7b314610207575b600080fd5b6101e7610454565b005b6101f16104ce565b6040516101fe919061183d565b60405180910390f35b61021a610215366004611785565b61055c565b60405190151581526020016101fe565b6101e76102383660046117e9565b61065b565b6003545b6040519081526020016101fe565b6009546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b61021a610282366004611712565b6106c5565b6101e761029536600461174e565b6107cc565b6101e76102a83660046117e9565b61085c565b6006546102ba9060ff1681565b60405160ff90911681526020016101fe565b6101e76108f3565b6102416109c6565b6101e76102ea3660046117af565b610a48565b6101e76102fd3660046116bd565b610a6e565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b6102416103373660046116bd565b6001600160a01b031660009081526001602052604090205490565b6101e7610af8565b60065461021a90610100900460ff1681565b6101e761037a3660046117e9565b610b0c565b6000546001600160a01b031661025c565b6101f1610b45565b61021a6103a6366004611785565b610b52565b6101e76103b936600461174e565b610bab565b610241610c5c565b61024160075481565b6101e76103dd36600461181b565b610ca1565b6101e76103f03660046117e9565b610cb4565b6102416104033660046116df565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e761043c3660046116bd565b610ced565b6101e761044f3660046116bd565b610d27565b61045c610d65565b600654610100900460ff16156104b95760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064015b60405180910390fd5b6006805461ff00191661010017905543600755565b600580546104db906118ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610507906118ee565b80156105545780601f1061052957610100808354040283529160200191610554565b820191906000526020600020905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006546000903390610100900460ff168061058457506000546001600160a01b038281169116145b6105a05760405162461bcd60e51b81526004016104b090611892565b6001600160a01b0384166105f65760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420617070726f766520746865203020616464726573730000000060448201526064016104b0565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610663610d65565b6009546040516302594d9d60e21b8152600481018390526001600160a01b03909116906309653674906024015b600060405180830381600087803b1580156106aa57600080fd5b505af11580156106be573d6000803e3d6000fd5b5050505050565b6006546000908490610100900460ff16806106ed57506000546001600160a01b038281169116145b6107095760405162461bcd60e51b81526004016104b090611892565b6001600160a01b03851660009081526002602090815260408083203384529091529020546107389084906118d7565b6001600160a01b0386166000908152600260209081526040808320338452909152902055610767858585610d92565b6001600160a01b038516600081815260026020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6107d4610d65565b6001600160a01b03821660009081526008602052604090205460ff16151581151514156108315760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b60448201526064016104b0565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610864610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401600060405180830381600087803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b5050600954604051636e08297160e11b8152600481018590526001600160a01b03909116925063dc1052e29150602401610690565b600654610100900460ff1661095c5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016104b0565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109ac57600080fd5b505af11580156109c0573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190611802565b905090565b610a50610d65565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b610a76610d65565b6009546040516328a8478560e11b81526001600160a01b038381166004830152909116906351508f0a90602401600060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b5050600a80546001600160a01b0319166001600160a01b0394909416939093179092555050565b610b00610d65565b610b0a6000610ed9565b565b610b14610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401610690565b600480546104db906118ee565b6006546000903390610100900460ff1680610b7a57506000546001600160a01b038281169116145b610b965760405162461bcd60e51b81526004016104b090611892565b610ba1338585610d92565b5060019392505050565b610bb3610d65565b6001600160a01b03821660009081526008602052604090205460ff161580610bd9575080155b610c315760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016104b0565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610a0b57600080fd5b610ca9610d65565b600d91909155600c55565b610cbc610d65565b600954604051636e08297160e11b8152600481018390526001600160a01b039091169063dc1052e290602401610690565b610cf5610d65565b600954604051631d48296560e31b81526001600160a01b0383811660048301529091169063ea414b2890602401610690565b610d2f610d65565b6001600160a01b038116610d5957604051631e4fbdf760e01b8152600060048201526024016104b0565b610d6281610ed9565b50565b6000546001600160a01b03163314610b0a5760405163118cdaa760e01b81523360048201526024016104b0565b6001600160a01b038216610de15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016104b0565b610dec838383610f29565b6000610df984848461108f565b6001600160a01b038516600090815260016020526040902054909150610e209083906118d7565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610e509082906118bf565b6001600160a01b038085166000818152600160205260408082208590559288168152918220549152610e869186919086906110a4565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ecb91815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600654610100900460ff168015610f4e57506000546001600160a01b03848116911614155b8015610f6857506000546001600160a01b03838116911614155b8015610f8d57506001600160a01b03821660009081526008602052604090205460ff16155b8015610fb25750610f9c6110b0565b6001600160a01b0316826001600160a01b031614155b8015610fcc57506009546001600160a01b03838116911614155b8015610fe657506009546001600160a01b03848116911614155b1561107f576001600160a01b0382166000908152600160205260409020547f0000000000000000000000000000000000000000000000000000000000000000906110319083906118bf565b111561107f5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016104b0565b61108a838383611199565b505050565b600061109c8484846113ad565b949350505050565b6109c0848484846115bc565b600046600114806110c15750466003145b806110cc5750466004145b806110d75750466005145b156110f55750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a71415611119575073c532a74256d3db42d0bf7a0400fefdbad769400890565b466038141561113b57507310ed43c718714eb63d5aa57b78b54704e256024e90565b46612105141561115e575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016104b0565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611802565b61122090426118d7565b600654909150610100900460ff1680156112435750600a54600160a01b900460ff165b801561126757506001600160a01b03831660009081526008602052604090205460ff165b8015611281575042600f54603c61127e91906118bf565b11155b801561128f5750600c548110155b80156112b75750600d546009546001600160a01b031660009081526001602052604090205410155b80156113465750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906117cc565b155b156113a85742600f556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561139557600080fd5b505af19250505080156113a6575060015b505b6109c0565b6001600160a01b0383166000908152600e6020526040812054829060ff161580156113f157506001600160a01b0384166000908152600e602052604090205460ff16155b80156114045750600654610100900460ff165b15611551576001600160a01b03851660009081526008602052604090205460ff16156114af5760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611802565b9050611551565b6001600160a01b03841660009081526008602052604090205460ff161561155157600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561151657600080fd5b505af115801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611802565b90505b600061155d82856118d7565b905080156115a7576009546001600160a01b031660009081526001602052604090205461158b9082906118bf565b6009546001600160a01b03166000908152600160205260409020555b6115b2868684611636565b9695505050505050565b600a546040516347d64b2f60e11b81526001600160a01b0386811660048301526024820186905284811660448301526064820184905290911690638fac965e90608401600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506109c0565b6000826001600160a01b0316846001600160a01b0316141561169a5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016104b0565b5092915050565b80356001600160a01b03811681146116b857600080fd5b919050565b6000602082840312156116cf57600080fd5b6116d8826116a1565b9392505050565b600080604083850312156116f257600080fd5b6116fb836116a1565b9150611709602084016116a1565b90509250929050565b60008060006060848603121561172757600080fd5b611730846116a1565b925061173e602085016116a1565b9150604084013590509250925092565b6000806040838503121561176157600080fd5b61176a836116a1565b9150602083013561177a8161193f565b809150509250929050565b6000806040838503121561179857600080fd5b6117a1836116a1565b946020939093013593505050565b6000602082840312156117c157600080fd5b81356116d88161193f565b6000602082840312156117de57600080fd5b81516116d88161193f565b6000602082840312156117fb57600080fd5b5035919050565b60006020828403121561181457600080fd5b5051919050565b6000806040838503121561182e57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561186a5785810183015185820160400152820161184e565b8181111561187c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b600082198211156118d2576118d2611929565b500190565b6000828210156118e9576118e9611929565b500390565b600181811c9082168061190257607f821691505b6020821081141561192357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610d6257600080fdfea26469706673582212206d48d949a9b073adc7107a3fde862889837a308374a96eb58ea9ff4d99d1e2de64736f6c634300080700336101406040523480156200001257600080fd5b50604051620010af380380620010af8339810160408190526200003591620001cd565b6001600160a01b038416620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038516620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038616620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031994811b851660e052600080546001600160a01b038981166001600160a01b031992831617909255610100959095526101209390935294851b84166080529490931b90911660a052600680549390921692169190911790556200023c565b80516001600160a01b0381168114620001c857600080fd5b919050565b60008060008060008060c08789031215620001e757600080fd5b620001f287620001b0565b95506200020260208801620001b0565b94506200021260408801620001b0565b935060608701519250608087015191506200023060a08801620001b0565b90509295509295509295565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051610dc9620002e66000396000610679015260006104ff015260006107be0152600081816102780152818161032501528181610376015281816103f701528181610463015281816104bb01528181610581015281816105d201528181610635015281816106ab0152818161076a0152818161081b0152610aaf01526000505060005050610dc96000f3fe6080604052600436106100c65760003560e01c80638cd09d501161007f578063db017dc711610059578063db017dc714610205578063dc1052e214610225578063e4fc6b6d14610245578063ea414b281461024d57600080fd5b80638cd09d501461019f578063b0bc85de146101bf578063d8306786146101d457600080fd5b806309653674146100d25780630dd87157146100f4578063252d723a1461011d5780634fa26fd51461013257806351508f0a1461015257806352894ceb1461017257600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506100f26100ed366004610c16565b61026d565b005b34801561010057600080fd5b5061010a60015481565b6040519081526020015b60405180910390f35b34801561012957600080fd5b5061010a610318565b34801561013e57600080fd5b5061010a61014d366004610c16565b610369565b34801561015e57600080fd5b506100f261016d366004610b21565b6103ec565b34801561017e57600080fd5b50610187610456565b6040516001600160a01b039091168152602001610114565b3480156101ab57600080fd5b506100f26101ba366004610c16565b6104b0565b3480156101cb57600080fd5b5061010a610574565b3480156101e057600080fd5b506000546101f590600160a01b900460ff1681565b6040519015158152602001610114565b34801561021157600080fd5b5061010a610220366004610c16565b6105c5565b34801561023157600080fd5b506100f2610240366004610c16565b61062a565b6100f26106a0565b34801561025957600080fd5b506100f2610268366004610b21565b610aa4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102be5760405162461bcd60e51b81526004016102b590610c48565b60405180910390fd5b60058190556127108111156103155760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f7420626520686967686572207468616e203130302500000000000060448201526064016102b5565b50565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103625760405162461bcd60e51b81526004016102b590610c48565b5060025490565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103b35760405162461bcd60e51b81526004016102b590610c48565b600354156103e8576000612710600354846103ce9190610d1b565b6103d89190610cf9565b90506103e48184610d3a565b9250505b5090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104345760405162461bcd60e51b81526004016102b590610c48565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104a05760405162461bcd60e51b81526004016102b590610c48565b506004546001600160a01b031690565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104f85760405162461bcd60e51b81526004016102b590610c48565b60038190557f0000000000000000000000000000000000000000000000000000000000000000610526610574565b11156103155760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f742062652073657420746869732068696768000000000060448201526064016102b5565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105be5760405162461bcd60e51b81526004016102b590610c48565b5060035490565b6000336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461060f5760405162461bcd60e51b81526004016102b590610c48565b600254156103e8576000612710600254846103ce9190610d1b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106725760405162461bcd60e51b81526004016102b590610c48565b60028190557f0000000000000000000000000000000000000000000000000000000000000000610526610318565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106e85760405162461bcd60e51b81526004016102b590610c48565b600054600160a01b900460ff16156107355760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b60448201526064016102b5565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061079c5761079c610d67565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106107f0576107f0610d67565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201527f000000000000000000000000000000000000000000000000000000000000000091600091908316906370a082319060240160206040518083038186803b15801561086357600080fd5b505afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b9190610c2f565b60008054919250906001600160a01b03166318cbafe5838387306108c14261012c610ce1565b6040518663ffffffff1660e01b81526004016108e1959493929190610c70565b600060405180830381600087803b1580156108fb57600080fd5b505af115801561090f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109379190810190610b51565b9050600047905060006127106005546127106109539190610d3a565b61095d9084610d1b565b6109679190610cf9565b905060006109758284610d3a565b6004546040519192506001600160a01b03169083156108fc029084906000818181858888f193505050501580156109b0573d6000803e3d6000fd5b508015610a2e576006546001600160a01b031663dde436c08260016109d3610b0e565b6109dd9190610d3a565b6040518363ffffffff1660e01b81526004016109fb91815260200190565b6000604051808303818588803b158015610a1457600080fd5b505af1158015610a28573d6000803e3d6000fd5b50505050505b7f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a18585600181518110610a6357610a63610d67565b6020026020010151604051610a82929190918252602082015260400190565b60405180910390a150504260015550506000805460ff60a01b19169055505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aec5760405162461bcd60e51b81526004016102b590610c48565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b1c612a3042610cf9565b905090565b600060208284031215610b3357600080fd5b81356001600160a01b0381168114610b4a57600080fd5b9392505050565b60006020808385031215610b6457600080fd5b825167ffffffffffffffff80821115610b7c57600080fd5b818501915085601f830112610b9057600080fd5b815181811115610ba257610ba2610d7d565b8060051b604051601f19603f83011681018181108582111715610bc757610bc7610d7d565b604052828152858101935084860182860187018a1015610be657600080fd5b600095505b83861015610c09578051855260019590950194938601938601610beb565b5098975050505050505050565b600060208284031215610c2857600080fd5b5035919050565b600060208284031215610c4157600080fd5b5051919050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015610cc05784516001600160a01b031683529383019391830191600101610c9b565b50506001600160a01b03969096166060850152505050608001529392505050565b60008219821115610cf457610cf4610d51565b500190565b600082610d1657634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610d3557610d35610d51565b500290565b600082821015610d4c57610d4c610d51565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220158a643784b44c3c2739fc4173c9757cdd83d7b4083f9539b8c2bce91518db6164736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806370a0823111610104578063c2ed286b116100a2578063dc1052e211610071578063dc1052e2146103e2578063dd62ed3e146103f5578063ea414b281461042e578063f2fde38b1461044157600080fd5b8063c2ed286b146103ab578063cc1776d3146103be578063d00efb2f146103c6578063d31acb28146103cf57600080fd5b80638cd09d50116100de5780638cd09d501461036c5780638da5cb5b1461037f57806395d89b4114610390578063a9059cbb1461039857600080fd5b806370a0823114610329578063715018a6146103525780638091f3bf1461035a57600080fd5b806328be90381161017c5780634f7041a51161014b5780634f7041a5146102d45780634f72e2a2146102dc57806351508f0a146102ef5780636331bf651461030257600080fd5b806328be9038146102875780632e5bb6ff1461029a578063313ce567146102ad578063442ef7d2146102cc57600080fd5b806309653674116101b8578063096536741461022a57806318160ddd1461023d578063185511081461024f57806323b872dd1461027457600080fd5b806301339c21146101df57806306fdde03146101e9578063095ea7b314610207575b600080fd5b6101e7610454565b005b6101f16104ce565b6040516101fe919061183d565b60405180910390f35b61021a610215366004611785565b61055c565b60405190151581526020016101fe565b6101e76102383660046117e9565b61065b565b6003545b6040519081526020016101fe565b6009546001600160a01b03165b6040516001600160a01b0390911681526020016101fe565b61021a610282366004611712565b6106c5565b6101e761029536600461174e565b6107cc565b6101e76102a83660046117e9565b61085c565b6006546102ba9060ff1681565b60405160ff90911681526020016101fe565b6101e76108f3565b6102416109c6565b6101e76102ea3660046117af565b610a48565b6101e76102fd3660046116bd565b610a6e565b6102417f00000000000000000000000000000000000000000000d3c261325e6fe5f4000081565b6102416103373660046116bd565b6001600160a01b031660009081526001602052604090205490565b6101e7610af8565b60065461021a90610100900460ff1681565b6101e761037a3660046117e9565b610b0c565b6000546001600160a01b031661025c565b6101f1610b45565b61021a6103a6366004611785565b610b52565b6101e76103b936600461174e565b610bab565b610241610c5c565b61024160075481565b6101e76103dd36600461181b565b610ca1565b6101e76103f03660046117e9565b610cb4565b6102416104033660046116df565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6101e761043c3660046116bd565b610ced565b6101e761044f3660046116bd565b610d27565b61045c610d65565b600654610100900460ff16156104b95760405162461bcd60e51b815260206004820152601960248201527f636f6e747261637420616c7265616479206c61756e636865640000000000000060448201526064015b60405180910390fd5b6006805461ff00191661010017905543600755565b600580546104db906118ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610507906118ee565b80156105545780601f1061052957610100808354040283529160200191610554565b820191906000526020600020905b81548152906001019060200180831161053757829003601f168201915b505050505081565b6006546000903390610100900460ff168061058457506000546001600160a01b038281169116145b6105a05760405162461bcd60e51b81526004016104b090611892565b6001600160a01b0384166105f65760405162461bcd60e51b815260206004820152601c60248201527f63616e6e6f7420617070726f766520746865203020616464726573730000000060448201526064016104b0565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020879055518681529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b610663610d65565b6009546040516302594d9d60e21b8152600481018390526001600160a01b03909116906309653674906024015b600060405180830381600087803b1580156106aa57600080fd5b505af11580156106be573d6000803e3d6000fd5b5050505050565b6006546000908490610100900460ff16806106ed57506000546001600160a01b038281169116145b6107095760405162461bcd60e51b81526004016104b090611892565b6001600160a01b03851660009081526002602090815260408083203384529091529020546107389084906118d7565b6001600160a01b0386166000908152600260209081526040808320338452909152902055610767858585610d92565b6001600160a01b038516600081815260026020908152604080832033808552908352928190205490519081529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506001949350505050565b6107d4610d65565b6001600160a01b03821660009081526008602052604090205460ff16151581151514156108315760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b60448201526064016104b0565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b610864610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401600060405180830381600087803b1580156108aa57600080fd5b505af11580156108be573d6000803e3d6000fd5b5050600954604051636e08297160e11b8152600481018590526001600160a01b03909116925063dc1052e29150602401610690565b600654610100900460ff1661095c5760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b60648201526084016104b0565b600960009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156109ac57600080fd5b505af11580156109c0573d6000803e3d6000fd5b50505050565b60095460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b158015610a0b57600080fd5b505afa158015610a1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a439190611802565b905090565b610a50610d65565b600a8054911515600160a01b0260ff60a01b19909216919091179055565b610a76610d65565b6009546040516328a8478560e11b81526001600160a01b038381166004830152909116906351508f0a90602401600060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b5050600a80546001600160a01b0319166001600160a01b0394909416939093179092555050565b610b00610d65565b610b0a6000610ed9565b565b610b14610d65565b6009546040516308cd09d560e41b8152600481018390526001600160a01b0390911690638cd09d5090602401610690565b600480546104db906118ee565b6006546000903390610100900460ff1680610b7a57506000546001600160a01b038281169116145b610b965760405162461bcd60e51b81526004016104b090611892565b610ba1338585610d92565b5060019392505050565b610bb3610d65565b6001600160a01b03821660009081526008602052604090205460ff161580610bd9575080155b610c315760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b60648201526084016104b0565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6009546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b158015610a0b57600080fd5b610ca9610d65565b600d91909155600c55565b610cbc610d65565b600954604051636e08297160e11b8152600481018390526001600160a01b039091169063dc1052e290602401610690565b610cf5610d65565b600954604051631d48296560e31b81526001600160a01b0383811660048301529091169063ea414b2890602401610690565b610d2f610d65565b6001600160a01b038116610d5957604051631e4fbdf760e01b8152600060048201526024016104b0565b610d6281610ed9565b50565b6000546001600160a01b03163314610b0a5760405163118cdaa760e01b81523360048201526024016104b0565b6001600160a01b038216610de15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b60448201526064016104b0565b610dec838383610f29565b6000610df984848461108f565b6001600160a01b038516600090815260016020526040902054909150610e209083906118d7565b6001600160a01b038086166000908152600160205260408082209390935590851681522054610e509082906118bf565b6001600160a01b038085166000818152600160205260408082208590559288168152918220549152610e869186919086906110a4565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ecb91815260200190565b60405180910390a350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600654610100900460ff168015610f4e57506000546001600160a01b03848116911614155b8015610f6857506000546001600160a01b03838116911614155b8015610f8d57506001600160a01b03821660009081526008602052604090205460ff16155b8015610fb25750610f9c6110b0565b6001600160a01b0316826001600160a01b031614155b8015610fcc57506009546001600160a01b03838116911614155b8015610fe657506009546001600160a01b03848116911614155b1561107f576001600160a01b0382166000908152600160205260409020547f00000000000000000000000000000000000000000000d3c261325e6fe5f40000906110319083906118bf565b111561107f5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e7460448201526064016104b0565b61108a838383611199565b505050565b600061109c8484846113ad565b949350505050565b6109c0848484846115bc565b600046600114806110c15750466003145b806110cc5750466004145b806110d75750466005145b156110f55750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b4662aa36a71415611119575073c532a74256d3db42d0bf7a0400fefdbad769400890565b466038141561113b57507310ed43c718714eb63d5aa57b78b54704e256024e90565b46612105141561115e575073fcd3842f85ed87ba2889b4d35893403796e67ff190565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b60448201526064016104b0565b60095460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b1580156111de57600080fd5b505afa1580156111f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112169190611802565b61122090426118d7565b600654909150610100900460ff1680156112435750600a54600160a01b900460ff165b801561126757506001600160a01b03831660009081526008602052604090205460ff165b8015611281575042600f54603c61127e91906118bf565b11155b801561128f5750600c548110155b80156112b75750600d546009546001600160a01b031660009081526001602052604090205410155b80156113465750600960009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b15801561130c57600080fd5b505afa158015611320573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134491906117cc565b155b156113a85742600f556009546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561139557600080fd5b505af19250505080156113a6575060015b505b6109c0565b6001600160a01b0383166000908152600e6020526040812054829060ff161580156113f157506001600160a01b0384166000908152600e602052604090205460ff16155b80156114045750600654610100900460ff165b15611551576001600160a01b03851660009081526008602052604090205460ff16156114af5760095460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611802565b9050611551565b6001600160a01b03841660009081526008602052604090205460ff161561155157600954604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b15801561151657600080fd5b505af115801561152a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154e9190611802565b90505b600061155d82856118d7565b905080156115a7576009546001600160a01b031660009081526001602052604090205461158b9082906118bf565b6009546001600160a01b03166000908152600160205260409020555b6115b2868684611636565b9695505050505050565b600a546040516347d64b2f60e11b81526001600160a01b0386811660048301526024820186905284811660448301526064820184905290911690638fac965e90608401600060405180830381600087803b15801561161957600080fd5b505af115801561162d573d6000803e3d6000fd5b505050506109c0565b6000826001600160a01b0316846001600160a01b0316141561169a5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c660060448201526064016104b0565b5092915050565b80356001600160a01b03811681146116b857600080fd5b919050565b6000602082840312156116cf57600080fd5b6116d8826116a1565b9392505050565b600080604083850312156116f257600080fd5b6116fb836116a1565b9150611709602084016116a1565b90509250929050565b60008060006060848603121561172757600080fd5b611730846116a1565b925061173e602085016116a1565b9150604084013590509250925092565b6000806040838503121561176157600080fd5b61176a836116a1565b9150602083013561177a8161193f565b809150509250929050565b6000806040838503121561179857600080fd5b6117a1836116a1565b946020939093013593505050565b6000602082840312156117c157600080fd5b81356116d88161193f565b6000602082840312156117de57600080fd5b81516116d88161193f565b6000602082840312156117fb57600080fd5b5035919050565b60006020828403121561181457600080fd5b5051919050565b6000806040838503121561182e57600080fd5b50508035926020909101359150565b600060208083528351808285015260005b8181101561186a5785810183015185820160400152820161184e565b8181111561187c576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b600082198211156118d2576118d2611929565b500190565b6000828210156118e9576118e9611929565b500390565b600181811c9082168061190257607f821691505b6020821081141561192357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b8015158114610d6257600080fdfea26469706673582212206d48d949a9b073adc7107a3fde862889837a308374a96eb58ea9ff4d99d1e2de64736f6c63430008070033

Deployed Bytecode Sourcemap

33574:2681:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22434:182;;;:::i;:::-;;18657:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21287:314;;;;;;:::i;:::-;;:::i;:::-;;;3508:14:1;;3501:22;3483:41;;3471:2;3456:18;21287:314:0;3343:187:1;28667:125:0;;;;;;:::i;:::-;;:::i;19369:102::-;19451:12;;19369:102;;;7913:25:1;;;7901:2;7886:18;19369:102:0;7767:177:1;27609:114:0;27700:14;;-1:-1:-1;;;;;27700:14:0;27609:114;;;-1:-1:-1;;;;;2847:32:1;;;2829:51;;2817:2;2802:18;27609:114:0;2683:203:1;22074:328:0;;;;;;:::i;:::-;;:::i;23071:155::-;;;;;;:::i;:::-;;:::i;36097:::-;;;;;;:::i;:::-;;:::i;18682:21::-;;;;;;;;;;;;8121:4:1;8109:17;;;8091:36;;8079:2;8064:18;18682:21:0;7949:184:1;28964:93:0;;;:::i;27417:102::-;;;:::i;27769:97::-;;;;;;:::i;:::-;;:::i;28800:156::-;;;;;;:::i;:::-;;:::i;33621:33::-;;;;;19688:119;;;;;;:::i;:::-;-1:-1:-1;;;;;19782:17:0;19755:7;19782:17;;;:9;:17;;;;;;;19688:119;17570:103;;;:::i;18716:20::-;;;;;;;;;;;;28310:113;;;;;;:::i;:::-;;:::i;16895:87::-;16941:7;16968:6;-1:-1:-1;;;;;16968:6:0;16895:87;;18630:20;;;:::i;20462:178::-;;;;;;:::i;:::-;;:::i;27874:225::-;;;;;;:::i;:::-;;:::i;27215:104::-;;;:::i;18743:26::-;;;;;;28107:191;;;;;;:::i;:::-;;:::i;28431:111::-;;;;;;:::i;:::-;;:::i;20147:144::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20258:16:0;;;20231:7;20258:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;20147:144;28554:105;;;;;;:::i;:::-;;:::i;17828:220::-;;;;;;:::i;:::-;;:::i;22434:182::-;16781:13;:11;:13::i;:::-;22498:8:::1;::::0;::::1;::::0;::::1;;;:17;22490:55;;;::::0;-1:-1:-1;;;22490:55:0;;6915:2:1;22490:55:0::1;::::0;::::1;6897:21:1::0;6954:2;6934:18;;;6927:30;6993:27;6973:18;;;6966:55;7038:18;;22490:55:0::1;;;;;;;;;22556:8;:15:::0;;-1:-1:-1;;22556:15:0::1;;;::::0;;22596:12:::1;22582:11;:26:::0;22434:182::o;18657:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21287:314::-;19159:8;;21390:4;;21369:10;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21415:21:0;::::1;21407:62;;;::::0;-1:-1:-1;;;21407:62:0;;4339:2:1;21407:62:0::1;::::0;::::1;4321:21:1::0;4378:2;4358:18;;;4351:30;4417;4397:18;;;4390:58;4465:18;;21407:62:0::1;4137:352:1::0;21407:62:0::1;21491:10;21482:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;21482:29:0;::::1;::::0;;;;;;;;;;:37;;;21535:36;7913:25:1;;;21482:29:0;;21491:10;21535:36:::1;::::0;7886:18:1;21535:36:0::1;;;;;;;-1:-1:-1::0;21589:4:0::1;::::0;21287:314;-1:-1:-1;;;21287:314:0:o;28667:125::-;16781:13;:11;:13::i;:::-;28742:14:::1;::::0;:42:::1;::::0;-1:-1:-1;;;28742:42:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28742:14:0;;::::1;::::0;:34:::1;::::0;7886:18:1;;28742:42:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28667:125:::0;:::o;22074:328::-;19159:8;;22185:4;;22170;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22231:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;22246:10:::1;22231:26:::0;;;;;;;;:34:::1;::::0;22260:5;;22231:34:::1;:::i;:::-;-1:-1:-1::0;;;;;22202:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;22217:10:::1;22202:26:::0;;;;;;;:63;22276:26:::1;22211:4:::0;22292:2;22296:5;22276:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;22318:54:0;::::1;22345:14;::::0;;;:8:::1;:14;::::0;;;;;;;22333:10:::1;22345:26:::0;;;;;;;;;;;22318:54;;7913:25:1;;;22333:10:0;;22318:54;::::1;::::0;7886:18:1;22318:54:0::1;;;;;;;-1:-1:-1::0;22390:4:0::1;::::0;22074:328;-1:-1:-1;;;;22074:328:0:o;23071:155::-;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;23152:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:20;;::::0;::::1;;;;23144:44;;;::::0;-1:-1:-1;;;23144:44:0;;7629:2:1;23144:44:0::1;::::0;::::1;7611:21:1::0;7668:2;7648:18;;;7641:30;-1:-1:-1;;;7687:18:1;;;7680:41;7738:18;;23144:44:0::1;7427:335:1::0;23144:44:0::1;-1:-1:-1::0;;;;;23199:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:19;;-1:-1:-1;;23199:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23071:155::o;36097:::-;16781:13;:11;:13::i;:::-;36162:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;36162:36:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;36162:14:0;;::::1;::::0;:25:::1;::::0;7886:18:1;;36162:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;36209:14:0::1;::::0;:35:::1;::::0;-1:-1:-1;;;36209:35:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;36209:14:0;;::::1;::::0;-1:-1:-1;36209:24:0::1;::::0;-1:-1:-1;7886:18:1;;36209:35:0::1;7767:177:1::0;28964:93:0;18876:8;;;;;;;18868:62;;;;-1:-1:-1;;;18868:62:0;;4696:2:1;18868:62:0;;;4678:21:1;4735:2;4715:18;;;4708:30;4774:34;4754:18;;;4747:62;-1:-1:-1;;;4825:18:1;;;4818:39;4874:19;;18868:62:0;4494:405:1;18868:62:0;29022:14:::1;;;;;;;;;-1:-1:-1::0;;;;;29022:14:0::1;-1:-1:-1::0;;;;;29022:25:0::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28964:93::o:0;27417:102::-;27485:14;;:26;;;-1:-1:-1;;;27485:26:0;;;;27458:7;;-1:-1:-1;;;;;27485:14:0;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27478:33;;27417:102;:::o;27769:97::-;16781:13;:11;:13::i;:::-;27837:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;27837:21:0::1;-1:-1:-1::0;;;;27837:21:0;;::::1;::::0;;;::::1;::::0;;27769:97::o;28800:156::-;16781:13;:11;:13::i;:::-;28870:14:::1;::::0;:37:::1;::::0;-1:-1:-1;;;28870:37:0;;-1:-1:-1;;;;;2847:32:1;;;28870:37:0::1;::::0;::::1;2829:51:1::0;28870:14:0;;::::1;::::0;:32:::1;::::0;2802:18:1;;28870:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28918:14:0::1;:30:::0;;-1:-1:-1;;;;;;28918:30:0::1;-1:-1:-1::0;;;;;28918:30:0;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;28800:156:0:o;17570:103::-;16781:13;:11;:13::i;:::-;17635:30:::1;17662:1;17635:18;:30::i;:::-;17570:103::o:0;28310:113::-;16781:13;:11;:13::i;:::-;28379:14:::1;::::0;:36:::1;::::0;-1:-1:-1;;;28379:36:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28379:14:0;;::::1;::::0;:25:::1;::::0;7886:18:1;;28379:36:0::1;7767:177:1::0;18630:20:0;;;;;;;:::i;20462:178::-;19159:8;;20561:4;;20540:10;;19159:8;;;;;;:27;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;19171:15:0;;;16968:6;;19171:15;19159:27;19151:59;;;;-1:-1:-1;;;19151:59:0;;;;;;;:::i;:::-;20578:32:::1;20588:10;20600:2;20604:5;20578:9;:32::i;:::-;-1:-1:-1::0;20628:4:0::1;::::0;20462:178;-1:-1:-1;;;20462:178:0:o;27874:225::-;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;27967:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;27994:16:0;::::1;27967:43;27959:91;;;::::0;-1:-1:-1;;;27959:91:0;;6511:2:1;27959:91:0::1;::::0;::::1;6493:21:1::0;6550:2;6530:18;;;6523:30;6589:34;6569:18;;;6562:62;-1:-1:-1;;;6640:18:1;;;6633:33;6683:19;;27959:91:0::1;6309:399:1::0;27959:91:0::1;-1:-1:-1::0;;;;;28061:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;28061:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27874:225::o;27215:104::-;27284:14;;:27;;;-1:-1:-1;;;27284:27:0;;;;27257:7;;-1:-1:-1;;;;;27284:14:0;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;28107:191;16781:13;:11;:13::i;:::-;28211:23:::1;:35:::0;;;;28257:23:::1;:33:::0;28107:191::o;28431:111::-;16781:13;:11;:13::i;:::-;28499:14:::1;::::0;:35:::1;::::0;-1:-1:-1;;;28499:35:0;;::::1;::::0;::::1;7913:25:1::0;;;-1:-1:-1;;;;;28499:14:0;;::::1;::::0;:24:::1;::::0;7886:18:1;;28499:35:0::1;7767:177:1::0;28554:105:0;16781:13;:11;:13::i;:::-;28619:14:::1;::::0;:32:::1;::::0;-1:-1:-1;;;28619:32:0;;-1:-1:-1;;;;;2847:32:1;;;28619::0::1;::::0;::::1;2829:51:1::0;28619:14:0;;::::1;::::0;:27:::1;::::0;2802:18:1;;28619:32:0::1;2683:203:1::0;17828:220:0;16781:13;:11;:13::i;:::-;-1:-1:-1;;;;;17913:22:0;::::1;17909:93;;17959:31;::::0;-1:-1:-1;;;17959:31:0;;17987:1:::1;17959:31;::::0;::::1;2829:51:1::0;2802:18;;17959:31:0::1;2683:203:1::0;17909:93:0::1;18012:28;18031:8;18012:18;:28::i;:::-;17828:220:::0;:::o;17060:166::-;16941:7;16968:6;-1:-1:-1;;;;;16968:6:0;15250:10;17120:23;17116:103;;17167:40;;-1:-1:-1;;;17167:40:0;;15250:10;17167:40;;;2829:51:1;2802:18;;17167:40:0;2683:203:1;24214:485:0;-1:-1:-1;;;;;24301:16:0;;24293:51;;;;-1:-1:-1;;;24293:51:0;;6160:2:1;24293:51:0;;;6142:21:1;6199:2;6179:18;;;6172:30;-1:-1:-1;;;6218:18:1;;;6211:52;6280:18;;24293:51:0;5958:346:1;24293:51:0;24357:28;24369:4;24375:2;24379:5;24357:11;:28::i;:::-;24398:22;24423:40;24447:4;24453:2;24457:5;24423:23;:40::i;:::-;-1:-1:-1;;;;;24492:15:0;;;;;;:9;:15;;;;;;24398:65;;-1:-1:-1;24492:23:0;;24510:5;;24492:23;:::i;:::-;-1:-1:-1;;;;;24474:15:0;;;;;;;:9;:15;;;;;;:41;;;;24542:13;;;;;;;:30;;24558:14;;24542:30;:::i;:::-;-1:-1:-1;;;;;24526:13:0;;;;;;;:9;:13;;;;;;:46;;;24604:15;;;;;;;;;24625:13;;24585:54;;24598:4;;24604:15;24536:2;;24585:12;:54::i;:::-;24672:2;-1:-1:-1;;;;;24657:34:0;24666:4;-1:-1:-1;;;;;24657:34:0;;24676:14;24657:34;;;;7913:25:1;;7901:2;7886:18;;7767:177;24657:34:0;;;;;;;;24282:417;24214:485;;;:::o;18208:191::-;18282:16;18301:6;;-1:-1:-1;;;;;18318:17:0;;;-1:-1:-1;;;;;;18318:17:0;;;;;;18351:40;;18301:6;;;;;;;18351:40;;18282:16;18351:40;18271:128;18208:191;:::o;35123:535::-;35244:8;;;;;;;:41;;;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;35270:15:0;;;16968:6;;35270:15;;35244:41;:58;;;;-1:-1:-1;16941:7:0;16968:6;-1:-1:-1;;;;;35289:13:0;;;16968:6;;35289:13;;35244:58;:98;;;;-1:-1:-1;;;;;;35320:13:0;;;;;;:9;:13;;;;;;;;:22;35244:98;:140;;;;;35366:18;:16;:18::i;:::-;-1:-1:-1;;;;;35360:24:0;:2;-1:-1:-1;;;;;35360:24:0;;;35244:140;:186;;;;-1:-1:-1;35415:14:0;;-1:-1:-1;;;;;35401:29:0;;;35415:14;;35401:29;;35244:186;:234;;;;-1:-1:-1;35463:14:0;;-1:-1:-1;;;;;35447:31:0;;;35463:14;;35447:31;;35244:234;35240:356;;;-1:-1:-1;;;;;35514:13:0;;;;;;:9;:13;;;;;;35539:8;;35514:21;;35530:5;;35514:21;:::i;:::-;:33;;35505:79;;;;-1:-1:-1;;;35505:79:0;;5106:2:1;35505:79:0;;;5088:21:1;;;5125:18;;;5118:30;5184:34;5164:18;;;5157:62;5236:18;;35505:79:0;4904:356:1;35505:79:0;35616:34;35634:4;35640:2;35644:5;35616:17;:34::i;:::-;35123:535;;;:::o;35887:202::-;36008:7;36035:46;36065:4;36071:2;36075:5;36035:29;:46::i;:::-;36028:53;35887:202;-1:-1:-1;;;;35887:202:0:o;35670:205::-;35815:52;35834:4;35840:11;35853:2;35857:9;35815:18;:52::i;23260:732::-;23311:21;23349:13;23366:1;23349:18;:40;;;;23371:13;23388:1;23371:18;23349:40;:62;;;;23393:13;23410:1;23393:18;23349:62;:85;;;;23416:13;23433:1;23416:18;23349:85;23345:640;;;-1:-1:-1;23467:42:0;23260:732;:::o;23345:640::-;23544:13;23561:8;23544:25;23540:445;;;-1:-1:-1;23603:42:0;23260:732;:::o;23540:445::-;23678:13;23695:2;23678:19;23674:311;;;-1:-1:-1;23730:42:0;23260:732;:::o;23674:311::-;23810:13;23827:4;23810:21;23806:179;;;-1:-1:-1;23864:42:0;23260:732;:::o;23806:179::-;23947:26;;-1:-1:-1;;;23947:26:0;;5815:2:1;23947:26:0;;;5797:21:1;5854:2;5834:18;;;5827:30;-1:-1:-1;;;5873:18:1;;;5866:46;5929:18;;23947:26:0;5613:340:1;26118:693:0;26263:14;;:29;;;-1:-1:-1;;;26263:29:0;;;;26217:25;;-1:-1:-1;;;;;26263:14:0;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26245:47;;:15;:47;:::i;:::-;26321:8;;26217:75;;-1:-1:-1;26321:8:0;;;;;:37;;;;-1:-1:-1;26347:11:0;;-1:-1:-1;;;26347:11:0;;;;26321:37;:68;;;;-1:-1:-1;;;;;;26376:13:0;;;;;;:9;:13;;;;;;;;26321:68;:123;;;;;26429:15;26407:13;;26423:2;26407:18;;;;:::i;:::-;:37;;26321:123;:184;;;;;26482:23;;26461:17;:44;;26321:184;:262;;;;-1:-1:-1;26560:23:0;;26540:14;;-1:-1:-1;;;;;26540:14:0;26522:34;;;;:9;:34;;;;;;:61;;26321:262;:311;;;;;26600:14;;;;;;;;;-1:-1:-1;;;;;26600:14:0;-1:-1:-1;;;;;26600:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;26321:311;26303:456;;;26675:15;26659:13;:31;26709:14;;:27;;;-1:-1:-1;;;26709:27:0;;;;-1:-1:-1;;;;;26709:14:0;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;26705:43;;26769:34;35123:535;25260:848;-1:-1:-1;;;;;25446:21:0;;25369:7;25446:21;;;:15;:21;;;;;;25424:5;;25446:21;;:30;;;:62;;-1:-1:-1;;;;;;25480:19:0;;;;;;:15;:19;;;;;;;;:28;25446:62;:74;;;;-1:-1:-1;25512:8:0;;;;;;;25446:74;25442:390;;;-1:-1:-1;;;;;25541:15:0;;;;;;:9;:15;;;;;;;;25537:284;;;25628:14;;:32;;-1:-1:-1;;;25628:32:0;;;;;7913:25:1;;;-1:-1:-1;;;;;25628:14:0;;;;:25;;7886:18:1;;25628:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25611:49;;25537:284;;;-1:-1:-1;;;;;25686:13:0;;;;;;:9;:13;;;;;;;;25682:139;;;25772:14;;:33;;-1:-1:-1;;;25772:33:0;;;;;7913:25:1;;;-1:-1:-1;;;;;25772:14:0;;;;:26;;7886:18:1;;25772:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25755:50;;25682:139;25844:17;25864:22;25872:14;25864:5;:22;:::i;:::-;25844:42;-1:-1:-1;25901:13:0;;25897:129;;25986:14;;-1:-1:-1;;;;;25986:14:0;25968:34;;;;:9;:34;;;;;;:46;;26005:9;;25968:46;:::i;:::-;25949:14;;-1:-1:-1;;;;;25949:14:0;25931:34;;;;:9;:34;;;;;:83;25897:129;26045:55;26075:4;26081:2;26085:14;26045:29;:55::i;:::-;26038:62;25260:848;-1:-1:-1;;;;;;25260:848:0:o;26819:259::-;26945:14;;:62;;-1:-1:-1;;;26945:62:0;;-1:-1:-1;;;;;3178:15:1;;;26945:62:0;;;3160:34:1;3210:18;;;3203:34;;;3273:15;;;3253:18;;;3246:43;3305:18;;;3298:34;;;26945:14:0;;;;:28;;3094:19:1;;26945:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27018:52;28964:93;22624:205;22724:7;22760:2;-1:-1:-1;;;;;22752:10:0;:4;-1:-1:-1;;;;;22752:10:0;;;22744:54;;;;-1:-1:-1;;;22744:54:0;;7269:2:1;22744:54:0;;;7251:21:1;7308:2;7288:18;;;7281:30;7347:33;7327:18;;;7320:61;7398:18;;22744:54:0;7067:355:1;22744:54:0;-1:-1:-1;22816:5:0;22624:205;-1:-1:-1;;22624:205:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:315::-;1046:6;1054;1107:2;1095:9;1086:7;1082:23;1078:32;1075:52;;;1123:1;1120;1113:12;1075:52;1146:29;1165:9;1146:29;:::i;:::-;1136:39;;1225:2;1214:9;1210:18;1197:32;1238:28;1260:5;1238:28;:::i;:::-;1285:5;1275:15;;;981:315;;;;;:::o;1301:254::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;1545:2;1530:18;;;;1517:32;;-1:-1:-1;;;1301:254:1:o;1560:241::-;1616:6;1669:2;1657:9;1648:7;1644:23;1640:32;1637:52;;;1685:1;1682;1675:12;1637:52;1724:9;1711:23;1743:28;1765:5;1743:28;:::i;1806:245::-;1873:6;1926:2;1914:9;1905:7;1901:23;1897:32;1894:52;;;1942:1;1939;1932:12;1894:52;1974:9;1968:16;1993:28;2015:5;1993:28;:::i;2056:180::-;2115:6;2168:2;2156:9;2147:7;2143:23;2139:32;2136:52;;;2184:1;2181;2174:12;2136:52;-1:-1:-1;2207:23:1;;2056:180;-1:-1:-1;2056:180:1:o;2241:184::-;2311:6;2364:2;2352:9;2343:7;2339:23;2335:32;2332:52;;;2380:1;2377;2370:12;2332:52;-1:-1:-1;2403:16:1;;2241:184;-1:-1:-1;2241:184:1:o;2430:248::-;2498:6;2506;2559:2;2547:9;2538:7;2534:23;2530:32;2527:52;;;2575:1;2572;2565:12;2527:52;-1:-1:-1;;2598:23:1;;;2668:2;2653:18;;;2640:32;;-1:-1:-1;2430:248:1:o;3535:597::-;3647:4;3676:2;3705;3694:9;3687:21;3737:6;3731:13;3780:6;3775:2;3764:9;3760:18;3753:34;3805:1;3815:140;3829:6;3826:1;3823:13;3815:140;;;3924:14;;;3920:23;;3914:30;3890:17;;;3909:2;3886:26;3879:66;3844:10;;3815:140;;;3973:6;3970:1;3967:13;3964:91;;;4043:1;4038:2;4029:6;4018:9;4014:22;4010:31;4003:42;3964:91;-1:-1:-1;4116:2:1;4095:15;-1:-1:-1;;4091:29:1;4076:45;;;;4123:2;4072:54;;3535:597;-1:-1:-1;;;3535:597:1:o;5265:343::-;5467:2;5449:21;;;5506:2;5486:18;;;5479:30;-1:-1:-1;;;5540:2:1;5525:18;;5518:49;5599:2;5584:18;;5265:343::o;8138:128::-;8178:3;8209:1;8205:6;8202:1;8199:13;8196:39;;;8215:18;;:::i;:::-;-1:-1:-1;8251:9:1;;8138:128::o;8271:125::-;8311:4;8339:1;8336;8333:8;8330:34;;;8344:18;;:::i;:::-;-1:-1:-1;8381:9:1;;8271:125::o;8401:380::-;8480:1;8476:12;;;;8523;;;8544:61;;8598:4;8590:6;8586:17;8576:27;;8544:61;8651:2;8643:6;8640:14;8620:18;8617:38;8614:161;;;8697:10;8692:3;8688:20;8685:1;8678:31;8732:4;8729:1;8722:15;8760:4;8757:1;8750:15;8614:161;;8401:380;;;:::o;8786:127::-;8847:10;8842:3;8838:20;8835:1;8828:31;8878:4;8875:1;8868:15;8902:4;8899:1;8892:15;8918:118;9004:5;8997:13;8990:21;8983:5;8980:32;8970:60;;9026:1;9023;9016:12

Swarm Source

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