ETH Price: $2,930.96 (-9.56%)
Gas: 55 Gwei

Token

DuckDAO Access (DDA)
 

Overview

Max Total Supply

3,464,577.603677889367334213 DDA

Holders

899

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
81.00000000000000012 DDA

Value
$0.00
0xc07a16db178ed7d1789453e33c9b4f5fde461959
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:
DuckdaoAccess

Compiler Version
v0.8.22+commit.4fc1097e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-11-29
*/

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @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 value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` 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 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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: @openzeppelin/contracts/utils/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

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

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    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
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // 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: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @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}.
 *
 * 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.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     * ```
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

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

// File: z_duckdao_DD.sol


pragma solidity ^0.8.20;


contract DuckdaoToken is ERC20 {
    bytes32 public DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH =
        0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public nonces;

    constructor(uint256 _supply) ERC20("DuckDAO Token", "DD") {
        uint chainId;
        assembly {
            chainId := chainid()
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256(
                    "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
                ),
                keccak256(bytes("DuckDAO Token")),
                keccak256(bytes("1")),
                chainId,
                address(this)
            )
        );

        _mint(msg.sender, _supply * 1e18);
    }

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        require(deadline >= block.timestamp, "Duckdao Permit: EXPIRED");
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                keccak256(
                    abi.encode(
                        PERMIT_TYPEHASH,
                        owner,
                        spender,
                        value,
                        nonces[owner]++,
                        deadline
                    )
                )
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(
            recoveredAddress != address(0) && recoveredAddress == owner,
            "Duckdao Permit: INVALID_SIGNATURE"
        );
        _approve(owner, spender, value);
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.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 anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing 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: z_duckdao_access.sol


pragma solidity ^0.8.20;




contract DuckdaoAccess is Ownable, ReentrancyGuard {
    uint256 public constant PENALTY_BPS = 1000;

    struct UserInfo {
        uint256 amount;
        uint256 interactionTime;
    }

    struct PenaltyInfo {
        uint256 amount;
        uint256 time;
    }

    mapping(address => UserInfo) public userInfo;
    mapping(uint256 => PenaltyInfo) public penalty;

    string public name = "DuckDAO Access";
    string public symbol = "DDA";
    uint8 public decimals = 18;

    uint256 public totalSupply;
    uint256 public totalPenalty;
    uint256 public penaltyLength;
    DuckdaoToken public duckdaoToken;

    event Added(address indexed user, uint256 amount);
    event Removed(address indexed user, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 amount);

    constructor(address _token) Ownable() {
        duckdaoToken = DuckdaoToken(_token);

        // penalty list
        // 10 days - 30%
        // 20 days - 25%
        // 30 days - 20%
        // 60 days - 10%
        // 90 days - 5%
        // > 90 days - 0%

        penalty[0] = PenaltyInfo(300, 10 days);
        penalty[1] = PenaltyInfo(250, 20 days);
        penalty[2] = PenaltyInfo(200, 30 days);
        penalty[3] = PenaltyInfo(100, 60 days);
        penalty[4] = PenaltyInfo(50, 90 days);

        penaltyLength = 5;
    }

    function balanceOf(address _user) public view returns (uint256) {
        return userInfo[_user].amount;
    }

    function interactionTimeOf(address _user) public view returns (uint256) {
        return userInfo[_user].interactionTime;
    }

    function addTokens(uint256 _amount) public nonReentrant {
        require(_amount > 0, "DDA: Amount must be greater than 0");

        duckdaoToken.transferFrom(msg.sender, address(this), _amount);

        userInfo[msg.sender].interactionTime = block.timestamp;
        userInfo[msg.sender].amount += _amount;
        totalSupply += _amount;

        emit Transfer(address(0), msg.sender, _amount);
        emit Added(msg.sender, _amount);
    }

    function removeTokens(uint256 _amount) public nonReentrant {
        require(_amount > 0, "DDA: Amount must be greater than 0");
        require(
            userInfo[msg.sender].amount >= _amount,
            "DDA: Insufficient balance"
        );

        uint256 penaltyAmount = calculatePenalty(msg.sender, _amount);
        duckdaoToken.transfer(msg.sender, _amount - penaltyAmount);

        userInfo[msg.sender].amount -= _amount;
        totalSupply -= _amount;
        totalPenalty += penaltyAmount;

        emit Transfer(msg.sender, address(0), _amount);
        emit Removed(msg.sender, _amount);
    }

    function addTokensWithPermit(
        uint256 _amount,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public {
        duckdaoToken.permit(
            msg.sender,
            address(this),
            _amount,
            _deadline,
            _v,
            _r,
            _s
        );
        addTokens(_amount);
    }

    function removeTokensWithPermit(
        uint256 _amount,
        uint256 _deadline,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) public {
        duckdaoToken.permit(
            msg.sender,
            address(this),
            _amount,
            _deadline,
            _v,
            _r,
            _s
        );
        removeTokens(_amount);
    }

    function calculatePenalty(
        address _user,
        uint256 _amount
    ) public view returns (uint256 penaltyAmount) {
        uint256 interactionTime = userInfo[_user].interactionTime;
        uint256 timeDiff = block.timestamp - interactionTime;

        penaltyAmount = 0;

        for (uint256 i = 0; i < penaltyLength; i++) {
            if (penalty[i].time == 0) {
                break;
            }

            if (timeDiff < penalty[i].time) {
                // penaltyAmount = user deposit * penaltyAmount / BPS
                penaltyAmount = (_amount * penalty[i].amount) / PENALTY_BPS;
                break;
            }
        }
    }

    function addPenalty(
        uint256 _index,
        uint256 _amount,
        uint256 _time
    ) public onlyOwner {
        require(_index < penaltyLength, "DDA: Index out of bounds");

        for (uint256 i = _index; i < penaltyLength - 1; i++) {
            penalty[i] = penalty[i + 1];
        }

        penalty[_index] = PenaltyInfo(_amount, _time);
        penaltyLength += 1;
    }

    function removePenalty(uint256 _index) public onlyOwner {
        require(_index < penaltyLength, "DDA: Index out of bounds");

        for (uint256 i = _index; i < penaltyLength - 1; i++) {
            penalty[i] = penalty[i + 1];
        }

        delete penalty[penaltyLength - 1];
        penaltyLength -= 1;
    }

    function changePenalty(
        uint256 _index,
        uint256 _amount,
        uint256 _time
    ) public onlyOwner {
        penalty[_index] = PenaltyInfo(_amount, _time);
    }

    function changeTotalPenalty(uint256 _totalPenalty) public onlyOwner {
        penaltyLength = _totalPenalty;
    }

    function withdrawPenalties() public onlyOwner {
        duckdaoToken.transfer(msg.sender, totalPenalty);
        totalPenalty = 0;
    }

    function emergencyWithdraw(address _token) public onlyOwner {
        require(
            _token != address(duckdaoToken),
            "DDA: Cannot withdraw DD tokens"
        );
        if (_token == address(0)) {
            payable(msg.sender).transfer(address(this).balance);
        } else {
            uint256 balance = IERC20(_token).balanceOf(address(this));
            IERC20(_token).transfer(msg.sender, balance);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Added","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Removed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PENALTY_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"addPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"addTokensWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculatePenalty","outputs":[{"internalType":"uint256","name":"penaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"changePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalPenalty","type":"uint256"}],"name":"changeTotalPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"duckdaoToken","outputs":[{"internalType":"contract DuckdaoToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"interactionTimeOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"penalty","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"penaltyLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"removeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"removeTokensWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"interactionTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawPenalties","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600e81526020017f4475636b44414f20416363657373000000000000000000000000000000000000815250600490816200004a9190620005c1565b506040518060400160405280600381526020017f444441000000000000000000000000000000000000000000000000000000000081525060059081620000919190620005c1565b50601260065f6101000a81548160ff021916908360ff160217905550348015620000b9575f80fd5b506040516200270a3803806200270a8339818101604052810190620000df91906200070a565b620000ff620000f36200029560201b60201c565b6200029c60201b60201c565b6001808190555080600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604051806040016040528061012c8152602001620d2f0081525060035f8081526020019081526020015f205f820151815f015560208201518160010155905050604051806040016040528060fa8152602001621a5e0081525060035f600181526020019081526020015f205f820151815f015560208201518160010155905050604051806040016040528060c8815260200162278d0081525060035f600281526020019081526020015f205f820151815f015560208201518160010155905050604051806040016040528060648152602001624f1a0081525060035f600381526020019081526020015f205f820151815f0155602082015181600101559050506040518060400160405280603281526020016276a70081525060035f600481526020019081526020015f205f820151815f0155602082015181600101559050506005600981905550506200073a565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003d957607f821691505b602082108103620003ef57620003ee62000394565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000416565b6200045f868362000416565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004a9620004a36200049d8462000477565b62000480565b62000477565b9050919050565b5f819050919050565b620004c48362000489565b620004dc620004d382620004b0565b84845462000422565b825550505050565b5f90565b620004f2620004e4565b620004ff818484620004b9565b505050565b5b8181101562000526576200051a5f82620004e8565b60018101905062000505565b5050565b601f82111562000575576200053f81620003f5565b6200054a8462000407565b810160208510156200055a578190505b62000572620005698562000407565b83018262000504565b50505b505050565b5f82821c905092915050565b5f620005975f19846008026200057a565b1980831691505092915050565b5f620005b1838362000586565b9150826002028217905092915050565b620005cc826200035d565b67ffffffffffffffff811115620005e857620005e762000367565b5b620005f48254620003c1565b620006018282856200052a565b5f60209050601f83116001811462000637575f841562000622578287015190505b6200062e8582620005a4565b8655506200069d565b601f1984166200064786620003f5565b5f5b82811015620006705784890151825560018201915060208501945060208101905062000649565b868310156200069057848901516200068c601f89168262000586565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620006d482620006a9565b9050919050565b620006e681620006c8565b8114620006f1575f80fd5b50565b5f815190506200070481620006db565b92915050565b5f60208284031215620007225762000721620006a5565b5b5f6200073184828501620006f4565b91505092915050565b611fc280620007485f395ff3fe608060405234801561000f575f80fd5b506004361061018b575f3560e01c80638da5cb5b116100dc578063c3c1424811610095578063e6af61c81161006f578063e6af61c814610447578063eff87ab614610465578063f2fde38b14610483578063fabac3a41461049f5761018b565b8063c3c14248146103f1578063c6ed89901461040d578063da62f3c8146104295761018b565b80638da5cb5b1461034357806395d89b4114610361578063addf14d81461037f578063b8cb65ee14610389578063bb99c05a146103a5578063bfe398c9146103d55761018b565b80631efe5321116101495780636f9064d7116101235780636f9064d7146102bc5780636ff1c9bc146102ed57806370a0823114610309578063715018a6146103395761018b565b80631efe532114610264578063313ce5671461028257806368c5effa146102a05761018b565b8062c917451461018f57806306fdde03146101ab57806311fd1222146101c957806318160ddd146101e55780631959a002146102035780631dc0da1c14610234575b5f80fd5b6101a960048036038101906101a49190611659565b6104bb565b005b6101b361055e565b6040516101c0919061175a565b60405180910390f35b6101e360048036038101906101de919061177a565b6105ea565b005b6101ed6105fc565b6040516101fa91906117b4565b60405180910390f35b61021d60048036038101906102189190611827565b610602565b60405161022b929190611852565b60405180910390f35b61024e60048036038101906102499190611879565b610622565b60405161025b91906117b4565b60405180910390f35b61026c610706565b60405161027991906117b4565b60405180910390f35b61028a61070c565b60405161029791906118c6565b60405180910390f35b6102ba60048036038101906102b5919061177a565b61071e565b005b6102d660048036038101906102d1919061177a565b610821565b6040516102e4929190611852565b60405180910390f35b61030760048036038101906103029190611827565b610841565b005b610323600480360381019061031e9190611827565b610a50565b60405161033091906117b4565b60405180910390f35b610341610a98565b005b61034b610aab565b60405161035891906118ee565b60405180910390f35b610369610ad2565b604051610376919061175a565b60405180910390f35b610387610b5e565b005b6103a3600480360381019061039e919061177a565b610c0e565b005b6103bf60048036038101906103ba9190611827565b610ed3565b6040516103cc91906117b4565b60405180910390f35b6103ef60048036038101906103ea9190611659565b610f1c565b005b61040b60048036038101906104069190611907565b610fbf565b005b6104276004803603810190610422919061177a565b6110d0565b005b610431611329565b60405161043e91906119b2565b60405180910390f35b61044f61134e565b60405161045c91906117b4565b60405180910390f35b61046d611354565b60405161047a91906117b4565b60405180910390f35b61049d60048036038101906104989190611827565b61135a565b005b6104b960048036038101906104b49190611907565b6113dc565b005b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b815260040161052197969594939291906119da565b5f604051808303815f87803b158015610538575f80fd5b505af115801561054a573d5f803e3d5ffd5b50505050610557856110d0565b5050505050565b6004805461056b90611a74565b80601f016020809104026020016040519081016040528092919081815260200182805461059790611a74565b80156105e25780601f106105b9576101008083540402835291602001916105e2565b820191905f5260205f20905b8154815290600101906020018083116105c557829003601f168201915b505050505081565b6105f2611424565b8060098190555050565b60075481565b6002602052805f5260405f205f91509050805f0154908060010154905082565b5f8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f81426106749190611ad1565b90505f92505f5b6009548110156106fd575f60035f8381526020019081526020015f206001015403156106fd5760035f8281526020019081526020015f20600101548210156106f0576103e860035f8381526020019081526020015f205f0154866106df9190611b04565b6106e99190611b72565b93506106fd565b808060010191505061067b565b50505092915050565b6103e881565b60065f9054906101000a900460ff1681565b610726611424565b600954811061076a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076190611bec565b60405180910390fd5b5f8190505b600160095461077e9190611ad1565b8110156107d55760035f6001836107959190611c0a565b81526020019081526020015f2060035f8381526020019081526020015f205f820154815f015560018201548160010155905050808060010191505061076f565b5060035f60016009546107e89190611ad1565b81526020019081526020015f205f8082015f9055600182015f90555050600160095f8282546108179190611ad1565b9250508190555050565b6003602052805f5260405f205f91509050805f0154908060010154905082565b610849611424565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90611c87565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610954573373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561094e573d5f803e3d5ffd5b50610a4d565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161098e91906118ee565b602060405180830381865afa1580156109a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109cd9190611cb9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a0a929190611ce4565b6020604051808303815f875af1158015610a26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4a9190611d40565b50505b50565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b610aa0611424565b610aa95f6114a2565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60058054610adf90611a74565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90611a74565b8015610b565780601f10610b2d57610100808354040283529160200191610b56565b820191905f5260205f20905b815481529060010190602001808311610b3957829003601f168201915b505050505081565b610b66611424565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b8152600401610bc4929190611ce4565b6020604051808303815f875af1158015610be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c049190611d40565b505f600881905550565b610c16611563565b5f8111610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611ddb565b60405180910390fd5b8060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd190611e43565b60405180910390fd5b5f610ce53383610622565b9050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338385610d319190611ad1565b6040518363ffffffff1660e01b8152600401610d4e929190611ce4565b6020604051808303815f875af1158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190611d40565b508160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254610ddd9190611ad1565b925050819055508160075f828254610df59190611ad1565b925050819055508060085f828254610e0d9190611c0a565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e7191906117b4565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167fbe80a446a00b8794a7d05e8386915bdde937fe8b48da8d16175a5362b4c3f4f883604051610ebf91906117b4565b60405180910390a250610ed06115a9565b50565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b8152600401610f8297969594939291906119da565b5f604051808303815f87803b158015610f99575f80fd5b505af1158015610fab573d5f803e3d5ffd5b50505050610fb885610c0e565b5050505050565b610fc7611424565b600954831061100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290611bec565b60405180910390fd5b5f8390505b600160095461101f9190611ad1565b8110156110765760035f6001836110369190611c0a565b81526020019081526020015f2060035f8381526020019081526020015f205f820154815f0155600182015481600101559050508080600101915050611010565b5060405180604001604052808381526020018281525060035f8581526020019081526020015f205f820151815f015560208201518160010155905050600160095f8282546110c49190611c0a565b92505081905550505050565b6110d8611563565b5f811161111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190611ddb565b60405180910390fd5b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161117893929190611e61565b6020604051808303815f875af1158015611194573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b89190611d40565b504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055508060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f82825461124c9190611c0a565b925050819055508060075f8282546112649190611c0a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112c891906117b4565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f446e00ad56f9b887844f390c87a128507b991ea0499375f13ecb115288c2df7d8260405161131691906117b4565b60405180910390a26113266115a9565b50565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60095481565b611362611424565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c790611f06565b60405180910390fd5b6113d9816114a2565b50565b6113e4611424565b60405180604001604052808381526020018281525060035f8581526020019081526020015f205f820151815f015560208201518160010155905050505050565b61142c6115b2565b73ffffffffffffffffffffffffffffffffffffffff1661144a610aab565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790611f6e565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361159f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b5f80fd5b5f819050919050565b6115cf816115bd565b81146115d9575f80fd5b50565b5f813590506115ea816115c6565b92915050565b5f60ff82169050919050565b611605816115f0565b811461160f575f80fd5b50565b5f81359050611620816115fc565b92915050565b5f819050919050565b61163881611626565b8114611642575f80fd5b50565b5f813590506116538161162f565b92915050565b5f805f805f60a08688031215611672576116716115b9565b5b5f61167f888289016115dc565b9550506020611690888289016115dc565b94505060406116a188828901611612565b93505060606116b288828901611645565b92505060806116c388828901611645565b9150509295509295909350565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156117075780820151818401526020810190506116ec565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61172c826116d0565b61173681856116da565b93506117468185602086016116ea565b61174f81611712565b840191505092915050565b5f6020820190508181035f8301526117728184611722565b905092915050565b5f6020828403121561178f5761178e6115b9565b5b5f61179c848285016115dc565b91505092915050565b6117ae816115bd565b82525050565b5f6020820190506117c75f8301846117a5565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117f6826117cd565b9050919050565b611806816117ec565b8114611810575f80fd5b50565b5f81359050611821816117fd565b92915050565b5f6020828403121561183c5761183b6115b9565b5b5f61184984828501611813565b91505092915050565b5f6040820190506118655f8301856117a5565b61187260208301846117a5565b9392505050565b5f806040838503121561188f5761188e6115b9565b5b5f61189c85828601611813565b92505060206118ad858286016115dc565b9150509250929050565b6118c0816115f0565b82525050565b5f6020820190506118d95f8301846118b7565b92915050565b6118e8816117ec565b82525050565b5f6020820190506119015f8301846118df565b92915050565b5f805f6060848603121561191e5761191d6115b9565b5b5f61192b868287016115dc565b935050602061193c868287016115dc565b925050604061194d868287016115dc565b9150509250925092565b5f819050919050565b5f61197a611975611970846117cd565b611957565b6117cd565b9050919050565b5f61198b82611960565b9050919050565b5f61199c82611981565b9050919050565b6119ac81611992565b82525050565b5f6020820190506119c55f8301846119a3565b92915050565b6119d481611626565b82525050565b5f60e0820190506119ed5f83018a6118df565b6119fa60208301896118df565b611a0760408301886117a5565b611a1460608301876117a5565b611a2160808301866118b7565b611a2e60a08301856119cb565b611a3b60c08301846119cb565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a8b57607f821691505b602082108103611a9e57611a9d611a47565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611adb826115bd565b9150611ae6836115bd565b9250828203905081811115611afe57611afd611aa4565b5b92915050565b5f611b0e826115bd565b9150611b19836115bd565b9250828202611b27816115bd565b91508282048414831517611b3e57611b3d611aa4565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611b7c826115bd565b9150611b87836115bd565b925082611b9757611b96611b45565b5b828204905092915050565b7f4444413a20496e646578206f7574206f6620626f756e647300000000000000005f82015250565b5f611bd66018836116da565b9150611be182611ba2565b602082019050919050565b5f6020820190508181035f830152611c0381611bca565b9050919050565b5f611c14826115bd565b9150611c1f836115bd565b9250828201905080821115611c3757611c36611aa4565b5b92915050565b7f4444413a2043616e6e6f7420776974686472617720444420746f6b656e7300005f82015250565b5f611c71601e836116da565b9150611c7c82611c3d565b602082019050919050565b5f6020820190508181035f830152611c9e81611c65565b9050919050565b5f81519050611cb3816115c6565b92915050565b5f60208284031215611cce57611ccd6115b9565b5b5f611cdb84828501611ca5565b91505092915050565b5f604082019050611cf75f8301856118df565b611d0460208301846117a5565b9392505050565b5f8115159050919050565b611d1f81611d0b565b8114611d29575f80fd5b50565b5f81519050611d3a81611d16565b92915050565b5f60208284031215611d5557611d546115b9565b5b5f611d6284828501611d2c565b91505092915050565b7f4444413a20416d6f756e74206d7573742062652067726561746572207468616e5f8201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b5f611dc56022836116da565b9150611dd082611d6b565b604082019050919050565b5f6020820190508181035f830152611df281611db9565b9050919050565b7f4444413a20496e73756666696369656e742062616c616e6365000000000000005f82015250565b5f611e2d6019836116da565b9150611e3882611df9565b602082019050919050565b5f6020820190508181035f830152611e5a81611e21565b9050919050565b5f606082019050611e745f8301866118df565b611e8160208301856118df565b611e8e60408301846117a5565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611ef06026836116da565b9150611efb82611e96565b604082019050919050565b5f6020820190508181035f830152611f1d81611ee4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f586020836116da565b9150611f6382611f24565b602082019050919050565b5f6020820190508181035f830152611f8581611f4c565b905091905056fea2646970667358221220200af48448dfb98fed676ada01d17d4df89bca63a7257286007a3f29e0c0fecc64736f6c634300081600330000000000000000000000007d51888c5abb7cdfa9cdd6a50673c7f8afaccd7f

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061018b575f3560e01c80638da5cb5b116100dc578063c3c1424811610095578063e6af61c81161006f578063e6af61c814610447578063eff87ab614610465578063f2fde38b14610483578063fabac3a41461049f5761018b565b8063c3c14248146103f1578063c6ed89901461040d578063da62f3c8146104295761018b565b80638da5cb5b1461034357806395d89b4114610361578063addf14d81461037f578063b8cb65ee14610389578063bb99c05a146103a5578063bfe398c9146103d55761018b565b80631efe5321116101495780636f9064d7116101235780636f9064d7146102bc5780636ff1c9bc146102ed57806370a0823114610309578063715018a6146103395761018b565b80631efe532114610264578063313ce5671461028257806368c5effa146102a05761018b565b8062c917451461018f57806306fdde03146101ab57806311fd1222146101c957806318160ddd146101e55780631959a002146102035780631dc0da1c14610234575b5f80fd5b6101a960048036038101906101a49190611659565b6104bb565b005b6101b361055e565b6040516101c0919061175a565b60405180910390f35b6101e360048036038101906101de919061177a565b6105ea565b005b6101ed6105fc565b6040516101fa91906117b4565b60405180910390f35b61021d60048036038101906102189190611827565b610602565b60405161022b929190611852565b60405180910390f35b61024e60048036038101906102499190611879565b610622565b60405161025b91906117b4565b60405180910390f35b61026c610706565b60405161027991906117b4565b60405180910390f35b61028a61070c565b60405161029791906118c6565b60405180910390f35b6102ba60048036038101906102b5919061177a565b61071e565b005b6102d660048036038101906102d1919061177a565b610821565b6040516102e4929190611852565b60405180910390f35b61030760048036038101906103029190611827565b610841565b005b610323600480360381019061031e9190611827565b610a50565b60405161033091906117b4565b60405180910390f35b610341610a98565b005b61034b610aab565b60405161035891906118ee565b60405180910390f35b610369610ad2565b604051610376919061175a565b60405180910390f35b610387610b5e565b005b6103a3600480360381019061039e919061177a565b610c0e565b005b6103bf60048036038101906103ba9190611827565b610ed3565b6040516103cc91906117b4565b60405180910390f35b6103ef60048036038101906103ea9190611659565b610f1c565b005b61040b60048036038101906104069190611907565b610fbf565b005b6104276004803603810190610422919061177a565b6110d0565b005b610431611329565b60405161043e91906119b2565b60405180910390f35b61044f61134e565b60405161045c91906117b4565b60405180910390f35b61046d611354565b60405161047a91906117b4565b60405180910390f35b61049d60048036038101906104989190611827565b61135a565b005b6104b960048036038101906104b49190611907565b6113dc565b005b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b815260040161052197969594939291906119da565b5f604051808303815f87803b158015610538575f80fd5b505af115801561054a573d5f803e3d5ffd5b50505050610557856110d0565b5050505050565b6004805461056b90611a74565b80601f016020809104026020016040519081016040528092919081815260200182805461059790611a74565b80156105e25780601f106105b9576101008083540402835291602001916105e2565b820191905f5260205f20905b8154815290600101906020018083116105c557829003601f168201915b505050505081565b6105f2611424565b8060098190555050565b60075481565b6002602052805f5260405f205f91509050805f0154908060010154905082565b5f8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015490505f81426106749190611ad1565b90505f92505f5b6009548110156106fd575f60035f8381526020019081526020015f206001015403156106fd5760035f8281526020019081526020015f20600101548210156106f0576103e860035f8381526020019081526020015f205f0154866106df9190611b04565b6106e99190611b72565b93506106fd565b808060010191505061067b565b50505092915050565b6103e881565b60065f9054906101000a900460ff1681565b610726611424565b600954811061076a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076190611bec565b60405180910390fd5b5f8190505b600160095461077e9190611ad1565b8110156107d55760035f6001836107959190611c0a565b81526020019081526020015f2060035f8381526020019081526020015f205f820154815f015560018201548160010155905050808060010191505061076f565b5060035f60016009546107e89190611ad1565b81526020019081526020015f205f8082015f9055600182015f90555050600160095f8282546108179190611ad1565b9250508190555050565b6003602052805f5260405f205f91509050805f0154908060010154905082565b610849611424565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108cf90611c87565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610954573373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f1935050505015801561094e573d5f803e3d5ffd5b50610a4d565b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161098e91906118ee565b602060405180830381865afa1580156109a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109cd9190611cb9565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610a0a929190611ce4565b6020604051808303815f875af1158015610a26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4a9190611d40565b50505b50565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01549050919050565b610aa0611424565b610aa95f6114a2565b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60058054610adf90611a74565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0b90611a74565b8015610b565780601f10610b2d57610100808354040283529160200191610b56565b820191905f5260205f20905b815481529060010190602001808311610b3957829003601f168201915b505050505081565b610b66611424565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336008546040518363ffffffff1660e01b8152600401610bc4929190611ce4565b6020604051808303815f875af1158015610be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c049190611d40565b505f600881905550565b610c16611563565b5f8111610c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4f90611ddb565b60405180910390fd5b8060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f01541015610cda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd190611e43565b60405180910390fd5b5f610ce53383610622565b9050600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338385610d319190611ad1565b6040518363ffffffff1660e01b8152600401610d4e929190611ce4565b6020604051808303815f875af1158015610d6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8e9190611d40565b508160025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f828254610ddd9190611ad1565b925050819055508160075f828254610df59190611ad1565b925050819055508060085f828254610e0d9190611c0a565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e7191906117b4565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167fbe80a446a00b8794a7d05e8386915bdde937fe8b48da8d16175a5362b4c3f4f883604051610ebf91906117b4565b60405180910390a250610ed06115a9565b50565b5f60025f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101549050919050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d505accf333088888888886040518863ffffffff1660e01b8152600401610f8297969594939291906119da565b5f604051808303815f87803b158015610f99575f80fd5b505af1158015610fab573d5f803e3d5ffd5b50505050610fb885610c0e565b5050505050565b610fc7611424565b600954831061100b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100290611bec565b60405180910390fd5b5f8390505b600160095461101f9190611ad1565b8110156110765760035f6001836110369190611c0a565b81526020019081526020015f2060035f8381526020019081526020015f205f820154815f0155600182015481600101559050508080600101915050611010565b5060405180604001604052808381526020018281525060035f8581526020019081526020015f205f820151815f015560208201518160010155905050600160095f8282546110c49190611c0a565b92505081905550505050565b6110d8611563565b5f811161111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111190611ddb565b60405180910390fd5b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b815260040161117893929190611e61565b6020604051808303815f875af1158015611194573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b89190611d40565b504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101819055508060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f82825461124c9190611c0a565b925050819055508060075f8282546112649190611c0a565b925050819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112c891906117b4565b60405180910390a33373ffffffffffffffffffffffffffffffffffffffff167f446e00ad56f9b887844f390c87a128507b991ea0499375f13ecb115288c2df7d8260405161131691906117b4565b60405180910390a26113266115a9565b50565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60095481565b611362611424565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c790611f06565b60405180910390fd5b6113d9816114a2565b50565b6113e4611424565b60405180604001604052808381526020018281525060035f8581526020019081526020015f205f820151815f015560208201518160010155905050505050565b61142c6115b2565b73ffffffffffffffffffffffffffffffffffffffff1661144a610aab565b73ffffffffffffffffffffffffffffffffffffffff16146114a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149790611f6e565b60405180910390fd5b565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60026001540361159f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b60018081905550565b5f33905090565b5f80fd5b5f819050919050565b6115cf816115bd565b81146115d9575f80fd5b50565b5f813590506115ea816115c6565b92915050565b5f60ff82169050919050565b611605816115f0565b811461160f575f80fd5b50565b5f81359050611620816115fc565b92915050565b5f819050919050565b61163881611626565b8114611642575f80fd5b50565b5f813590506116538161162f565b92915050565b5f805f805f60a08688031215611672576116716115b9565b5b5f61167f888289016115dc565b9550506020611690888289016115dc565b94505060406116a188828901611612565b93505060606116b288828901611645565b92505060806116c388828901611645565b9150509295509295909350565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156117075780820151818401526020810190506116ec565b5f8484015250505050565b5f601f19601f8301169050919050565b5f61172c826116d0565b61173681856116da565b93506117468185602086016116ea565b61174f81611712565b840191505092915050565b5f6020820190508181035f8301526117728184611722565b905092915050565b5f6020828403121561178f5761178e6115b9565b5b5f61179c848285016115dc565b91505092915050565b6117ae816115bd565b82525050565b5f6020820190506117c75f8301846117a5565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117f6826117cd565b9050919050565b611806816117ec565b8114611810575f80fd5b50565b5f81359050611821816117fd565b92915050565b5f6020828403121561183c5761183b6115b9565b5b5f61184984828501611813565b91505092915050565b5f6040820190506118655f8301856117a5565b61187260208301846117a5565b9392505050565b5f806040838503121561188f5761188e6115b9565b5b5f61189c85828601611813565b92505060206118ad858286016115dc565b9150509250929050565b6118c0816115f0565b82525050565b5f6020820190506118d95f8301846118b7565b92915050565b6118e8816117ec565b82525050565b5f6020820190506119015f8301846118df565b92915050565b5f805f6060848603121561191e5761191d6115b9565b5b5f61192b868287016115dc565b935050602061193c868287016115dc565b925050604061194d868287016115dc565b9150509250925092565b5f819050919050565b5f61197a611975611970846117cd565b611957565b6117cd565b9050919050565b5f61198b82611960565b9050919050565b5f61199c82611981565b9050919050565b6119ac81611992565b82525050565b5f6020820190506119c55f8301846119a3565b92915050565b6119d481611626565b82525050565b5f60e0820190506119ed5f83018a6118df565b6119fa60208301896118df565b611a0760408301886117a5565b611a1460608301876117a5565b611a2160808301866118b7565b611a2e60a08301856119cb565b611a3b60c08301846119cb565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611a8b57607f821691505b602082108103611a9e57611a9d611a47565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611adb826115bd565b9150611ae6836115bd565b9250828203905081811115611afe57611afd611aa4565b5b92915050565b5f611b0e826115bd565b9150611b19836115bd565b9250828202611b27816115bd565b91508282048414831517611b3e57611b3d611aa4565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611b7c826115bd565b9150611b87836115bd565b925082611b9757611b96611b45565b5b828204905092915050565b7f4444413a20496e646578206f7574206f6620626f756e647300000000000000005f82015250565b5f611bd66018836116da565b9150611be182611ba2565b602082019050919050565b5f6020820190508181035f830152611c0381611bca565b9050919050565b5f611c14826115bd565b9150611c1f836115bd565b9250828201905080821115611c3757611c36611aa4565b5b92915050565b7f4444413a2043616e6e6f7420776974686472617720444420746f6b656e7300005f82015250565b5f611c71601e836116da565b9150611c7c82611c3d565b602082019050919050565b5f6020820190508181035f830152611c9e81611c65565b9050919050565b5f81519050611cb3816115c6565b92915050565b5f60208284031215611cce57611ccd6115b9565b5b5f611cdb84828501611ca5565b91505092915050565b5f604082019050611cf75f8301856118df565b611d0460208301846117a5565b9392505050565b5f8115159050919050565b611d1f81611d0b565b8114611d29575f80fd5b50565b5f81519050611d3a81611d16565b92915050565b5f60208284031215611d5557611d546115b9565b5b5f611d6284828501611d2c565b91505092915050565b7f4444413a20416d6f756e74206d7573742062652067726561746572207468616e5f8201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b5f611dc56022836116da565b9150611dd082611d6b565b604082019050919050565b5f6020820190508181035f830152611df281611db9565b9050919050565b7f4444413a20496e73756666696369656e742062616c616e6365000000000000005f82015250565b5f611e2d6019836116da565b9150611e3882611df9565b602082019050919050565b5f6020820190508181035f830152611e5a81611e21565b9050919050565b5f606082019050611e745f8301866118df565b611e8160208301856118df565b611e8e60408301846117a5565b949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f611ef06026836116da565b9150611efb82611e96565b604082019050919050565b5f6020820190508181035f830152611f1d81611ee4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f611f586020836116da565b9150611f6382611f24565b602082019050919050565b5f6020820190508181035f830152611f8581611f4c565b905091905056fea2646970667358221220200af48448dfb98fed676ada01d17d4df89bca63a7257286007a3f29e0c0fecc64736f6c63430008160033

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

0000000000000000000000007d51888c5abb7cdfa9cdd6a50673c7f8afaccd7f

-----Decoded View---------------
Arg [0] : _token (address): 0x7d51888C5ABb7CDfa9cdd6A50673c7F8afAccD7F

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007d51888c5abb7cdfa9cdd6a50673c7f8afaccd7f


Deployed Bytecode Sourcemap

30670:5911:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33430:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31059:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35854:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31173:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30953:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;34224:681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30728:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31138:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35324:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31004:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;36125:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32070:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29784:103;;;:::i;:::-;;29136:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31103:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35978:139;;;:::i;:::-;;32792:630;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32190:129;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33824:392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34913:403;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32327:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31275:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31206:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31240:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30042:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35660:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33430:386;33599:12;;;;;;;;;;;:19;;;33633:10;33666:4;33686:7;33708:9;33732:2;33749;33766;33599:180;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33790:18;33800:7;33790:9;:18::i;:::-;33430:386;;;;;:::o;31059:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35854:116::-;29022:13;:11;:13::i;:::-;35949::::1;35933;:29;;;;35854:116:::0;:::o;31173:26::-;;;;:::o;30953:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34224:681::-;34328:21;34362:23;34388:8;:15;34397:5;34388:15;;;;;;;;;;;;;;;:31;;;34362:57;;34430:16;34467:15;34449;:33;;;;:::i;:::-;34430:52;;34511:1;34495:17;;34530:9;34525:373;34549:13;;34545:1;:17;34525:373;;;34607:1;34588:7;:10;34596:1;34588:10;;;;;;;;;;;:15;;;:20;34584:66;34629:5;34584:66;34681:7;:10;34689:1;34681:10;;;;;;;;;;;:15;;;34670:8;:26;34666:221;;;30766:4;34815:7;:10;34823:1;34815:10;;;;;;;;;;;:17;;;34805:7;:27;;;;:::i;:::-;34804:43;;;;:::i;:::-;34788:59;;34866:5;;34666:221;34564:3;;;;;;;34525:373;;;;34351:554;;34224:681;;;;:::o;30728:42::-;30766:4;30728:42;:::o;31138:26::-;;;;;;;;;;;;;:::o;35324:328::-;29022:13;:11;:13::i;:::-;35408::::1;;35399:6;:22;35391:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;35468:9;35480:6;35468:18;;35463:107;35508:1;35492:13;;:17;;;;:::i;:::-;35488:1;:21;35463:107;;;35544:7;:14;35556:1;35552;:5;;;;:::i;:::-;35544:14;;;;;;;;;;;35531:7;:10;35539:1;35531:10;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;;35511:3;;;;;;;35463:107;;;;35589:7;:26;35613:1;35597:13;;:17;;;;:::i;:::-;35589:26;;;;;;;;;;;;35582:33:::0;::::1;;;;;;;;;;;;;35643:1;35626:13;;:18;;;;;;;:::i;:::-;;;;;;;;35324:328:::0;:::o;31004:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36125:453::-;29022:13;:11;:13::i;:::-;36236:12:::1;;;;;;;;;;;36218:31;;:6;:31;;::::0;36196:111:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36340:1;36322:20;;:6;:20;;::::0;36318:253:::1;;36367:10;36359:28;;:51;36388:21;36359:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;36318:253;;;36443:15;36468:6;36461:24;;;36494:4;36461:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36443:57;;36522:6;36515:23;;;36539:10;36551:7;36515:44;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36428:143;36318:253;36125:453:::0;:::o;32070:112::-;32125:7;32152:8;:15;32161:5;32152:15;;;;;;;;;;;;;;;:22;;;32145:29;;32070:112;;;:::o;29784:103::-;29022:13;:11;:13::i;:::-;29849:30:::1;29876:1;29849:18;:30::i;:::-;29784:103::o:0;29136:87::-;29182:7;29209:6;;;;;;;;;;;29202:13;;29136:87;:::o;31103:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35978:139::-;29022:13;:11;:13::i;:::-;36035:12:::1;;;;;;;;;;;:21;;;36057:10;36069:12;;36035:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36108:1;36093:12;:16;;;;35978:139::o:0;32792:630::-;12779:21;:19;:21::i;:::-;32880:1:::1;32870:7;:11;32862:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32984:7;32953:8;:20;32962:10;32953:20;;;;;;;;;;;;;;;:27;;;:38;;32931:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;33057:21;33081:37;33098:10;33110:7;33081:16;:37::i;:::-;33057:61;;33129:12;;;;;;;;;;;:21;;;33151:10;33173:13;33163:7;:23;;;;:::i;:::-;33129:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33231:7;33200:8;:20;33209:10;33200:20;;;;;;;;;;;;;;;:27;;;:38;;;;;;;:::i;:::-;;;;;;;;33264:7;33249:11;;:22;;;;;;;:::i;:::-;;;;;;;;33298:13;33282:12;;:29;;;;;;;:::i;:::-;;;;;;;;33358:1;33329:41;;33338:10;33329:41;;;33362:7;33329:41;;;;;;:::i;:::-;;;;;;;;33394:10;33386:28;;;33406:7;33386:28;;;;;;:::i;:::-;;;;;;;;32851:571;12823:20:::0;:18;:20::i;:::-;32792:630;:::o;32190:129::-;32253:7;32280:8;:15;32289:5;32280:15;;;;;;;;;;;;;;;:31;;;32273:38;;32190:129;;;:::o;33824:392::-;33996:12;;;;;;;;;;;:19;;;34030:10;34063:4;34083:7;34105:9;34129:2;34146;34163;33996:180;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34187:21;34200:7;34187:12;:21::i;:::-;33824:392;;;;;:::o;34913:403::-;29022:13;:11;:13::i;:::-;35060::::1;;35051:6;:22;35043:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;35120:9;35132:6;35120:18;;35115:107;35160:1;35144:13;;:17;;;;:::i;:::-;35140:1;:21;35115:107;;;35196:7;:14;35208:1;35204;:5;;;;:::i;:::-;35196:14;;;;;;;;;;;35183:7;:10;35191:1;35183:10;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;;35163:3;;;;;;;35115:107;;;;35252:27;;;;;;;;35264:7;35252:27;;;;35273:5;35252:27;;::::0;35234:7:::1;:15;35242:6;35234:15;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;35307:1;35290:13;;:18;;;;;;;:::i;:::-;;;;;;;;34913:403:::0;;;:::o;32327:457::-;12779:21;:19;:21::i;:::-;32412:1:::1;32402:7;:11;32394:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32465:12;;;;;;;;;;;:25;;;32491:10;32511:4;32518:7;32465:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32578:15;32539:8;:20;32548:10;32539:20;;;;;;;;;;;;;;;:36;;:54;;;;32635:7;32604:8;:20;32613:10;32604:20;;;;;;;;;;;;;;;:27;;;:38;;;;;;;:::i;:::-;;;;;;;;32668:7;32653:11;;:22;;;;;;;:::i;:::-;;;;;;;;32714:10;32693:41;;32710:1;32693:41;;;32726:7;32693:41;;;;;;:::i;:::-;;;;;;;;32756:10;32750:26;;;32768:7;32750:26;;;;;;:::i;:::-;;;;;;;;12823:20:::0;:18;:20::i;:::-;32327:457;:::o;31275:32::-;;;;;;;;;;;;;:::o;31206:27::-;;;;:::o;31240:28::-;;;;:::o;30042:201::-;29022:13;:11;:13::i;:::-;30151:1:::1;30131:22;;:8;:22;;::::0;30123:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;30207:28;30226:8;30207:18;:28::i;:::-;30042:201:::0;:::o;35660:186::-;29022:13;:11;:13::i;:::-;35811:27:::1;;;;;;;;35823:7;35811:27;;;;35832:5;35811:27;;::::0;35793:7:::1;:15;35801:6;35793:15;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;;35660:186:::0;;;:::o;29301:132::-;29376:12;:10;:12::i;:::-;29365:23;;:7;:5;:7::i;:::-;:23;;;29357:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29301:132::o;30403:191::-;30477:16;30496:6;;;;;;;;;;;30477:25;;30522:8;30513:6;;:17;;;;;;;;;;;;;;;;;;30577:8;30546:40;;30567:8;30546:40;;;;;;;;;;;;30466:128;30403:191;:::o;12859:315::-;12157:1;12988:7;;:18;12984:88;;13030:30;;;;;;;;;;;;;;12984:88;12157:1;13149:7;:17;;;;12859:315::o;13182:212::-;12114:1;13365:7;:21;;;;13182:212::o;14389:98::-;14442:7;14469:10;14462:17;;14389:98;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:86::-;725:7;765:4;758:5;754:16;743:27;;690:86;;;:::o;782:118::-;853:22;869:5;853:22;:::i;:::-;846:5;843:33;833:61;;890:1;887;880:12;833:61;782:118;:::o;906:135::-;950:5;988:6;975:20;966:29;;1004:31;1029:5;1004:31;:::i;:::-;906:135;;;;:::o;1047:77::-;1084:7;1113:5;1102:16;;1047:77;;;:::o;1130:122::-;1203:24;1221:5;1203:24;:::i;:::-;1196:5;1193:35;1183:63;;1242:1;1239;1232:12;1183:63;1130:122;:::o;1258:139::-;1304:5;1342:6;1329:20;1320:29;;1358:33;1385:5;1358:33;:::i;:::-;1258:139;;;;:::o;1403:907::-;1496:6;1504;1512;1520;1528;1577:3;1565:9;1556:7;1552:23;1548:33;1545:120;;;1584:79;;:::i;:::-;1545:120;1704:1;1729:53;1774:7;1765:6;1754:9;1750:22;1729:53;:::i;:::-;1719:63;;1675:117;1831:2;1857:53;1902:7;1893:6;1882:9;1878:22;1857:53;:::i;:::-;1847:63;;1802:118;1959:2;1985:51;2028:7;2019:6;2008:9;2004:22;1985:51;:::i;:::-;1975:61;;1930:116;2085:2;2111:53;2156:7;2147:6;2136:9;2132:22;2111:53;:::i;:::-;2101:63;;2056:118;2213:3;2240:53;2285:7;2276:6;2265:9;2261:22;2240:53;:::i;:::-;2230:63;;2184:119;1403:907;;;;;;;;:::o;2316:99::-;2368:6;2402:5;2396:12;2386:22;;2316:99;;;:::o;2421:169::-;2505:11;2539:6;2534:3;2527:19;2579:4;2574:3;2570:14;2555:29;;2421:169;;;;:::o;2596:246::-;2677:1;2687:113;2701:6;2698:1;2695:13;2687:113;;;2786:1;2781:3;2777:11;2771:18;2767:1;2762:3;2758:11;2751:39;2723:2;2720:1;2716:10;2711:15;;2687:113;;;2834:1;2825:6;2820:3;2816:16;2809:27;2658:184;2596:246;;;:::o;2848:102::-;2889:6;2940:2;2936:7;2931:2;2924:5;2920:14;2916:28;2906:38;;2848:102;;;:::o;2956:377::-;3044:3;3072:39;3105:5;3072:39;:::i;:::-;3127:71;3191:6;3186:3;3127:71;:::i;:::-;3120:78;;3207:65;3265:6;3260:3;3253:4;3246:5;3242:16;3207:65;:::i;:::-;3297:29;3319:6;3297:29;:::i;:::-;3292:3;3288:39;3281:46;;3048:285;2956:377;;;;:::o;3339:313::-;3452:4;3490:2;3479:9;3475:18;3467:26;;3539:9;3533:4;3529:20;3525:1;3514:9;3510:17;3503:47;3567:78;3640:4;3631:6;3567:78;:::i;:::-;3559:86;;3339:313;;;;:::o;3658:329::-;3717:6;3766:2;3754:9;3745:7;3741:23;3737:32;3734:119;;;3772:79;;:::i;:::-;3734:119;3892:1;3917:53;3962:7;3953:6;3942:9;3938:22;3917:53;:::i;:::-;3907:63;;3863:117;3658:329;;;;:::o;3993:118::-;4080:24;4098:5;4080:24;:::i;:::-;4075:3;4068:37;3993:118;;:::o;4117:222::-;4210:4;4248:2;4237:9;4233:18;4225:26;;4261:71;4329:1;4318:9;4314:17;4305:6;4261:71;:::i;:::-;4117:222;;;;:::o;4345:126::-;4382:7;4422:42;4415:5;4411:54;4400:65;;4345:126;;;:::o;4477:96::-;4514:7;4543:24;4561:5;4543:24;:::i;:::-;4532:35;;4477:96;;;:::o;4579:122::-;4652:24;4670:5;4652:24;:::i;:::-;4645:5;4642:35;4632:63;;4691:1;4688;4681:12;4632:63;4579:122;:::o;4707:139::-;4753:5;4791:6;4778:20;4769:29;;4807:33;4834:5;4807:33;:::i;:::-;4707:139;;;;:::o;4852:329::-;4911:6;4960:2;4948:9;4939:7;4935:23;4931:32;4928:119;;;4966:79;;:::i;:::-;4928:119;5086:1;5111:53;5156:7;5147:6;5136:9;5132:22;5111:53;:::i;:::-;5101:63;;5057:117;4852:329;;;;:::o;5187:332::-;5308:4;5346:2;5335:9;5331:18;5323:26;;5359:71;5427:1;5416:9;5412:17;5403:6;5359:71;:::i;:::-;5440:72;5508:2;5497:9;5493:18;5484:6;5440:72;:::i;:::-;5187:332;;;;;:::o;5525:474::-;5593:6;5601;5650:2;5638:9;5629:7;5625:23;5621:32;5618:119;;;5656:79;;:::i;:::-;5618:119;5776:1;5801:53;5846:7;5837:6;5826:9;5822:22;5801:53;:::i;:::-;5791:63;;5747:117;5903:2;5929:53;5974:7;5965:6;5954:9;5950:22;5929:53;:::i;:::-;5919:63;;5874:118;5525:474;;;;;:::o;6005:112::-;6088:22;6104:5;6088:22;:::i;:::-;6083:3;6076:35;6005:112;;:::o;6123:214::-;6212:4;6250:2;6239:9;6235:18;6227:26;;6263:67;6327:1;6316:9;6312:17;6303:6;6263:67;:::i;:::-;6123:214;;;;:::o;6343:118::-;6430:24;6448:5;6430:24;:::i;:::-;6425:3;6418:37;6343:118;;:::o;6467:222::-;6560:4;6598:2;6587:9;6583:18;6575:26;;6611:71;6679:1;6668:9;6664:17;6655:6;6611:71;:::i;:::-;6467:222;;;;:::o;6695:619::-;6772:6;6780;6788;6837:2;6825:9;6816:7;6812:23;6808:32;6805:119;;;6843:79;;:::i;:::-;6805:119;6963:1;6988:53;7033:7;7024:6;7013:9;7009:22;6988:53;:::i;:::-;6978:63;;6934:117;7090:2;7116:53;7161:7;7152:6;7141:9;7137:22;7116:53;:::i;:::-;7106:63;;7061:118;7218:2;7244:53;7289:7;7280:6;7269:9;7265:22;7244:53;:::i;:::-;7234:63;;7189:118;6695:619;;;;;:::o;7320:60::-;7348:3;7369:5;7362:12;;7320:60;;;:::o;7386:142::-;7436:9;7469:53;7487:34;7496:24;7514:5;7496:24;:::i;:::-;7487:34;:::i;:::-;7469:53;:::i;:::-;7456:66;;7386:142;;;:::o;7534:126::-;7584:9;7617:37;7648:5;7617:37;:::i;:::-;7604:50;;7534:126;;;:::o;7666:146::-;7736:9;7769:37;7800:5;7769:37;:::i;:::-;7756:50;;7666:146;;;:::o;7818:171::-;7925:57;7976:5;7925:57;:::i;:::-;7920:3;7913:70;7818:171;;:::o;7995:262::-;8108:4;8146:2;8135:9;8131:18;8123:26;;8159:91;8247:1;8236:9;8232:17;8223:6;8159:91;:::i;:::-;7995:262;;;;:::o;8263:118::-;8350:24;8368:5;8350:24;:::i;:::-;8345:3;8338:37;8263:118;;:::o;8387:878::-;8644:4;8682:3;8671:9;8667:19;8659:27;;8696:71;8764:1;8753:9;8749:17;8740:6;8696:71;:::i;:::-;8777:72;8845:2;8834:9;8830:18;8821:6;8777:72;:::i;:::-;8859;8927:2;8916:9;8912:18;8903:6;8859:72;:::i;:::-;8941;9009:2;8998:9;8994:18;8985:6;8941:72;:::i;:::-;9023:69;9087:3;9076:9;9072:19;9063:6;9023:69;:::i;:::-;9102:73;9170:3;9159:9;9155:19;9146:6;9102:73;:::i;:::-;9185;9253:3;9242:9;9238:19;9229:6;9185:73;:::i;:::-;8387:878;;;;;;;;;;:::o;9271:180::-;9319:77;9316:1;9309:88;9416:4;9413:1;9406:15;9440:4;9437:1;9430:15;9457:320;9501:6;9538:1;9532:4;9528:12;9518:22;;9585:1;9579:4;9575:12;9606:18;9596:81;;9662:4;9654:6;9650:17;9640:27;;9596:81;9724:2;9716:6;9713:14;9693:18;9690:38;9687:84;;9743:18;;:::i;:::-;9687:84;9508:269;9457:320;;;:::o;9783:180::-;9831:77;9828:1;9821:88;9928:4;9925:1;9918:15;9952:4;9949:1;9942:15;9969:194;10009:4;10029:20;10047:1;10029:20;:::i;:::-;10024:25;;10063:20;10081:1;10063:20;:::i;:::-;10058:25;;10107:1;10104;10100:9;10092:17;;10131:1;10125:4;10122:11;10119:37;;;10136:18;;:::i;:::-;10119:37;9969:194;;;;:::o;10169:410::-;10209:7;10232:20;10250:1;10232:20;:::i;:::-;10227:25;;10266:20;10284:1;10266:20;:::i;:::-;10261:25;;10321:1;10318;10314:9;10343:30;10361:11;10343:30;:::i;:::-;10332:41;;10522:1;10513:7;10509:15;10506:1;10503:22;10483:1;10476:9;10456:83;10433:139;;10552:18;;:::i;:::-;10433:139;10217:362;10169:410;;;;:::o;10585:180::-;10633:77;10630:1;10623:88;10730:4;10727:1;10720:15;10754:4;10751:1;10744:15;10771:185;10811:1;10828:20;10846:1;10828:20;:::i;:::-;10823:25;;10862:20;10880:1;10862:20;:::i;:::-;10857:25;;10901:1;10891:35;;10906:18;;:::i;:::-;10891:35;10948:1;10945;10941:9;10936:14;;10771:185;;;;:::o;10962:174::-;11102:26;11098:1;11090:6;11086:14;11079:50;10962:174;:::o;11142:366::-;11284:3;11305:67;11369:2;11364:3;11305:67;:::i;:::-;11298:74;;11381:93;11470:3;11381:93;:::i;:::-;11499:2;11494:3;11490:12;11483:19;;11142:366;;;:::o;11514:419::-;11680:4;11718:2;11707:9;11703:18;11695:26;;11767:9;11761:4;11757:20;11753:1;11742:9;11738:17;11731:47;11795:131;11921:4;11795:131;:::i;:::-;11787:139;;11514:419;;;:::o;11939:191::-;11979:3;11998:20;12016:1;11998:20;:::i;:::-;11993:25;;12032:20;12050:1;12032:20;:::i;:::-;12027:25;;12075:1;12072;12068:9;12061:16;;12096:3;12093:1;12090:10;12087:36;;;12103:18;;:::i;:::-;12087:36;11939:191;;;;:::o;12136:180::-;12276:32;12272:1;12264:6;12260:14;12253:56;12136:180;:::o;12322:366::-;12464:3;12485:67;12549:2;12544:3;12485:67;:::i;:::-;12478:74;;12561:93;12650:3;12561:93;:::i;:::-;12679:2;12674:3;12670:12;12663:19;;12322:366;;;:::o;12694:419::-;12860:4;12898:2;12887:9;12883:18;12875:26;;12947:9;12941:4;12937:20;12933:1;12922:9;12918:17;12911:47;12975:131;13101:4;12975:131;:::i;:::-;12967:139;;12694:419;;;:::o;13119:143::-;13176:5;13207:6;13201:13;13192:22;;13223:33;13250:5;13223:33;:::i;:::-;13119:143;;;;:::o;13268:351::-;13338:6;13387:2;13375:9;13366:7;13362:23;13358:32;13355:119;;;13393:79;;:::i;:::-;13355:119;13513:1;13538:64;13594:7;13585:6;13574:9;13570:22;13538:64;:::i;:::-;13528:74;;13484:128;13268:351;;;;:::o;13625:332::-;13746:4;13784:2;13773:9;13769:18;13761:26;;13797:71;13865:1;13854:9;13850:17;13841:6;13797:71;:::i;:::-;13878:72;13946:2;13935:9;13931:18;13922:6;13878:72;:::i;:::-;13625:332;;;;;:::o;13963:90::-;13997:7;14040:5;14033:13;14026:21;14015:32;;13963:90;;;:::o;14059:116::-;14129:21;14144:5;14129:21;:::i;:::-;14122:5;14119:32;14109:60;;14165:1;14162;14155:12;14109:60;14059:116;:::o;14181:137::-;14235:5;14266:6;14260:13;14251:22;;14282:30;14306:5;14282:30;:::i;:::-;14181:137;;;;:::o;14324:345::-;14391:6;14440:2;14428:9;14419:7;14415:23;14411:32;14408:119;;;14446:79;;:::i;:::-;14408:119;14566:1;14591:61;14644:7;14635:6;14624:9;14620:22;14591:61;:::i;:::-;14581:71;;14537:125;14324:345;;;;:::o;14675:221::-;14815:34;14811:1;14803:6;14799:14;14792:58;14884:4;14879:2;14871:6;14867:15;14860:29;14675:221;:::o;14902:366::-;15044:3;15065:67;15129:2;15124:3;15065:67;:::i;:::-;15058:74;;15141:93;15230:3;15141:93;:::i;:::-;15259:2;15254:3;15250:12;15243:19;;14902:366;;;:::o;15274:419::-;15440:4;15478:2;15467:9;15463:18;15455:26;;15527:9;15521:4;15517:20;15513:1;15502:9;15498:17;15491:47;15555:131;15681:4;15555:131;:::i;:::-;15547:139;;15274:419;;;:::o;15699:175::-;15839:27;15835:1;15827:6;15823:14;15816:51;15699:175;:::o;15880:366::-;16022:3;16043:67;16107:2;16102:3;16043:67;:::i;:::-;16036:74;;16119:93;16208:3;16119:93;:::i;:::-;16237:2;16232:3;16228:12;16221:19;;15880:366;;;:::o;16252:419::-;16418:4;16456:2;16445:9;16441:18;16433:26;;16505:9;16499:4;16495:20;16491:1;16480:9;16476:17;16469:47;16533:131;16659:4;16533:131;:::i;:::-;16525:139;;16252:419;;;:::o;16677:442::-;16826:4;16864:2;16853:9;16849:18;16841:26;;16877:71;16945:1;16934:9;16930:17;16921:6;16877:71;:::i;:::-;16958:72;17026:2;17015:9;17011:18;17002:6;16958:72;:::i;:::-;17040;17108:2;17097:9;17093:18;17084:6;17040:72;:::i;:::-;16677:442;;;;;;:::o;17125:225::-;17265:34;17261:1;17253:6;17249:14;17242:58;17334:8;17329:2;17321:6;17317:15;17310:33;17125:225;:::o;17356:366::-;17498:3;17519:67;17583:2;17578:3;17519:67;:::i;:::-;17512:74;;17595:93;17684:3;17595:93;:::i;:::-;17713:2;17708:3;17704:12;17697:19;;17356:366;;;:::o;17728:419::-;17894:4;17932:2;17921:9;17917:18;17909:26;;17981:9;17975:4;17971:20;17967:1;17956:9;17952:17;17945:47;18009:131;18135:4;18009:131;:::i;:::-;18001:139;;17728:419;;;:::o;18153:182::-;18293:34;18289:1;18281:6;18277:14;18270:58;18153:182;:::o;18341:366::-;18483:3;18504:67;18568:2;18563:3;18504:67;:::i;:::-;18497:74;;18580:93;18669:3;18580:93;:::i;:::-;18698:2;18693:3;18689:12;18682:19;;18341:366;;;:::o;18713:419::-;18879:4;18917:2;18906:9;18902:18;18894:26;;18966:9;18960:4;18956:20;18952:1;18941:9;18937:17;18930:47;18994:131;19120:4;18994:131;:::i;:::-;18986:139;;18713:419;;;:::o

Swarm Source

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