ETH Price: $3,459.35 (+1.81%)
Gas: 10 Gwei

Origins (OG)
 

Overview

TokenID

83

Total Transfers

-

Market

Onchain Market Cap

$0.00

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:
Origins

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-08
*/

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

abstract contract ERC721Receiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(
        address indexed from,
        address indexed to,
        uint256 amount
    );
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 amount
    );
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed id
    );
    event ERC721Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed id
    );
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    ) Ownable(_owner) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(
        address spender,
        uint256 amountOrId
    ) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(
        address from,
        address to,
        uint256 amountOrId
    ) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (
                msg.sender != from &&
                !isApprovedForAll[from][msg.sender] &&
                msg.sender != getApproved[amountOrId]
            ) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max)
                allowance[from][msg.sender] = allowed - amountOrId;

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0 &&
            ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) !=
            ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) -
                (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) -
                (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

        emit Transfer(address(0), to, id);
    }

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(
        string memory _name,
        string memory _symbol
    ) internal {
        name = _name;
        symbol = _symbol;
    }
}



/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Muldiv operation overflow.
     */
    error MathOverflowedMulDiv();

    enum Rounding {
        Floor, // Toward negative infinity
        Ceil, // Toward positive infinity
        Trunc, // Toward zero
        Expand // Away from zero
    }

    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @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 towards infinity instead
     * of rounding towards zero.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        if (b == 0) {
            // Guarantee the same behavior as in a regular Solidity division.
            return a / b;
        }

        // (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 = x * y; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                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.
            if (denominator <= prod1) {
                revert MathOverflowedMulDiv();
            }

            ///////////////////////////////////////////////
            // 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.

            uint256 twos = denominator & (0 - denominator);
            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 (unsignedRoundsUp(rounding) && 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
     * towards zero.
     *
     * 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 + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256 of a positive value rounded towards zero.
     * 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 + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0);
        }
    }

    /**
     * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers.
     */
    function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) {
        return uint8(rounding) % 2 == 1;
    }
}



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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant HEX_DIGITS = "0123456789abcdef";
    uint8 private constant ADDRESS_LENGTH = 20;

    /**
     * @dev The `value` string doesn't fit in the specified `length`.
     */
    error StringsInsufficientHexLength(uint256 value, uint256 length);

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), HEX_DIGITS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `int256` to its ASCII `string` decimal representation.
     */
    function toStringSigned(int256 value) internal pure returns (string memory) {
        return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value)));
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        uint256 localValue = value;
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = HEX_DIGITS[localValue & 0xf];
            localValue >>= 4;
        }
        if (localValue != 0) {
            revert StringsInsufficientHexLength(value, length);
        }
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal
     * representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH);
    }

    /**
     * @dev Returns true if the two strings are equal.
     */
    function equal(string memory a, string memory b) internal pure returns (bool) {
        return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b));
    }
}


contract Origins is ERC404 {
    string public baseTokenURI; 

    constructor() ERC404("Origins", "OG", 18, 36, msg.sender) {
        balanceOf[msg.sender] = totalSupply;
    }

    function setTokenURI(string memory _tokenURI) public onlyOwner {
        baseTokenURI = _tokenURI;
    }

    function setNameSymbol(string memory _name, string memory _symbol) public onlyOwner {
        _setNameSymbol(_name, _symbol);
    }

     function tokenURI(uint256 id) public view override returns (string memory) {
        return
        string.concat(
            string.concat(baseTokenURI, Strings.toString(id)),
            ".jpg"
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","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":"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":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60c060405234801562000010575f80fd5b5060408051808201825260078152664f726967696e7360c81b602080830191909152825180840190935260028352614f4760f01b9083015290601260243380806200006e576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001620000c48682620001b4565b506002620000d38582620001b4565b5060ff83166080819052620000ea90600a6200038f565b620000f69083620003a6565b60a0819052335f9081526004602052604090205550620003c09350505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200013f57607f821691505b6020821081036200015e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620001af57805f5260205f20601f840160051c810160208510156200018b5750805b601f840160051c820191505b81811015620001ac575f815560010162000197565b50505b505050565b81516001600160401b03811115620001d057620001d062000116565b620001e881620001e184546200012a565b8462000164565b602080601f8311600181146200021e575f8415620002065750858301515b5f19600386901b1c1916600185901b17855562000278565b5f85815260208120601f198616915b828110156200024e578886015182559484019460019091019084016200022d565b50858210156200026c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115620002d457815f1904821115620002b857620002b862000280565b80851615620002c657918102915b93841c939080029062000299565b509250929050565b5f82620002ec5750600162000389565b81620002fa57505f62000389565b81600181146200031357600281146200031e576200033e565b600191505062000389565b60ff84111562000332576200033262000280565b50506001821b62000389565b5060208310610133831016604e8410600b841016171562000363575081810a62000389565b6200036f838362000294565b805f190482111562000385576200038562000280565b0290505b92915050565b5f6200039f60ff841683620002dc565b9392505050565b808202811582820484141762000389576200038962000280565b60805160a051611a61620003e95f395f6101f701525f81816102490152610dc80152611a615ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806370a08231116100d9578063b88d4fde11610093578063dd62ed3e1161006e578063dd62ed3e14610381578063e0df5b6f146103ab578063e985e9c5146103be578063f2fde38b146103eb575f80fd5b8063b88d4fde14610353578063c87b56dd14610366578063d547cfb714610379575f80fd5b806370a08231146102d25780638da5cb5b146102f157806395d89b41146103035780639b19251a1461030b578063a22cb4651461032d578063a9059cbb14610340575f80fd5b8063313ce5671161012a578063313ce5671461024457806342842e0e1461027d5780634f02c42014610290578063504334c21461029957806353d6fd59146102ac5780636352211e146102bf575f80fd5b806306fdde0314610171578063081812fc1461018f578063095ea7b3146101cf57806318160ddd146101f257806323b872dd146102275780632b9689581461023c575b5f80fd5b6101796103fe565b6040516101869190611363565b60405180910390f35b6101b761019d366004611395565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610186565b6101e26101dd3660046113c2565b61048a565b6040519015158152602001610186565b6102197f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610186565b61023a6102353660046113ea565b6105d5565b005b61023a610951565b61026b7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610186565b61023a61028b3660046113ea565b6109b5565b61021960035481565b61023a6102a73660046114c0565b610a86565b61023a6102ba366004611520565b610abd565b6101b76102cd366004611395565b610b10565b6102196102e0366004611559565b60046020525f908152604090205481565b5f546101b7906001600160a01b031681565b610179610b4a565b6101e2610319366004611559565b600b6020525f908152604090205460ff1681565b61023a61033b366004611520565b610b57565b6101e261034e3660046113c2565b610bc2565b61023a610361366004611572565b610bd5565b610179610374366004611395565b610c95565b610179610ce6565b61021961038f366004611605565b600560209081525f928352604080842090915290825290205481565b61023a6103b9366004611636565b610cf3565b6101e26103cc366004611605565b600760209081525f928352604080842090915290825290205460ff1681565b61023a6103f9366004611559565b610d28565b6001805461040b90611670565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611670565b80156104825780601f1061045957610100808354040283529160200191610482565b820191905f5260205f20905b81548152906001019060200180831161046557829003601f168201915b505050505081565b5f600354821115801561049c57505f82115b15610570575f828152600860205260409020546001600160a01b03163381148015906104eb57506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610508576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506105cb565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60035481116108e5575f818152600860205260409020546001600160a01b0384811691161461061757604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661063e57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061067a57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561069c57505f818152600660205260409020546001600160a01b03163314155b156106b9576040516282b42960e81b815260040160405180910390fd5b6106c1610dc2565b6001600160a01b0384165f90815260046020526040812080549091906106e89084906116bc565b909155506106f69050610dc2565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b03199081169094179055600681528482208054909316909255918616825260099052908120805461075f906001906116bc565b8154811061076f5761076f6116cf565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a909352909220548154929350839281106107b2576107b26116cf565b5f9182526020808320909101929092556001600160a01b03861681526009909152604090208054806107e6576107e66116e3565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b03861680845260098352908320805460018181018355828652938520018690559252905461084891906116bc565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876108ce610dc2565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f19811461093e5761091a82826116bc565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610949848484610df3565b50505b505050565b5f546001600160a01b0316331461097a576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6109c08383836105d5565b6001600160a01b0382163b15801590610a685750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b91906116f7565b6001600160e01b03191614155b1561094c57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610aaf576040516282b42960e81b815260040160405180910390fd5b610ab98282610f98565b5050565b5f546001600160a01b03163314610ae6576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610b455760405163c5723b5160e01b815260040160405180910390fd5b919050565b6002805461040b90611670565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610bce338484610df3565b9392505050565b610be08585856105d5565b6001600160a01b0384163b15801590610c775750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c2a9033908a9089908990899060040161171e565b6020604051808303815f875af1158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a91906116f7565b6001600160e01b03191614155b1561094957604051633da6393160e01b815260040160405180910390fd5b6060600c610ca283610fb1565b604051602001610cb3929190611770565b60408051601f1981840301815290829052610cd0916020016117f3565b6040516020818303038152906040529050919050565b600c805461040b90611670565b5f546001600160a01b03163314610d1c576040516282b42960e81b815260040160405180910390fd5b600c610ab9828261185e565b5f546001600160a01b03163314610d51576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610d78576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f610dee7f0000000000000000000000000000000000000000000000000000000000000000600a6119fe565b905090565b5f80610dfd610dc2565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190610e3883866116bc565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16610ec7576001600160a01b0387165f90815260046020526040812054610e93908590611a0c565b610e9d8585611a0c565b610ea791906116bc565b90505f5b81811015610ec457610ebc89611041565b600101610eab565b50505b6001600160a01b0386165f908152600b602052604090205460ff16610f3e575f610ef18483611a0c565b6001600160a01b0388165f90815260046020526040902054610f14908690611a0c565b610f1e91906116bc565b90505f5b81811015610f3b57610f3388611162565b600101610f22565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051610f8391815260200190565b60405180910390a35060019695505050505050565b6001610fa4838261185e565b50600261094c828261185e565b60605f610fbd8361126a565b60010190505f8167ffffffffffffffff811115610fdc57610fdc611423565b6040519080825280601f01601f191660200182016040528015611006576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461101057509392505050565b6001600160a01b03811661106857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600960205260408120805461108d906001906116bc565b8154811061109d5761109d6116cf565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f208054806110da576110da6116e3565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661118957604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b0316156111c95760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461122091906116bc565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106112a85772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106112d4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106112f257662386f26fc10000830492506010015b6305f5e100831061130a576305f5e100830492506008015b612710831061131e57612710830492506004015b60648310611330576064830492506002015b600a83106105cf5760010192915050565b5f5b8381101561135b578181015183820152602001611343565b50505f910152565b602081525f8251806020840152611381816040850160208701611341565b601f01601f19169190910160400192915050565b5f602082840312156113a5575f80fd5b5035919050565b80356001600160a01b0381168114610b45575f80fd5b5f80604083850312156113d3575f80fd5b6113dc836113ac565b946020939093013593505050565b5f805f606084860312156113fc575f80fd5b611405846113ac565b9250611413602085016113ac565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611446575f80fd5b813567ffffffffffffffff8082111561146157611461611423565b604051601f8301601f19908116603f0116810190828211818310171561148957611489611423565b816040528381528660208588010111156114a1575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f80604083850312156114d1575f80fd5b823567ffffffffffffffff808211156114e8575f80fd5b6114f486838701611437565b93506020850135915080821115611509575f80fd5b5061151685828601611437565b9150509250929050565b5f8060408385031215611531575f80fd5b61153a836113ac565b91506020830135801515811461154e575f80fd5b809150509250929050565b5f60208284031215611569575f80fd5b610bce826113ac565b5f805f805f60808688031215611586575f80fd5b61158f866113ac565b945061159d602087016113ac565b935060408601359250606086013567ffffffffffffffff808211156115c0575f80fd5b818801915088601f8301126115d3575f80fd5b8135818111156115e1575f80fd5b8960208285010111156115f2575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611616575f80fd5b61161f836113ac565b915061162d602084016113ac565b90509250929050565b5f60208284031215611646575f80fd5b813567ffffffffffffffff81111561165c575f80fd5b61166884828501611437565b949350505050565b600181811c9082168061168457607f821691505b6020821081036116a257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156105cf576105cf6116a8565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611707575f80fd5b81516001600160e01b031981168114610bce575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f80845461177d81611670565b6001828116801561179557600181146117aa576117d6565b60ff19841687528215158302870194506117d6565b885f526020805f205f5b858110156117cd5781548a8201529084019082016117b4565b50505082870194505b5050505083516117ea818360208801611341565b01949350505050565b5f8251611804818460208701611341565b632e6a706760e01b920191825250600401919050565b601f82111561094c57805f5260205f20601f840160051c8101602085101561183f5750805b601f840160051c820191505b81811015610949575f815560010161184b565b815167ffffffffffffffff81111561187857611878611423565b61188c816118868454611670565b8461181a565b602080601f8311600181146118bf575f84156118a85750858301515b5f19600386901b1c1916600185901b178555611916565b5f85815260208120601f198616915b828110156118ed578886015182559484019460019091019084016118ce565b508582101561190a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b8085111561195857815f190482111561193e5761193e6116a8565b8085161561194b57918102915b93841c9390800290611923565b509250929050565b5f8261196e575060016105cf565b8161197a57505f6105cf565b8160018114611990576002811461199a576119b6565b60019150506105cf565b60ff8411156119ab576119ab6116a8565b50506001821b6105cf565b5060208310610133831016604e8410600b84101617156119d9575081810a6105cf565b6119e3838361191e565b805f19048211156119f6576119f66116a8565b029392505050565b5f610bce60ff841683611960565b5f82611a2657634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220ed73b5994d6f6b91d68761e70d9c92755a18aff3a615d609567a3add3157136764736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061016d575f3560e01c806370a08231116100d9578063b88d4fde11610093578063dd62ed3e1161006e578063dd62ed3e14610381578063e0df5b6f146103ab578063e985e9c5146103be578063f2fde38b146103eb575f80fd5b8063b88d4fde14610353578063c87b56dd14610366578063d547cfb714610379575f80fd5b806370a08231146102d25780638da5cb5b146102f157806395d89b41146103035780639b19251a1461030b578063a22cb4651461032d578063a9059cbb14610340575f80fd5b8063313ce5671161012a578063313ce5671461024457806342842e0e1461027d5780634f02c42014610290578063504334c21461029957806353d6fd59146102ac5780636352211e146102bf575f80fd5b806306fdde0314610171578063081812fc1461018f578063095ea7b3146101cf57806318160ddd146101f257806323b872dd146102275780632b9689581461023c575b5f80fd5b6101796103fe565b6040516101869190611363565b60405180910390f35b6101b761019d366004611395565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610186565b6101e26101dd3660046113c2565b61048a565b6040519015158152602001610186565b6102197f000000000000000000000000000000000000000000000001f399b1438a10000081565b604051908152602001610186565b61023a6102353660046113ea565b6105d5565b005b61023a610951565b61026b7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610186565b61023a61028b3660046113ea565b6109b5565b61021960035481565b61023a6102a73660046114c0565b610a86565b61023a6102ba366004611520565b610abd565b6101b76102cd366004611395565b610b10565b6102196102e0366004611559565b60046020525f908152604090205481565b5f546101b7906001600160a01b031681565b610179610b4a565b6101e2610319366004611559565b600b6020525f908152604090205460ff1681565b61023a61033b366004611520565b610b57565b6101e261034e3660046113c2565b610bc2565b61023a610361366004611572565b610bd5565b610179610374366004611395565b610c95565b610179610ce6565b61021961038f366004611605565b600560209081525f928352604080842090915290825290205481565b61023a6103b9366004611636565b610cf3565b6101e26103cc366004611605565b600760209081525f928352604080842090915290825290205460ff1681565b61023a6103f9366004611559565b610d28565b6001805461040b90611670565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611670565b80156104825780601f1061045957610100808354040283529160200191610482565b820191905f5260205f20905b81548152906001019060200180831161046557829003601f168201915b505050505081565b5f600354821115801561049c57505f82115b15610570575f828152600860205260409020546001600160a01b03163381148015906104eb57506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff16155b15610508576040516282b42960e81b815260040160405180910390fd5b5f8381526006602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3506105cb565b335f8181526005602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60035481116108e5575f818152600860205260409020546001600160a01b0384811691161461061757604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661063e57604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061067a57506001600160a01b0383165f90815260076020908152604080832033845290915290205460ff16155b801561069c57505f818152600660205260409020546001600160a01b03163314155b156106b9576040516282b42960e81b815260040160405180910390fd5b6106c1610dc2565b6001600160a01b0384165f90815260046020526040812080549091906106e89084906116bc565b909155506106f69050610dc2565b6001600160a01b038084165f81815260046020908152604080832080549096019095558582526008815284822080546001600160a01b03199081169094179055600681528482208054909316909255918616825260099052908120805461075f906001906116bc565b8154811061076f5761076f6116cf565b5f9182526020808320909101546001600160a01b0387168352600982526040808420868552600a909352909220548154929350839281106107b2576107b26116cf565b5f9182526020808320909101929092556001600160a01b03861681526009909152604090208054806107e6576107e66116e3565b5f828152602080822083015f19908101839055909201909255838252600a8152604080832054848452818420556001600160a01b03861680845260098352908320805460018181018355828652938520018690559252905461084891906116bc565b5f838152600a602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314876108ce610dc2565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526005602090815260408083203384529091529020545f19811461093e5761091a82826116bc565b6001600160a01b0385165f9081526005602090815260408083203384529091529020555b610949848484610df3565b50505b505050565b5f546001600160a01b0316331461097a576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b6109c08383836105d5565b6001600160a01b0382163b15801590610a685750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610a37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5b91906116f7565b6001600160e01b03191614155b1561094c57604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610aaf576040516282b42960e81b815260040160405180910390fd5b610ab98282610f98565b5050565b5f546001600160a01b03163314610ae6576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600b60205260409020805460ff1916911515919091179055565b5f818152600860205260409020546001600160a01b031680610b455760405163c5723b5160e01b815260040160405180910390fd5b919050565b6002805461040b90611670565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610bce338484610df3565b9392505050565b610be08585856105d5565b6001600160a01b0384163b15801590610c775750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610c2a9033908a9089908990899060040161171e565b6020604051808303815f875af1158015610c46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6a91906116f7565b6001600160e01b03191614155b1561094957604051633da6393160e01b815260040160405180910390fd5b6060600c610ca283610fb1565b604051602001610cb3929190611770565b60408051601f1981840301815290829052610cd0916020016117f3565b6040516020818303038152906040529050919050565b600c805461040b90611670565b5f546001600160a01b03163314610d1c576040516282b42960e81b815260040160405180910390fd5b600c610ab9828261185e565b5f546001600160a01b03163314610d51576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610d78576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f610dee7f0000000000000000000000000000000000000000000000000000000000000012600a6119fe565b905090565b5f80610dfd610dc2565b6001600160a01b038087165f818152600460205260408082208054948a1683529082205492825293945091929091869190610e3883866116bc565b90915550506001600160a01b038087165f90815260046020908152604080832080548a019055928a168252600b9052205460ff16610ec7576001600160a01b0387165f90815260046020526040812054610e93908590611a0c565b610e9d8585611a0c565b610ea791906116bc565b90505f5b81811015610ec457610ebc89611041565b600101610eab565b50505b6001600160a01b0386165f908152600b602052604090205460ff16610f3e575f610ef18483611a0c565b6001600160a01b0388165f90815260046020526040902054610f14908690611a0c565b610f1e91906116bc565b90505f5b81811015610f3b57610f3388611162565b600101610f22565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051610f8391815260200190565b60405180910390a35060019695505050505050565b6001610fa4838261185e565b50600261094c828261185e565b60605f610fbd8361126a565b60010190505f8167ffffffffffffffff811115610fdc57610fdc611423565b6040519080825280601f01601f191660200182016040528015611006576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461101057509392505050565b6001600160a01b03811661106857604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b0381165f908152600960205260408120805461108d906001906116bc565b8154811061109d5761109d6116cf565b905f5260205f200154905060095f836001600160a01b03166001600160a01b031681526020019081526020015f208054806110da576110da6116e3565b5f828152602080822083015f19908101839055909201909255828252600a815260408083208390556008825280832080546001600160a01b031990811690915560069092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b03811661118957604051634e46966960e11b815260040160405180910390fd5b60038054600101908190555f818152600860205260409020546001600160a01b0316156111c95760405163119b4fd360e11b815260040160405180910390fd5b5f81815260086020908152604080832080546001600160a01b0319166001600160a01b03871690811790915580845260098352908320805460018181018355828652938520018590559252905461122091906116bc565b5f828152600a602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106112a85772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106112d4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106112f257662386f26fc10000830492506010015b6305f5e100831061130a576305f5e100830492506008015b612710831061131e57612710830492506004015b60648310611330576064830492506002015b600a83106105cf5760010192915050565b5f5b8381101561135b578181015183820152602001611343565b50505f910152565b602081525f8251806020840152611381816040850160208701611341565b601f01601f19169190910160400192915050565b5f602082840312156113a5575f80fd5b5035919050565b80356001600160a01b0381168114610b45575f80fd5b5f80604083850312156113d3575f80fd5b6113dc836113ac565b946020939093013593505050565b5f805f606084860312156113fc575f80fd5b611405846113ac565b9250611413602085016113ac565b9150604084013590509250925092565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611446575f80fd5b813567ffffffffffffffff8082111561146157611461611423565b604051601f8301601f19908116603f0116810190828211818310171561148957611489611423565b816040528381528660208588010111156114a1575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f80604083850312156114d1575f80fd5b823567ffffffffffffffff808211156114e8575f80fd5b6114f486838701611437565b93506020850135915080821115611509575f80fd5b5061151685828601611437565b9150509250929050565b5f8060408385031215611531575f80fd5b61153a836113ac565b91506020830135801515811461154e575f80fd5b809150509250929050565b5f60208284031215611569575f80fd5b610bce826113ac565b5f805f805f60808688031215611586575f80fd5b61158f866113ac565b945061159d602087016113ac565b935060408601359250606086013567ffffffffffffffff808211156115c0575f80fd5b818801915088601f8301126115d3575f80fd5b8135818111156115e1575f80fd5b8960208285010111156115f2575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611616575f80fd5b61161f836113ac565b915061162d602084016113ac565b90509250929050565b5f60208284031215611646575f80fd5b813567ffffffffffffffff81111561165c575f80fd5b61166884828501611437565b949350505050565b600181811c9082168061168457607f821691505b6020821081036116a257634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156105cf576105cf6116a8565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611707575f80fd5b81516001600160e01b031981168114610bce575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f80845461177d81611670565b6001828116801561179557600181146117aa576117d6565b60ff19841687528215158302870194506117d6565b885f526020805f205f5b858110156117cd5781548a8201529084019082016117b4565b50505082870194505b5050505083516117ea818360208801611341565b01949350505050565b5f8251611804818460208701611341565b632e6a706760e01b920191825250600401919050565b601f82111561094c57805f5260205f20601f840160051c8101602085101561183f5750805b601f840160051c820191505b81811015610949575f815560010161184b565b815167ffffffffffffffff81111561187857611878611423565b61188c816118868454611670565b8461181a565b602080601f8311600181146118bf575f84156118a85750858301515b5f19600386901b1c1916600185901b178555611916565b5f85815260208120601f198616915b828110156118ed578886015182559484019460019091019084016118ce565b508582101561190a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b600181815b8085111561195857815f190482111561193e5761193e6116a8565b8085161561194b57918102915b93841c9390800290611923565b509250929050565b5f8261196e575060016105cf565b8161197a57505f6105cf565b8160018114611990576002811461199a576119b6565b60019150506105cf565b60ff8411156119ab576119ab6116a8565b50506001821b6105cf565b5060208310610133831016604e8410600b84101617156119d9575081810a6105cf565b6119e3838361191e565b805f19048211156119f6576119f66116a8565b029392505050565b5f610bce60ff841683611960565b5f82611a2657634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220ed73b5994d6f6b91d68761e70d9c92755a18aff3a615d609567a3add3157136764736f6c63430008180033

Deployed Bytecode Sourcemap

31221:668:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2800:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3511:46;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3511:46:0;;;;;;-1:-1:-1;;;;;1019:32:1;;;1001:51;;989:2;974:18;3511:46:0;855:203:1;5342:642:0;;;;;;:::i;:::-;;:::i;:::-;;;1665:14:1;;1658:22;1640:41;;1628:2;1613:18;5342:642:0;1500:187:1;3036:36:0;;;;;;;;1838:25:1;;;1826:2;1811:18;3036:36:0;1692:177:1;6391:1716:0;;;;;;:::i;:::-;;:::i;:::-;;797:151;;;:::i;2936:31::-;;;;;;;;2379:4:1;2367:17;;;2349:36;;2337:2;2322:18;2936:31:0;2207:184:1;8403:405:0;;;;;;:::i;:::-;;:::i;3171:21::-;;;;;;31525:133;;;;;;:::i;:::-;;:::i;4671:111::-;;;;;;:::i;:::-;;:::i;4854:193::-;;;;;;:::i;:::-;;:::i;3277:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;238:20;;;;;-1:-1:-1;;;;;238:20:0;;;2854;;;:::i;4122:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;6035:207;;;;;;:::i;:::-;;:::i;8166:160::-;;;;;;:::i;:::-;;:::i;8903:437::-;;;;;;:::i;:::-;;:::i;31667:219::-;;;;;;:::i;:::-;;:::i;31255:26::-;;;:::i;3391:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;31411:106;;;;;;:::i;:::-;;:::i;3622:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;570:219;;;;;;:::i;:::-;;:::i;2800:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5342:642::-;5445:4;5480:6;;5466:10;:20;;:38;;;;;5503:1;5490:10;:14;5466:38;5462:491;;;5521:13;5537:20;;;:8;:20;;;;;;-1:-1:-1;;;;;5537:20:0;5578:10;:19;;;;;:59;;-1:-1:-1;;;;;;5602:23:0;;;;;;:16;:23;;;;;;;;5626:10;5602:35;;;;;;;;;;5601:36;5578:59;5574:121;;;5665:14;;-1:-1:-1;;;5665:14:0;;;;;;;;;;;5574:121;5711:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;5711:33:0;-1:-1:-1;;;;;5711:33:0;;;;;;;;;5766:36;;1838:25:1;;;5766:36:0;;;;;;1811:18:1;5766:36:0;;;;;;;5506:308;5462:491;;;5845:10;5835:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;5835:30:0;;;;;;;;;;;;:43;;;5900:41;1838:25:1;;;5835:30:0;;5845:10;5900:41;;1811:18:1;5900:41:0;;;;;;;5462:491;-1:-1:-1;5972:4:0;5342:642;;;;;:::o;6391:1716::-;6537:6;;6523:10;:20;6519:1581;;6572:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;6564:28:0;;;6572:20;;6564:28;6560:91;;6620:15;;-1:-1:-1;;;6620:15:0;;;;;;;;;;;6560:91;-1:-1:-1;;;;;6671:16:0;;6667:82;;6715:18;;-1:-1:-1;;;6715:18:0;;;;;;;;;;;6667:82;6787:10;-1:-1:-1;;;;;6787:18:0;;;;;;:74;;-1:-1:-1;;;;;;6827:22:0;;;;;;:16;:22;;;;;;;;6850:10;6827:34;;;;;;;;;;6826:35;6787:74;:132;;;;-1:-1:-1;6896:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;6896:23:0;6882:10;:37;;6787:132;6765:226;;;6961:14;;-1:-1:-1;;;6961:14:0;;;;;;;;;;;6765:226;7026:10;:8;:10::i;:::-;-1:-1:-1;;;;;7007:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;7099:10:0;;-1:-1:-1;7099:8:0;:10::i;:::-;-1:-1:-1;;;;;7082:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;7141:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;7141:25:0;;;;;;;;7188:11;:23;;;;;7181:30;;;;;;;;7289:12;;;;;:6;:12;;;;;7302:19;;:23;;-1:-1:-1;;7302:23:0;:::i;:::-;7289:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7341:12:0;;;;:6;:12;;;;;;7354:23;;;:11;:23;;;;;;;7341:37;;7289;;-1:-1:-1;7289:37:0;;7341;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;7425:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;7425:18:0;;;;;;;;;;;;7529:23;;;:11;:23;;;;;;;7504:22;;;;;;:48;-1:-1:-1;;;;;7606:10:0;;;;;:6;:10;;;;;:27;;7425:18;7606:27;;;;;;;;;;;;;;;7716:10;;:17;;:21;;7425:18;7716:21;:::i;:::-;7690:23;;;;:11;:23;;;;;;:47;;;;7759:30;;7702:10;;-1:-1:-1;;;;;7759:30:0;;;;;;;;;;;7829:2;-1:-1:-1;;;;;7809:35:0;7823:4;-1:-1:-1;;;;;7809:35:0;;7833:10;:8;:10::i;:::-;7809:35;;1838:25:1;;;1826:2;1811:18;7809:35:0;;;;;;;6545:1311;6391:1716;;;:::o;6519:1581::-;-1:-1:-1;;;;;7895:15:0;;7877;7895;;;:9;:15;;;;;;;;7911:10;7895:27;;;;;;;;-1:-1:-1;;7943:28:0;;7939:101;;8020:20;8030:10;8020:7;:20;:::i;:::-;-1:-1:-1;;;;;7990:15:0;;;;;;:9;:15;;;;;;;;8006:10;7990:27;;;;;;;:50;7939:101;8057:31;8067:4;8073:2;8077:10;8057:9;:31::i;:::-;;7862:238;6519:1581;6391:1716;;;:::o;797:151::-;325:5;;-1:-1:-1;;;;;325:5:0;311:10;:19;307:46;;339:14;;-1:-1:-1;;;339:14:0;;;;;;;;;;;307:46;876:1:::1;860:18:::0;;-1:-1:-1;;;;;;860:18:0::1;::::0;;896:44:::1;::::0;917:10:::1;::::0;896:44:::1;::::0;876:1;;896:44:::1;797:151::o:0;8403:405::-;8527:26;8540:4;8546:2;8550;8527:12;:26::i;:::-;-1:-1:-1;;;;;8584:14:0;;;:19;;;;:154;;-1:-1:-1;8620:61:0;;-1:-1:-1;;;8620:61:0;;;8656:10;8620:61;;;6967:34:1;-1:-1:-1;;;;;7037:15:1;;;7017:18;;;7010:43;7069:18;;;7062:34;;;7132:3;7112:18;;;7105:31;-1:-1:-1;7152:19:1;;;7145:30;8698:40:0;;8620:35;;;;8698:40;;7192:19:1;;8620:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;8620:118:0;;;8584:154;8566:235;;;8772:17;;-1:-1:-1;;;8772:17:0;;;;;;;;;;;31525:133;325:5;;-1:-1:-1;;;;;325:5:0;311:10;:19;307:46;;339:14;;-1:-1:-1;;;339:14:0;;;;;;;;;;;307:46;31620:30:::1;31635:5;31642:7;31620:14;:30::i;:::-;31525:133:::0;;:::o;4671:111::-;325:5;;-1:-1:-1;;;;;325:5:0;311:10;:19;307:46;;339:14;;-1:-1:-1;;;339:14:0;;;;;;;;;;;307:46;-1:-1:-1;;;;;4749:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;4749:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;4671:111::o;4854:193::-;4912:13;4946:12;;;:8;:12;;;;;;-1:-1:-1;;;;;4946:12:0;;4971:69;;5018:10;;-1:-1:-1;;;5018:10:0;;;;;;;;;;;4971:69;4854:193;;;:::o;2854:20::-;;;;;;;:::i;6035:207::-;6138:10;6121:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;6121:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;6121:49:0;;;;;;;;;;6188:46;;1640:41:1;;;6121:38:0;;6138:10;6188:46;;1613:18:1;6188:46:0;;;;;;;6035:207;;:::o;8166:160::-;8261:4;8285:33;8295:10;8307:2;8311:6;8285:9;:33::i;:::-;8278:40;8166:160;-1:-1:-1;;;8166:160:0:o;8903:437::-;9057:26;9070:4;9076:2;9080;9057:12;:26::i;:::-;-1:-1:-1;;;;;9114:14:0;;;:19;;;;:156;;-1:-1:-1;9150:63:0;;-1:-1:-1;;;9150:63:0;;;9230:40;-1:-1:-1;;;;;9150:35:0;;;9230:40;;9150:63;;9186:10;;9198:4;;9204:2;;9208:4;;;;9150:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;9150:120:0;;;9114:156;9096:237;;;9304:17;;-1:-1:-1;;;9304:17:0;;;;;;;;;;;31667:219;31727:13;31811:12;31825:20;31842:2;31825:16;:20::i;:::-;31797:49;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;31797:49:0;;;;;;;;;;31769:109;;31797:49;31769:109;;:::i;:::-;;;;;;;;;;;;;31753:125;;31667:219;;;:::o;31255:26::-;;;;;;;:::i;31411:106::-;325:5;;-1:-1:-1;;;;;325:5:0;311:10;:19;307:46;;339:14;;-1:-1:-1;;;339:14:0;;;;;;;;;;;307:46;31485:12:::1;:24;31500:9:::0;31485:12;:24:::1;:::i;570:219::-:0;325:5;;-1:-1:-1;;;;;325:5:0;311:10;:19;307:46;;339:14;;-1:-1:-1;;;339:14:0;;;;;;;;;;;307:46;-1:-1:-1;;;;;653:20:0;::::1;649:47;;682:14;;-1:-1:-1::0;;;682:14:0::1;;;;;;;;;;;649:47;709:5;:14:::0;;-1:-1:-1;;;;;;709:14:0::1;-1:-1:-1::0;;;;;709:14:0;::::1;::::0;;::::1;::::0;;741:40:::1;::::0;709:14;;762:10:::1;::::0;741:40:::1;::::0;709:5;741:40:::1;570:219:::0;:::o;10540:92::-;10583:7;10610:14;10616:8;10610:2;:14;:::i;:::-;10603:21;;10540:92;:::o;9408:1093::-;9521:4;9538:12;9553:10;:8;:10::i;:::-;-1:-1:-1;;;;;9604:15:0;;;9574:27;9604:15;;;:9;:15;;;;;;;;9662:13;;;;;;;;;9688:15;;;9538:25;;-1:-1:-1;9604:15:0;;9662:13;;9707:6;;9604:15;9688:25;9707:6;9604:15;9688:25;:::i;:::-;;;;-1:-1:-1;;;;;;;9751:13:0;;;;;;;:9;:13;;;;;;;;:23;;;;;;9859:15;;;;;:9;:15;;;;;;9854:251;;-1:-1:-1;;;;;9965:15:0;;9891:22;9965:15;;;:9;:15;;;;;;:22;;9983:4;;9965:22;:::i;:::-;9917:26;9939:4;9917:19;:26;:::i;:::-;9916:72;;;;:::i;:::-;9891:97;;10008:9;10003:91;10027:14;10023:1;:18;10003:91;;;10067:11;10073:4;10067:5;:11::i;:::-;10043:3;;10003:91;;;;9876:229;9854:251;-1:-1:-1;;;;;10181:13:0;;;;;;:9;:13;;;;;;;;10176:247;;10211:22;10279:28;10303:4;10279:21;:28;:::i;:::-;-1:-1:-1;;;;;10237:13:0;;;;;;:9;:13;;;;;;:20;;10253:4;;10237:20;:::i;:::-;10236:72;;;;:::i;:::-;10211:97;;10328:9;10323:89;10347:14;10343:1;:18;10323:89;;;10387:9;10393:2;10387:5;:9::i;:::-;10363:3;;10323:89;;;;10196:227;10176:247;10460:2;-1:-1:-1;;;;;10440:31:0;10454:4;-1:-1:-1;;;;;10440:31:0;;10464:6;10440:31;;;;1838:25:1;;1826:2;1811:18;;1692:177;10440:31:0;;;;;;;;-1:-1:-1;10489:4:0;;9408:1093;-1:-1:-1;;;;;;9408:1093:0:o;11503:160::-;11616:4;:12;11623:5;11616:4;:12;:::i;:::-;-1:-1:-1;11639:6:0;:16;11648:7;11639:6;:16;:::i;28684:718::-;28740:13;28791:14;28808:17;28819:5;28808:10;:17::i;:::-;28828:1;28808:21;28791:38;;28844:20;28878:6;28867:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28867:18:0;-1:-1:-1;28844:41:0;-1:-1:-1;29009:28:0;;;29025:2;29009:28;29066:290;-1:-1:-1;;29098:5:0;-1:-1:-1;;;29235:2:0;29224:14;;29219:32;29098:5;29206:46;29298:2;29289:11;;;-1:-1:-1;29319:21:0;29066:290;29319:21;-1:-1:-1;29377:6:0;28684:718;-1:-1:-1;;;28684:718:0:o;11122:373::-;-1:-1:-1;;;;;11183:18:0;;11179:73;;11225:15;;-1:-1:-1;;;11225:15:0;;;;;;;;;;;11179:73;-1:-1:-1;;;;;11277:12:0;;11264:10;11277:12;;;:6;:12;;;;;11290:19;;:23;;11312:1;;11290:23;:::i;:::-;11277:37;;;;;;;;:::i;:::-;;;;;;;;;11264:50;;11325:6;:12;11332:4;-1:-1:-1;;;;;11325:12:0;-1:-1:-1;;;;;11325:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;11325:18:0;;;;;;;;;;;;11361:15;;;:11;:15;;;;;;11354:22;;;11394:8;:12;;;;;11387:19;;-1:-1:-1;;;;;;11387:19:0;;;;;;11424:11;:15;;;;;;11417:22;;;;;;;;11457:30;11373:2;;11325:18;-1:-1:-1;;;;;11457:30:0;;;;;11325:18;;11457:30;11168:327;11122:373;:::o;10640:474::-;-1:-1:-1;;;;;10699:16:0;;10695:74;;10739:18;;-1:-1:-1;;;10739:18:0;;;;;;;;;;;10695:74;10806:6;:8;;;;;;;;:6;10874:12;;;:8;:12;;;;;;-1:-1:-1;;;;;10874:12:0;:26;10870:81;;10924:15;;-1:-1:-1;;;10924:15:0;;;;;;;;;;;10870:81;10963:12;;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;10963:17:0;-1:-1:-1;;;;;10963:17:0;;;;;;;;10991:10;;;:6;:10;;;;;:19;;-1:-1:-1;10991:19:0;;;;;;;;;;;;;;;11039:10;;:17;;:21;;-1:-1:-1;11039:21:0;:::i;:::-;11021:15;;;;:11;:15;;;;;;:39;;;;11078:28;;11033:2;;-1:-1:-1;;;;;11078:28:0;;;;;11021:15;;11078:28;10684:430;10640:474;:::o;24074:948::-;24127:7;;-1:-1:-1;;;24205:17:0;;24201:106;;-1:-1:-1;;;24243:17:0;;;-1:-1:-1;24289:2:0;24279:12;24201:106;24334:8;24325:5;:17;24321:106;;24372:8;24363:17;;;-1:-1:-1;24409:2:0;24399:12;24321:106;24454:8;24445:5;:17;24441:106;;24492:8;24483:17;;;-1:-1:-1;24529:2:0;24519:12;24441:106;24574:7;24565:5;:16;24561:103;;24611:7;24602:16;;;-1:-1:-1;24647:1:0;24637:11;24561:103;24691:7;24682:5;:16;24678:103;;24728:7;24719:16;;;-1:-1:-1;24764:1:0;24754:11;24678:103;24808:7;24799:5;:16;24795:103;;24845:7;24836:16;;;-1:-1:-1;24881:1:0;24871:11;24795:103;24925:7;24916:5;:16;24912:68;;24963:1;24953:11;25008:6;24074:948;-1:-1:-1;;24074:948:0:o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:180::-;729:6;782:2;770:9;761:7;757:23;753:32;750:52;;;798:1;795;788:12;750:52;-1:-1:-1;821:23:1;;670:180;-1:-1:-1;670:180:1:o;1063:173::-;1131:20;;-1:-1:-1;;;;;1180:31:1;;1170:42;;1160:70;;1226:1;1223;1216:12;1241:254;1309:6;1317;1370:2;1358:9;1349:7;1345:23;1341:32;1338:52;;;1386:1;1383;1376:12;1338:52;1409:29;1428:9;1409:29;:::i;:::-;1399:39;1485:2;1470:18;;;;1457:32;;-1:-1:-1;;;1241:254:1:o;1874:328::-;1951:6;1959;1967;2020:2;2008:9;1999:7;1995:23;1991:32;1988:52;;;2036:1;2033;2026:12;1988:52;2059:29;2078:9;2059:29;:::i;:::-;2049:39;;2107:38;2141:2;2130:9;2126:18;2107:38;:::i;:::-;2097:48;;2192:2;2181:9;2177:18;2164:32;2154:42;;1874:328;;;;;:::o;2396:127::-;2457:10;2452:3;2448:20;2445:1;2438:31;2488:4;2485:1;2478:15;2512:4;2509:1;2502:15;2528:719;2571:5;2624:3;2617:4;2609:6;2605:17;2601:27;2591:55;;2642:1;2639;2632:12;2591:55;2678:6;2665:20;2704:18;2741:2;2737;2734:10;2731:36;;;2747:18;;:::i;:::-;2822:2;2816:9;2790:2;2876:13;;-1:-1:-1;;2872:22:1;;;2896:2;2868:31;2864:40;2852:53;;;2920:18;;;2940:22;;;2917:46;2914:72;;;2966:18;;:::i;:::-;3006:10;3002:2;2995:22;3041:2;3033:6;3026:18;3087:3;3080:4;3075:2;3067:6;3063:15;3059:26;3056:35;3053:55;;;3104:1;3101;3094:12;3053:55;3168:2;3161:4;3153:6;3149:17;3142:4;3134:6;3130:17;3117:54;3215:1;3208:4;3203:2;3195:6;3191:15;3187:26;3180:37;3235:6;3226:15;;;;;;2528:719;;;;:::o;3252:543::-;3340:6;3348;3401:2;3389:9;3380:7;3376:23;3372:32;3369:52;;;3417:1;3414;3407:12;3369:52;3457:9;3444:23;3486:18;3527:2;3519:6;3516:14;3513:34;;;3543:1;3540;3533:12;3513:34;3566:50;3608:7;3599:6;3588:9;3584:22;3566:50;:::i;:::-;3556:60;;3669:2;3658:9;3654:18;3641:32;3625:48;;3698:2;3688:8;3685:16;3682:36;;;3714:1;3711;3704:12;3682:36;;3737:52;3781:7;3770:8;3759:9;3755:24;3737:52;:::i;:::-;3727:62;;;3252:543;;;;;:::o;3800:347::-;3865:6;3873;3926:2;3914:9;3905:7;3901:23;3897:32;3894:52;;;3942:1;3939;3932:12;3894:52;3965:29;3984:9;3965:29;:::i;:::-;3955:39;;4044:2;4033:9;4029:18;4016:32;4091:5;4084:13;4077:21;4070:5;4067:32;4057:60;;4113:1;4110;4103:12;4057:60;4136:5;4126:15;;;3800:347;;;;;:::o;4152:186::-;4211:6;4264:2;4252:9;4243:7;4239:23;4235:32;4232:52;;;4280:1;4277;4270:12;4232:52;4303:29;4322:9;4303:29;:::i;4343:808::-;4440:6;4448;4456;4464;4472;4525:3;4513:9;4504:7;4500:23;4496:33;4493:53;;;4542:1;4539;4532:12;4493:53;4565:29;4584:9;4565:29;:::i;:::-;4555:39;;4613:38;4647:2;4636:9;4632:18;4613:38;:::i;:::-;4603:48;;4698:2;4687:9;4683:18;4670:32;4660:42;;4753:2;4742:9;4738:18;4725:32;4776:18;4817:2;4809:6;4806:14;4803:34;;;4833:1;4830;4823:12;4803:34;4871:6;4860:9;4856:22;4846:32;;4916:7;4909:4;4905:2;4901:13;4897:27;4887:55;;4938:1;4935;4928:12;4887:55;4978:2;4965:16;5004:2;4996:6;4993:14;4990:34;;;5020:1;5017;5010:12;4990:34;5065:7;5060:2;5051:6;5047:2;5043:15;5039:24;5036:37;5033:57;;;5086:1;5083;5076:12;5033:57;4343:808;;;;-1:-1:-1;4343:808:1;;-1:-1:-1;5117:2:1;5109:11;;5139:6;4343:808;-1:-1:-1;;;4343:808:1:o;5156:260::-;5224:6;5232;5285:2;5273:9;5264:7;5260:23;5256:32;5253:52;;;5301:1;5298;5291:12;5253:52;5324:29;5343:9;5324:29;:::i;:::-;5314:39;;5372:38;5406:2;5395:9;5391:18;5372:38;:::i;:::-;5362:48;;5156:260;;;;;:::o;5421:322::-;5490:6;5543:2;5531:9;5522:7;5518:23;5514:32;5511:52;;;5559:1;5556;5549:12;5511:52;5599:9;5586:23;5632:18;5624:6;5621:30;5618:50;;;5664:1;5661;5654:12;5618:50;5687;5729:7;5720:6;5709:9;5705:22;5687:50;:::i;:::-;5677:60;5421:322;-1:-1:-1;;;;5421:322:1:o;5748:380::-;5827:1;5823:12;;;;5870;;;5891:61;;5945:4;5937:6;5933:17;5923:27;;5891:61;5998:2;5990:6;5987:14;5967:18;5964:38;5961:161;;6044:10;6039:3;6035:20;6032:1;6025:31;6079:4;6076:1;6069:15;6107:4;6104:1;6097:15;5961:161;;5748:380;;;:::o;6133:127::-;6194:10;6189:3;6185:20;6182:1;6175:31;6225:4;6222:1;6215:15;6249:4;6246:1;6239:15;6265:128;6332:9;;;6353:11;;;6350:37;;;6367:18;;:::i;6398:127::-;6459:10;6454:3;6450:20;6447:1;6440:31;6490:4;6487:1;6480:15;6514:4;6511:1;6504:15;6530:127;6591:10;6586:3;6582:20;6579:1;6572:31;6622:4;6619:1;6612:15;6646:4;6643:1;6636:15;7222:290;7291:6;7344:2;7332:9;7323:7;7319:23;7315:32;7312:52;;;7360:1;7357;7350:12;7312:52;7386:16;;-1:-1:-1;;;;;;7431:32:1;;7421:43;;7411:71;;7478:1;7475;7468:12;7517:662;-1:-1:-1;;;;;7796:15:1;;;7778:34;;7848:15;;7843:2;7828:18;;7821:43;7895:2;7880:18;;7873:34;;;7943:3;7938:2;7923:18;;7916:31;;;7963:19;;7956:35;;;7721:4;7984:6;8034;7758:3;8013:19;;8000:49;8099:1;8093:3;8084:6;8073:9;8069:22;8065:32;8058:43;8169:3;8162:2;8158:7;8153:2;8145:6;8141:15;8137:29;8126:9;8122:45;8118:55;8110:63;;7517:662;;;;;;;;:::o;8310:1021::-;8486:3;8515:1;8548:6;8542:13;8578:36;8604:9;8578:36;:::i;:::-;8633:1;8650:17;;;8676:133;;;;8823:1;8818:358;;;;8643:533;;8676:133;-1:-1:-1;;8709:24:1;;8697:37;;8782:14;;8775:22;8763:35;;8754:45;;;-1:-1:-1;8676:133:1;;8818:358;8849:6;8846:1;8839:17;8879:4;8924;8921:1;8911:18;8951:1;8965:165;8979:6;8976:1;8973:13;8965:165;;;9057:14;;9044:11;;;9037:35;9100:16;;;;8994:10;;8965:165;;;8969:3;;;9159:6;9154:3;9150:16;9143:23;;8643:533;;;;;9207:6;9201:13;9223:68;9282:8;9277:3;9270:4;9262:6;9258:17;9223:68;:::i;:::-;9307:18;;8310:1021;-1:-1:-1;;;;8310:1021:1:o;9336:444::-;9557:3;9595:6;9589:13;9611:66;9670:6;9665:3;9658:4;9650:6;9646:17;9611:66;:::i;:::-;-1:-1:-1;;;9699:16:1;;9724:21;;;-1:-1:-1;9772:1:1;9761:13;;9336:444;-1:-1:-1;9336:444:1:o;9785:518::-;9887:2;9882:3;9879:11;9876:421;;;9923:5;9920:1;9913:16;9967:4;9964:1;9954:18;10037:2;10025:10;10021:19;10018:1;10014:27;10008:4;10004:38;10073:4;10061:10;10058:20;10055:47;;;-1:-1:-1;10096:4:1;10055:47;10151:2;10146:3;10142:12;10139:1;10135:20;10129:4;10125:31;10115:41;;10206:81;10224:2;10217:5;10214:13;10206:81;;;10283:1;10269:16;;10250:1;10239:13;10206:81;;10479:1345;10605:3;10599:10;10632:18;10624:6;10621:30;10618:56;;;10654:18;;:::i;:::-;10683:97;10773:6;10733:38;10765:4;10759:11;10733:38;:::i;:::-;10727:4;10683:97;:::i;:::-;10835:4;;10892:2;10881:14;;10909:1;10904:663;;;;11611:1;11628:6;11625:89;;;-1:-1:-1;11680:19:1;;;11674:26;11625:89;-1:-1:-1;;10436:1:1;10432:11;;;10428:24;10424:29;10414:40;10460:1;10456:11;;;10411:57;11727:81;;10874:944;;10904:663;8257:1;8250:14;;;8294:4;8281:18;;-1:-1:-1;;10940:20:1;;;11058:236;11072:7;11069:1;11066:14;11058:236;;;11161:19;;;11155:26;11140:42;;11253:27;;;;11221:1;11209:14;;;;11088:19;;11058:236;;;11062:3;11322:6;11313:7;11310:19;11307:201;;;11383:19;;;11377:26;-1:-1:-1;;11466:1:1;11462:14;;;11478:3;11458:24;11454:37;11450:42;11435:58;11420:74;;11307:201;;;11554:1;11545:6;11542:1;11538:14;11534:22;11528:4;11521:36;10874:944;;;;;10479:1345;;:::o;11829:416::-;11918:1;11955:5;11918:1;11969:270;11990:7;11980:8;11977:21;11969:270;;;12049:4;12045:1;12041:6;12037:17;12031:4;12028:27;12025:53;;;12058:18;;:::i;:::-;12108:7;12098:8;12094:22;12091:55;;;12128:16;;;;12091:55;12207:22;;;;12167:15;;;;11969:270;;;11973:3;11829:416;;;;;:::o;12250:806::-;12299:5;12329:8;12319:80;;-1:-1:-1;12370:1:1;12384:5;;12319:80;12418:4;12408:76;;-1:-1:-1;12455:1:1;12469:5;;12408:76;12500:4;12518:1;12513:59;;;;12586:1;12581:130;;;;12493:218;;12513:59;12543:1;12534:10;;12557:5;;;12581:130;12618:3;12608:8;12605:17;12602:43;;;12625:18;;:::i;:::-;-1:-1:-1;;12681:1:1;12667:16;;12696:5;;12493:218;;12795:2;12785:8;12782:16;12776:3;12770:4;12767:13;12763:36;12757:2;12747:8;12744:16;12739:2;12733:4;12730:12;12726:35;12723:77;12720:159;;;-1:-1:-1;12832:19:1;;;12864:5;;12720:159;12911:34;12936:8;12930:4;12911:34;:::i;:::-;12981:6;12977:1;12973:6;12969:19;12960:7;12957:32;12954:58;;;12992:18;;:::i;:::-;13030:20;;12250:806;-1:-1:-1;;;12250:806:1:o;13061:140::-;13119:5;13148:47;13189:4;13179:8;13175:19;13169:4;13148:47;:::i;13338:217::-;13378:1;13404;13394:132;;13448:10;13443:3;13439:20;13436:1;13429:31;13483:4;13480:1;13473:15;13511:4;13508:1;13501:15;13394:132;-1:-1:-1;13540:9:1;;13338:217::o

Swarm Source

ipfs://ed73b5994d6f6b91d68761e70d9c92755a18aff3a615d609567a3add31571367
Loading...
Loading
[ 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.