ETH Price: $1,878.15 (-12.40%)
 

Overview

Max Total Supply

50,000,000 GCO

Holders

3

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
GCOToken

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

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

// File: @openzeppelin/contracts/utils/introspection/IERC1820Registry.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/introspection/IERC1820Registry.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);

    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 _interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 _interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     * @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     * @param account Address of the contract for which to update the cache.
     * @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not.
     * If the result is not cached a direct lookup on the contract address is performed.
     * If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     * {updateERC165Cache} with the contract address.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     * @notice Checks whether a contract implements an ERC165 interface or not without using or updating the cache.
     * @param account Address of the contract to check.
     * @param interfaceId ERC165 interface to check.
     * @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @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 {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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: @openzeppelin/contracts/utils/Address.sol


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

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

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

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

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

// File: @openzeppelin/contracts/utils/escrow/Escrow.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/escrow/Escrow.sol)

pragma solidity ^0.8.0;



/**
 * @title Escrow
 * @dev Base escrow contract, holds funds designated for a payee until they
 * withdraw them.
 *
 * Intended usage: This contract (and derived escrow contracts) should be a
 * standalone contract, that only interacts with the contract that instantiated
 * it. That way, it is guaranteed that all Ether will be handled according to
 * the `Escrow` rules, and there is no need to check for payable functions or
 * transfers in the inheritance tree. The contract that uses the escrow as its
 * payment method should be its owner, and provide public methods redirecting
 * to the escrow's deposit and withdraw.
 */
contract Escrow is Ownable(msg.sender) {
    using Address for address payable;

    event Deposited(address indexed payee, uint256 weiAmount);
    event Withdrawn(address indexed payee, uint256 weiAmount);

    mapping(address => uint256) private _deposits;

    function depositsOf(address payee) public view returns (uint256) {
        return _deposits[payee];
    }

    /**
     * @dev Stores the sent amount as credit to be withdrawn.
     * @param payee The destination address of the funds.
     *
     * Emits a {Deposited} event.
     */
    function deposit(address payee) public payable virtual onlyOwner {
        uint256 amount = msg.value;
        _deposits[payee] += amount;
        emit Deposited(payee, amount);
    }

    /**
     * @dev Withdraw accumulated balance for a payee, forwarding all gas to the
     * recipient.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee The address whose funds will be withdrawn and transferred to.
     *
     * Emits a {Withdrawn} event.
     */
    function withdraw(address payable payee) public virtual onlyOwner {
        uint256 payment = _deposits[payee];

        _deposits[payee] = 0;

        payee.sendValue(payment);

        emit Withdrawn(payee, payment);
    }
}

// File: @openzeppelin/contracts/security/PullPayment.sol


// OpenZeppelin Contracts (last updated v4.8.0) (security/PullPayment.sol)

pragma solidity ^0.8.0;


/**
 * @dev Simple implementation of a
 * https://consensys.github.io/smart-contract-best-practices/development-recommendations/general/external-calls/#favor-pull-over-push-for-external-calls[pull-payment]
 * strategy, where the paying contract doesn't interact directly with the
 * receiver account, which must withdraw its payments itself.
 *
 * Pull-payments are often considered the best practice when it comes to sending
 * Ether, security-wise. It prevents recipients from blocking execution, and
 * eliminates reentrancy concerns.
 *
 * 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].
 *
 * To use, derive from the `PullPayment` contract, and use {_asyncTransfer}
 * instead of Solidity's `transfer` function. Payees can query their due
 * payments with {payments}, and retrieve them with {withdrawPayments}.
 */
abstract contract PullPayment {
    Escrow private immutable _escrow;

    constructor() {
        _escrow = new Escrow();
    }

    /**
     * @dev Withdraw accumulated payments, forwarding all gas to the recipient.
     *
     * Note that _any_ account can call this function, not just the `payee`.
     * This means that contracts unaware of the `PullPayment` protocol can still
     * receive funds this way, by having a separate account call
     * {withdrawPayments}.
     *
     * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
     * Make sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     *
     * @param payee Whose payments will be withdrawn.
     *
     * Causes the `escrow` to emit a {Withdrawn} event.
     */
    function withdrawPayments(address payable payee) public virtual {
        _escrow.withdraw(payee);
    }

    /**
     * @dev Returns the payments owed to an address.
     * @param dest The creditor's address.
     */
    function payments(address dest) public view returns (uint256) {
        return _escrow.depositsOf(dest);
    }

    /**
     * @dev Called by the payer to store the sent amount as credit to be pulled.
     * Funds sent in this way are stored in an intermediate {Escrow} contract, so
     * there is no danger of them being spent before withdrawal.
     *
     * @param dest The destination address of the funds.
     * @param amount The amount to transfer.
     *
     * Causes the `escrow` to emit a {Deposited} event.
     */
    function _asyncTransfer(address dest, uint256 amount) internal virtual {
        _escrow.deposit{value: amount}(dest);
    }
}

// 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/ERC777/IERC777Sender.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Sender.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 * their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

// File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC777/IERC777Recipient.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

// File: @openzeppelin/contracts/token/ERC777/IERC777.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Emitted when `amount` tokens are created by `operator` and assigned to `to`.
     *
     * Note that some additional user `data` and `operatorData` can be logged in the event.
     */
    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    /**
     * @dev Emitted when `operator` destroys `amount` tokens from `account`.
     *
     * Note that some additional user `data` and `operatorData` can be logged in the event.
     */
    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    /**
     * @dev Emitted when `operator` is made operator for `tokenHolder`.
     */
    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    /**
     * @dev Emitted when `operator` is revoked its operator status for `tokenHolder`.
     */
    event RevokedOperator(address indexed operator, address indexed tokenHolder);

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(address recipient, uint256 amount, bytes calldata data) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(address account, uint256 amount, bytes calldata data, bytes calldata operatorData) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );
}

// File: @openzeppelin/contracts/token/ERC777/ERC777.sol


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of the {IERC777} 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}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 *
 * CAUTION: This file is deprecated as of v4.9 and will be removed in the next major release.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using Address for address;

    IERC1820Registry internal constant _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    bytes32 private constant _TOKENS_SENDER_INTERFACE_HASH = keccak256("ERC777TokensSender");
    bytes32 private constant _TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping(address => mapping(address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(string memory name_, string memory symbol_, address[] memory defaultOperators_) {
        _name = name_;
        _symbol = symbol_;

        _defaultOperatorsArray = defaultOperators_;
        for (uint256 i = 0; i < defaultOperators_.length; i++) {
            _defaultOperators[defaultOperators_[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }
    function isContract(address _address) public view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_address)
        }
    return (size > 0);
    }
    /**
     * @dev See {IERC777-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC777-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view virtual override returns (uint256) {
        return 1;
    }

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

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view virtual override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(address recipient, uint256 amount, bytes memory data) public virtual override {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _send(_msgSender(), recipient, amount, "", "", false);
        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public virtual override {
        _burn(_msgSender(), amount, data, "");
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(address operator, address tokenHolder) public view virtual override returns (bool) {
        return
            operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public virtual override {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public virtual override {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view virtual override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    ) public virtual override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view virtual override returns (uint256) {
        return _allowances[holder][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.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public virtual override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Note that operator and allowance concepts are orthogonal: operators cannot
     * call `transferFrom` (unless they have allowance), and accounts with
     * allowance cannot call `operatorSend` (unless they are operators).
     *
     * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
     */
    function transferFrom(address holder, address recipient, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(holder, spender, amount);
        _send(holder, recipient, amount, "", "", false);
        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with the caller address as the `operator` and with
     * `userData` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(address account, uint256 amount, bytes memory userData, bytes memory operatorData) internal virtual {
        _mint(account, amount, userData, operatorData, true);
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If `requireReceptionAck` is set to true, and if a send hook is
     * registered for `account`, the corresponding function will be called with
     * `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(account != address(0), "ERC777: mint to the zero address");

        address operator = _msgSender();

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

        // Update state variables
        _totalSupply += amount;
        _balances[account] += amount;

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, requireReceptionAck);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) internal virtual {
        require(from != address(0), "ERC777: transfer from the zero address");
        require(to != address(0), "ERC777: transfer to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(address from, uint256 amount, bytes memory data, bytes memory operatorData) internal virtual {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        _beforeTokenTransfer(operator, from, address(0), amount);

        // Update state variables
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: burn amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _totalSupply -= amount;

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        _beforeTokenTransfer(operator, from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC777: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(address holder, address spender, uint256 value) internal virtual {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

        _allowances[holder][spender] = value;
        emit Approval(holder, spender, value);
    }

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    ) private {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require(!isContract(to), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

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

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

// File: GCOToken.sol


pragma solidity ^0.8.0;




contract GCOToken is ERC777, Ownable(msg.sender), PullPayment {
    constructor(uint256 initialSupply, address[] memory defaultOperators)
        ERC777("Gamers Tokens", "GCO", defaultOperators)
        PullPayment()
    {
        _mint(address(this), initialSupply, "", "");
    }

    function buy() external payable {
        uint256 eth = msg.value;
        uint256 tokens = eth * 2000;
        _asyncTransfer(payable(owner()), eth);
        _send(address(this), msg.sender, tokens, "", "", true);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"address[]","name":"defaultOperators","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dest","type":"address"}],"name":"payments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"payee","type":"address"}],"name":"withdrawPayments","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801562000010575f80fd5b50604051620029bd380380620029bd833981016040819052620000339162000713565b336040518060400160405280600d81526020016c47616d65727320546f6b656e7360981b8152506040518060400160405280600381526020016247434f60e81b8152508382600290816200008891906200087a565b5060036200009783826200087a565b508051620000ad90600490602084019062000657565b505f5b81518110156200011a57600160055f848481518110620000d457620000d462000942565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790558062000111816200096a565b915050620000b0565b506040516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce217705460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d906064015f604051808303815f87803b15801562000192575f80fd5b505af1158015620001a5573d5f803e3d5ffd5b50506040516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a60248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d91506064015f604051808303815f87803b15801562000220575f80fd5b505af115801562000233573d5f803e3d5ffd5b5050506001600160a01b03851693506200026b9250505057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6200027681620002dd565b506040516200028590620006bf565b604051809103905ff0801580156200029f573d5f803e3d5ffd5b506001600160a01b031660805260408051602080820183525f8083528351918201909352918252620002d591309185916200032e565b505062000a9e565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6200033e84848484600162000344565b50505050565b6001600160a01b0385166200039c5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000262565b5f3390508460015f828254620003b3919062000985565b90915550506001600160a01b0386165f9081526020819052604081208054879290620003e190849062000985565b90915550620003f89050815f888888888862000491565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516200044193929190620009e6565b60405180910390a36040518581526001600160a01b038716905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201525f90731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa15801562000510573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000536919062000a1e565b90506001600160a01b03811615620005b3576040516223de2960e01b81526001600160a01b038216906223de29906200057e908b908b908b908b908b908b9060040162000a41565b5f604051808303815f87803b15801562000596575f80fd5b505af1158015620005a9573d5f803e3d5ffd5b505050506200064d565b81156200064d5763ffffffff863b16156200064d5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a40162000262565b5050505050505050565b828054828255905f5260205f20908101928215620006ad579160200282015b82811115620006ad57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000676565b50620006bb929150620006cd565b5090565b6104ac806200251183390190565b5b80821115620006bb575f8155600101620006ce565b634e487b7160e01b5f52604160045260245ffd5b80516001600160a01b03811681146200070e575f80fd5b919050565b5f806040838503121562000725575f80fd5b8251602080850151919350906001600160401b038082111562000746575f80fd5b818601915086601f8301126200075a575f80fd5b8151818111156200076f576200076f620006e3565b8060051b604051601f19603f83011681018181108582111715620007975762000797620006e3565b604052918252848201925083810185019189831115620007b5575f80fd5b938501935b82851015620007de57620007ce85620006f7565b84529385019392850192620007ba565b8096505050505050509250929050565b600181811c908216806200080357607f821691505b6020821081036200082257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000875575f81815260208120601f850160051c81016020861015620008505750805b601f850160051c820191505b8181101562000871578281556001016200085c565b5050505b505050565b81516001600160401b03811115620008965762000896620006e3565b620008ae81620008a78454620007ee565b8462000828565b602080601f831160018114620008e4575f8415620008cc5750858301515b5f19600386901b1c1916600185901b17855562000871565b5f85815260208120601f198616915b828110156200091457888601518255948401946001909101908401620008f3565b50858210156200093257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016200097e576200097e62000956565b5060010190565b808201808211156200099b576200099b62000956565b92915050565b5f81518084525f5b81811015620009c757602081850181015186830182015201620009a9565b505f602082860101526020601f19601f83011685010191505092915050565b838152606060208201525f62000a006060830185620009a1565b828103604084015262000a148185620009a1565b9695505050505050565b5f6020828403121562000a2f575f80fd5b62000a3a82620006f7565b9392505050565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c0608082018190525f9062000a7d90830185620009a1565b82810360a084015262000a918185620009a1565b9998505050505050505050565b608051611a4c62000ac55f395f81816105f7015281816109390152610e930152611a4c5ff3fe608060405260043610610161575f3560e01c80638da5cb5b116100cd578063d95b637111610087578063f2fde38b11610062578063f2fde38b1461041a578063fad8b32a14610439578063fc673c4f14610458578063fe9d930314610477575f80fd5b8063d95b637114610398578063dd62ed3e146103b7578063e2982c21146103fb575f80fd5b80638da5cb5b146102f8578063959b8c3f1461031f57806395d89b411461033e5780639bd9bbc614610352578063a6f2ae3a14610371578063a9059cbb14610379575f80fd5b8063313ce5671161011e578063313ce5671461024257806331b3eb941461025d578063556f0dc71461027e57806362ad1b831461029157806370a08231146102b0578063715018a6146102e4575f80fd5b806306e485381461016557806306fdde031461018f578063095ea7b3146101b057806316279055146101df57806318160ddd1461020557806323b872dd14610223575b5f80fd5b348015610170575f80fd5b50610179610496565b60405161018691906114d5565b60405180910390f35b34801561019a575f80fd5b506101a36104f6565b6040516101869190611564565b3480156101bb575f80fd5b506101cf6101ca36600461158a565b61057d565b6040519015158152602001610186565b3480156101ea575f80fd5b506101cf6101f93660046115b4565b3b63ffffffff16151590565b348015610210575f80fd5b506001545b604051908152602001610186565b34801561022e575f80fd5b506101cf61023d3660046115cf565b610596565b34801561024d575f80fd5b5060405160128152602001610186565b348015610268575f80fd5b5061027c6102773660046115b4565b6105d8565b005b348015610289575f80fd5b506001610215565b34801561029c575f80fd5b5061027c6102ab3660046116aa565b610651565b3480156102bb575f80fd5b506102156102ca3660046115b4565b6001600160a01b03165f9081526020819052604090205490565b3480156102ef575f80fd5b5061027c61068f565b348015610303575f80fd5b506009546040516001600160a01b039091168152602001610186565b34801561032a575f80fd5b5061027c6103393660046115b4565b6106a2565b348015610349575f80fd5b506101a36107bb565b34801561035d575f80fd5b5061027c61036c366004611737565b6107ca565b61027c6107ec565b348015610384575f80fd5b506101cf61039336600461158a565b610846565b3480156103a3575f80fd5b506101cf6103b236600461178c565b61087a565b3480156103c2575f80fd5b506102156103d136600461178c565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b348015610406575f80fd5b506102156104153660046115b4565b610918565b348015610425575f80fd5b5061027c6104343660046115b4565b6109a4565b348015610444575f80fd5b5061027c6104533660046115b4565b6109e1565b348015610463575f80fd5b5061027c6104723660046117c3565b610af8565b348015610482575f80fd5b5061027c61049136600461183e565b610b30565b606060048054806020026020016040519081016040528092919081815260200182805480156104ec57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116104ce575b5050505050905090565b60606002805461050590611882565b80601f016020809104026020016040519081016040528092919081815260200182805461053190611882565b80156104ec5780601f10610553576101008083540402835291602001916104ec565b820191905f5260205f20905b81548152906001019060200180831161055f57509395945050505050565b5f3361058a818585610b4a565b60019150505b92915050565b5f336105a3858285610c70565b6105cd85858560405180602001604052805f81525060405180602001604052805f8152505f610cfa565b506001949350505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906351cff8d9906024015f604051808303815f87803b158015610638575f80fd5b505af115801561064a573d5f803e3d5ffd5b5050505050565b61065b338661087a565b6106805760405162461bcd60e51b8152600401610677906118ba565b60405180910390fd5b61064a85858585856001610cfa565b610697610df6565b6106a05f610e23565b565b6001600160a01b03811633036107065760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b6064820152608401610677565b6001600160a01b0381165f9081526005602052604090205460ff161561075557335f9081526007602090815260408083206001600160a01b03851684529091529020805460ff19169055610783565b335f9081526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f9905f90a350565b60606003805461050590611882565b6107e73384848460405180602001604052805f8152506001610cfa565b505050565b345f6107fa826107d061191a565b90506108176108116009546001600160a01b031690565b83610e74565b61084230338360405180602001604052805f81525060405180602001604052805f8152506001610cfa565b5050565b5f61087133848460405180602001604052805f81525060405180602001604052805f8152505f610cfa565b50600192915050565b5f816001600160a01b0316836001600160a01b031614806108e257506001600160a01b0383165f9081526005602052604090205460ff1680156108e257506001600160a01b038083165f9081526007602090815260408083209387168352929052205460ff16155b8061091157506001600160a01b038083165f9081526006602090815260408083209387168352929052205460ff165b9392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063e3a9db1a90602401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105909190611931565b6109ac610df6565b6001600160a01b0381166109d557604051631e4fbdf760e01b81525f6004820152602401610677565b6109de81610e23565b50565b336001600160a01b03821603610a435760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b6064820152608401610677565b6001600160a01b0381165f9081526005602052604090205460ff1615610a9557335f9081526007602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610ac0565b335f9081526006602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa1905f90a350565b610b02338561087a565b610b1e5760405162461bcd60e51b8152600401610677906118ba565b610b2a84848484610ee8565b50505050565b61084233838360405180602001604052805f815250610ee8565b6001600160a01b038316610bae5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610677565b6001600160a01b038216610c105760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610677565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381165f908152600860209081526040808320938616835292905220545f198114610b2a5781811015610ced5760405162461bcd60e51b815260206004820152601e60248201527f4552433737373a20696e73756666696369656e7420616c6c6f77616e636500006044820152606401610677565b610b2a8484848403610b4a565b6001600160a01b038616610d5f5760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610677565b6001600160a01b038516610dc15760405162461bcd60e51b8152602060048201526024808201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610677565b33610dd0818888888888611098565b610dde8188888888886111b7565b610ded8188888888888861131b565b50505050505050565b6009546001600160a01b031633146106a05760405163118cdaa760e01b8152336004820152602401610677565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f340fa019083906024015f604051808303818588803b158015610ed6575f80fd5b505af1158015610ded573d5f803e3d5ffd5b6001600160a01b038416610f495760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b6064820152608401610677565b33610f5881865f878787611098565b6001600160a01b0385165f9081526020819052604090205484811015610fcc5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b6064820152608401610677565b6001600160a01b0386165f908152602081905260408120868303905560018054879290610ffa908490611948565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a40988787876040516110489392919061195b565b60405180910390a36040518581525f906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201525f90731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611116573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113a919061198f565b90506001600160a01b03811615610ded57604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611181908a908a908a908a908a908a906004016119aa565b5f604051808303815f87803b158015611198575f80fd5b505af11580156111aa573d5f803e3d5ffd5b5050505050505050505050565b6001600160a01b0385165f908152602081905260409020548381101561122f5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610677565b6001600160a01b038087165f90815260208190526040808220878503905591871681529081208054869290611265908490611a03565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516112bd9392919061195b565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161130a91815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201525f90731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113bd919061198f565b90506001600160a01b03811615611434576040516223de2960e01b81526001600160a01b038216906223de2990611402908b908b908b908b908b908b906004016119aa565b5f604051808303815f87803b158015611419575f80fd5b505af115801561142b573d5f803e3d5ffd5b505050506114cb565b81156114cb57853b63ffffffff16156114cb5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a401610677565b5050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156115155783516001600160a01b0316835292840192918401916001016114f0565b50909695505050505050565b5f81518084525f5b8181101561154557602081850181015186830182015201611529565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6109116020830184611521565b6001600160a01b03811681146109de575f80fd5b5f806040838503121561159b575f80fd5b82356115a681611576565b946020939093013593505050565b5f602082840312156115c4575f80fd5b813561091181611576565b5f805f606084860312156115e1575f80fd5b83356115ec81611576565b925060208401356115fc81611576565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611630575f80fd5b813567ffffffffffffffff8082111561164b5761164b61160d565b604051601f8301601f19908116603f011681019082821181831017156116735761167361160d565b8160405283815286602085880101111561168b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a086880312156116be575f80fd5b85356116c981611576565b945060208601356116d981611576565b935060408601359250606086013567ffffffffffffffff808211156116fc575f80fd5b61170889838a01611621565b9350608088013591508082111561171d575f80fd5b5061172a88828901611621565b9150509295509295909350565b5f805f60608486031215611749575f80fd5b833561175481611576565b925060208401359150604084013567ffffffffffffffff811115611776575f80fd5b61178286828701611621565b9150509250925092565b5f806040838503121561179d575f80fd5b82356117a881611576565b915060208301356117b881611576565b809150509250929050565b5f805f80608085870312156117d6575f80fd5b84356117e181611576565b935060208501359250604085013567ffffffffffffffff80821115611804575f80fd5b61181088838901611621565b93506060870135915080821115611825575f80fd5b5061183287828801611621565b91505092959194509250565b5f806040838503121561184f575f80fd5b82359150602083013567ffffffffffffffff81111561186c575f80fd5b61187885828601611621565b9150509250929050565b600181811c9082168061189657607f821691505b6020821081036118b457634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761059057610590611906565b5f60208284031215611941575f80fd5b5051919050565b8181038181111561059057610590611906565b838152606060208201525f6119736060830185611521565b82810360408401526119858185611521565b9695505050505050565b5f6020828403121561199f575f80fd5b815161091181611576565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c0608082018190525f906119e490830185611521565b82810360a08401526119f68185611521565b9998505050505050505050565b808201808211156105905761059061190656fea2646970667358221220835bd34c0931da05fd101ab93f942f78ab16def64da639466059b4c5e62943ef64736f6c63430008140033608060405234801561000f575f80fd5b50338061003557604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61003e81610044565b50610093565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61040c806100a05f395ff3fe608060405260043610610054575f3560e01c806351cff8d914610058578063715018a6146100795780638da5cb5b1461008d578063e3a9db1a146100b8578063f2fde38b146100fa578063f340fa0114610119575b5f80fd5b348015610063575f80fd5b5061007761007236600461038f565b61012c565b005b348015610084575f80fd5b506100776101a2565b348015610098575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b3480156100c3575f80fd5b506100ec6100d236600461038f565b6001600160a01b03165f9081526001602052604090205490565b6040519081526020016100af565b348015610105575f80fd5b5061007761011436600461038f565b6101b5565b61007761012736600461038f565b6101f7565b610134610268565b6001600160a01b0381165f81815260016020526040812080549190559061015b9082610294565b816001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58260405161019691815260200190565b60405180910390a25050565b6101aa610268565b6101b35f61032c565b565b6101bd610268565b6001600160a01b0381166101eb57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101f48161032c565b50565b6101ff610268565b6001600160a01b0381165f908152600160205260408120805434928392916102289084906103b1565b90915550506040518181526001600160a01b038316907f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c490602001610196565b5f546001600160a01b031633146101b35760405163118cdaa760e01b81523360048201526024016101e2565b804710156102b75760405163cd78605960e01b81523060048201526024016101e2565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610300576040519150601f19603f3d011682016040523d82523d5f602084013e610305565b606091505b505090508061032757604051630a12f52160e11b815260040160405180910390fd5b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101f4575f80fd5b5f6020828403121561039f575f80fd5b81356103aa8161037b565b9392505050565b808201808211156103d057634e487b7160e01b5f52601160045260245ffd5b9291505056fea2646970667358221220939ab44d153e2fc786746bba1b2b8e1b790588ee3a6801f738ada317e425ee5c64736f6c63430008140033000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082e47148ee1aa542a83540bf2e68b1be66ccddab

Deployed Bytecode

0x608060405260043610610161575f3560e01c80638da5cb5b116100cd578063d95b637111610087578063f2fde38b11610062578063f2fde38b1461041a578063fad8b32a14610439578063fc673c4f14610458578063fe9d930314610477575f80fd5b8063d95b637114610398578063dd62ed3e146103b7578063e2982c21146103fb575f80fd5b80638da5cb5b146102f8578063959b8c3f1461031f57806395d89b411461033e5780639bd9bbc614610352578063a6f2ae3a14610371578063a9059cbb14610379575f80fd5b8063313ce5671161011e578063313ce5671461024257806331b3eb941461025d578063556f0dc71461027e57806362ad1b831461029157806370a08231146102b0578063715018a6146102e4575f80fd5b806306e485381461016557806306fdde031461018f578063095ea7b3146101b057806316279055146101df57806318160ddd1461020557806323b872dd14610223575b5f80fd5b348015610170575f80fd5b50610179610496565b60405161018691906114d5565b60405180910390f35b34801561019a575f80fd5b506101a36104f6565b6040516101869190611564565b3480156101bb575f80fd5b506101cf6101ca36600461158a565b61057d565b6040519015158152602001610186565b3480156101ea575f80fd5b506101cf6101f93660046115b4565b3b63ffffffff16151590565b348015610210575f80fd5b506001545b604051908152602001610186565b34801561022e575f80fd5b506101cf61023d3660046115cf565b610596565b34801561024d575f80fd5b5060405160128152602001610186565b348015610268575f80fd5b5061027c6102773660046115b4565b6105d8565b005b348015610289575f80fd5b506001610215565b34801561029c575f80fd5b5061027c6102ab3660046116aa565b610651565b3480156102bb575f80fd5b506102156102ca3660046115b4565b6001600160a01b03165f9081526020819052604090205490565b3480156102ef575f80fd5b5061027c61068f565b348015610303575f80fd5b506009546040516001600160a01b039091168152602001610186565b34801561032a575f80fd5b5061027c6103393660046115b4565b6106a2565b348015610349575f80fd5b506101a36107bb565b34801561035d575f80fd5b5061027c61036c366004611737565b6107ca565b61027c6107ec565b348015610384575f80fd5b506101cf61039336600461158a565b610846565b3480156103a3575f80fd5b506101cf6103b236600461178c565b61087a565b3480156103c2575f80fd5b506102156103d136600461178c565b6001600160a01b039182165f90815260086020908152604080832093909416825291909152205490565b348015610406575f80fd5b506102156104153660046115b4565b610918565b348015610425575f80fd5b5061027c6104343660046115b4565b6109a4565b348015610444575f80fd5b5061027c6104533660046115b4565b6109e1565b348015610463575f80fd5b5061027c6104723660046117c3565b610af8565b348015610482575f80fd5b5061027c61049136600461183e565b610b30565b606060048054806020026020016040519081016040528092919081815260200182805480156104ec57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116104ce575b5050505050905090565b60606002805461050590611882565b80601f016020809104026020016040519081016040528092919081815260200182805461053190611882565b80156104ec5780601f10610553576101008083540402835291602001916104ec565b820191905f5260205f20905b81548152906001019060200180831161055f57509395945050505050565b5f3361058a818585610b4a565b60019150505b92915050565b5f336105a3858285610c70565b6105cd85858560405180602001604052805f81525060405180602001604052805f8152505f610cfa565b506001949350505050565b6040516351cff8d960e01b81526001600160a01b0382811660048301527f000000000000000000000000d8408b49d9dadec221606fa59c066ad5f0a0fe2116906351cff8d9906024015f604051808303815f87803b158015610638575f80fd5b505af115801561064a573d5f803e3d5ffd5b5050505050565b61065b338661087a565b6106805760405162461bcd60e51b8152600401610677906118ba565b60405180910390fd5b61064a85858585856001610cfa565b610697610df6565b6106a05f610e23565b565b6001600160a01b03811633036107065760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b6064820152608401610677565b6001600160a01b0381165f9081526005602052604090205460ff161561075557335f9081526007602090815260408083206001600160a01b03851684529091529020805460ff19169055610783565b335f9081526006602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f9905f90a350565b60606003805461050590611882565b6107e73384848460405180602001604052805f8152506001610cfa565b505050565b345f6107fa826107d061191a565b90506108176108116009546001600160a01b031690565b83610e74565b61084230338360405180602001604052805f81525060405180602001604052805f8152506001610cfa565b5050565b5f61087133848460405180602001604052805f81525060405180602001604052805f8152505f610cfa565b50600192915050565b5f816001600160a01b0316836001600160a01b031614806108e257506001600160a01b0383165f9081526005602052604090205460ff1680156108e257506001600160a01b038083165f9081526007602090815260408083209387168352929052205460ff16155b8061091157506001600160a01b038083165f9081526006602090815260408083209387168352929052205460ff165b9392505050565b6040516371d4ed8d60e11b81526001600160a01b0382811660048301525f917f000000000000000000000000d8408b49d9dadec221606fa59c066ad5f0a0fe219091169063e3a9db1a90602401602060405180830381865afa158015610980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105909190611931565b6109ac610df6565b6001600160a01b0381166109d557604051631e4fbdf760e01b81525f6004820152602401610677565b6109de81610e23565b50565b336001600160a01b03821603610a435760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b6064820152608401610677565b6001600160a01b0381165f9081526005602052604090205460ff1615610a9557335f9081526007602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610ac0565b335f9081526006602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa1905f90a350565b610b02338561087a565b610b1e5760405162461bcd60e51b8152600401610677906118ba565b610b2a84848484610ee8565b50505050565b61084233838360405180602001604052805f815250610ee8565b6001600160a01b038316610bae5760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610677565b6001600160a01b038216610c105760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610677565b6001600160a01b038381165f8181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038381165f908152600860209081526040808320938616835292905220545f198114610b2a5781811015610ced5760405162461bcd60e51b815260206004820152601e60248201527f4552433737373a20696e73756666696369656e7420616c6c6f77616e636500006044820152606401610677565b610b2a8484848403610b4a565b6001600160a01b038616610d5f5760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b6064820152608401610677565b6001600160a01b038516610dc15760405162461bcd60e51b8152602060048201526024808201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610677565b33610dd0818888888888611098565b610dde8188888888886111b7565b610ded8188888888888861131b565b50505050505050565b6009546001600160a01b031633146106a05760405163118cdaa760e01b8152336004820152602401610677565b600980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60405163f340fa0160e01b81526001600160a01b0383811660048301527f000000000000000000000000d8408b49d9dadec221606fa59c066ad5f0a0fe21169063f340fa019083906024015f604051808303818588803b158015610ed6575f80fd5b505af1158015610ded573d5f803e3d5ffd5b6001600160a01b038416610f495760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b6064820152608401610677565b33610f5881865f878787611098565b6001600160a01b0385165f9081526020819052604090205484811015610fcc5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b6064820152608401610677565b6001600160a01b0386165f908152602081905260408120868303905560018054879290610ffa908490611948565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a40988787876040516110489392919061195b565b60405180910390a36040518581525f906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201525f90731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611116573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061113a919061198f565b90506001600160a01b03811615610ded57604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611181908a908a908a908a908a908a906004016119aa565b5f604051808303815f87803b158015611198575f80fd5b505af11580156111aa573d5f803e3d5ffd5b5050505050505050505050565b6001600160a01b0385165f908152602081905260409020548381101561122f5760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b6064820152608401610677565b6001600160a01b038087165f90815260208190526040808220878503905591871681529081208054869290611265908490611a03565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc826146779878787876040516112bd9392919061195b565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161130a91815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201525f90731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca90604401602060405180830381865afa158015611399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113bd919061198f565b90506001600160a01b03811615611434576040516223de2960e01b81526001600160a01b038216906223de2990611402908b908b908b908b908b908b906004016119aa565b5f604051808303815f87803b158015611419575f80fd5b505af115801561142b573d5f803e3d5ffd5b505050506114cb565b81156114cb57853b63ffffffff16156114cb5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a401610677565b5050505050505050565b602080825282518282018190525f9190848201906040850190845b818110156115155783516001600160a01b0316835292840192918401916001016114f0565b50909695505050505050565b5f81518084525f5b8181101561154557602081850181015186830182015201611529565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6109116020830184611521565b6001600160a01b03811681146109de575f80fd5b5f806040838503121561159b575f80fd5b82356115a681611576565b946020939093013593505050565b5f602082840312156115c4575f80fd5b813561091181611576565b5f805f606084860312156115e1575f80fd5b83356115ec81611576565b925060208401356115fc81611576565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112611630575f80fd5b813567ffffffffffffffff8082111561164b5761164b61160d565b604051601f8301601f19908116603f011681019082821181831017156116735761167361160d565b8160405283815286602085880101111561168b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a086880312156116be575f80fd5b85356116c981611576565b945060208601356116d981611576565b935060408601359250606086013567ffffffffffffffff808211156116fc575f80fd5b61170889838a01611621565b9350608088013591508082111561171d575f80fd5b5061172a88828901611621565b9150509295509295909350565b5f805f60608486031215611749575f80fd5b833561175481611576565b925060208401359150604084013567ffffffffffffffff811115611776575f80fd5b61178286828701611621565b9150509250925092565b5f806040838503121561179d575f80fd5b82356117a881611576565b915060208301356117b881611576565b809150509250929050565b5f805f80608085870312156117d6575f80fd5b84356117e181611576565b935060208501359250604085013567ffffffffffffffff80821115611804575f80fd5b61181088838901611621565b93506060870135915080821115611825575f80fd5b5061183287828801611621565b91505092959194509250565b5f806040838503121561184f575f80fd5b82359150602083013567ffffffffffffffff81111561186c575f80fd5b61187885828601611621565b9150509250929050565b600181811c9082168061189657607f821691505b6020821081036118b457634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761059057610590611906565b5f60208284031215611941575f80fd5b5051919050565b8181038181111561059057610590611906565b838152606060208201525f6119736060830185611521565b82810360408401526119858185611521565b9695505050505050565b5f6020828403121561199f575f80fd5b815161091181611576565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c0608082018190525f906119e490830185611521565b82810360a08401526119f68185611521565b9998505050505050505050565b808201808211156105905761059061190656fea2646970667358221220835bd34c0931da05fd101ab93f942f78ab16def64da639466059b4c5e62943ef64736f6c63430008140033

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

000000000000000000000000000000000000000000295be96e640669720000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000100000000000000000000000082e47148ee1aa542a83540bf2e68b1be66ccddab

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 50000000000000000000000000
Arg [1] : defaultOperators (address[]): 0x82E47148EE1AA542A83540bF2E68B1BE66cCddAb

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000295be96e64066972000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [3] : 00000000000000000000000082e47148ee1aa542a83540bf2e68b1be66ccddab


Deployed Bytecode Sourcemap

52366:523:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40040:132;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36406:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41852:201::-;;;;;;;;;;-1:-1:-1;41852:201:0;;;;;:::i;:::-;;:::i;:::-;;;1951:14:1;;1944:22;1926:41;;1914:2;1899:18;41852:201:0;1786:187:1;36156:193:0;;;;;;;;;;-1:-1:-1;36156:193:0;;;;;:::i;:::-;36286:21;36332:8;;;;;36156:193;37232:125;;;;;;;;;;-1:-1:-1;37337:12:0;;37232:125;;;2376:25:1;;;2364:2;2349:18;37232:125:0;2230:177:1;42549:292:0;;;;;;;;;;-1:-1:-1;42549:292:0;;;;;:::i;:::-;;:::i;36863:84::-;;;;;;;;;;-1:-1:-1;36863:84:0;;36937:2;3015:36:1;;3003:2;2988:18;36863:84:0;2873:184:1;19873:106:0;;;;;;;;;;-1:-1:-1;19873:106:0;;;;;:::i;:::-;;:::i;:::-;;37069:97;;;;;;;;;;-1:-1:-1;37157:1:0;37069:97;;40298:375;;;;;;;;;;-1:-1:-1;40298:375:0;;;;;:::i;:::-;;:::i;37462:152::-;;;;;;;;;;-1:-1:-1;37462:152:0;;;;;:::i;:::-;-1:-1:-1;;;;;37584:22:0;37557:7;37584:22;;;;;;;;;;;;37462:152;8251:103;;;;;;;;;;;;;:::i;7576:87::-;;;;;;;;;;-1:-1:-1;7649:6:0;;7576:87;;-1:-1:-1;;;;;7649:6:0;;;5213:51:1;;5201:2;5186:18;7576:87:0;5067:203:1;39065:422:0;;;;;;;;;;-1:-1:-1;39065:422:0;;;;;:::i;:::-;;:::i;36567:104::-;;;;;;;;;;;;;:::i;37751:165::-;;;;;;;;;;-1:-1:-1;37751:165:0;;;;;:::i;:::-;;:::i;52661:225::-;;;:::i;38157:186::-;;;;;;;;;;-1:-1:-1;38157:186:0;;;;;:::i;:::-;;:::i;38677:316::-;;;;;;;;;;-1:-1:-1;38677:316:0;;;;;:::i;:::-;;:::i;41382:153::-;;;;;;;;;;-1:-1:-1;41382:153:0;;;;;:::i;:::-;-1:-1:-1;;;;;41499:19:0;;;41472:7;41499:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;41382:153;20103:112;;;;;;;;;;-1:-1:-1;20103:112:0;;;;;:::i;:::-;;:::i;8509:220::-;;;;;;;;;;-1:-1:-1;8509:220:0;;;;;:::i;:::-;;:::i;39556:413::-;;;;;;;;;;-1:-1:-1;39556:413:0;;;;;:::i;:::-;;:::i;40801:333::-;;;;;;;;;;-1:-1:-1;40801:333:0;;;;;:::i;:::-;;:::i;38480:129::-;;;;;;;;;;-1:-1:-1;38480:129:0;;;;;:::i;:::-;;:::i;40040:132::-;40106:16;40142:22;40135:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40135:29:0;;;;;;;;;;;;;;;;;;;;;;;40040:132;:::o;36406:100::-;36460:13;36493:5;36486:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36486:12:0;;36406:100;-1:-1:-1;;;;;36406:100:0:o;41852:201::-;41934:4;5772:10;41991:32;5772:10;42008:7;42017:5;41991:8;:32::i;:::-;42041:4;42034:11;;;41852:201;;;;;:::o;42549:292::-;42655:4;5772:10;42713:40;42729:6;5772:10;42746:6;42713:15;:40::i;:::-;42764:47;42770:6;42778:9;42789:6;42764:47;;;;;;;;;;;;;;;;;;;;;;;;42805:5;42764;:47::i;:::-;-1:-1:-1;42829:4:0;;42549:292;-1:-1:-1;;;;42549:292:0:o;19873:106::-;19948:23;;-1:-1:-1;;;19948:23:0;;-1:-1:-1;;;;;5231:32:1;;;19948:23:0;;;5213:51:1;19948:7:0;:16;;;;5186:18:1;;19948:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19873:106;:::o;40298:375::-;40512:35;5772:10;40540:6;40512:13;:35::i;:::-;40504:92;;;;-1:-1:-1;;;40504:92:0;;;;;;;:::i;:::-;;;;;;;;;40607:58;40613:6;40621:9;40632:6;40640:4;40646:12;40660:4;40607:5;:58::i;8251:103::-;7462:13;:11;:13::i;:::-;8316:30:::1;8343:1;8316:18;:30::i;:::-;8251:103::o:0;39065:422::-;-1:-1:-1;;;;;39153:24:0;;5772:10;39153:24;39145:73;;;;-1:-1:-1;;;39145:73:0;;8561:2:1;39145:73:0;;;8543:21:1;8600:2;8580:18;;;8573:30;8639:34;8619:18;;;8612:62;-1:-1:-1;;;8690:18:1;;;8683:34;8734:19;;39145:73:0;8359:400:1;39145:73:0;-1:-1:-1;;;;;39235:27:0;;;;;;:17;:27;;;;;;;;39231:189;;;5772:10;39286:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;39286:48:0;;;;;;;;;39279:55;;-1:-1:-1;;39279:55:0;;;39231:189;;;5772:10;39367:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;39367:34:0;;;;;;;;;:41;;-1:-1:-1;;39367:41:0;39404:4;39367:41;;;39231:189;39437:42;;5772:10;;-1:-1:-1;;;;;39437:42:0;;;;;;;;39065:422;:::o;36567:104::-;36623:13;36656:7;36649:14;;;;;:::i;37751:165::-;37854:54;5772:10;37874:9;37885:6;37893:4;37854:54;;;;;;;;;;;;37903:4;37854:5;:54::i;:::-;37751:165;;;:::o;52661:225::-;52718:9;52704:11;52755:10;52718:9;52761:4;52755:10;:::i;:::-;52738:27;;52776:37;52799:7;7649:6;;-1:-1:-1;;;;;7649:6:0;;7576:87;52799:7;52809:3;52776:14;:37::i;:::-;52824:54;52838:4;52845:10;52857:6;52824:54;;;;;;;;;;;;;;;;;;;;;;;;52873:4;52824:5;:54::i;:::-;52693:193;;52661:225::o;38157:186::-;38243:4;38260:53;5772:10;38280:9;38291:6;38260:53;;;;;;;;;;;;;;;;;;;;;;;;38307:5;38260;:53::i;:::-;-1:-1:-1;38331:4:0;38157:186;;;;:::o;38677:316::-;38777:4;38826:11;-1:-1:-1;;;;;38814:23:0;:8;-1:-1:-1;;;;;38814:23:0;;:121;;;-1:-1:-1;;;;;;38855:27:0;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;;;;;;38887:37:0;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;38886:48;38855:79;38814:171;;;-1:-1:-1;;;;;;38952:23:0;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;38814:171;38794:191;38677:316;-1:-1:-1;;;38677:316:0:o;20103:112::-;20183:24;;-1:-1:-1;;;20183:24:0;;-1:-1:-1;;;;;5231:32:1;;;20183:24:0;;;5213:51:1;20156:7:0;;20183;:18;;;;;;5186::1;;20183:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8509:220::-;7462:13;:11;:13::i;:::-;-1:-1:-1;;;;;8594:22:0;::::1;8590:93;;8640:31;::::0;-1:-1:-1;;;8640:31:0;;8668:1:::1;8640:31;::::0;::::1;5213:51:1::0;5186:18;;8640:31:0::1;5067:203:1::0;8590:93:0::1;8693:28;8712:8;8693:18;:28::i;:::-;8509:220:::0;:::o;39556:413::-;5772:10;-1:-1:-1;;;;;39641:24:0;;;39633:70;;;;-1:-1:-1;;;39633:70:0;;9460:2:1;39633:70:0;;;9442:21:1;9499:2;9479:18;;;9472:30;9538:34;9518:18;;;9511:62;-1:-1:-1;;;9589:18:1;;;9582:31;9630:19;;39633:70:0;9258:397:1;39633:70:0;-1:-1:-1;;;;;39720:27:0;;;;;;:17;:27;;;;;;;;39716:189;;;5772:10;39764:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;39764:48:0;;;;;;;;;:55;;-1:-1:-1;;39764:55:0;39815:4;39764:55;;;39716:189;;;5772:10;39859:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;39859:34:0;;;;;;;;;39852:41;;-1:-1:-1;;39852:41:0;;;39716:189;39922:39;;5772:10;;-1:-1:-1;;;;;39922:39:0;;;;;;;;39556:413;:::o;40801:333::-;40988:36;5772:10;41016:7;40988:13;:36::i;:::-;40980:93;;;;-1:-1:-1;;;40980:93:0;;;;;;;:::i;:::-;41084:42;41090:7;41099:6;41107:4;41113:12;41084:5;:42::i;:::-;40801:333;;;;:::o;38480:129::-;38564:37;5772:10;38584:6;38592:4;38564:37;;;;;;;;;;;;:5;:37::i;48103:349::-;-1:-1:-1;;;;;48205:20:0;;48197:70;;;;-1:-1:-1;;;48197:70:0;;9862:2:1;48197:70:0;;;9844:21:1;9901:2;9881:18;;;9874:30;9940:34;9920:18;;;9913:62;-1:-1:-1;;;9991:18:1;;;9984:35;10036:19;;48197:70:0;9660:401:1;48197:70:0;-1:-1:-1;;;;;48286:21:0;;48278:69;;;;-1:-1:-1;;;48278:69:0;;10268:2:1;48278:69:0;;;10250:21:1;10307:2;10287:18;;;10280:30;10346:34;10326:18;;;10319:62;-1:-1:-1;;;10397:18:1;;;10390:33;10440:19;;48278:69:0;10066:399:1;48278:69:0;-1:-1:-1;;;;;48360:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;48412:32;;2376:25:1;;;48412:32:0;;2349:18:1;48412:32:0;;;;;;;48103:349;;;:::o;51110:420::-;-1:-1:-1;;;;;41499:19:0;;;51211:24;41499:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;-1:-1:-1;;51278:37:0;;51274:249;;51360:6;51340:16;:26;;51332:69;;;;-1:-1:-1;;;51332:69:0;;10672:2:1;51332:69:0;;;10654:21:1;10711:2;10691:18;;;10684:30;10750:32;10730:18;;;10723:60;10800:18;;51332:69:0;10470:354:1;51332:69:0;51445:51;51454:5;51461:7;51489:6;51470:16;:25;51445:8;:51::i;45538:676::-;-1:-1:-1;;;;;45768:18:0;;45760:69;;;;-1:-1:-1;;;45760:69:0;;11031:2:1;45760:69:0;;;11013:21:1;11070:2;11050:18;;;11043:30;11109:34;11089:18;;;11082:62;-1:-1:-1;;;11160:18:1;;;11153:36;11206:19;;45760:69:0;10829:402:1;45760:69:0;-1:-1:-1;;;;;45848:16:0;;45840:65;;;;-1:-1:-1;;;45840:65:0;;11438:2:1;45840:65:0;;;11420:21:1;11477:2;11457:18;;;11450:30;11516:34;11496:18;;;11489:62;-1:-1:-1;;;11567:18:1;;;11560:34;11611:19;;45840:65:0;11236:400:1;45840:65:0;5772:10;45962:69;5772:10;45990:4;45996:2;46000:6;46008:8;46018:12;45962:17;:69::i;:::-;46044:57;46050:8;46060:4;46066:2;46070:6;46078:8;46088:12;46044:5;:57::i;:::-;46114:92;46134:8;46144:4;46150:2;46154:6;46162:8;46172:12;46186:19;46114;:92::i;:::-;45749:465;45538:676;;;;;;:::o;7741:166::-;7649:6;;-1:-1:-1;;;;;7649:6:0;5772:10;7801:23;7797:103;;7848:40;;-1:-1:-1;;;7848:40:0;;5772:10;7848:40;;;5213:51:1;5186:18;;7848:40:0;5067:203:1;8889:191:0;8982:6;;;-1:-1:-1;;;;;8999:17:0;;;-1:-1:-1;;;;;;8999:17:0;;;;;;;9032:40;;8982:6;;;8999:17;8982:6;;9032:40;;8963:16;;9032:40;8952:128;8889:191;:::o;20649:126::-;20731:36;;-1:-1:-1;;;20731:36:0;;-1:-1:-1;;;;;5231:32:1;;;20731:36:0;;;5213:51:1;20731:7:0;:15;;;;20754:6;;5186:18:1;;20731:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46528:792;-1:-1:-1;;;;;46655:18:0;;46647:65;;;;-1:-1:-1;;;46647:65:0;;11843:2:1;46647:65:0;;;11825:21:1;11882:2;11862:18;;;11855:30;11921:34;11901:18;;;11894:62;-1:-1:-1;;;11972:18:1;;;11965:32;12014:19;;46647:65:0;11641:398:1;46647:65:0;5772:10;46769:73;5772:10;46797:4;46725:16;46815:6;46823:4;46829:12;46769:17;:73::i;:::-;-1:-1:-1;;;;;46981:15:0;;46959:19;46981:15;;;;;;;;;;;47015:21;;;;47007:69;;;;-1:-1:-1;;;47007:69:0;;12246:2:1;47007:69:0;;;12228:21:1;12285:2;12265:18;;;12258:30;12324:34;12304:18;;;12297:62;-1:-1:-1;;;12375:18:1;;;12368:33;12418:19;;47007:69:0;12044:399:1;47007:69:0;-1:-1:-1;;;;;47112:15:0;;:9;:15;;;;;;;;;;47130:20;;;47112:38;;47172:12;:22;;47144:6;;47112:9;47172:22;;47144:6;;47172:22;:::i;:::-;;;;;;;;47229:4;-1:-1:-1;;;;;47212:50:0;47219:8;-1:-1:-1;;;;;47212:50:0;;47235:6;47243:4;47249:12;47212:50;;;;;;;;:::i;:::-;;;;;;;;47278:34;;2376:25:1;;;47301:1:0;;-1:-1:-1;;;;;47278:34:0;;;;;2364:2:1;2349:18;47278:34:0;;;;;;;46636:684;;46528:792;;;;:::o;48936:484::-;49175:78;;-1:-1:-1;;;49175:78:0;;-1:-1:-1;;;;;13228:32:1;;49175:78:0;;;13210:51:1;34712:31:0;13277:18:1;;;13270:34;49153:19:0;;34454:42;;49175:41;;13183:18:1;;49175:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49153:100;-1:-1:-1;;;;;;49268:25:0;;;49264:149;;49310:91;;-1:-1:-1;;;49310:91:0;;-1:-1:-1;;;;;49310:39:0;;;;;:91;;49350:8;;49360:4;;49366:2;;49370:6;;49378:8;;49388:12;;49310:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49142:278;48936:484;;;;;;:::o;47328:630::-;-1:-1:-1;;;;;47616:15:0;;47594:19;47616:15;;;;;;;;;;;47650:21;;;;47642:73;;;;-1:-1:-1;;;47642:73:0;;14510:2:1;47642:73:0;;;14492:21:1;14549:2;14529:18;;;14522:30;14588:34;14568:18;;;14561:62;-1:-1:-1;;;14639:18:1;;;14632:37;14686:19;;47642:73:0;14308:403:1;47642:73:0;-1:-1:-1;;;;;47751:15:0;;;:9;:15;;;;;;;;;;;47769:20;;;47751:38;;47811:13;;;;;;;;:23;;47783:6;;47751:9;47811:23;;47783:6;;47811:23;:::i;:::-;;;;;;;;47873:2;-1:-1:-1;;;;;47852:56:0;47867:4;-1:-1:-1;;;;;47852:56:0;47857:8;-1:-1:-1;;;;;47852:56:0;;47877:6;47885:8;47895:12;47852:56;;;;;;;;:::i;:::-;;;;;;;;47939:2;-1:-1:-1;;;;;47924:26:0;47933:4;-1:-1:-1;;;;;47924:26:0;;47943:6;47924:26;;;;2376:25:1;;2364:2;2349:18;;2230:177;47924:26:0;;;;;;;;47522:436;47328:630;;;;;;:::o;50122:690::-;50398:79;;-1:-1:-1;;;50398:79:0;;-1:-1:-1;;;;;13228:32:1;;50398:79:0;;;13210:51:1;34810:34:0;13277:18:1;;;13270:34;50376:19:0;;34454:42;;50398:41;;13183:18:1;;50398:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50376:101;-1:-1:-1;;;;;;50492:25:0;;;50488:317;;50534:96;;-1:-1:-1;;;50534:96:0;;-1:-1:-1;;;;;50534:44:0;;;;;:96;;50579:8;;50589:4;;50595:2;;50599:6;;50607:8;;50617:12;;50534:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50488:317;;;50652:19;50648:157;;;36286:21;;36332:8;;;50688:105;;;;-1:-1:-1;;;50688:105:0;;15048:2:1;50688:105:0;;;15030:21:1;15087:2;15067:18;;;15060:30;15126:34;15106:18;;;15099:62;15197:34;15177:18;;;15170:62;-1:-1:-1;;;15248:19:1;;;15241:44;15302:19;;50688:105:0;14846:481:1;50688:105:0;50365:447;50122:690;;;;;;;:::o;14:658:1:-;185:2;237:21;;;307:13;;210:18;;;329:22;;;156:4;;185:2;408:15;;;;382:2;367:18;;;156:4;451:195;465:6;462:1;459:13;451:195;;;530:13;;-1:-1:-1;;;;;526:39:1;514:52;;621:15;;;;586:12;;;;562:1;480:9;451:195;;;-1:-1:-1;663:3:1;;14:658;-1:-1:-1;;;;;;14:658:1:o;677:423::-;719:3;757:5;751:12;784:6;779:3;772:19;809:1;819:162;833:6;830:1;827:13;819:162;;;895:4;951:13;;;947:22;;941:29;923:11;;;919:20;;912:59;848:12;819:162;;;823:3;1026:1;1019:4;1010:6;1005:3;1001:16;997:27;990:38;1089:4;1082:2;1078:7;1073:2;1065:6;1061:15;1057:29;1052:3;1048:39;1044:50;1037:57;;;677:423;;;;:::o;1105:220::-;1254:2;1243:9;1236:21;1217:4;1274:45;1315:2;1304:9;1300:18;1292:6;1274:45;:::i;1330:131::-;-1:-1:-1;;;;;1405:31:1;;1395:42;;1385:70;;1451:1;1448;1441:12;1466:315;1534:6;1542;1595:2;1583:9;1574:7;1570:23;1566:32;1563:52;;;1611:1;1608;1601:12;1563:52;1650:9;1637:23;1669:31;1694:5;1669:31;:::i;:::-;1719:5;1771:2;1756:18;;;;1743:32;;-1:-1:-1;;;1466:315:1:o;1978:247::-;2037:6;2090:2;2078:9;2069:7;2065:23;2061:32;2058:52;;;2106:1;2103;2096:12;2058:52;2145:9;2132:23;2164:31;2189:5;2164:31;:::i;2412:456::-;2489:6;2497;2505;2558:2;2546:9;2537:7;2533:23;2529:32;2526:52;;;2574:1;2571;2564:12;2526:52;2613:9;2600:23;2632:31;2657:5;2632:31;:::i;:::-;2682:5;-1:-1:-1;2739:2:1;2724:18;;2711:32;2752:33;2711:32;2752:33;:::i;:::-;2412:456;;2804:7;;-1:-1:-1;;;2858:2:1;2843:18;;;;2830:32;;2412:456::o;3322:127::-;3383:10;3378:3;3374:20;3371:1;3364:31;3414:4;3411:1;3404:15;3438:4;3435:1;3428:15;3454:718;3496:5;3549:3;3542:4;3534:6;3530:17;3526:27;3516:55;;3567:1;3564;3557:12;3516:55;3603:6;3590:20;3629:18;3666:2;3662;3659:10;3656:36;;;3672:18;;:::i;:::-;3747:2;3741:9;3715:2;3801:13;;-1:-1:-1;;3797:22:1;;;3821:2;3793:31;3789:40;3777:53;;;3845:18;;;3865:22;;;3842:46;3839:72;;;3891:18;;:::i;:::-;3931:10;3927:2;3920:22;3966:2;3958:6;3951:18;4012:3;4005:4;4000:2;3992:6;3988:15;3984:26;3981:35;3978:55;;;4029:1;4026;4019:12;3978:55;4093:2;4086:4;4078:6;4074:17;4067:4;4059:6;4055:17;4042:54;4140:1;4133:4;4128:2;4120:6;4116:15;4112:26;4105:37;4160:6;4151:15;;;;;;3454:718;;;;:::o;4177:885::-;4290:6;4298;4306;4314;4322;4375:3;4363:9;4354:7;4350:23;4346:33;4343:53;;;4392:1;4389;4382:12;4343:53;4431:9;4418:23;4450:31;4475:5;4450:31;:::i;:::-;4500:5;-1:-1:-1;4557:2:1;4542:18;;4529:32;4570:33;4529:32;4570:33;:::i;:::-;4622:7;-1:-1:-1;4676:2:1;4661:18;;4648:32;;-1:-1:-1;4731:2:1;4716:18;;4703:32;4754:18;4784:14;;;4781:34;;;4811:1;4808;4801:12;4781:34;4834:49;4875:7;4866:6;4855:9;4851:22;4834:49;:::i;:::-;4824:59;;4936:3;4925:9;4921:19;4908:33;4892:49;;4966:2;4956:8;4953:16;4950:36;;;4982:1;4979;4972:12;4950:36;;5005:51;5048:7;5037:8;5026:9;5022:24;5005:51;:::i;:::-;4995:61;;;4177:885;;;;;;;;:::o;5275:523::-;5361:6;5369;5377;5430:2;5418:9;5409:7;5405:23;5401:32;5398:52;;;5446:1;5443;5436:12;5398:52;5485:9;5472:23;5504:31;5529:5;5504:31;:::i;:::-;5554:5;-1:-1:-1;5606:2:1;5591:18;;5578:32;;-1:-1:-1;5661:2:1;5646:18;;5633:32;5688:18;5677:30;;5674:50;;;5720:1;5717;5710:12;5674:50;5743:49;5784:7;5775:6;5764:9;5760:22;5743:49;:::i;:::-;5733:59;;;5275:523;;;;;:::o;5803:388::-;5871:6;5879;5932:2;5920:9;5911:7;5907:23;5903:32;5900:52;;;5948:1;5945;5938:12;5900:52;5987:9;5974:23;6006:31;6031:5;6006:31;:::i;:::-;6056:5;-1:-1:-1;6113:2:1;6098:18;;6085:32;6126:33;6085:32;6126:33;:::i;:::-;6178:7;6168:17;;;5803:388;;;;;:::o;6196:743::-;6300:6;6308;6316;6324;6377:3;6365:9;6356:7;6352:23;6348:33;6345:53;;;6394:1;6391;6384:12;6345:53;6433:9;6420:23;6452:31;6477:5;6452:31;:::i;:::-;6502:5;-1:-1:-1;6554:2:1;6539:18;;6526:32;;-1:-1:-1;6609:2:1;6594:18;;6581:32;6632:18;6662:14;;;6659:34;;;6689:1;6686;6679:12;6659:34;6712:49;6753:7;6744:6;6733:9;6729:22;6712:49;:::i;:::-;6702:59;;6814:2;6803:9;6799:18;6786:32;6770:48;;6843:2;6833:8;6830:16;6827:36;;;6859:1;6856;6849:12;6827:36;;6882:51;6925:7;6914:8;6903:9;6899:24;6882:51;:::i;:::-;6872:61;;;6196:743;;;;;;;:::o;6944:388::-;7021:6;7029;7082:2;7070:9;7061:7;7057:23;7053:32;7050:52;;;7098:1;7095;7088:12;7050:52;7134:9;7121:23;7111:33;;7195:2;7184:9;7180:18;7167:32;7222:18;7214:6;7211:30;7208:50;;;7254:1;7251;7244:12;7208:50;7277:49;7318:7;7309:6;7298:9;7294:22;7277:49;:::i;:::-;7267:59;;;6944:388;;;;;:::o;7337:380::-;7416:1;7412:12;;;;7459;;;7480:61;;7534:4;7526:6;7522:17;7512:27;;7480:61;7587:2;7579:6;7576:14;7556:18;7553:38;7550:161;;7633:10;7628:3;7624:20;7621:1;7614:31;7668:4;7665:1;7658:15;7696:4;7693:1;7686:15;7550:161;;7337:380;;;:::o;7946:408::-;8148:2;8130:21;;;8187:2;8167:18;;;8160:30;8226:34;8221:2;8206:18;;8199:62;-1:-1:-1;;;8292:2:1;8277:18;;8270:42;8344:3;8329:19;;7946:408::o;8764:127::-;8825:10;8820:3;8816:20;8813:1;8806:31;8856:4;8853:1;8846:15;8880:4;8877:1;8870:15;8896:168;8969:9;;;9000;;9017:15;;;9011:22;;8997:37;8987:71;;9038:18;;:::i;9069:184::-;9139:6;9192:2;9180:9;9171:7;9167:23;9163:32;9160:52;;;9208:1;9205;9198:12;9160:52;-1:-1:-1;9231:16:1;;9069:184;-1:-1:-1;9069:184:1:o;12448:128::-;12515:9;;;12536:11;;;12533:37;;;12550:18;;:::i;12581:450::-;12802:6;12791:9;12784:25;12845:2;12840;12829:9;12825:18;12818:30;12765:4;12871:45;12912:2;12901:9;12897:18;12889:6;12871:45;:::i;:::-;12964:9;12956:6;12952:22;12947:2;12936:9;12932:18;12925:50;12992:33;13018:6;13010;12992:33;:::i;:::-;12984:41;12581:450;-1:-1:-1;;;;;;12581:450:1:o;13315:251::-;13385:6;13438:2;13426:9;13417:7;13413:23;13409:32;13406:52;;;13454:1;13451;13444:12;13406:52;13486:9;13480:16;13505:31;13530:5;13505:31;:::i;13571:732::-;-1:-1:-1;;;;;13914:15:1;;;13896:34;;13966:15;;;13961:2;13946:18;;13939:43;14018:15;;14013:2;13998:18;;13991:43;14065:2;14050:18;;14043:34;;;14114:3;14108;14093:19;;14086:32;;;13839:4;;14141:46;;14167:19;;14159:6;14141:46;:::i;:::-;14236:9;14228:6;14224:22;14218:3;14207:9;14203:19;14196:51;14264:33;14290:6;14282;14264:33;:::i;:::-;14256:41;13571:732;-1:-1:-1;;;;;;;;;13571:732:1:o;14716:125::-;14781:9;;;14802:10;;;14799:36;;;14815:18;;:::i

Swarm Source

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