ETH Price: $3,456.29 (+1.50%)
Gas: 10 Gwei

Token

ERC20 ***
 

Overview

Max Total Supply

28,312.567882421961279176 ERC20 ***

Holders

55

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
mlotta.eth
Balance
0.000000000000000001 ERC20 ***

Value
$0.00
0xb835367ae1cafcea58a10a51b17fea25d16c3dab
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:
JayERC20Deriv

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

File 2 of 13 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 3 of 13 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * 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 Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 default value returned by this function, unless
     * it's 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");
        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 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 {}

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

File 4 of 13 : ERC20Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;

import "../ERC20.sol";
import "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

File 5 of 13 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

File 6 of 13 : IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.0;

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

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

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

File 7 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 8 of 13 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";

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

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

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

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
     * 0 before setting it to a non-zero value.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
     * Revert on invalid signature.
     */
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

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

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

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

File 9 of 13 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 10 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 12 of 13 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 13 of 13 : JayDeriv.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import {IERC20, SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract JayERC20Deriv is ERC20Burnable, Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    IERC721 public JAYNFT;

    IERC20 public immutable backingToken;

    address payable private FEE_ADDRESS;

    uint256 private constant MIN = 1000;
    uint256 public immutable DECIMALS;
    uint256 public MAX = 1 * 10 ** 28;

    uint16 public SELL_FEE = 9000;
    uint16 public BUY_FEE = 9000;
    uint16 private constant FEE_BASE_1000 = 10000;

    uint16 private constant FEES = 25;

    bool public start;

    uint128 private constant ETHinWEI = 1 * 10 ** 18;

    event Price(uint256 recieved, uint256 sent);
    event MaxUpdated(uint256 max);
    event SellFeeUpdated(uint256 sellFee);
    event buyFeeUpdated(uint256 buyFee);

    constructor(address _backingToken) ERC20("Jaypeggers USDC", "jUSDC") {
        backingToken = IERC20(_backingToken);
        DECIMALS = ETHinWEI / (1 * 10 ** IERC20Metadata(_backingToken).decimals());
    }

    function setJAYNFT(address _nft) external onlyOwner{
        JAYNFT = IERC721(_nft);
    }
    
    function init(uint256 value) external onlyOwner {
        require(!start);
        backingToken.safeTransferFrom(msg.sender, address(this), value);
        _mint(msg.sender, value * DECIMALS);
        transfer(0x000000000000000000000000000000000000dEaD, 1000);
    }

    function setStart() external onlyOwner {    
        start = true;
    }

    //Will be set to 100m eth value after 1 hr
    function setMax(uint256 _max) external onlyOwner {
        MAX = _max;
        emit MaxUpdated(_max);
    }

    // Sell Jay
    function sellNftDiscount(uint256 jay) external nonReentrant {
        require(jay > 0, "must trade over 0");
        uint256 discount = JAYNFT.balanceOf(msg.sender) * 3; 
        if(discount > 300) discount = 300; 
        // Total Eth to be sent
        uint256 eth = JAYtoETH(jay);

        // Burn of JAY
        _burn(msg.sender, jay);

        // Payment to sender
        backingToken.safeTransfer(msg.sender, (eth * (SELL_FEE + discount)) / FEE_BASE_1000);
        // Team fee
        backingToken.safeTransfer(FEE_ADDRESS, eth / FEES);

        emit Price(jay, eth);
    }
    function buyNftDiscount(address reciever, uint256 amount) external nonReentrant {
        require(start);
        require(amount > MIN && amount < MAX, "must trade over min");
        uint256 discount = JAYNFT.balanceOf(msg.sender) * 3; 
        if(discount > 300) discount = 300; 

        // Mint Jay to sender

         uint256 jay = ETHtoJAY(amount);
        _mint(reciever, (jay * (BUY_FEE + discount)) / FEE_BASE_1000);

        backingToken.safeTransferFrom(msg.sender, address(this), amount);
        // Team fee
        backingToken.safeTransfer(FEE_ADDRESS, amount / FEES);

        emit Price(jay, amount);
    }
    function sell(uint256 jay) external nonReentrant {
        // Total Eth to be sent
        require(jay > 0, "must trade over 0");
        uint256 eth = JAYtoETH(jay);

        // Burn of JAY
        _burn(msg.sender, jay);

        // Payment to sender
        backingToken.safeTransfer(msg.sender, (eth * SELL_FEE) / FEE_BASE_1000);
        // Team fee
        backingToken.safeTransfer(FEE_ADDRESS, eth / FEES);

        emit Price(jay, eth);
    }

    // Buy Jay
    function buy(address reciever, uint256 amount) external nonReentrant {
        require(start, "contract not initiated");
        require(amount > MIN, "must trade over min");


        // Mint Jay to sender
        uint256 jay = ETHtoJAY(amount);
        _mint(reciever, (jay * BUY_FEE) / FEE_BASE_1000);

        backingToken.safeTransferFrom(msg.sender, address(this), amount);
        // Team fee
        backingToken.safeTransfer(FEE_ADDRESS, amount / FEES);

        emit Price(jay, amount);
    }

    function JAYtoETH(uint256 value) public view returns (uint256) {
        return (value * backingToken.balanceOf(address(this))) / totalSupply();
    }

    function ETHtoJAY(uint256 value) public view returns (uint256) {
        return (value * totalSupply()) / backingToken.balanceOf(address(this));
    }

    function setFeeAddress(address _address) external onlyOwner {
        require(_address != address(0x0), "cannot set to 0x0 address");
        FEE_ADDRESS = payable(_address);
    }

    function setSellFee(uint16 amount) external onlyOwner {
        require(amount <= 9290, "cant set less than 3% fee");
        require(amount > SELL_FEE, "cant increase sell fee");
        SELL_FEE = amount;
        emit SellFeeUpdated(amount);
    }

    function setBuyFee(uint16 amount) external onlyOwner {
        require(amount <= 9290 && amount >= 9000, "cant set less than 3% fee or greater than 5%");
        BUY_FEE = amount;
        emit buyFeeUpdated(amount);
    }

    //utils
    function getBuyJay(uint256 amount) external view returns (uint256) {
        return
            (amount * (totalSupply()) * (BUY_FEE)) /
            (backingToken.balanceOf(address(this))) /
            (FEE_BASE_1000);
    }

    function getSellJay(uint256 amount) external view returns (uint256) {
        return
            ((amount * backingToken.balanceOf(address(this))) * (SELL_FEE)) /
            (totalSupply()) /
            (FEE_BASE_1000);
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_backingToken","type":"address"}],"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":false,"internalType":"uint256","name":"max","type":"uint256"}],"name":"MaxUpdated","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":false,"internalType":"uint256","name":"recieved","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sent","type":"uint256"}],"name":"Price","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellFee","type":"uint256"}],"name":"SellFeeUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyFee","type":"uint256"}],"name":"buyFeeUpdated","type":"event"},{"inputs":[],"name":"BUY_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ETHtoJAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JAYNFT","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"JAYtoETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELL_FEE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"backingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reciever","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reciever","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyNftDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getBuyJay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getSellJay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"value","type":"uint256"}],"name":"init","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"jay","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"jay","type":"uint256"}],"name":"sellNftDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setBuyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nft","type":"address"}],"name":"setJAYNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"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":"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"}]

60c06040526b204fce5e3e25026110000000600955612328600a60006101000a81548161ffff021916908361ffff160217905550612328600a60026101000a81548161ffff021916908361ffff1602179055503480156200005f57600080fd5b506040516200471f3803806200471f83398181016040528101906200008591906200036e565b6040518060400160405280600f81526020017f4a617970656767657273205553444300000000000000000000000000000000008152506040518060400160405280600581526020017f6a5553444300000000000000000000000000000000000000000000000000000081525081600390816200010291906200061a565b5080600490816200011491906200061a565b505050620001376200012b6200023660201b60201c565b6200023e60201b60201c565b60016006819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e591906200073f565b600a620001f39190620008f4565b600162000201919062000945565b670de0b6b3a76400006fffffffffffffffffffffffffffffffff16620002289190620009d5565b60a081815250505062000a0d565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003368262000309565b9050919050565b620003488162000329565b81146200035457600080fd5b50565b60008151905062000368816200033d565b92915050565b60006020828403121562000387576200038662000304565b5b6000620003978482850162000357565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042257607f821691505b602082108103620004385762000437620003da565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000463565b620004ae868362000463565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004fb620004f5620004ef84620004c6565b620004d0565b620004c6565b9050919050565b6000819050919050565b6200051783620004da565b6200052f620005268262000502565b84845462000470565b825550505050565b600090565b6200054662000537565b620005538184846200050c565b505050565b5b818110156200057b576200056f6000826200053c565b60018101905062000559565b5050565b601f821115620005ca5762000594816200043e565b6200059f8462000453565b81016020851015620005af578190505b620005c7620005be8562000453565b83018262000558565b50505b505050565b600082821c905092915050565b6000620005ef60001984600802620005cf565b1980831691505092915050565b60006200060a8383620005dc565b9150826002028217905092915050565b6200062582620003a0565b67ffffffffffffffff811115620006415762000640620003ab565b5b6200064d825462000409565b6200065a8282856200057f565b600060209050601f8311600181146200069257600084156200067d578287015190505b620006898582620005fc565b865550620006f9565b601f198416620006a2866200043e565b60005b82811015620006cc57848901518255600182019150602085019450602081019050620006a5565b86831015620006ec5784890151620006e8601f891682620005dc565b8355505b6001600288020188555050505b505050505050565b600060ff82169050919050565b620007198162000701565b81146200072557600080fd5b50565b60008151905062000739816200070e565b92915050565b60006020828403121562000758576200075762000304565b5b6000620007688482850162000728565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115620007ff57808604811115620007d757620007d662000771565b5b6001851615620007e75780820291505b8081029050620007f785620007a0565b9450620007b7565b94509492505050565b6000826200081a5760019050620008ed565b816200082a5760009050620008ed565b81600181146200084357600281146200084e5762000884565b6001915050620008ed565b60ff84111562000863576200086262000771565b5b8360020a9150848211156200087d576200087c62000771565b5b50620008ed565b5060208310610133831016604e8410600b8410161715620008be5782820a905083811115620008b857620008b762000771565b5b620008ed565b620008cd8484846001620007ad565b92509050818404811115620008e757620008e662000771565b5b81810290505b9392505050565b60006200090182620004c6565b91506200090e8362000701565b92506200093d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000808565b905092915050565b60006200095282620004c6565b91506200095f83620004c6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200099b576200099a62000771565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620009e282620004c6565b9150620009ef83620004c6565b92508262000a025762000a01620009a6565b5b828204905092915050565b60805160a051613c8a62000a956000396000818161096c015261119e0152600081816107ef01528181610a6901528181610beb01528181610c6801528181610e3001528181611153015281816112dc0152818161135a01528181611572015281816115f00152818161189d0152818161191a01528181611a500152611b180152613c8a6000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80637478b32511610130578063cce7ec13116100b8578063e4849b321161007c578063e4849b3214610679578063f2fde38b14610695578063f4178417146106b1578063f5755747146106cf578063fea449f7146106ff57610232565b8063cce7ec13146105d7578063d49d5181146105f3578063dada0a8714610611578063dd62ed3e1461062d578063e064648a1461065d57610232565b806395d89b41116100ff57806395d89b411461051f578063a457c2d71461053d578063a9059cbb1461056d578063b7b0422d1461059d578063be9a6555146105b957610232565b80637478b3251461049957806379cc6790146104c95780638705fcd4146104e55780638da5cb5b1461050157610232565b806335975a37116101be57806347e621b71161018257806347e621b714610409578063636d13ce1461042757806370a082311461044357806370c4767114610473578063715018a61461048f57610232565b806335975a3714610379578063395093511461038357806342966c68146103b35780634773a6a9146103cf578063477e7b9d146103ed57610232565b80631fe9eabc116102055780631fe9eabc146102d357806323b872dd146102ef57806327b9bb9c1461031f5780632e0f26251461033d578063313ce5671461035b57610232565b806306fdde0314610237578063095ea7b3146102555780630f0266f51461028557806318160ddd146102b5575b600080fd5b61023f61072f565b60405161024c919061299d565b60405180910390f35b61026f600480360381019061026a9190612a58565b6107c1565b60405161027c9190612ab3565b60405180910390f35b61029f600480360381019061029a9190612ace565b6107e4565b6040516102ac9190612b0a565b60405180910390f35b6102bd6108d4565b6040516102ca9190612b0a565b60405180910390f35b6102ed60048036038101906102e89190612ace565b6108de565b005b61030960048036038101906103049190612b25565b610927565b6040516103169190612ab3565b60405180910390f35b610327610956565b6040516103349190612b95565b60405180910390f35b61034561096a565b6040516103529190612b0a565b60405180910390f35b61036361098e565b6040516103709190612bcc565b60405180910390f35b610381610997565b005b61039d60048036038101906103989190612a58565b6109bc565b6040516103aa9190612ab3565b60405180910390f35b6103cd60048036038101906103c89190612ace565b6109f3565b005b6103d7610a07565b6040516103e49190612b95565b60405180910390f35b61040760048036038101906104029190612be7565b610a1b565b005b610411610a67565b60405161041e9190612c73565b60405180910390f35b610441600480360381019061043c9190612ace565b610a8b565b005b61045d60048036038101906104589190612be7565b610cf2565b60405161046a9190612b0a565b60405180910390f35b61048d60048036038101906104889190612cba565b610d3a565b005b610497610df4565b005b6104b360048036038101906104ae9190612ace565b610e08565b6040516104c09190612b0a565b60405180910390f35b6104e360048036038101906104de9190612a58565b610ef8565b005b6104ff60048036038101906104fa9190612be7565b610f18565b005b610509610fd3565b6040516105169190612cf6565b60405180910390f35b610527610ffd565b604051610534919061299d565b60405180910390f35b61055760048036038101906105529190612a58565b61108f565b6040516105649190612ab3565b60405180910390f35b61058760048036038101906105829190612a58565b611106565b6040516105949190612ab3565b60405180910390f35b6105b760048036038101906105b29190612ace565b611129565b005b6105c16111df565b6040516105ce9190612ab3565b60405180910390f35b6105f160048036038101906105ec9190612a58565b6111f2565b005b6105fb6113e4565b6040516106089190612b0a565b60405180910390f35b61062b60048036038101906106269190612a58565b6113ea565b005b61064760048036038101906106429190612d11565b61167b565b6040516106549190612b0a565b60405180910390f35b61067760048036038101906106729190612cba565b611702565b005b610693600480360381019061068e9190612ace565b611804565b005b6106af60048036038101906106aa9190612be7565b6119a3565b005b6106b9611a26565b6040516106c69190612d72565b60405180910390f35b6106e960048036038101906106e49190612ace565b611a4c565b6040516106f69190612b0a565b60405180910390f35b61071960048036038101906107149190612ace565b611b0c565b6040516107269190612b0a565b60405180910390f35b60606003805461073e90612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461076a90612dbc565b80156107b75780601f1061078c576101008083540402835291602001916107b7565b820191906000526020600020905b81548152906001019060200180831161079a57829003601f168201915b5050505050905090565b6000806107cc611bcc565b90506107d9818585611bd4565b600191505092915050565b600061271061ffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108469190612cf6565b602060405180830381865afa158015610863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108879190612e02565b600a60029054906101000a900461ffff1661ffff166108a46108d4565b856108af9190612e5e565b6108b99190612e5e565b6108c39190612ee7565b6108cd9190612ee7565b9050919050565b6000600254905090565b6108e6611d9d565b806009819055507f772ff6e3371c3a674ced69185fcffe1c41e3e910595f1f186268b6bf79cfb7f78160405161091c9190612b0a565b60405180910390a150565b600080610932611bcc565b905061093f858285611e1b565b61094a858585611ea7565b60019150509392505050565b600a60029054906101000a900461ffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006012905090565b61099f611d9d565b6001600a60046101000a81548160ff021916908315150217905550565b6000806109c7611bcc565b90506109e88185856109d9858961167b565b6109e39190612f18565b611bd4565b600191505092915050565b610a046109fe611bcc565b8261211d565b50565b600a60009054906101000a900461ffff1681565b610a23611d9d565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a936122ea565b60008111610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90612f98565b60405180910390fd5b60006003600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610b359190612cf6565b602060405180830381865afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612e02565b610b809190612e5e565b905061012c811115610b925761012c90505b6000610b9d83611b0c565b9050610ba9338461211d565b610c2f3361271061ffff1684600a60009054906101000a900461ffff1661ffff16610bd49190612f18565b84610bdf9190612e5e565b610be99190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b610cac600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff1683610c669190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a8382604051610cdd929190612fb8565b60405180910390a15050610cef6123bf565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d42611d9d565b61244a8161ffff1611158015610d5e57506123288161ffff1610155b610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490613053565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff1602179055507f11953a0453d6e2e337ab856b9de1f4818ffa2a51f3a9c12f924e2a043ae37f6d81604051610de991906130a4565b60405180910390a150565b610dfc611d9d565b610e0660006123c9565b565b600061271061ffff16610e196108d4565b600a60009054906101000a900461ffff1661ffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e879190612cf6565b602060405180830381865afa158015610ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec89190612e02565b85610ed39190612e5e565b610edd9190612e5e565b610ee79190612ee7565b610ef19190612ee7565b9050919050565b610f0a82610f04611bcc565b83611e1b565b610f14828261211d565b5050565b610f20611d9d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f869061310b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461100c90612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612dbc565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b60008061109a611bcc565b905060006110a8828661167b565b9050838110156110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061319d565b60405180910390fd5b6110fa8286868403611bd4565b60019250505092915050565b600080611111611bcc565b905061111e818585611ea7565b600191505092915050565b611131611d9d565b600a60049054906101000a900460ff161561114b57600080fd5b6111983330837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b6111cd337f0000000000000000000000000000000000000000000000000000000000000000836111c89190612e5e565b612518565b6111db61dead6103e8611106565b5050565b600a60049054906101000a900460ff1681565b6111fa6122ea565b600a60049054906101000a900460ff16611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613209565b60405180910390fd5b6103e8811161128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490613275565b60405180910390fd5b600061129882611a4c565b90506112d48361271061ffff16600a60029054906101000a900461ffff1661ffff16846112c59190612e5e565b6112cf9190612ee7565b612518565b6113213330847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b61139e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16846113589190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a81836040516113cf929190612fb8565b60405180910390a1506113e06123bf565b5050565b60095481565b6113f26122ea565b600a60049054906101000a900460ff1661140b57600080fd5b6103e88111801561141d575060095481105b61145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613275565b60405180910390fd5b60006003600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016114bb9190612cf6565b602060405180830381865afa1580156114d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fc9190612e02565b6115069190612e5e565b905061012c8111156115185761012c90505b600061152383611a4c565b905061156a8461271061ffff1684600a60029054906101000a900461ffff1661ffff166115509190612f18565b8461155b9190612e5e565b6115659190612ee7565b612518565b6115b73330857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b611634600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16856115ee9190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a8184604051611665929190612fb8565b60405180910390a150506116776123bf565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61170a611d9d565b61244a8161ffff161115611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906132e1565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff168161ffff16116117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a49061334d565b60405180910390fd5b80600a60006101000a81548161ffff021916908361ffff1602179055507f495ee53ee22006979ebc689a00ed737d7c13b6419142f82dcaea4ed95ac1e780816040516117f991906130a4565b60405180910390a150565b61180c6122ea565b6000811161184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690612f98565b60405180910390fd5b600061185a82611b0c565b9050611866338361211d565b6118e13361271061ffff16600a60009054906101000a900461ffff1661ffff16846118919190612e5e565b61189b9190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b61195e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16836119189190612ee7565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a828260405161198f929190612fb8565b60405180910390a1506119a06123bf565b50565b6119ab611d9d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a11906133df565b60405180910390fd5b611a23816123c9565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa79190612cf6565b602060405180830381865afa158015611ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae89190612e02565b611af06108d4565b83611afb9190612e5e565b611b059190612ee7565b9050919050565b6000611b166108d4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6f9190612cf6565b602060405180830381865afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612e02565b83611bbb9190612e5e565b611bc59190612ee7565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613471565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613503565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d909190612b0a565b60405180910390a3505050565b611da5611bcc565b73ffffffffffffffffffffffffffffffffffffffff16611dc3610fd3565b73ffffffffffffffffffffffffffffffffffffffff1614611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e109061356f565b60405180910390fd5b565b6000611e27848461167b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ea15781811015611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a906135db565b60405180910390fd5b611ea08484848403611bd4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d9061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c906136ff565b60405180910390fd5b611f9083838361266e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d90613791565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516121049190612b0a565b60405180910390a3612117848484612673565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390613823565b60405180910390fd5b6121988260008361266e565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561221e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612215906138b5565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122d19190612b0a565b60405180910390a36122e583600084612673565b505050565b60026006540361232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690613921565b60405180910390fd5b6002600681905550565b6123ba8363a9059cbb60e01b8484604051602401612358929190613941565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612678565b505050565b6001600681905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612512846323b872dd60e01b8585856040516024016124b09392919061396a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612678565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e906139ed565b60405180910390fd5b6125936000838361266e565b80600260008282546125a59190612f18565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126569190612b0a565b60405180910390a361266a60008383612673565b5050565b505050565b505050565b60006126da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127409092919063ffffffff16565b90506000815114806126fc5750808060200190518101906126fb9190613a39565b5b61273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290613ad8565b60405180910390fd5b505050565b606061274f8484600085612758565b90509392505050565b60608247101561279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490613b6a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127c69190613bd1565b60006040518083038185875af1925050503d8060008114612803576040519150601f19603f3d011682016040523d82523d6000602084013e612808565b606091505b509150915061281987838387612825565b92505050949350505050565b6060831561288757600083510361287f5761283f8561289a565b61287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590613c34565b60405180910390fd5b5b829050612892565b61289183836128bd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156128d05781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612904919061299d565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b8381101561294757808201518184015260208101905061292c565b60008484015250505050565b6000601f19601f8301169050919050565b600061296f8261290d565b6129798185612918565b9350612989818560208601612929565b61299281612953565b840191505092915050565b600060208201905081810360008301526129b78184612964565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129ef826129c4565b9050919050565b6129ff816129e4565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b6000819050919050565b612a3581612a22565b8114612a4057600080fd5b50565b600081359050612a5281612a2c565b92915050565b60008060408385031215612a6f57612a6e6129bf565b5b6000612a7d85828601612a0d565b9250506020612a8e85828601612a43565b9150509250929050565b60008115159050919050565b612aad81612a98565b82525050565b6000602082019050612ac86000830184612aa4565b92915050565b600060208284031215612ae457612ae36129bf565b5b6000612af284828501612a43565b91505092915050565b612b0481612a22565b82525050565b6000602082019050612b1f6000830184612afb565b92915050565b600080600060608486031215612b3e57612b3d6129bf565b5b6000612b4c86828701612a0d565b9350506020612b5d86828701612a0d565b9250506040612b6e86828701612a43565b9150509250925092565b600061ffff82169050919050565b612b8f81612b78565b82525050565b6000602082019050612baa6000830184612b86565b92915050565b600060ff82169050919050565b612bc681612bb0565b82525050565b6000602082019050612be16000830184612bbd565b92915050565b600060208284031215612bfd57612bfc6129bf565b5b6000612c0b84828501612a0d565b91505092915050565b6000819050919050565b6000612c39612c34612c2f846129c4565b612c14565b6129c4565b9050919050565b6000612c4b82612c1e565b9050919050565b6000612c5d82612c40565b9050919050565b612c6d81612c52565b82525050565b6000602082019050612c886000830184612c64565b92915050565b612c9781612b78565b8114612ca257600080fd5b50565b600081359050612cb481612c8e565b92915050565b600060208284031215612cd057612ccf6129bf565b5b6000612cde84828501612ca5565b91505092915050565b612cf0816129e4565b82525050565b6000602082019050612d0b6000830184612ce7565b92915050565b60008060408385031215612d2857612d276129bf565b5b6000612d3685828601612a0d565b9250506020612d4785828601612a0d565b9150509250929050565b6000612d5c82612c40565b9050919050565b612d6c81612d51565b82525050565b6000602082019050612d876000830184612d63565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd457607f821691505b602082108103612de757612de6612d8d565b5b50919050565b600081519050612dfc81612a2c565b92915050565b600060208284031215612e1857612e176129bf565b5b6000612e2684828501612ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e6982612a22565b9150612e7483612a22565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ead57612eac612e2f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ef282612a22565b9150612efd83612a22565b925082612f0d57612f0c612eb8565b5b828204905092915050565b6000612f2382612a22565b9150612f2e83612a22565b9250828201905080821115612f4657612f45612e2f565b5b92915050565b7f6d757374207472616465206f7665722030000000000000000000000000000000600082015250565b6000612f82601183612918565b9150612f8d82612f4c565b602082019050919050565b60006020820190508181036000830152612fb181612f75565b9050919050565b6000604082019050612fcd6000830185612afb565b612fda6020830184612afb565b9392505050565b7f63616e7420736574206c657373207468616e20332520666565206f722067726560008201527f61746572207468616e2035250000000000000000000000000000000000000000602082015250565b600061303d602c83612918565b915061304882612fe1565b604082019050919050565b6000602082019050818103600083015261306c81613030565b9050919050565b600061308e61308961308484612b78565b612c14565b612a22565b9050919050565b61309e81613073565b82525050565b60006020820190506130b96000830184613095565b92915050565b7f63616e6e6f742073657420746f20307830206164647265737300000000000000600082015250565b60006130f5601983612918565b9150613100826130bf565b602082019050919050565b60006020820190508181036000830152613124816130e8565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613187602583612918565b91506131928261312b565b604082019050919050565b600060208201905081810360008301526131b68161317a565b9050919050565b7f636f6e7472616374206e6f7420696e6974696174656400000000000000000000600082015250565b60006131f3601683612918565b91506131fe826131bd565b602082019050919050565b60006020820190508181036000830152613222816131e6565b9050919050565b7f6d757374207472616465206f766572206d696e00000000000000000000000000600082015250565b600061325f601383612918565b915061326a82613229565b602082019050919050565b6000602082019050818103600083015261328e81613252565b9050919050565b7f63616e7420736574206c657373207468616e2033252066656500000000000000600082015250565b60006132cb601983612918565b91506132d682613295565b602082019050919050565b600060208201905081810360008301526132fa816132be565b9050919050565b7f63616e7420696e6372656173652073656c6c2066656500000000000000000000600082015250565b6000613337601683612918565b915061334282613301565b602082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133c9602683612918565b91506133d48261336d565b604082019050919050565b600060208201905081810360008301526133f8816133bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061345b602483612918565b9150613466826133ff565b604082019050919050565b6000602082019050818103600083015261348a8161344e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ed602283612918565b91506134f882613491565b604082019050919050565b6000602082019050818103600083015261351c816134e0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613559602083612918565b915061356482613523565b602082019050919050565b600060208201905081810360008301526135888161354c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006135c5601d83612918565b91506135d08261358f565b602082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613657602583612918565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136e9602383612918565b91506136f48261368d565b604082019050919050565b60006020820190508181036000830152613718816136dc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061377b602683612918565b91506137868261371f565b604082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061380d602183612918565b9150613818826137b1565b604082019050919050565b6000602082019050818103600083015261383c81613800565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061389f602283612918565b91506138aa82613843565b604082019050919050565b600060208201905081810360008301526138ce81613892565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061390b601f83612918565b9150613916826138d5565b602082019050919050565b6000602082019050818103600083015261393a816138fe565b9050919050565b60006040820190506139566000830185612ce7565b6139636020830184612afb565b9392505050565b600060608201905061397f6000830186612ce7565b61398c6020830185612ce7565b6139996040830184612afb565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006139d7601f83612918565b91506139e2826139a1565b602082019050919050565b60006020820190508181036000830152613a06816139ca565b9050919050565b613a1681612a98565b8114613a2157600080fd5b50565b600081519050613a3381613a0d565b92915050565b600060208284031215613a4f57613a4e6129bf565b5b6000613a5d84828501613a24565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613ac2602a83612918565b9150613acd82613a66565b604082019050919050565b60006020820190508181036000830152613af181613ab5565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b54602683612918565b9150613b5f82613af8565b604082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b600081519050919050565b600081905092915050565b6000613bab82613b8a565b613bb58185613b95565b9350613bc5818560208601612929565b80840191505092915050565b6000613bdd8284613ba0565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613c1e601d83612918565b9150613c2982613be8565b602082019050919050565b60006020820190508181036000830152613c4d81613c11565b905091905056fea26469706673582212206bb6c961d576f1166ef3b818177364288172ce004e404be7531d8cce2138bfb664736f6c63430008100033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c80637478b32511610130578063cce7ec13116100b8578063e4849b321161007c578063e4849b3214610679578063f2fde38b14610695578063f4178417146106b1578063f5755747146106cf578063fea449f7146106ff57610232565b8063cce7ec13146105d7578063d49d5181146105f3578063dada0a8714610611578063dd62ed3e1461062d578063e064648a1461065d57610232565b806395d89b41116100ff57806395d89b411461051f578063a457c2d71461053d578063a9059cbb1461056d578063b7b0422d1461059d578063be9a6555146105b957610232565b80637478b3251461049957806379cc6790146104c95780638705fcd4146104e55780638da5cb5b1461050157610232565b806335975a37116101be57806347e621b71161018257806347e621b714610409578063636d13ce1461042757806370a082311461044357806370c4767114610473578063715018a61461048f57610232565b806335975a3714610379578063395093511461038357806342966c68146103b35780634773a6a9146103cf578063477e7b9d146103ed57610232565b80631fe9eabc116102055780631fe9eabc146102d357806323b872dd146102ef57806327b9bb9c1461031f5780632e0f26251461033d578063313ce5671461035b57610232565b806306fdde0314610237578063095ea7b3146102555780630f0266f51461028557806318160ddd146102b5575b600080fd5b61023f61072f565b60405161024c919061299d565b60405180910390f35b61026f600480360381019061026a9190612a58565b6107c1565b60405161027c9190612ab3565b60405180910390f35b61029f600480360381019061029a9190612ace565b6107e4565b6040516102ac9190612b0a565b60405180910390f35b6102bd6108d4565b6040516102ca9190612b0a565b60405180910390f35b6102ed60048036038101906102e89190612ace565b6108de565b005b61030960048036038101906103049190612b25565b610927565b6040516103169190612ab3565b60405180910390f35b610327610956565b6040516103349190612b95565b60405180910390f35b61034561096a565b6040516103529190612b0a565b60405180910390f35b61036361098e565b6040516103709190612bcc565b60405180910390f35b610381610997565b005b61039d60048036038101906103989190612a58565b6109bc565b6040516103aa9190612ab3565b60405180910390f35b6103cd60048036038101906103c89190612ace565b6109f3565b005b6103d7610a07565b6040516103e49190612b95565b60405180910390f35b61040760048036038101906104029190612be7565b610a1b565b005b610411610a67565b60405161041e9190612c73565b60405180910390f35b610441600480360381019061043c9190612ace565b610a8b565b005b61045d60048036038101906104589190612be7565b610cf2565b60405161046a9190612b0a565b60405180910390f35b61048d60048036038101906104889190612cba565b610d3a565b005b610497610df4565b005b6104b360048036038101906104ae9190612ace565b610e08565b6040516104c09190612b0a565b60405180910390f35b6104e360048036038101906104de9190612a58565b610ef8565b005b6104ff60048036038101906104fa9190612be7565b610f18565b005b610509610fd3565b6040516105169190612cf6565b60405180910390f35b610527610ffd565b604051610534919061299d565b60405180910390f35b61055760048036038101906105529190612a58565b61108f565b6040516105649190612ab3565b60405180910390f35b61058760048036038101906105829190612a58565b611106565b6040516105949190612ab3565b60405180910390f35b6105b760048036038101906105b29190612ace565b611129565b005b6105c16111df565b6040516105ce9190612ab3565b60405180910390f35b6105f160048036038101906105ec9190612a58565b6111f2565b005b6105fb6113e4565b6040516106089190612b0a565b60405180910390f35b61062b60048036038101906106269190612a58565b6113ea565b005b61064760048036038101906106429190612d11565b61167b565b6040516106549190612b0a565b60405180910390f35b61067760048036038101906106729190612cba565b611702565b005b610693600480360381019061068e9190612ace565b611804565b005b6106af60048036038101906106aa9190612be7565b6119a3565b005b6106b9611a26565b6040516106c69190612d72565b60405180910390f35b6106e960048036038101906106e49190612ace565b611a4c565b6040516106f69190612b0a565b60405180910390f35b61071960048036038101906107149190612ace565b611b0c565b6040516107269190612b0a565b60405180910390f35b60606003805461073e90612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461076a90612dbc565b80156107b75780601f1061078c576101008083540402835291602001916107b7565b820191906000526020600020905b81548152906001019060200180831161079a57829003601f168201915b5050505050905090565b6000806107cc611bcc565b90506107d9818585611bd4565b600191505092915050565b600061271061ffff167f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108469190612cf6565b602060405180830381865afa158015610863573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108879190612e02565b600a60029054906101000a900461ffff1661ffff166108a46108d4565b856108af9190612e5e565b6108b99190612e5e565b6108c39190612ee7565b6108cd9190612ee7565b9050919050565b6000600254905090565b6108e6611d9d565b806009819055507f772ff6e3371c3a674ced69185fcffe1c41e3e910595f1f186268b6bf79cfb7f78160405161091c9190612b0a565b60405180910390a150565b600080610932611bcc565b905061093f858285611e1b565b61094a858585611ea7565b60019150509392505050565b600a60029054906101000a900461ffff1681565b7f000000000000000000000000000000000000000000000000000000e8d4a5100081565b60006012905090565b61099f611d9d565b6001600a60046101000a81548160ff021916908315150217905550565b6000806109c7611bcc565b90506109e88185856109d9858961167b565b6109e39190612f18565b611bd4565b600191505092915050565b610a046109fe611bcc565b8261211d565b50565b600a60009054906101000a900461ffff1681565b610a23611d9d565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b610a936122ea565b60008111610ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acd90612f98565b60405180910390fd5b60006003600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610b359190612cf6565b602060405180830381865afa158015610b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b769190612e02565b610b809190612e5e565b905061012c811115610b925761012c90505b6000610b9d83611b0c565b9050610ba9338461211d565b610c2f3361271061ffff1684600a60009054906101000a900461ffff1661ffff16610bd49190612f18565b84610bdf9190612e5e565b610be99190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b610cac600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff1683610c669190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a8382604051610cdd929190612fb8565b60405180910390a15050610cef6123bf565b50565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d42611d9d565b61244a8161ffff1611158015610d5e57506123288161ffff1610155b610d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9490613053565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff1602179055507f11953a0453d6e2e337ab856b9de1f4818ffa2a51f3a9c12f924e2a043ae37f6d81604051610de991906130a4565b60405180910390a150565b610dfc611d9d565b610e0660006123c9565b565b600061271061ffff16610e196108d4565b600a60009054906101000a900461ffff1661ffff167f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e879190612cf6565b602060405180830381865afa158015610ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec89190612e02565b85610ed39190612e5e565b610edd9190612e5e565b610ee79190612ee7565b610ef19190612ee7565b9050919050565b610f0a82610f04611bcc565b83611e1b565b610f14828261211d565b5050565b610f20611d9d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f869061310b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461100c90612dbc565b80601f016020809104026020016040519081016040528092919081815260200182805461103890612dbc565b80156110855780601f1061105a57610100808354040283529160200191611085565b820191906000526020600020905b81548152906001019060200180831161106857829003601f168201915b5050505050905090565b60008061109a611bcc565b905060006110a8828661167b565b9050838110156110ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e49061319d565b60405180910390fd5b6110fa8286868403611bd4565b60019250505092915050565b600080611111611bcc565b905061111e818585611ea7565b600191505092915050565b611131611d9d565b600a60049054906101000a900460ff161561114b57600080fd5b6111983330837f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b6111cd337f000000000000000000000000000000000000000000000000000000e8d4a51000836111c89190612e5e565b612518565b6111db61dead6103e8611106565b5050565b600a60049054906101000a900460ff1681565b6111fa6122ea565b600a60049054906101000a900460ff16611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613209565b60405180910390fd5b6103e8811161128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490613275565b60405180910390fd5b600061129882611a4c565b90506112d48361271061ffff16600a60029054906101000a900461ffff1661ffff16846112c59190612e5e565b6112cf9190612ee7565b612518565b6113213330847f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b61139e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16846113589190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a81836040516113cf929190612fb8565b60405180910390a1506113e06123bf565b5050565b60095481565b6113f26122ea565b600a60049054906101000a900460ff1661140b57600080fd5b6103e88111801561141d575060095481105b61145c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145390613275565b60405180910390fd5b60006003600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016114bb9190612cf6565b602060405180830381865afa1580156114d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fc9190612e02565b6115069190612e5e565b905061012c8111156115185761012c90505b600061152383611a4c565b905061156a8461271061ffff1684600a60029054906101000a900461ffff1661ffff166115509190612f18565b8461155b9190612e5e565b6115659190612ee7565b612518565b6115b73330857f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1661248f909392919063ffffffff16565b611634600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16856115ee9190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a8184604051611665929190612fb8565b60405180910390a150506116776123bf565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61170a611d9d565b61244a8161ffff161115611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174a906132e1565b60405180910390fd5b600a60009054906101000a900461ffff1661ffff168161ffff16116117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a49061334d565b60405180910390fd5b80600a60006101000a81548161ffff021916908361ffff1602179055507f495ee53ee22006979ebc689a00ed737d7c13b6419142f82dcaea4ed95ac1e780816040516117f991906130a4565b60405180910390a150565b61180c6122ea565b6000811161184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690612f98565b60405180910390fd5b600061185a82611b0c565b9050611866338361211d565b6118e13361271061ffff16600a60009054906101000a900461ffff1661ffff16846118919190612e5e565b61189b9190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b61195e600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601961ffff16836119189190612ee7565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166123399092919063ffffffff16565b7fd1353c68e79ef70de84ee90d2facf845ec24895116d4a03505aa41785af71f5a828260405161198f929190612fb8565b60405180910390a1506119a06123bf565b50565b6119ab611d9d565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a11906133df565b60405180910390fd5b611a23816123c9565b50565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa79190612cf6565b602060405180830381865afa158015611ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae89190612e02565b611af06108d4565b83611afb9190612e5e565b611b059190612ee7565b9050919050565b6000611b166108d4565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611b6f9190612cf6565b602060405180830381865afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612e02565b83611bbb9190612e5e565b611bc59190612ee7565b9050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3a90613471565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca990613503565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611d909190612b0a565b60405180910390a3505050565b611da5611bcc565b73ffffffffffffffffffffffffffffffffffffffff16611dc3610fd3565b73ffffffffffffffffffffffffffffffffffffffff1614611e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e109061356f565b60405180910390fd5b565b6000611e27848461167b565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ea15781811015611e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8a906135db565b60405180910390fd5b611ea08484848403611bd4565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0d9061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7c906136ff565b60405180910390fd5b611f9083838361266e565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200d90613791565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516121049190612b0a565b60405180910390a3612117848484612673565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390613823565b60405180910390fd5b6121988260008361266e565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561221e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612215906138b5565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282540392505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122d19190612b0a565b60405180910390a36122e583600084612673565b505050565b60026006540361232f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232690613921565b60405180910390fd5b6002600681905550565b6123ba8363a9059cbb60e01b8484604051602401612358929190613941565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612678565b505050565b6001600681905550565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612512846323b872dd60e01b8585856040516024016124b09392919061396a565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612678565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257e906139ed565b60405180910390fd5b6125936000838361266e565b80600260008282546125a59190612f18565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126569190612b0a565b60405180910390a361266a60008383612673565b5050565b505050565b505050565b60006126da826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166127409092919063ffffffff16565b90506000815114806126fc5750808060200190518101906126fb9190613a39565b5b61273b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273290613ad8565b60405180910390fd5b505050565b606061274f8484600085612758565b90509392505050565b60608247101561279d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279490613b6a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516127c69190613bd1565b60006040518083038185875af1925050503d8060008114612803576040519150601f19603f3d011682016040523d82523d6000602084013e612808565b606091505b509150915061281987838387612825565b92505050949350505050565b6060831561288757600083510361287f5761283f8561289a565b61287e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287590613c34565b60405180910390fd5b5b829050612892565b61289183836128bd565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156128d05781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612904919061299d565b60405180910390fd5b600081519050919050565b600082825260208201905092915050565b60005b8381101561294757808201518184015260208101905061292c565b60008484015250505050565b6000601f19601f8301169050919050565b600061296f8261290d565b6129798185612918565b9350612989818560208601612929565b61299281612953565b840191505092915050565b600060208201905081810360008301526129b78184612964565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129ef826129c4565b9050919050565b6129ff816129e4565b8114612a0a57600080fd5b50565b600081359050612a1c816129f6565b92915050565b6000819050919050565b612a3581612a22565b8114612a4057600080fd5b50565b600081359050612a5281612a2c565b92915050565b60008060408385031215612a6f57612a6e6129bf565b5b6000612a7d85828601612a0d565b9250506020612a8e85828601612a43565b9150509250929050565b60008115159050919050565b612aad81612a98565b82525050565b6000602082019050612ac86000830184612aa4565b92915050565b600060208284031215612ae457612ae36129bf565b5b6000612af284828501612a43565b91505092915050565b612b0481612a22565b82525050565b6000602082019050612b1f6000830184612afb565b92915050565b600080600060608486031215612b3e57612b3d6129bf565b5b6000612b4c86828701612a0d565b9350506020612b5d86828701612a0d565b9250506040612b6e86828701612a43565b9150509250925092565b600061ffff82169050919050565b612b8f81612b78565b82525050565b6000602082019050612baa6000830184612b86565b92915050565b600060ff82169050919050565b612bc681612bb0565b82525050565b6000602082019050612be16000830184612bbd565b92915050565b600060208284031215612bfd57612bfc6129bf565b5b6000612c0b84828501612a0d565b91505092915050565b6000819050919050565b6000612c39612c34612c2f846129c4565b612c14565b6129c4565b9050919050565b6000612c4b82612c1e565b9050919050565b6000612c5d82612c40565b9050919050565b612c6d81612c52565b82525050565b6000602082019050612c886000830184612c64565b92915050565b612c9781612b78565b8114612ca257600080fd5b50565b600081359050612cb481612c8e565b92915050565b600060208284031215612cd057612ccf6129bf565b5b6000612cde84828501612ca5565b91505092915050565b612cf0816129e4565b82525050565b6000602082019050612d0b6000830184612ce7565b92915050565b60008060408385031215612d2857612d276129bf565b5b6000612d3685828601612a0d565b9250506020612d4785828601612a0d565b9150509250929050565b6000612d5c82612c40565b9050919050565b612d6c81612d51565b82525050565b6000602082019050612d876000830184612d63565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dd457607f821691505b602082108103612de757612de6612d8d565b5b50919050565b600081519050612dfc81612a2c565b92915050565b600060208284031215612e1857612e176129bf565b5b6000612e2684828501612ded565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e6982612a22565b9150612e7483612a22565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612ead57612eac612e2f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ef282612a22565b9150612efd83612a22565b925082612f0d57612f0c612eb8565b5b828204905092915050565b6000612f2382612a22565b9150612f2e83612a22565b9250828201905080821115612f4657612f45612e2f565b5b92915050565b7f6d757374207472616465206f7665722030000000000000000000000000000000600082015250565b6000612f82601183612918565b9150612f8d82612f4c565b602082019050919050565b60006020820190508181036000830152612fb181612f75565b9050919050565b6000604082019050612fcd6000830185612afb565b612fda6020830184612afb565b9392505050565b7f63616e7420736574206c657373207468616e20332520666565206f722067726560008201527f61746572207468616e2035250000000000000000000000000000000000000000602082015250565b600061303d602c83612918565b915061304882612fe1565b604082019050919050565b6000602082019050818103600083015261306c81613030565b9050919050565b600061308e61308961308484612b78565b612c14565b612a22565b9050919050565b61309e81613073565b82525050565b60006020820190506130b96000830184613095565b92915050565b7f63616e6e6f742073657420746f20307830206164647265737300000000000000600082015250565b60006130f5601983612918565b9150613100826130bf565b602082019050919050565b60006020820190508181036000830152613124816130e8565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000613187602583612918565b91506131928261312b565b604082019050919050565b600060208201905081810360008301526131b68161317a565b9050919050565b7f636f6e7472616374206e6f7420696e6974696174656400000000000000000000600082015250565b60006131f3601683612918565b91506131fe826131bd565b602082019050919050565b60006020820190508181036000830152613222816131e6565b9050919050565b7f6d757374207472616465206f766572206d696e00000000000000000000000000600082015250565b600061325f601383612918565b915061326a82613229565b602082019050919050565b6000602082019050818103600083015261328e81613252565b9050919050565b7f63616e7420736574206c657373207468616e2033252066656500000000000000600082015250565b60006132cb601983612918565b91506132d682613295565b602082019050919050565b600060208201905081810360008301526132fa816132be565b9050919050565b7f63616e7420696e6372656173652073656c6c2066656500000000000000000000600082015250565b6000613337601683612918565b915061334282613301565b602082019050919050565b600060208201905081810360008301526133668161332a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133c9602683612918565b91506133d48261336d565b604082019050919050565b600060208201905081810360008301526133f8816133bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061345b602483612918565b9150613466826133ff565b604082019050919050565b6000602082019050818103600083015261348a8161344e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006134ed602283612918565b91506134f882613491565b604082019050919050565b6000602082019050818103600083015261351c816134e0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613559602083612918565b915061356482613523565b602082019050919050565b600060208201905081810360008301526135888161354c565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006135c5601d83612918565b91506135d08261358f565b602082019050919050565b600060208201905081810360008301526135f4816135b8565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613657602583612918565b9150613662826135fb565b604082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006136e9602383612918565b91506136f48261368d565b604082019050919050565b60006020820190508181036000830152613718816136dc565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061377b602683612918565b91506137868261371f565b604082019050919050565b600060208201905081810360008301526137aa8161376e565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061380d602183612918565b9150613818826137b1565b604082019050919050565b6000602082019050818103600083015261383c81613800565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b600061389f602283612918565b91506138aa82613843565b604082019050919050565b600060208201905081810360008301526138ce81613892565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061390b601f83612918565b9150613916826138d5565b602082019050919050565b6000602082019050818103600083015261393a816138fe565b9050919050565b60006040820190506139566000830185612ce7565b6139636020830184612afb565b9392505050565b600060608201905061397f6000830186612ce7565b61398c6020830185612ce7565b6139996040830184612afb565b949350505050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006139d7601f83612918565b91506139e2826139a1565b602082019050919050565b60006020820190508181036000830152613a06816139ca565b9050919050565b613a1681612a98565b8114613a2157600080fd5b50565b600081519050613a3381613a0d565b92915050565b600060208284031215613a4f57613a4e6129bf565b5b6000613a5d84828501613a24565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613ac2602a83612918565b9150613acd82613a66565b604082019050919050565b60006020820190508181036000830152613af181613ab5565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b54602683612918565b9150613b5f82613af8565b604082019050919050565b60006020820190508181036000830152613b8381613b47565b9050919050565b600081519050919050565b600081905092915050565b6000613bab82613b8a565b613bb58185613b95565b9350613bc5818560208601612929565b80840191505092915050565b6000613bdd8284613ba0565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613c1e601d83612918565b9150613c2982613be8565b602082019050919050565b60006020820190508181036000830152613c4d81613c11565b905091905056fea26469706673582212206bb6c961d576f1166ef3b818177364288172ce004e404be7531d8cce2138bfb664736f6c63430008100033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

-----Decoded View---------------
Arg [0] : _backingToken (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48


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.