ETH Price: $2,098.21 (+1.92%)
Gas: 0.08 Gwei
 

Overview

Max Total Supply

1,000,000,000 EDEN

Holders

6

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
EDEN

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2025-09-06
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/token/ERC20/IERC20.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v4.9.4) (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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/token/ERC20/extensions/IERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.9.4) (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.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
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].
     *
     * CAUTION: See Security Considerations above.
     */
    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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/utils/Address.sol


// 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.5/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    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: EdenRWAtoken.sol


pragma solidity ^0.8.20;

/**
 * ERC20 EDEN avec dividendes en USDC (pull model).
 * - Supply fixe: 1,000,000,000 EDEN (18 décimales), mintés au déployeur
 * - Dépôt d'USDC via distributeUSDC(), puis chaque holder réclame sa part avec claim()
 * - Pro-rata automatique via "magnified dividends" (pas d'itération sur les holders)
 */

// Imports OpenZeppelin épinglés (compatibles Remix)





contract EDEN is ERC20, Ownable {
    using SafeERC20 for IERC20;

    IERC20 public immutable USDC;

    uint256 public constant MAGNITUDE = 2**128;
    uint256 private _magnifiedDividendPerShare;

    mapping(address => int256) private _magnifiedDividendCorrections;
    mapping(address => uint256) private _withdrawnDividends;

    event USDCDeposited(address indexed depositor, uint256 amount);
    event DividendClaimed(address indexed account, address indexed to, uint256 amount);

    /**
     * @param usdcToken Adresse du contrat USDC sur le réseau choisi
     */
    constructor(address usdcToken) ERC20("EDENRWA", "EDEN") Ownable() {
        require(usdcToken != address(0), "USDC address zero");
        USDC = IERC20(usdcToken);
        _mint(msg.sender, 1_000_000_000 * 10**decimals());
    }

    // --------- Dividendes USDC ---------

    function distributeUSDC(uint256 amount) external {
        require(totalSupply() > 0, "no supply");
        USDC.safeTransferFrom(msg.sender, address(this), amount);
        _magnifiedDividendPerShare += (amount * MAGNITUDE) / totalSupply();
        emit USDCDeposited(msg.sender, amount);
    }

    function claim(address to) public returns (uint256 amount) {
        amount = withdrawableDividendOf(msg.sender);
        if (amount == 0) return 0;
        _withdrawnDividends[msg.sender] += amount;
        address recipient = (to == address(0)) ? msg.sender : to;
        USDC.safeTransfer(recipient, amount);
        emit DividendClaimed(msg.sender, recipient, amount);
    }

    function claim() external returns (uint256 amount) {
        return claim(msg.sender);
    }

    // --------- Vues ---------

    function withdrawableDividendOf(address account) public view returns (uint256) {
        uint256 accumulative = accumulativeDividendOf(account);
        uint256 withdrawn = _withdrawnDividends[account];
        return accumulative > withdrawn ? accumulative - withdrawn : 0;
    }

    function withdrawnDividendOf(address account) external view returns (uint256) {
        return _withdrawnDividends[account];
    }

    function accumulativeDividendOf(address account) public view returns (uint256) {
        uint256 bal = balanceOf(account);
        int256 corrected = int256(_magnifiedDividendPerShare * bal) + _magnifiedDividendCorrections[account];
        return uint256(corrected) / MAGNITUDE;
    }

    // --------- Hooks transferts/mint/burn ---------

    function _transfer(address from, address to, uint256 value) internal override {
        super._transfer(from, to, value);
        int256 mc = int256(_magnifiedDividendPerShare * value);
        _magnifiedDividendCorrections[from] += mc;
        _magnifiedDividendCorrections[to]   -= mc;
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        _magnifiedDividendCorrections[account] -= int256(_magnifiedDividendPerShare * value);
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        _magnifiedDividendCorrections[account] += int256(_magnifiedDividendPerShare * value);
    }

    // --------- Secours ---------

    function rescueTokens(address token, address to, uint256 amount) external onlyOwner {
        require(to != address(0), "to zero");
        require(token != address(USDC), "cannot rescue USDC");
        IERC20(token).safeTransfer(to, amount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"usdcToken","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":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DividendClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"USDCDeposited","type":"event"},{"inputs":[],"name":"MAGNITUDE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"accumulativeDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"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":"distributeUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a060405234801562000010575f80fd5b5060405162001817380380620018178339810160408190526200003391620002a3565b604051806040016040528060078152602001664544454e52574160c81b8152506040518060400160405280600481526020016322a222a760e11b815250816003908162000081919062000371565b50600462000090828262000371565b505050620000ad620000a76200013a60201b60201c565b6200013e565b6001600160a01b038116620000fd5760405162461bcd60e51b8152602060048201526011602482015270555344432061646472657373207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b03811660805262000133336200011d6012600a62000548565b6200012d90633b9aca0062000558565b6200018f565b50620005b1565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6200019b8282620001dd565b80600654620001ab919062000558565b6001600160a01b0383165f9081526007602052604081208054909190620001d490849062000572565b90915550505050565b6001600160a01b038216620002355760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620000f4565b8060025f8282546200024891906200059b565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b5f60208284031215620002b4575f80fd5b81516001600160a01b0381168114620002cb575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620002fb57607f821691505b6020821081036200031a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200029e575f81815260208120601f850160051c81016020861015620003485750805b601f850160051c820191505b81811015620003695782815560010162000354565b505050505050565b81516001600160401b038111156200038d576200038d620002d2565b620003a5816200039e8454620002e6565b8462000320565b602080601f831160018114620003db575f8415620003c35750858301515b5f19600386901b1c1916600185901b17855562000369565b5f85815260208120601f198616915b828110156200040b57888601518255948401946001909101908401620003ea565b50858210156200042957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200048d57815f190482111562000471576200047162000439565b808516156200047f57918102915b93841c939080029062000452565b509250929050565b5f82620004a55750600162000542565b81620004b357505f62000542565b8160018114620004cc5760028114620004d757620004f7565b600191505062000542565b60ff841115620004eb57620004eb62000439565b50506001821b62000542565b5060208310610133831016604e8410600b84101617156200051c575081810a62000542565b6200052883836200044d565b805f19048211156200053e576200053e62000439565b0290505b92915050565b5f620002cb60ff84168362000495565b808202811582820484141762000542576200054262000439565b8181035f83128015838313168383128216171562000594576200059462000439565b5092915050565b8082018082111562000542576200054262000439565b608051611238620005df5f395f818161024401528181610452015281816106a1015261077b01526112385ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c8063715018a6116100bf578063a9059cbb11610079578063a9059cbb146102bd578063aafd847a146102d0578063b3bf2ff1146102f8578063cea9d26f1461030b578063dd62ed3e1461031e578063f2fde38b14610331575f80fd5b8063715018a61461023557806389a302711461023f5780638da5cb5b1461027e57806395d89b411461028f578063a457c2d714610297578063a8b9d240146102aa575f80fd5b806327ce01471161011057806327ce0147146101c5578063313ce567146101d857806339509351146101e75780634e71d92d146101fa5780636d3036a71461020257806370a082311461020d575f80fd5b806306fdde031461014c578063095ea7b31461016a57806318160ddd1461018d5780631e83409a1461019f57806323b872dd146101b2575b5f80fd5b610154610344565b6040516101619190610fbd565b60405180910390f35b61017d61017836600461100a565b6103d4565b6040519015158152602001610161565b6002545b604051908152602001610161565b6101916101ad366004611032565b6103ed565b61017d6101c0366004611052565b6104bf565b6101916101d3366004611032565b6104e2565b60405160128152602001610161565b61017d6101f536600461100a565b610536565b610191610557565b610191600160801b81565b61019161021b366004611032565b6001600160a01b03165f9081526020819052604090205490565b61023d610566565b005b6102667f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610161565b6005546001600160a01b0316610266565b610154610579565b61017d6102a536600461100a565b610588565b6101916102b8366004611032565b610607565b61017d6102cb36600461100a565b610644565b6101916102de366004611032565b6001600160a01b03165f9081526008602052604090205490565b61023d61030636600461108b565b610651565b61023d610319366004611052565b610731565b61019161032c3660046110a2565b610808565b61023d61033f366004611032565b610832565b606060038054610353906110d3565b80601f016020809104026020016040519081016040528092919081815260200182805461037f906110d3565b80156103ca5780601f106103a1576101008083540402835291602001916103ca565b820191905f5260205f20905b8154815290600101906020018083116103ad57829003601f168201915b5050505050905090565b5f336103e18185856108ab565b60019150505b92915050565b5f6103f733610607565b9050805f0361040757505f919050565b335f908152600860205260408120805483929061042590849061111f565b909155505f90506001600160a01b038316156104415782610443565b335b90506104796001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001682846109ce565b6040518281526001600160a01b0382169033907ff672323216d71b2d59f826d5cc49657006c38667b59ae06ec262b9f71bed64fb9060200160405180910390a350919050565b5f336104cc858285610a31565b6104d7858585610aa9565b506001949350505050565b6001600160a01b0381165f90815260208181526040808320546007909252822054600654839190610514908490611132565b61051e9190611149565b905061052e600160801b82611170565b949350505050565b5f336103e18185856105488383610808565b610552919061111f565b6108ab565b5f610561336103ed565b905090565b61056e610b26565b6105775f610b80565b565b606060048054610353906110d3565b5f33816105958286610808565b9050838110156105fa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6104d782868684036108ab565b5f80610612836104e2565b6001600160a01b0384165f9081526008602052604090205490915080821161063a575f61052e565b61052e818361118f565b5f336103e1818585610aa9565b5f61065b60025490565b116106945760405162461bcd60e51b81526020600482015260096024820152686e6f20737570706c7960b81b60448201526064016105f1565b6106c96001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084610bd1565b6002546106da600160801b83611132565b6106e49190611170565b60065f8282546106f4919061111f565b909155505060405181815233907f80ecc532cf2e08856601df42646970d676a686d8eeacbfd2038fae4ff288da569060200160405180910390a250565b610739610b26565b6001600160a01b0382166107795760405162461bcd60e51b8152602060048201526007602482015266746f207a65726f60c81b60448201526064016105f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036107ef5760405162461bcd60e51b815260206004820152601260248201527163616e6e6f7420726573637565205553444360701b60448201526064016105f1565b6108036001600160a01b03841683836109ce565b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61083a610b26565b6001600160a01b03811661089f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f1565b6108a881610b80565b50565b6001600160a01b03831661090d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105f1565b6001600160a01b03821661096e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105f1565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040516001600160a01b03831660248201526044810182905261080390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610c09565b5f610a3c8484610808565b90505f198114610aa35781811015610a965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105f1565b610aa384848484036108ab565b50505050565b610ab4838383610cdc565b5f81600654610ac39190611132565b6001600160a01b0385165f90815260076020526040812080549293508392909190610aef908490611149565b90915550506001600160a01b0383165f9081526007602052604081208054839290610b1b9084906111a2565b909155505050505050565b6005546001600160a01b031633146105775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f1565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610aa39085906323b872dd60e01b906084016109fa565b5f610c5d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e7e9092919063ffffffff16565b905080515f1480610c7d575080806020019051810190610c7d91906111c8565b6108035760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105f1565b6001600160a01b038316610d405760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105f1565b6001600160a01b038216610da25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105f1565b6001600160a01b0383165f9081526020819052604090205481811015610e195760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105f1565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa3565b606061052e84845f85855f80866001600160a01b03168587604051610ea391906111e7565b5f6040518083038185875af1925050503d805f8114610edd576040519150601f19603f3d011682016040523d82523d5f602084013e610ee2565b606091505b5091509150610ef387838387610efe565b979650505050505050565b60608315610f6c5782515f03610f65576001600160a01b0385163b610f655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105f1565b508161052e565b61052e8383815115610f815781518083602001fd5b8060405162461bcd60e51b81526004016105f19190610fbd565b5f5b83811015610fb5578181015183820152602001610f9d565b50505f910152565b602081525f8251806020840152610fdb816040850160208701610f9b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611005575f80fd5b919050565b5f806040838503121561101b575f80fd5b61102483610fef565b946020939093013593505050565b5f60208284031215611042575f80fd5b61104b82610fef565b9392505050565b5f805f60608486031215611064575f80fd5b61106d84610fef565b925061107b60208501610fef565b9150604084013590509250925092565b5f6020828403121561109b575f80fd5b5035919050565b5f80604083850312156110b3575f80fd5b6110bc83610fef565b91506110ca60208401610fef565b90509250929050565b600181811c908216806110e757607f821691505b60208210810361110557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103e7576103e761110b565b80820281158282048414176103e7576103e761110b565b8082018281125f8312801582168215821617156111685761116861110b565b505092915050565b5f8261118a57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103e7576103e761110b565b8181035f8312801583831316838312821617156111c1576111c161110b565b5092915050565b5f602082840312156111d8575f80fd5b8151801515811461104b575f80fd5b5f82516111f8818460208701610f9b565b919091019291505056fea2646970667358221220b93aaf379ad840036ed2aa9413d036c0ebc8b6306d859a0ad4884ada323b240e64736f6c63430008140033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610148575f3560e01c8063715018a6116100bf578063a9059cbb11610079578063a9059cbb146102bd578063aafd847a146102d0578063b3bf2ff1146102f8578063cea9d26f1461030b578063dd62ed3e1461031e578063f2fde38b14610331575f80fd5b8063715018a61461023557806389a302711461023f5780638da5cb5b1461027e57806395d89b411461028f578063a457c2d714610297578063a8b9d240146102aa575f80fd5b806327ce01471161011057806327ce0147146101c5578063313ce567146101d857806339509351146101e75780634e71d92d146101fa5780636d3036a71461020257806370a082311461020d575f80fd5b806306fdde031461014c578063095ea7b31461016a57806318160ddd1461018d5780631e83409a1461019f57806323b872dd146101b2575b5f80fd5b610154610344565b6040516101619190610fbd565b60405180910390f35b61017d61017836600461100a565b6103d4565b6040519015158152602001610161565b6002545b604051908152602001610161565b6101916101ad366004611032565b6103ed565b61017d6101c0366004611052565b6104bf565b6101916101d3366004611032565b6104e2565b60405160128152602001610161565b61017d6101f536600461100a565b610536565b610191610557565b610191600160801b81565b61019161021b366004611032565b6001600160a01b03165f9081526020819052604090205490565b61023d610566565b005b6102667f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b6040516001600160a01b039091168152602001610161565b6005546001600160a01b0316610266565b610154610579565b61017d6102a536600461100a565b610588565b6101916102b8366004611032565b610607565b61017d6102cb36600461100a565b610644565b6101916102de366004611032565b6001600160a01b03165f9081526008602052604090205490565b61023d61030636600461108b565b610651565b61023d610319366004611052565b610731565b61019161032c3660046110a2565b610808565b61023d61033f366004611032565b610832565b606060038054610353906110d3565b80601f016020809104026020016040519081016040528092919081815260200182805461037f906110d3565b80156103ca5780601f106103a1576101008083540402835291602001916103ca565b820191905f5260205f20905b8154815290600101906020018083116103ad57829003601f168201915b5050505050905090565b5f336103e18185856108ab565b60019150505b92915050565b5f6103f733610607565b9050805f0361040757505f919050565b335f908152600860205260408120805483929061042590849061111f565b909155505f90506001600160a01b038316156104415782610443565b335b90506104796001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481682846109ce565b6040518281526001600160a01b0382169033907ff672323216d71b2d59f826d5cc49657006c38667b59ae06ec262b9f71bed64fb9060200160405180910390a350919050565b5f336104cc858285610a31565b6104d7858585610aa9565b506001949350505050565b6001600160a01b0381165f90815260208181526040808320546007909252822054600654839190610514908490611132565b61051e9190611149565b905061052e600160801b82611170565b949350505050565b5f336103e18185856105488383610808565b610552919061111f565b6108ab565b5f610561336103ed565b905090565b61056e610b26565b6105775f610b80565b565b606060048054610353906110d3565b5f33816105958286610808565b9050838110156105fa5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084015b60405180910390fd5b6104d782868684036108ab565b5f80610612836104e2565b6001600160a01b0384165f9081526008602052604090205490915080821161063a575f61052e565b61052e818361118f565b5f336103e1818585610aa9565b5f61065b60025490565b116106945760405162461bcd60e51b81526020600482015260096024820152686e6f20737570706c7960b81b60448201526064016105f1565b6106c96001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816333084610bd1565b6002546106da600160801b83611132565b6106e49190611170565b60065f8282546106f4919061111f565b909155505060405181815233907f80ecc532cf2e08856601df42646970d676a686d8eeacbfd2038fae4ff288da569060200160405180910390a250565b610739610b26565b6001600160a01b0382166107795760405162461bcd60e51b8152602060048201526007602482015266746f207a65726f60c81b60448201526064016105f1565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316836001600160a01b0316036107ef5760405162461bcd60e51b815260206004820152601260248201527163616e6e6f7420726573637565205553444360701b60448201526064016105f1565b6108036001600160a01b03841683836109ce565b505050565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61083a610b26565b6001600160a01b03811661089f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105f1565b6108a881610b80565b50565b6001600160a01b03831661090d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105f1565b6001600160a01b03821661096e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105f1565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6040516001600160a01b03831660248201526044810182905261080390849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610c09565b5f610a3c8484610808565b90505f198114610aa35781811015610a965760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105f1565b610aa384848484036108ab565b50505050565b610ab4838383610cdc565b5f81600654610ac39190611132565b6001600160a01b0385165f90815260076020526040812080549293508392909190610aef908490611149565b90915550506001600160a01b0383165f9081526007602052604081208054839290610b1b9084906111a2565b909155505050505050565b6005546001600160a01b031633146105775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105f1565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610aa39085906323b872dd60e01b906084016109fa565b5f610c5d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610e7e9092919063ffffffff16565b905080515f1480610c7d575080806020019051810190610c7d91906111c8565b6108035760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105f1565b6001600160a01b038316610d405760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105f1565b6001600160a01b038216610da25760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105f1565b6001600160a01b0383165f9081526020819052604090205481811015610e195760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105f1565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610aa3565b606061052e84845f85855f80866001600160a01b03168587604051610ea391906111e7565b5f6040518083038185875af1925050503d805f8114610edd576040519150601f19603f3d011682016040523d82523d5f602084013e610ee2565b606091505b5091509150610ef387838387610efe565b979650505050505050565b60608315610f6c5782515f03610f65576001600160a01b0385163b610f655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105f1565b508161052e565b61052e8383815115610f815781518083602001fd5b8060405162461bcd60e51b81526004016105f19190610fbd565b5f5b83811015610fb5578181015183820152602001610f9d565b50505f910152565b602081525f8251806020840152610fdb816040850160208701610f9b565b601f01601f19169190910160400192915050565b80356001600160a01b0381168114611005575f80fd5b919050565b5f806040838503121561101b575f80fd5b61102483610fef565b946020939093013593505050565b5f60208284031215611042575f80fd5b61104b82610fef565b9392505050565b5f805f60608486031215611064575f80fd5b61106d84610fef565b925061107b60208501610fef565b9150604084013590509250925092565b5f6020828403121561109b575f80fd5b5035919050565b5f80604083850312156110b3575f80fd5b6110bc83610fef565b91506110ca60208401610fef565b90509250929050565b600181811c908216806110e757607f821691505b60208210810361110557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103e7576103e761110b565b80820281158282048414176103e7576103e761110b565b8082018281125f8312801582168215821617156111685761116861110b565b505092915050565b5f8261118a57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156103e7576103e761110b565b8181035f8312801583831316838312821617156111c1576111c161110b565b5092915050565b5f602082840312156111d8575f80fd5b8151801515811461104b575f80fd5b5f82516111f8818460208701610f9b565b919091019291505056fea2646970667358221220b93aaf379ad840036ed2aa9413d036c0ebc8b6306d859a0ad4884ada323b240e64736f6c63430008140033

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

000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

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

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


Deployed Bytecode Sourcemap

41889:3533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6955:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9315:201;;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;9315:201:0;1107:187:1;8084:108:0;8172:12;;8084:108;;;1445:25:1;;;1433:2;1418:18;8084:108:0;1299:177:1;43079:385:0;;;;;;:::i;:::-;;:::i;10096:261::-;;;;;;:::i;:::-;;:::i;44041:289::-;;;;;;:::i;:::-;;:::i;7926:93::-;;;8009:2;2147:36:1;;2135:2;2120:18;7926:93:0;2005:184:1;10766:238:0;;;;;;:::i;:::-;;:::i;43472:94::-;;;:::i;42000:42::-;;-1:-1:-1;;;42000:42:0;;8255:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8356:18:0;8329:7;8356:18;;;;;;;;;;;;8255:127;19877:103;;;:::i;:::-;;41963:28;;;;;;;;-1:-1:-1;;;;;2371:32:1;;;2353:51;;2341:2;2326:18;41963:28:0;2194:216:1;19236:87:0;19309:6;;-1:-1:-1;;;;;19309:6:0;19236:87;;7174:104;;;:::i;11507:436::-;;;;;;:::i;:::-;;:::i;43609:284::-;;;;;;:::i;:::-;;:::i;8588:193::-;;;;;;:::i;:::-;;:::i;43901:132::-;;;;;;:::i;:::-;-1:-1:-1;;;;;43997:28:0;43970:7;43997:28;;;:19;:28;;;;;;;43901:132;42771:300;;;;;;:::i;:::-;;:::i;45167:252::-;;;;;;:::i;:::-;;:::i;8844:151::-;;;;;;:::i;:::-;;:::i;20135:201::-;;;;;;:::i;:::-;;:::i;6955:100::-;7009:13;7042:5;7035:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6955:100;:::o;9315:201::-;9398:4;4513:10;9454:32;4513:10;9470:7;9479:6;9454:8;:32::i;:::-;9504:4;9497:11;;;9315:201;;;;;:::o;43079:385::-;43122:14;43158:34;43181:10;43158:22;:34::i;:::-;43149:43;;43207:6;43217:1;43207:11;43203:25;;-1:-1:-1;43227:1:0;;43079:385;-1:-1:-1;43079:385:0:o;43203:25::-;43259:10;43239:31;;;;:19;:31;;;;;:41;;43274:6;;43239:31;:41;;43274:6;;43239:41;:::i;:::-;;;;-1:-1:-1;43291:17:0;;-1:-1:-1;;;;;;43312:16:0;;;43311:36;;43345:2;43311:36;;;43332:10;43311:36;43291:56;-1:-1:-1;43358:36:0;-1:-1:-1;;;;;43358:4:0;:17;43291:56;43387:6;43358:17;:36::i;:::-;43410:46;;1445:25:1;;;-1:-1:-1;;;;;43410:46:0;;;43426:10;;43410:46;;1433:2:1;1418:18;43410:46:0;;;;;;;43138:326;43079:385;;;:::o;10096:261::-;10193:4;4513:10;10251:38;10267:4;4513:10;10282:6;10251:15;:38::i;:::-;10300:27;10310:4;10316:2;10320:6;10300:9;:27::i;:::-;-1:-1:-1;10345:4:0;;10096:261;-1:-1:-1;;;;10096:261:0:o;44041:289::-;-1:-1:-1;;;;;8356:18:0;;44111:7;8356:18;;;;;;;;;;;;44236:29;:38;;;;;;44200:26;;44111:7;;44236:38;44200:32;;8356:18;;44200:32;:::i;:::-;44193:81;;;;:::i;:::-;44174:100;-1:-1:-1;44292:30:0;-1:-1:-1;;;44174:100:0;44292:30;:::i;:::-;44285:37;44041:289;-1:-1:-1;;;;44041:289:0:o;10766:238::-;10854:4;4513:10;10910:64;4513:10;10926:7;10963:10;10935:25;4513:10;10926:7;10935:9;:25::i;:::-;:38;;;;:::i;:::-;10910:8;:64::i;43472:94::-;43507:14;43541:17;43547:10;43541:5;:17::i;:::-;43534:24;;43472:94;:::o;19877:103::-;19122:13;:11;:13::i;:::-;19942:30:::1;19969:1;19942:18;:30::i;:::-;19877:103::o:0;7174:104::-;7230:13;7263:7;7256:14;;;;;:::i;11507:436::-;11600:4;4513:10;11600:4;11683:25;4513:10;11700:7;11683:9;:25::i;:::-;11656:52;;11747:15;11727:16;:35;;11719:85;;;;-1:-1:-1;;;11719:85:0;;4538:2:1;11719:85:0;;;4520:21:1;4577:2;4557:18;;;4550:30;4616:34;4596:18;;;4589:62;-1:-1:-1;;;4667:18:1;;;4660:35;4712:19;;11719:85:0;;;;;;;;;11840:60;11849:5;11856:7;11884:15;11865:16;:34;11840:8;:60::i;43609:284::-;43679:7;43699:20;43722:31;43745:7;43722:22;:31::i;:::-;-1:-1:-1;;;;;43784:28:0;;43764:17;43784:28;;;:19;:28;;;;;;43699:54;;-1:-1:-1;43830:24:0;;;:55;;43884:1;43830:55;;;43857:24;43872:9;43857:12;:24;:::i;8588:193::-;8667:4;4513:10;8723:28;4513:10;8740:2;8744:6;8723:9;:28::i;42771:300::-;42855:1;42839:13;8172:12;;;8084:108;42839:13;:17;42831:39;;;;-1:-1:-1;;;42831:39:0;;5077:2:1;42831:39:0;;;5059:21:1;5116:1;5096:18;;;5089:29;-1:-1:-1;;;5134:18:1;;;5127:39;5183:18;;42831:39:0;4875:332:1;42831:39:0;42881:56;-1:-1:-1;;;;;42881:4:0;:21;42903:10;42923:4;42930:6;42881:21;:56::i;:::-;8172:12;;42979:18;-1:-1:-1;;;42979:6:0;:18;:::i;:::-;42978:36;;;;:::i;:::-;42948:26;;:66;;;;;;;:::i;:::-;;;;-1:-1:-1;;43030:33:0;;1445:25:1;;;43044:10:0;;43030:33;;1433:2:1;1418:18;43030:33:0;;;;;;;42771:300;:::o;45167:252::-;19122:13;:11;:13::i;:::-;-1:-1:-1;;;;;45270:16:0;::::1;45262:36;;;::::0;-1:-1:-1;;;45262:36:0;;5414:2:1;45262:36:0::1;::::0;::::1;5396:21:1::0;5453:1;5433:18;;;5426:29;-1:-1:-1;;;5471:18:1;;;5464:37;5518:18;;45262:36:0::1;5212:330:1::0;45262:36:0::1;45334:4;-1:-1:-1::0;;;;;45317:22:0::1;:5;-1:-1:-1::0;;;;;45317:22:0::1;::::0;45309:53:::1;;;::::0;-1:-1:-1;;;45309:53:0;;5749:2:1;45309:53:0::1;::::0;::::1;5731:21:1::0;5788:2;5768:18;;;5761:30;-1:-1:-1;;;5807:18:1;;;5800:48;5865:18;;45309:53:0::1;5547:342:1::0;45309:53:0::1;45373:38;-1:-1:-1::0;;;;;45373:26:0;::::1;45400:2:::0;45404:6;45373:26:::1;:38::i;:::-;45167:252:::0;;;:::o;8844:151::-;-1:-1:-1;;;;;8960:18:0;;;8933:7;8960:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8844:151::o;20135:201::-;19122:13;:11;:13::i;:::-;-1:-1:-1;;;;;20224:22:0;::::1;20216:73;;;::::0;-1:-1:-1;;;20216:73:0;;6096:2:1;20216:73:0::1;::::0;::::1;6078:21:1::0;6135:2;6115:18;;;6108:30;6174:34;6154:18;;;6147:62;-1:-1:-1;;;6225:18:1;;;6218:36;6271:19;;20216:73:0::1;5894:402:1::0;20216:73:0::1;20300:28;20319:8;20300:18;:28::i;:::-;20135:201:::0;:::o;15500:346::-;-1:-1:-1;;;;;15602:19:0;;15594:68;;;;-1:-1:-1;;;15594:68:0;;6503:2:1;15594:68:0;;;6485:21:1;6542:2;6522:18;;;6515:30;6581:34;6561:18;;;6554:62;-1:-1:-1;;;6632:18:1;;;6625:34;6676:19;;15594:68:0;6301:400:1;15594:68:0;-1:-1:-1;;;;;15681:21:0;;15673:68;;;;-1:-1:-1;;;15673:68:0;;6908:2:1;15673:68:0;;;6890:21:1;6947:2;6927:18;;;6920:30;6986:34;6966:18;;;6959:62;-1:-1:-1;;;7037:18:1;;;7030:32;7079:19;;15673:68:0;6706:398:1;15673:68:0;-1:-1:-1;;;;;15754:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15806:32;;1445:25:1;;;15806:32:0;;1418:18:1;15806:32:0;;;;;;;15500:346;;;:::o;35327:177::-;35437:58;;-1:-1:-1;;;;;7301:32:1;;35437:58:0;;;7283:51:1;7350:18;;;7343:34;;;35410:86:0;;35430:5;;-1:-1:-1;;;35460:23:0;7256:18:1;;35437:58:0;;;;-1:-1:-1;;35437:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;35437:58:0;-1:-1:-1;;;;;;35437:58:0;;;;;;;;;;35410:19;:86::i;16137:419::-;16238:24;16265:25;16275:5;16282:7;16265:9;:25::i;:::-;16238:52;;-1:-1:-1;;16305:16:0;:37;16301:248;;16387:6;16367:16;:26;;16359:68;;;;-1:-1:-1;;;16359:68:0;;7590:2:1;16359:68:0;;;7572:21:1;7629:2;7609:18;;;7602:30;7668:31;7648:18;;;7641:59;7717:18;;16359:68:0;7388:353:1;16359:68:0;16471:51;16480:5;16487:7;16515:6;16496:16;:25;16471:8;:51::i;:::-;16227:329;16137:419;;;:::o;44395:298::-;44484:32;44500:4;44506:2;44510:5;44484:15;:32::i;:::-;44527:9;44575:5;44546:26;;:34;;;;:::i;:::-;-1:-1:-1;;;;;44592:35:0;;;;;;:29;:35;;;;;:41;;44527:54;;-1:-1:-1;44527:54:0;;44592:35;;;:41;;44527:54;;44592:41;:::i;:::-;;;;-1:-1:-1;;;;;;;44644:33:0;;;;;;:29;:33;;;;;:41;;44683:2;;44644:33;:41;;44683:2;;44644:41;:::i;:::-;;;;-1:-1:-1;;;;;;44395:298:0:o;19401:132::-;19309:6;;-1:-1:-1;;;;;19309:6:0;4513:10;19465:23;19457:68;;;;-1:-1:-1;;;19457:68:0;;8153:2:1;19457:68:0;;;8135:21:1;;;8172:18;;;8165:30;8231:34;8211:18;;;8204:62;8283:18;;19457:68:0;7951:356:1;20496:191:0;20589:6;;;-1:-1:-1;;;;;20606:17:0;;;-1:-1:-1;;;;;;20606:17:0;;;;;;;20639:40;;20589:6;;;20606:17;20589:6;;20639:40;;20570:16;;20639:40;20559:128;20496:191;:::o;35749:205::-;35877:68;;-1:-1:-1;;;;;8570:15:1;;;35877:68:0;;;8552:34:1;8622:15;;8602:18;;;8595:43;8654:18;;;8647:34;;;35850:96:0;;35870:5;;-1:-1:-1;;;35900:27:0;8487:18:1;;35877:68:0;8312:375:1;39673:649:0;40097:23;40123:69;40151:4;40123:69;;;;;;;;;;;;;;;;;40131:5;-1:-1:-1;;;;;40123:27:0;;;:69;;;;;:::i;:::-;40097:95;;40211:10;:17;40232:1;40211:22;:56;;;;40248:10;40237:30;;;;;;;;;;;;:::i;:::-;40203:111;;;;-1:-1:-1;;;40203:111:0;;9176:2:1;40203:111:0;;;9158:21:1;9215:2;9195:18;;;9188:30;9254:34;9234:18;;;9227:62;-1:-1:-1;;;9305:18:1;;;9298:40;9355:19;;40203:111:0;8974:406:1;12413:806:0;-1:-1:-1;;;;;12510:18:0;;12502:68;;;;-1:-1:-1;;;12502:68:0;;9587:2:1;12502:68:0;;;9569:21:1;9626:2;9606:18;;;9599:30;9665:34;9645:18;;;9638:62;-1:-1:-1;;;9716:18:1;;;9709:35;9761:19;;12502:68:0;9385:401:1;12502:68:0;-1:-1:-1;;;;;12589:16:0;;12581:64;;;;-1:-1:-1;;;12581:64:0;;9993:2:1;12581:64:0;;;9975:21:1;10032:2;10012:18;;;10005:30;10071:34;10051:18;;;10044:62;-1:-1:-1;;;10122:18:1;;;10115:33;10165:19;;12581:64:0;9791:399:1;12581:64:0;-1:-1:-1;;;;;12731:15:0;;12709:19;12731:15;;;;;;;;;;;12765:21;;;;12757:72;;;;-1:-1:-1;;;12757:72:0;;10397:2:1;12757:72:0;;;10379:21:1;10436:2;10416:18;;;10409:30;10475:34;10455:18;;;10448:62;-1:-1:-1;;;10526:18:1;;;10519:36;10572:19;;12757:72:0;10195:402:1;12757:72:0;-1:-1:-1;;;;;12865:15:0;;;:9;:15;;;;;;;;;;;12883:20;;;12865:38;;13083:13;;;;;;;;;;:23;;;;;;13135:26;;1445:25:1;;;13083:13:0;;13135:26;;1418:18:1;13135:26:0;;;;;;;13174:37;45167:252;28968:229;29105:12;29137:52;29159:6;29167:4;29173:1;29176:12;29105;30342;30356:23;30383:6;-1:-1:-1;;;;;30383:11:0;30402:5;30409:4;30383:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30341:73;;;;30432:69;30459:6;30467:7;30476:10;30488:12;30432:26;:69::i;:::-;30425:76;30054:455;-1:-1:-1;;;;;;;30054:455:0:o;32627:644::-;32812:12;32841:7;32837:427;;;32869:10;:17;32890:1;32869:22;32865:290;;-1:-1:-1;;;;;26508:19:0;;;33079:60;;;;-1:-1:-1;;;33079:60:0;;11503:2:1;33079:60:0;;;11485:21:1;11542:2;11522:18;;;11515:30;11581:31;11561:18;;;11554:59;11630:18;;33079:60:0;11301:353:1;33079:60:0;-1:-1:-1;33176:10:0;33169:17;;32837:427;33219:33;33227:10;33239:12;33974:17;;:21;33970:388;;34206:10;34200:17;34263:15;34250:10;34246:2;34242:19;34235:44;33970:388;34333:12;34326:20;;-1:-1:-1;;;34326:20:0;;;;;;;;:::i;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:173::-;738:20;;-1:-1:-1;;;;;787:31:1;;777:42;;767:70;;833:1;830;823:12;767:70;670:173;;;:::o;848:254::-;916:6;924;977:2;965:9;956:7;952:23;948:32;945:52;;;993:1;990;983:12;945:52;1016:29;1035:9;1016:29;:::i;:::-;1006:39;1092:2;1077:18;;;;1064:32;;-1:-1:-1;;;848:254:1:o;1481:186::-;1540:6;1593:2;1581:9;1572:7;1568:23;1564:32;1561:52;;;1609:1;1606;1599:12;1561:52;1632:29;1651:9;1632:29;:::i;:::-;1622:39;1481:186;-1:-1:-1;;;1481:186:1:o;1672:328::-;1749:6;1757;1765;1818:2;1806:9;1797:7;1793:23;1789:32;1786:52;;;1834:1;1831;1824:12;1786:52;1857:29;1876:9;1857:29;:::i;:::-;1847:39;;1905:38;1939:2;1928:9;1924:18;1905:38;:::i;:::-;1895:48;;1990:2;1979:9;1975:18;1962:32;1952:42;;1672:328;;;;;:::o;2623:180::-;2682:6;2735:2;2723:9;2714:7;2710:23;2706:32;2703:52;;;2751:1;2748;2741:12;2703:52;-1:-1:-1;2774:23:1;;2623:180;-1:-1:-1;2623:180:1:o;2808:260::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:52;;;2953:1;2950;2943:12;2905:52;2976:29;2995:9;2976:29;:::i;:::-;2966:39;;3024:38;3058:2;3047:9;3043:18;3024:38;:::i;:::-;3014:48;;2808:260;;;;;:::o;3073:380::-;3152:1;3148:12;;;;3195;;;3216:61;;3270:4;3262:6;3258:17;3248:27;;3216:61;3323:2;3315:6;3312:14;3292:18;3289:38;3286:161;;3369:10;3364:3;3360:20;3357:1;3350:31;3404:4;3401:1;3394:15;3432:4;3429:1;3422:15;3286:161;;3073:380;;;:::o;3458:127::-;3519:10;3514:3;3510:20;3507:1;3500:31;3550:4;3547:1;3540:15;3574:4;3571:1;3564:15;3590:125;3655:9;;;3676:10;;;3673:36;;;3689:18;;:::i;3720:168::-;3793:9;;;3824;;3841:15;;;3835:22;;3821:37;3811:71;;3862:18;;:::i;3893:216::-;3957:9;;;3985:11;;;3932:3;4015:9;;4043:10;;4039:19;;4068:10;;4060:19;;4036:44;4033:70;;;4083:18;;:::i;:::-;4033:70;;3893:216;;;;:::o;4114:217::-;4154:1;4180;4170:132;;4224:10;4219:3;4215:20;4212:1;4205:31;4259:4;4256:1;4249:15;4287:4;4284:1;4277:15;4170:132;-1:-1:-1;4316:9:1;;4114:217::o;4742:128::-;4809:9;;;4830:11;;;4827:37;;;4844:18;;:::i;7746:200::-;7812:9;;;7785:4;7840:9;;7868:10;;7880:12;;;7864:29;7903:12;;;7895:21;;7861:56;7858:82;;;7920:18;;:::i;:::-;7858:82;7746:200;;;;:::o;8692:277::-;8759:6;8812:2;8800:9;8791:7;8787:23;8783:32;8780:52;;;8828:1;8825;8818:12;8780:52;8860:9;8854:16;8913:5;8906:13;8899:21;8892:5;8889:32;8879:60;;8935:1;8932;8925:12;11009:287;11138:3;11176:6;11170:13;11192:66;11251:6;11246:3;11239:4;11231:6;11227:17;11192:66;:::i;:::-;11274:16;;;;;11009:287;-1:-1:-1;;11009:287:1:o

Swarm Source

ipfs://b93aaf379ad840036ed2aa9413d036c0ebc8b6306d859a0ad4884ada323b240e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.