Token Intercoin Investor Token

 

Overview [ERC-20]

Price
$0.09 @ 0.000053 Eth (+0.04%)
Fully Diluted Market Cap
Max Total Supply:
3,139,576.32 ITR

Holders:
71

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Intercoin.org works to power smart economies for communities worldwide. It uses smart contracts to enable voting, governance, local currencies, CPI, and a UBI. The Intercoin Investor token is designed to allow stakers to receive dividends from sales of the Intercoin token to communities worldwide.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ITR

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-29
*/

// SPDX-License-Identifier: AGPL
// File: @openzeppelin/contracts/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 {
    /**
     * @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 nor 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);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

// File: @openzeppelin/contracts/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/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 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
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

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



pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/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.
 */
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));
    }

    /**
     * @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) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, 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 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 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) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");

        uint256 currentAllowance = _allowances[holder][spender];
        require(currentAllowance >= amount, "ERC777: transfer amount exceeds allowance");
        _approve(holder, spender, currentAllowance - amount);

        _callTokensReceived(spender, 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 `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
    ) 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: send from the zero address");
        require(to != address(0), "ERC777: send 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 {
        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(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes
     * calls to {send}, {transfer}, {operatorSend}, 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: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: contracts/ITR.sol


pragma solidity ^0.8.0;





contract ITR is Ownable, ERC777 {
    using SafeMath for uint256;
    
    address private constant deadAddress = 0x000000000000000000000000000000000000dEaD;
    
    uint256 internal constant WEEK = 604800;    // 7*24*60*60
    uint256 internal constant MONTH = 2592000;  // 30*24*60*60  30 days
    uint256 internal _maxTotalSupply = 200_000_000 * 10**18;
    
    address _claimToken;
    uint256 public _claimDuration;
    uint256 public _claimFraction;
    
    // this is the amount of ITR which can be sold before any percent restrictions kick in
    uint256 _claimExcepted;
    
    // every _claimDuration this gets added to _claimFraction
    uint256 _claimGrowth;
    
	uint256 internal constant MULTIPLIER = 100000;
    uint256 private deployedTime;
    
    // global restriction for claims
    uint256 internal _lastClaimedTime;
    uint256 internal _lastClaimedAmount;
    
    constructor() ERC777("Intercoin Investor Token", "ITR", new address[](0)) {
       init(
		   200_000_000 * 10**18,
		   0x6Ef5febbD2A56FAb23f18a69d3fB9F4E2A70440B,
		   2000,
		   MONTH,
		   30000 * 10 **18,
		   100
	   );
    }

	function init(
		uint256 maxTotalSupply, 
		address claimToken, 
		uint256 claimFraction,
		uint256 claimDuration, 
		uint256 claimExcepted, 
		uint256 claimGrowth
	) internal {
		(_maxTotalSupply, _claimToken, _claimFraction, _claimDuration, _claimExcepted, _claimGrowth) = 
		    (maxTotalSupply, claimToken, claimFraction, claimDuration, claimExcepted, claimGrowth);
		
		deployedTime = block.timestamp;
	}
    
    // cap of total supply
    function getMaxTotalSupply() public view returns(uint256) {
        return _maxTotalSupply;
    }
    
    // still available to claim
    function totalRemaining() public view returns(uint256) {
        return _maxTotalSupply.sub(totalSupply());
    }
	
	// how much to claim
	function getClaimFraction() public view returns (uint256) {
		return _claimFraction.add(_claimGrowth.mul(getGrowthDurationsPassed()));
	}
    
	// this function mints the tokens internally
    function claim(address to) external {
        uint256 a = IERC20(_claimToken).balanceOf(to);
        uint256 b = IERC20(_claimToken).balanceOf(address(this));

        require(b > 0, "nothing to claim");
       
        if ((b > _claimExcepted) && (b > (
			a.add(b).mul(getClaimFraction()).div(MULTIPLIER)
		))) {
            revert("please claim less tokens per month");
        }
         
		// restrict global amounts transferred in each period
        uint256 index = (block.timestamp)
			.div(_claimDuration)
			.mul(_claimDuration);
        if (index == _lastClaimedTime) {
            _lastClaimedAmount = _lastClaimedAmount.add(b);
        } else {
            _lastClaimedTime = index;
            _lastClaimedAmount = b;
        }
        
        require(
            (_maxTotalSupply).mul(getClaimFraction()).div(MULTIPLIER) >= _lastClaimedAmount, 
            "please wait, too many tokens already claimed this month"
        );
        
        require(totalSupply().add(b) <= _maxTotalSupply, 
			"this would exceed maxTotalSupply");
        _mint(to, b, "", "");
        IERC20(_claimToken).transfer(deadAddress, b);
        
    }
    
    function getGrowthDurationsPassed() internal view returns(uint256) {
        return (block.timestamp.sub(deployedTime)).div(_claimDuration);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":[],"name":"_claimDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_claimFraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"address","name":"to","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":"getClaimFraction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"totalRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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"}]

60806040526aa56fa5b99019a5c8000000600a553480156200002057600080fd5b50604080518082018252601881527f496e746572636f696e20496e766573746f7220546f6b656e000000000000000060208083019190915282518084018452600381526224aa2960e91b818301528351600081529182019093529091906200008833620002ae565b82516200009d90600390602086019062000333565b508151620000b390600490602085019062000333565b508051620000c9906005906020840190620003c2565b5060005b81518110156200013957600160066000848481518110620000f257620000f262000498565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000130816200046e565b915050620000cd565b506040516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce217705460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90606401600060405180830381600087803b158015620001b457600080fd5b505af1158015620001c9573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a60248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b1580156200024757600080fd5b505af11580156200025c573d6000803e3d6000fd5b50505050505050620002a86aa56fa5b99019a5c8000000736ef5febbd2a56fab23f18a69d3fb9f4e2a70440b6107d062278d0069065a4da25d3016c000006064620002fe60201b60201c565b620004ae565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600f55600e55600c55600d55600b80546001600160a01b0319166001600160a01b0392909216919091179055600a5542601055565b828054620003419062000431565b90600052602060002090601f016020900481019282620003655760008555620003b0565b82601f106200038057805160ff1916838001178555620003b0565b82800160010185558215620003b0579182015b82811115620003b057825182559160200191906001019062000393565b50620003be9291506200041a565b5090565b828054828255906000526020600020908101928215620003b0579160200282015b82811115620003b057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003e3565b5b80821115620003be57600081556001016200041b565b600181811c908216806200044657607f821691505b602082108114156200046857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200049157634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b61205f80620004be6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063d8a5436011610097578063f2fde38b11610071578063f2fde38b1461036e578063fad8b32a14610381578063fc673c4f14610394578063fe9d9303146103a757600080fd5b8063d8a543601461031a578063d95b637114610322578063dd62ed3e1461033557600080fd5b80639bd9bbc6116100d35780639bd9bbc6146102e35780639fb7ef31146102f6578063a02fbbf4146102ff578063a9059cbb1461030757600080fd5b80638da5cb5b146102ad578063959b8c3f146102c857806395d89b41146102db57600080fd5b806323b872dd116101665780635db30bb1116101405780635db30bb11461026157806362ad1b831461026957806370a082311461027c578063715018a6146102a557600080fd5b806323b872dd14610238578063313ce5671461024b578063556f0dc71461025a57600080fd5b806306e48538146101ae57806306fdde03146101cc578063095ea7b3146101e15780630c428b611461020457806318160ddd1461021b5780631e83409a14610223575b600080fd5b6101b66103ba565b6040516101c39190611e18565b60405180910390f35b6101d461041c565b6040516101c39190611e65565b6101f46101ef366004611bea565b6104a5565b60405190151581526020016101c3565b61020d600d5481565b6040519081526020016101c3565b60025461020d565b610236610231366004611aa3565b6104bd565b005b6101f4610246366004611b16565b610882565b604051601281526020016101c3565b600161020d565b600a5461020d565b610236610277366004611b57565b610a42565b61020d61028a366004611aa3565b6001600160a01b031660009081526001602052604090205490565b610236610a77565b6000546040516001600160a01b0390911681526020016101c3565b6102366102d6366004611aa3565b610add565b6101d4610bfb565b6102366102f1366004611c16565b610c0a565b61020d600c5481565b61020d610c2d565b6101f4610315366004611bea565b610c54565b61020d610d07565b6101f4610330366004611add565b610d1e565b61020d610343366004611add565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61023661037c366004611aa3565b610dc0565b61023661038f366004611aa3565b610e8b565b6102366103a2366004611c6f565b610fa7565b6102366103b5366004611d2a565b610fdf565b6060600580548060200260200160405190810160405280929190818152602001828054801561041257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f4575b5050505050905090565b60606003805461042b90611fad565b80601f016020809104026020016040519081016040528092919081815260200182805461045790611fad565b80156104125780601f1061047957610100808354040283529160200191610412565b820191906000526020600020905b81548152906001019060200180831161048757509395945050505050565b6000336104b3818585610ffe565b5060019392505050565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561050357600080fd5b505afa158015610517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053b9190611d11565b600b546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561058457600080fd5b505afa158015610598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105bc9190611d11565b9050600081116106065760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b60448201526064015b60405180910390fd5b600e548111801561063d575061063a620186a0610634610624610c2d565b61062e8686611125565b90611131565b9061113d565b81115b156106955760405162461bcd60e51b815260206004820152602260248201527f706c6561736520636c61696d206c65737320746f6b656e7320706572206d6f6e6044820152610e8d60f31b60648201526084016105fd565b600c546000906106a99061062e428261113d565b90506011548114156106ca576012546106c29083611125565b6012556106d5565b601181905560128290555b6012546106f3620186a06106346106ea610c2d565b600a5490611131565b10156107675760405162461bcd60e51b815260206004820152603760248201527f706c6561736520776169742c20746f6f206d616e7920746f6b656e7320616c7260448201527f6561647920636c61696d65642074686973206d6f6e746800000000000000000060648201526084016105fd565b600a5461077d8361077760025490565b90611125565b11156107cb5760405162461bcd60e51b815260206004820181905260248201527f7468697320776f756c6420657863656564206d6178546f74616c537570706c7960448201526064016105fd565b6107f584836040518060200160405280600081525060405180602001604052806000815250611149565b600b5460405163a9059cbb60e01b815261dead6004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561084357600080fd5b505af1158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b9190611cef565b5050505050565b60006001600160a01b0383166108aa5760405162461bcd60e51b81526004016105fd90611e78565b6001600160a01b03841661090f5760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b6000339050610940818686866040518060200160405280600081525060405180602001604052806000815250611157565b61096c81868686604051806020016040528060008152506040518060200160405280600081525061128e565b6001600160a01b03808616600090815260096020908152604080832093851683529290522054838110156109f45760405162461bcd60e51b815260206004820152602960248201527f4552433737373a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b60648201526084016105fd565b610a088683610a038785611f96565b610ffe565b610a3682878787604051806020016040528060008152506040518060200160405280600081525060006113f4565b50600195945050505050565b610a4c3386610d1e565b610a685760405162461bcd60e51b81526004016105fd90611ebc565b61087b858585858560016115c8565b6000546001600160a01b03163314610ad15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b610adb60006116ab565b565b336001600160a01b0382161415610b425760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610b93573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19169055610bc2565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606004805461042b90611fad565b610c28338484846040518060200160405280600081525060016115c8565b505050565b6000610c4f610c46610c3d6116fb565b600f5490611131565b600d5490611125565b905090565b60006001600160a01b038316610c7c5760405162461bcd60e51b81526004016105fd90611e78565b6000339050610cad818286866040518060200160405280600081525060405180602001604052806000815250611157565b610cd981828686604051806020016040528060008152506040518060200160405280600081525061128e565b6104b381828686604051806020016040528060008152506040518060200160405280600081525060006113f4565b6000610c4f610d1560025490565b600a5490611718565b6000816001600160a01b0316836001600160a01b03161480610d8957506001600160a01b03831660009081526006602052604090205460ff168015610d8957506001600160a01b0380831660009081526008602090815260408083209387168352929052205460ff16155b80610db957506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff165b9392505050565b6000546001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b6001600160a01b038116610e7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b610e88816116ab565b50565b6001600160a01b038116331415610eee5760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610f42573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f6e565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b610fb13385610d1e565b610fcd5760405162461bcd60e51b81526004016105fd90611ebc565b610fd984848484611724565b50505050565b610ffa33838360405180602001604052806000815250611724565b5050565b6001600160a01b0383166110625760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105fd565b6001600160a01b0382166110c45760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105fd565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610db98284611f3d565b6000610db98284611f77565b6000610db98284611f55565b610fd98484848460016118d9565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b9190611ac0565b90506001600160a01b0381161561128557604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611252908a908a908a908a908a908a90600401611dbe565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b505050505b50505050505050565b6001600160a01b038516600090815260016020526040902054838110156113075760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b60648201526084016105fd565b6001600160a01b0380871660009081526001602052604080822087850390559187168152908120805486929061133e908490611f3d565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161139693929190611f08565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516113e391815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611ac0565b90506001600160a01b03811615611524576040516223de2960e01b81526001600160a01b038216906223de29906114ed908b908b908b908b908b908b90600401611dbe565b600060405180830381600087803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506115be565b81156115be576001600160a01b0386163b156115be5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a4016105fd565b5050505050505050565b6001600160a01b0386166116295760405162461bcd60e51b815260206004820152602260248201527f4552433737373a2073656e642066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b6001600160a01b03851661167f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f206164647265737360448201526064016105fd565b3361168e818888888888611157565b61169c81888888888861128e565b611285818888888888886113f4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c4f600c546106346010544261171890919063ffffffff16565b6000610db98284611f96565b6001600160a01b0384166117855760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b3361179581866000878787611157565b6001600160a01b0385166000908152600160205260409020548481101561180a5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b60648201526084016105fd565b6001600160a01b0386166000908152600160205260408120868303905560028054879290611839908490611f96565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161188793929190611f08565b60405180910390a36040518581526000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050505050565b6001600160a01b03851661192f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fd565b600033905084600260008282546119469190611f3d565b90915550506001600160a01b03861660009081526001602052604081208054879290611973908490611f3d565b90915550611989905081600088888888886113f4565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516119d093929190611f08565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016118c9565b600082601f830112611a2757600080fd5b813567ffffffffffffffff80821115611a4257611a42611ffe565b604051601f8301601f19908116603f01168101908282118183101715611a6a57611a6a611ffe565b81604052838152866020858801011115611a8357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ab557600080fd5b8135610db981612014565b600060208284031215611ad257600080fd5b8151610db981612014565b60008060408385031215611af057600080fd5b8235611afb81612014565b91506020830135611b0b81612014565b809150509250929050565b600080600060608486031215611b2b57600080fd5b8335611b3681612014565b92506020840135611b4681612014565b929592945050506040919091013590565b600080600080600060a08688031215611b6f57600080fd5b8535611b7a81612014565b94506020860135611b8a81612014565b935060408601359250606086013567ffffffffffffffff80821115611bae57600080fd5b611bba89838a01611a16565b93506080880135915080821115611bd057600080fd5b50611bdd88828901611a16565b9150509295509295909350565b60008060408385031215611bfd57600080fd5b8235611c0881612014565b946020939093013593505050565b600080600060608486031215611c2b57600080fd5b8335611c3681612014565b925060208401359150604084013567ffffffffffffffff811115611c5957600080fd5b611c6586828701611a16565b9150509250925092565b60008060008060808587031215611c8557600080fd5b8435611c9081612014565b935060208501359250604085013567ffffffffffffffff80821115611cb457600080fd5b611cc088838901611a16565b93506060870135915080821115611cd657600080fd5b50611ce387828801611a16565b91505092959194509250565b600060208284031215611d0157600080fd5b81518015158114610db957600080fd5b600060208284031215611d2357600080fd5b5051919050565b60008060408385031215611d3d57600080fd5b82359150602083013567ffffffffffffffff811115611d5b57600080fd5b611d6785828601611a16565b9150509250929050565b6000815180845260005b81811015611d9757602081850181015186830182015201611d7b565b81811115611da9576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c060808201819052600090611df990830185611d71565b82810360a0840152611e0b8185611d71565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611e595783516001600160a01b031683529284019291840191600101611e34565b50909695505050505050565b602081526000610db96020830184611d71565b60208082526024908201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b838152606060208201526000611f216060830185611d71565b8281036040840152611f338185611d71565b9695505050505050565b60008219821115611f5057611f50611fe8565b500190565b600082611f7257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f9157611f91611fe8565b500290565b600082821015611fa857611fa8611fe8565b500390565b600181811c90821680611fc157607f821691505b60208210811415611fe257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e8857600080fdfea26469706673582212208cd1ca1d480bc2a3355e84afbb0768c216703cbecd099c3e05d40bea4bc57b8b64736f6c63430008070033

Deployed ByteCode Sourcemap

53529:3455:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32341:132;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28408:100;;;:::i;:::-;;;;;;;:::i;33981:201::-;;;;;;:::i;:::-;;:::i;:::-;;;8254:14:1;;8247:22;8229:41;;8217:2;8202:18;33981:201:0;8089:187:1;53967:29:0;;;;;;;;;17030:25:1;;;17018:2;17003:18;53967:29:0;16884:177:1;29234:125:0;29339:12;;29234:125;;55640:1181;;;;;;:::i;:::-;;:::i;:::-;;34567:827;;;;;;:::i;:::-;;:::i;28865:84::-;;;28939:2;17661:36:1;;17649:2;17634:18;28865:84:0;17519:184:1;29071:97:0;29159:1;29071:97;;55154:99;55230:15;;55154:99;;32599:375;;;;;;:::i;:::-;;:::i;29464:152::-;;;;;;:::i;:::-;-1:-1:-1;;;;;29586:22:0;29559:7;29586:22;;;:9;:22;;;;;;;29464:152;45876:94;;;:::i;45225:87::-;45271:7;45298:6;45225:87;;-1:-1:-1;;;;;45298:6:0;;;6071:51:1;;6059:2;6044:18;45225:87:0;5925:203:1;31366:422:0;;;;;;:::i;:::-;;:::i;28569:104::-;;;:::i;29753:199::-;;;;;;:::i;:::-;;:::i;53931:29::-;;;;;;55442:139;;;:::i;30193:451::-;;;;;;:::i;:::-;;:::i;55298:115::-;;;:::i;30978:316::-;;;;;;:::i;:::-;;:::i;33683:153::-;;;;;;:::i;:::-;-1:-1:-1;;;;;33800:19:0;;;33773:7;33800:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;33683:153;46125:192;;;;;;:::i;:::-;;:::i;31857:413::-;;;;;;:::i;:::-;;:::i;33102:333::-;;;;;;:::i;:::-;;:::i;30781:129::-;;;;;;:::i;:::-;;:::i;32341:132::-;32407:16;32443:22;32436:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32436:29:0;;;;;;;;;;;;;;;;;;;;;;;32341:132;:::o;28408:100::-;28462:13;28495:5;28488:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28488:12:0;;28408:100;-1:-1:-1;;;;;28408:100:0:o;33981:201::-;34063:4;25495:10;34120:32;25495:10;34137:7;34146:5;34120:8;:32::i;:::-;-1:-1:-1;34170:4:0;;33981:201;-1:-1:-1;;;33981:201:0:o;55640:1181::-;55706:11;;55699:33;;-1:-1:-1;;;55699:33:0;;-1:-1:-1;;;;;6089:32:1;;;55699:33:0;;;6071:51:1;55687:9:0;;55706:11;;55699:29;;6044:18:1;;55699:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55762:11;;55755:44;;-1:-1:-1;;;55755:44:0;;55793:4;55755:44;;;6071:51:1;55687:45:0;;-1:-1:-1;55743:9:0;;-1:-1:-1;;;;;55762:11:0;;;;55755:29;;6044:18:1;;55755:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55743:56;;55824:1;55820;:5;55812:34;;;;-1:-1:-1;;;55812:34:0;;11500:2:1;55812:34:0;;;11482:21:1;11539:2;11519:18;;;11512:30;-1:-1:-1;;;11558:18:1;;;11551:46;11614:18;;55812:34:0;;;;;;;;;55875:14;;55871:1;:18;55870:89;;;;;55905:48;54268:6;55905:32;55918:18;:16;:18::i;:::-;55905:8;:1;55911;55905:5;:8::i;:::-;:12;;:32::i;:::-;:36;;:48::i;:::-;55895:1;:63;55870:89;55866:166;;;55976:44;;-1:-1:-1;;;55976:44:0;;14697:2:1;55976:44:0;;;14679:21:1;14736:2;14716:18;;;14709:30;14775:34;14755:18;;;14748:62;-1:-1:-1;;;14826:18:1;;;14819:32;14868:19;;55976:44:0;14495:398:1;55866:166:0;56178:14;;56110:13;;56126:67;;:42;56127:15;56178:14;56126:26;:42::i;:67::-;56110:83;;56217:16;;56208:5;:25;56204:198;;;56271:18;;:25;;56294:1;56271:22;:25::i;:::-;56250:18;:46;56204:198;;;56329:16;:24;;;56368:18;:22;;;56204:198;56505:18;;56444:57;54268:6;56444:41;56466:18;:16;:18::i;:::-;56445:15;;;56444:21;:41::i;:57::-;:79;;56422:185;;;;-1:-1:-1;;;56422:185:0;;12247:2:1;56422:185:0;;;12229:21:1;12286:2;12266:18;;;12259:30;12325:34;12305:18;;;12298:62;12396:25;12376:18;;;12369:53;12439:19;;56422:185:0;12045:419:1;56422:185:0;56660:15;;56636:20;56654:1;56636:13;29339:12;;;29234:125;56636:13;:17;;:20::i;:::-;:39;;56628:89;;;;-1:-1:-1;;;56628:89:0;;9516:2:1;56628:89:0;;;9498:21:1;;;9535:18;;;9528:30;9594:34;9574:18;;;9567:62;9646:18;;56628:89:0;9314:356:1;56628:89:0;56728:20;56734:2;56738:1;56728:20;;;;;;;;;;;;;;;;;;;;;;;;:5;:20::i;:::-;56766:11;;56759:44;;-1:-1:-1;;;56759:44:0;;53646:42;56759:44;;;7042:51:1;7109:18;;;7102:34;;;-1:-1:-1;;;;;56766:11:0;;;;56759:28;;7015:18:1;;56759:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55676:1145;;;55640:1181;:::o;34567:827::-;34707:4;-1:-1:-1;;;;;34732:23:0;;34724:72;;;;-1:-1:-1;;;34724:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34815:20:0;;34807:71;;;;-1:-1:-1;;;34807:71:0;;15510:2:1;34807:71:0;;;15492:21:1;15549:2;15529:18;;;15522:30;15588:34;15568:18;;;15561:62;-1:-1:-1;;;15639:18:1;;;15632:36;15685:19;;34807:71:0;15308:402:1;34807:71:0;34891:15;25495:10;34891:30;;34934:61;34952:7;34961:6;34969:9;34980:6;34934:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;35008:49;35014:7;35023:6;35031:9;35042:6;35008:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;-1:-1:-1;;;;;35097:19:0;;;35070:24;35097:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;35144:26;;;;35136:80;;;;-1:-1:-1;;;35136:80:0;;15100:2:1;35136:80:0;;;15082:21:1;15139:2;15119:18;;;15112:30;15178:34;15158:18;;;15151:62;-1:-1:-1;;;15229:18:1;;;15222:39;15278:19;;35136:80:0;14898:405:1;35136:80:0;35227:52;35236:6;35244:7;35253:25;35272:6;35253:16;:25;:::i;:::-;35227:8;:52::i;:::-;35292:70;35312:7;35321:6;35329:9;35340:6;35292:70;;;;;;;;;;;;;;;;;;;;;;;;35356:5;35292:19;:70::i;:::-;-1:-1:-1;35382:4:0;;34567:827;-1:-1:-1;;;;;34567:827:0:o;32599:375::-;32813:35;25495:10;32841:6;32813:13;:35::i;:::-;32805:92;;;;-1:-1:-1;;;32805:92:0;;;;;;;:::i;:::-;32908:58;32914:6;32922:9;32933:6;32941:4;32947:12;32961:4;32908:5;:58::i;45876:94::-;45271:7;45298:6;-1:-1:-1;;;;;45298:6:0;25495:10;45445:23;45437:68;;;;-1:-1:-1;;;45437:68:0;;13032:2:1;45437:68:0;;;13014:21:1;;;13051:18;;;13044:30;13110:34;13090:18;;;13083:62;13162:18;;45437:68:0;12830:356:1;45437:68:0;45941:21:::1;45959:1;45941:9;:21::i;:::-;45876:94::o:0;31366:422::-;25495:10;-1:-1:-1;;;;;31454:24:0;;;;31446:73;;;;-1:-1:-1;;;31446:73:0;;11095:2:1;31446:73:0;;;11077:21:1;11134:2;11114:18;;;11107:30;11173:34;11153:18;;;11146:62;-1:-1:-1;;;11224:18:1;;;11217:34;11268:19;;31446:73:0;10893:400:1;31446:73:0;-1:-1:-1;;;;;31536:27:0;;;;;;:17;:27;;;;;;;;31532:189;;;25495:10;31587:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;31587:48:0;;;;;;;;;31580:55;;-1:-1:-1;;31580:55:0;;;31532:189;;;25495:10;31668:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;31668:34:0;;;;;;;;;:41;;-1:-1:-1;;31668:41:0;31705:4;31668:41;;;31532:189;31738:42;;25495:10;;-1:-1:-1;;;;;31738:42:0;;;;;;;;31366:422;:::o;28569:104::-;28625:13;28658:7;28651:14;;;;;:::i;29753:199::-;29890:54;25495:10;29910:9;29921:6;29929:4;29890:54;;;;;;;;;;;;29939:4;29890:5;:54::i;:::-;29753:199;;;:::o;55442:139::-;55491:7;55512:64;55531:44;55548:26;:24;:26::i;:::-;55531:12;;;:16;:44::i;:::-;55512:14;;;:18;:64::i;:::-;55505:71;;55442:139;:::o;30193:451::-;30279:4;-1:-1:-1;;;;;30304:23:0;;30296:72;;;;-1:-1:-1;;;30296:72:0;;;;;;;:::i;:::-;30381:12;25495:10;30381:27;;30421:56;30439:4;30445;30451:9;30462:6;30421:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;30490:44;30496:4;30502;30508:9;30519:6;30490:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;30547:65;30567:4;30573;30579:9;30590:6;30547:65;;;;;;;;;;;;;;;;;;;;;;;;30606:5;30547:19;:65::i;55298:115::-;55344:7;55371:34;55391:13;29339:12;;;29234:125;55391:13;55371:15;;;:19;:34::i;30978:316::-;31078:4;31127:11;-1:-1:-1;;;;;31115:23:0;:8;-1:-1:-1;;;;;31115:23:0;;:121;;;-1:-1:-1;;;;;;31156:27:0;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;;;;;;31188:37:0;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;31187:48;31156:79;31115:171;;;-1:-1:-1;;;;;;31253:23:0;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;31115:171;31095:191;30978:316;-1:-1:-1;;;30978:316:0:o;46125:192::-;45271:7;45298:6;-1:-1:-1;;;;;45298:6:0;25495:10;45445:23;45437:68;;;;-1:-1:-1;;;45437:68:0;;13032:2:1;45437:68:0;;;13014:21:1;;;13051:18;;;13044:30;13110:34;13090:18;;;13083:62;13162:18;;45437:68:0;12830:356:1;45437:68:0;-1:-1:-1;;;;;46214:22:0;::::1;46206:73;;;::::0;-1:-1:-1;;;46206:73:0;;10285:2:1;46206:73:0::1;::::0;::::1;10267:21:1::0;10324:2;10304:18;;;10297:30;10363:34;10343:18;;;10336:62;-1:-1:-1;;;10414:18:1;;;10407:36;10460:19;;46206:73:0::1;10083:402:1::0;46206:73:0::1;46290:19;46300:8;46290:9;:19::i;:::-;46125:192:::0;:::o;31857:413::-;-1:-1:-1;;;;;31942:24:0;;25495:10;31942:24;;31934:70;;;;-1:-1:-1;;;31934:70:0;;11845:2:1;31934:70:0;;;11827:21:1;11884:2;11864:18;;;11857:30;11923:34;11903:18;;;11896:62;-1:-1:-1;;;11974:18:1;;;11967:31;12015:19;;31934:70:0;11643:397:1;31934:70:0;-1:-1:-1;;;;;32021:27:0;;;;;;:17;:27;;;;;;;;32017:189;;;25495:10;32065:38;;;;:24;:38;;;;;;;;-1:-1:-1;;;;;32065:48:0;;;;;;;;;:55;;-1:-1:-1;;32065:55:0;32116:4;32065:55;;;32017:189;;;25495:10;32160:24;;;;:10;:24;;;;;;;;-1:-1:-1;;;;;32160:34:0;;;;;;;;;32153:41;;-1:-1:-1;;32153:41:0;;;32017:189;32223:39;;25495:10;;-1:-1:-1;;;;;32223:39:0;;;;;;;;31857:413;:::o;33102:333::-;33289:36;25495:10;33317:7;33289:13;:36::i;:::-;33281:93;;;;-1:-1:-1;;;33281:93:0;;;;;;;:::i;:::-;33385:42;33391:7;33400:6;33408:4;33414:12;33385:5;:42::i;:::-;33102:333;;;;:::o;30781:129::-;30865:37;25495:10;30885:6;30893:4;30865:37;;;;;;;;;;;;:5;:37::i;:::-;30781:129;;:::o;40688:375::-;-1:-1:-1;;;;;40816:20:0;;40808:70;;;;-1:-1:-1;;;40808:70:0;;8707:2:1;40808:70:0;;;8689:21:1;8746:2;8726:18;;;8719:30;8785:34;8765:18;;;8758:62;-1:-1:-1;;;8836:18:1;;;8829:35;8881:19;;40808:70:0;8505:401:1;40808:70:0;-1:-1:-1;;;;;40897:21:0;;40889:69;;;;-1:-1:-1;;;40889:69:0;;16682:2:1;40889:69:0;;;16664:21:1;16721:2;16701:18;;;16694:30;16760:34;16740:18;;;16733:62;-1:-1:-1;;;16811:18:1;;;16804:33;16854:19;;40889:69:0;16480:399:1;40889:69:0;-1:-1:-1;;;;;40971:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;41023:32;;17030:25:1;;;41023:32:0;;17003:18:1;41023:32:0;;;;;;;40688:375;;;:::o;49297:98::-;49355:7;49382:5;49386:1;49382;:5;:::i;50035:98::-;50093:7;50120:5;50124:1;50120;:5;:::i;50434:98::-;50492:7;50519:5;50523:1;50519;:5;:::i;35983:229::-;36152:52;36158:7;36167:6;36175:8;36185:12;36199:4;36152:5;:52::i;41547:484::-;41786:78;;-1:-1:-1;;;41786:78:0;;-1:-1:-1;;;;;7060:32:1;;41786:78:0;;;7042:51:1;26877:31:0;7109:18:1;;;7102:34;41764:19:0;;26619:42;;41786:41;;7015:18:1;;41786:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41764:100;-1:-1:-1;;;;;;41879:25:0;;;41875:149;;41921:91;;-1:-1:-1;;;41921:91:0;;-1:-1:-1;;;;;41921:39:0;;;;;:91;;41961:8;;41971:4;;41977:2;;41981:6;;41989:8;;41999:12;;41921:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41875:149;41753:278;41547:484;;;;;;:::o;39913:630::-;-1:-1:-1;;;;;40201:15:0;;40179:19;40201:15;;;:9;:15;;;;;;40235:21;;;;40227:73;;;;-1:-1:-1;;;40227:73:0;;9877:2:1;40227:73:0;;;9859:21:1;9916:2;9896:18;;;9889:30;9955:34;9935:18;;;9928:62;-1:-1:-1;;;10006:18:1;;;9999:37;10053:19;;40227:73:0;9675:403:1;40227:73:0;-1:-1:-1;;;;;40336:15:0;;;;;;;:9;:15;;;;;;40354:20;;;40336:38;;40396:13;;;;;;;;:23;;40368:6;;40336:15;40396:23;;40368:6;;40396:23;:::i;:::-;;;;;;;;40458:2;-1:-1:-1;;;;;40437:56:0;40452:4;-1:-1:-1;;;;;40437:56:0;40442:8;-1:-1:-1;;;;;40437:56:0;;40462:6;40470:8;40480:12;40437:56;;;;;;;;:::i;:::-;;;;;;;;40524:2;-1:-1:-1;;;;;40509:26:0;40518:4;-1:-1:-1;;;;;40509:26:0;;40528:6;40509:26;;;;17030:25:1;;17018:2;17003:18;;16884:177;40509:26:0;;;;;;;;40107:436;39913:630;;;;;;:::o;42733:691::-;43009:79;;-1:-1:-1;;;43009:79:0;;-1:-1:-1;;;;;7060:32:1;;43009:79:0;;;7042:51:1;26975:34:0;7109:18:1;;;7102:34;42987:19:0;;26619:42;;43009:41;;7015:18:1;;43009:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42987:101;-1:-1:-1;;;;;;43103:25:0;;;43099:318;;43145:96;;-1:-1:-1;;;43145:96:0;;-1:-1:-1;;;;;43145:44:0;;;;;:96;;43190:8;;43200:4;;43206:2;;43210:6;;43218:8;;43228:12;;43145:96;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43099:318;;;43263:19;43259:158;;;-1:-1:-1;;;;;43308:13:0;;6063:20;6111:8;43299:106;;;;-1:-1:-1;;;43299:106:0;;13393:2:1;43299:106:0;;;13375:21:1;13432:2;13412:18;;;13405:30;13471:34;13451:18;;;13444:62;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:19:1;;;13586:44;13647:19;;43299:106:0;13191:481:1;43299:106:0;42976:448;42733:691;;;;;;;:::o;38088:668::-;-1:-1:-1;;;;;38318:18:0;;38310:65;;;;-1:-1:-1;;;38310:65:0;;9113:2:1;38310:65:0;;;9095:21:1;9152:2;9132:18;;;9125:30;9191:34;9171:18;;;9164:62;-1:-1:-1;;;9242:18:1;;;9235:32;9284:19;;38310:65:0;8911:398:1;38310:65:0;-1:-1:-1;;;;;38394:16:0;;38386:61;;;;-1:-1:-1;;;38386:61:0;;16321:2:1;38386:61:0;;;16303:21:1;;;16340:18;;;16333:30;16399:34;16379:18;;;16372:62;16451:18;;38386:61:0;16119:356:1;38386:61:0;25495:10;38504:69;25495:10;38532:4;38538:2;38542:6;38550:8;38560:12;38504:17;:69::i;:::-;38586:57;38592:8;38602:4;38608:2;38612:6;38620:8;38630:12;38586:5;:57::i;:::-;38656:92;38676:8;38686:4;38692:2;38696:6;38704:8;38714:12;38728:19;38656;:92::i;46325:173::-;46381:16;46400:6;;-1:-1:-1;;;;;46417:17:0;;;-1:-1:-1;;;;;;46417:17:0;;;;;;46450:40;;46400:6;;;;;;;46450:40;;46381:16;46450:40;46370:128;46325:173;:::o;56833:148::-;56891:7;56918:55;56958:14;;56919:33;56939:12;;56919:15;:19;;:33;;;;:::i;49678:98::-;49736:7;49763:5;49767:1;49763;:5;:::i;39070:835::-;-1:-1:-1;;;;;39240:18:0;;39232:65;;;;-1:-1:-1;;;39232:65:0;;10692:2:1;39232:65:0;;;10674:21:1;10731:2;10711:18;;;10704:30;10770:34;10750:18;;;10743:62;-1:-1:-1;;;10821:18:1;;;10814:32;10863:19;;39232:65:0;10490:398:1;39232:65:0;25495:10;39354:73;25495:10;39382:4;39310:16;39400:6;39408:4;39414:12;39354:17;:73::i;:::-;-1:-1:-1;;;;;39566:15:0;;39544:19;39566:15;;;:9;:15;;;;;;39600:21;;;;39592:69;;;;-1:-1:-1;;;39592:69:0;;15917:2:1;39592:69:0;;;15899:21:1;15956:2;15936:18;;;15929:30;15995:34;15975:18;;;15968:62;-1:-1:-1;;;16046:18:1;;;16039:33;16089:19;;39592:69:0;15715:399:1;39592:69:0;-1:-1:-1;;;;;39697:15:0;;;;;;:9;:15;;;;;39715:20;;;39697:38;;39757:12;:22;;39729:6;;39697:15;39757:22;;39729:6;;39757:22;:::i;:::-;;;;;;;;39814:4;-1:-1:-1;;;;;39797:50:0;39804:8;-1:-1:-1;;;;;39797:50:0;;39820:6;39828:4;39834:12;39797:50;;;;;;;;:::i;:::-;;;;;;;;39863:34;;17030:25:1;;;39886:1:0;;-1:-1:-1;;;;;39863:34:0;;;;;17018:2:1;17003:18;39863:34:0;;;;;;;;39221:684;;39070:835;;;;:::o;36854:747::-;-1:-1:-1;;;;;37066:21:0;;37058:66;;;;-1:-1:-1;;;37058:66:0;;12671:2:1;37058:66:0;;;12653:21:1;;;12690:18;;;12683:30;12749:34;12729:18;;;12722:62;12801:18;;37058:66:0;12469:356:1;37058:66:0;37137:16;25495:10;37137:31;;37304:6;37288:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;37321:18:0;;;;;;:9;:18;;;;;:28;;37343:6;;37321:18;:28;;37343:6;;37321:28;:::i;:::-;;;;-1:-1:-1;37362:103:0;;-1:-1:-1;37382:8:0;37400:1;37404:7;37413:6;37421:8;37431:12;37445:19;37362;:103::i;:::-;37500:7;-1:-1:-1;;;;;37483:57:0;37490:8;-1:-1:-1;;;;;37483:57:0;;37509:6;37517:8;37527:12;37483:57;;;;;;;;:::i;:::-;;;;;;;;37556:37;;17030:25:1;;;-1:-1:-1;;;;;37556:37:0;;;37573:1;;37556:37;;17018:2:1;17003:18;37556:37:0;16884:177:1;14:718;56:5;109:3;102:4;94:6;90:17;86:27;76:55;;127:1;124;117:12;76:55;163:6;150:20;189:18;226:2;222;219:10;216:36;;;232:18;;:::i;:::-;307:2;301:9;275:2;361:13;;-1:-1:-1;;357:22:1;;;381:2;353:31;349:40;337:53;;;405:18;;;425:22;;;402:46;399:72;;;451:18;;:::i;:::-;491:10;487:2;480:22;526:2;518:6;511:18;572:3;565:4;560:2;552:6;548:15;544:26;541:35;538:55;;;589:1;586;579:12;538:55;653:2;646:4;638:6;634:17;627:4;619:6;615:17;602:54;700:1;693:4;688:2;680:6;676:15;672:26;665:37;720:6;711:15;;;;;;14:718;;;;:::o;737:247::-;796:6;849:2;837:9;828:7;824:23;820:32;817:52;;;865:1;862;855:12;817:52;904:9;891:23;923:31;948:5;923:31;:::i;989:251::-;1059:6;1112:2;1100:9;1091:7;1087:23;1083:32;1080:52;;;1128:1;1125;1118:12;1080:52;1160:9;1154:16;1179:31;1204:5;1179:31;:::i;1245:388::-;1313:6;1321;1374:2;1362:9;1353:7;1349:23;1345:32;1342:52;;;1390:1;1387;1380:12;1342:52;1429:9;1416:23;1448:31;1473:5;1448:31;:::i;:::-;1498:5;-1:-1:-1;1555:2:1;1540:18;;1527:32;1568:33;1527:32;1568:33;:::i;:::-;1620:7;1610:17;;;1245:388;;;;;:::o;1638:456::-;1715:6;1723;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;-1:-1:-1;1965:2:1;1950:18;;1937:32;1978:33;1937:32;1978:33;:::i;:::-;1638:456;;2030:7;;-1:-1:-1;;;2084:2:1;2069:18;;;;2056:32;;1638:456::o;2099:885::-;2212:6;2220;2228;2236;2244;2297:3;2285:9;2276:7;2272:23;2268:33;2265:53;;;2314:1;2311;2304:12;2265:53;2353:9;2340:23;2372:31;2397:5;2372:31;:::i;:::-;2422:5;-1:-1:-1;2479:2:1;2464:18;;2451:32;2492:33;2451:32;2492:33;:::i;:::-;2544:7;-1:-1:-1;2598:2:1;2583:18;;2570:32;;-1:-1:-1;2653:2:1;2638:18;;2625:32;2676:18;2706:14;;;2703:34;;;2733:1;2730;2723:12;2703:34;2756:49;2797:7;2788:6;2777:9;2773:22;2756:49;:::i;:::-;2746:59;;2858:3;2847:9;2843:19;2830:33;2814:49;;2888:2;2878:8;2875:16;2872:36;;;2904:1;2901;2894:12;2872:36;;2927:51;2970:7;2959:8;2948:9;2944:24;2927:51;:::i;:::-;2917:61;;;2099:885;;;;;;;;:::o;2989:315::-;3057:6;3065;3118:2;3106:9;3097:7;3093:23;3089:32;3086:52;;;3134:1;3131;3124:12;3086:52;3173:9;3160:23;3192:31;3217:5;3192:31;:::i;:::-;3242:5;3294:2;3279:18;;;;3266:32;;-1:-1:-1;;;2989:315:1:o;3309:523::-;3395:6;3403;3411;3464:2;3452:9;3443:7;3439:23;3435:32;3432:52;;;3480:1;3477;3470:12;3432:52;3519:9;3506:23;3538:31;3563:5;3538:31;:::i;:::-;3588:5;-1:-1:-1;3640:2:1;3625:18;;3612:32;;-1:-1:-1;3695:2:1;3680:18;;3667:32;3722:18;3711:30;;3708:50;;;3754:1;3751;3744:12;3708:50;3777:49;3818:7;3809:6;3798:9;3794:22;3777:49;:::i;:::-;3767:59;;;3309:523;;;;;:::o;3837:743::-;3941:6;3949;3957;3965;4018:3;4006:9;3997:7;3993:23;3989:33;3986:53;;;4035:1;4032;4025:12;3986:53;4074:9;4061:23;4093:31;4118:5;4093:31;:::i;:::-;4143:5;-1:-1:-1;4195:2:1;4180:18;;4167:32;;-1:-1:-1;4250:2:1;4235:18;;4222:32;4273:18;4303:14;;;4300:34;;;4330:1;4327;4320:12;4300:34;4353:49;4394:7;4385:6;4374:9;4370:22;4353:49;:::i;:::-;4343:59;;4455:2;4444:9;4440:18;4427:32;4411:48;;4484:2;4474:8;4471:16;4468:36;;;4500:1;4497;4490:12;4468:36;;4523:51;4566:7;4555:8;4544:9;4540:24;4523:51;:::i;:::-;4513:61;;;3837:743;;;;;;;:::o;4585:277::-;4652:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:52;;;4721:1;4718;4711:12;4673:52;4753:9;4747:16;4806:5;4799:13;4792:21;4785:5;4782:32;4772:60;;4828:1;4825;4818:12;4867:184;4937:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:52;;;5006:1;5003;4996:12;4958:52;-1:-1:-1;5029:16:1;;4867:184;-1:-1:-1;4867:184:1:o;5056:388::-;5133:6;5141;5194:2;5182:9;5173:7;5169:23;5165:32;5162:52;;;5210:1;5207;5200:12;5162:52;5246:9;5233:23;5223:33;;5307:2;5296:9;5292:18;5279:32;5334:18;5326:6;5323:30;5320:50;;;5366:1;5363;5356:12;5320:50;5389:49;5430:7;5421:6;5410:9;5406:22;5389:49;:::i;:::-;5379:59;;;5056:388;;;;;:::o;5449:471::-;5490:3;5528:5;5522:12;5555:6;5550:3;5543:19;5580:1;5590:162;5604:6;5601:1;5598:13;5590:162;;;5666:4;5722:13;;;5718:22;;5712:29;5694:11;;;5690:20;;5683:59;5619:12;5590:162;;;5770:6;5767:1;5764:13;5761:87;;;5836:1;5829:4;5820:6;5815:3;5811:16;5807:27;5800:38;5761:87;-1:-1:-1;5902:2:1;5881:15;-1:-1:-1;;5877:29:1;5868:39;;;;5909:4;5864:50;;5449:471;-1:-1:-1;;5449:471:1:o;6133:730::-;-1:-1:-1;;;;;6476:15:1;;;6458:34;;6528:15;;;6523:2;6508:18;;6501:43;6580:15;;6575:2;6560:18;;6553:43;6627:2;6612:18;;6605:34;;;6676:3;6670;6655:19;;6648:32;;;6401:4;;6703:45;;6728:19;;6720:6;6703:45;:::i;:::-;6797:9;6789:6;6785:22;6779:3;6768:9;6764:19;6757:51;6825:32;6850:6;6842;6825:32;:::i;:::-;6817:40;6133:730;-1:-1:-1;;;;;;;;;6133:730:1:o;7426:658::-;7597:2;7649:21;;;7719:13;;7622:18;;;7741:22;;;7568:4;;7597:2;7820:15;;;;7794:2;7779:18;;;7568:4;7863:195;7877:6;7874:1;7871:13;7863:195;;;7942:13;;-1:-1:-1;;;;;7938:39:1;7926:52;;8033:15;;;;7998:12;;;;7974:1;7892:9;7863:195;;;-1:-1:-1;8075:3:1;;7426:658;-1:-1:-1;;;;;;7426:658:1:o;8281:219::-;8430:2;8419:9;8412:21;8393:4;8450:44;8490:2;8479:9;8475:18;8467:6;8450:44;:::i;13677:400::-;13879:2;13861:21;;;13918:2;13898:18;;;13891:30;13957:34;13952:2;13937:18;;13930:62;-1:-1:-1;;;14023:2:1;14008:18;;14001:34;14067:3;14052:19;;13677:400::o;14082:408::-;14284:2;14266:21;;;14323:2;14303:18;;;14296:30;14362:34;14357:2;14342:18;;14335:62;-1:-1:-1;;;14428:2:1;14413:18;;14406:42;14480:3;14465:19;;14082:408::o;17066:448::-;17287:6;17276:9;17269:25;17330:2;17325;17314:9;17310:18;17303:30;17250:4;17356:44;17396:2;17385:9;17381:18;17373:6;17356:44;:::i;:::-;17448:9;17440:6;17436:22;17431:2;17420:9;17416:18;17409:50;17476:32;17501:6;17493;17476:32;:::i;:::-;17468:40;17066:448;-1:-1:-1;;;;;;17066:448:1:o;17708:128::-;17748:3;17779:1;17775:6;17772:1;17769:13;17766:39;;;17785:18;;:::i;:::-;-1:-1:-1;17821:9:1;;17708:128::o;17841:217::-;17881:1;17907;17897:132;;17951:10;17946:3;17942:20;17939:1;17932:31;17986:4;17983:1;17976:15;18014:4;18011:1;18004:15;17897:132;-1:-1:-1;18043:9:1;;17841:217::o;18063:168::-;18103:7;18169:1;18165;18161:6;18157:14;18154:1;18151:21;18146:1;18139:9;18132:17;18128:45;18125:71;;;18176:18;;:::i;:::-;-1:-1:-1;18216:9:1;;18063:168::o;18236:125::-;18276:4;18304:1;18301;18298:8;18295:34;;;18309:18;;:::i;:::-;-1:-1:-1;18346:9:1;;18236:125::o;18366:380::-;18445:1;18441:12;;;;18488;;;18509:61;;18563:4;18555:6;18551:17;18541:27;;18509:61;18616:2;18608:6;18605:14;18585:18;18582:38;18579:161;;;18662:10;18657:3;18653:20;18650:1;18643:31;18697:4;18694:1;18687:15;18725:4;18722:1;18715:15;18579:161;;18366:380;;;:::o;18751:127::-;18812:10;18807:3;18803:20;18800:1;18793:31;18843:4;18840:1;18833:15;18867:4;18864:1;18857:15;18883:127;18944:10;18939:3;18935:20;18932:1;18925:31;18975:4;18972:1;18965:15;18999:4;18996:1;18989:15;19015:131;-1:-1:-1;;;;;19090:31:1;;19080:42;;19070:70;;19136:1;19133;19126:12

Swarm Source

ipfs://8cd1ca1d480bc2a3355e84afbb0768c216703cbecd099c3e05d40bea4bc57b8b

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.