Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 246 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 20713109 | 35 days ago | IN | 0 ETH | 0.00105963 | ||||
Approve | 20617199 | 48 days ago | IN | 0 ETH | 0.00004017 | ||||
Approve | 20617106 | 48 days ago | IN | 0 ETH | 0.0000822 | ||||
Transfer | 20212170 | 105 days ago | IN | 0 ETH | 0.00036032 | ||||
Approve | 19982195 | 137 days ago | IN | 0 ETH | 0.00035523 | ||||
Transfer | 19982157 | 137 days ago | IN | 0 ETH | 0.00065277 | ||||
Transfer | 19305939 | 232 days ago | IN | 0 ETH | 0.00229608 | ||||
Transfer | 18835787 | 298 days ago | IN | 0 ETH | 0.00314255 | ||||
Approve | 18819408 | 300 days ago | IN | 0 ETH | 0.00208879 | ||||
Transfer | 18819378 | 300 days ago | IN | 0 ETH | 0.00358979 | ||||
Transfer | 18415615 | 357 days ago | IN | 0 ETH | 0.00092617 | ||||
Transfer | 17952455 | 421 days ago | IN | 0 ETH | 0.00077594 | ||||
Transfer | 17874988 | 432 days ago | IN | 0 ETH | 0.00066257 | ||||
Approve | 17756764 | 449 days ago | IN | 0 ETH | 0.0014296 | ||||
Approve | 17648026 | 464 days ago | IN | 0 ETH | 0.00085933 | ||||
Approve | 17401795 | 499 days ago | IN | 0 ETH | 0.00215894 | ||||
Approve | 17308656 | 512 days ago | IN | 0 ETH | 0.00143495 | ||||
Transfer | 17294520 | 514 days ago | IN | 0 ETH | 0.00505606 | ||||
Approve | 17271375 | 517 days ago | IN | 0 ETH | 0.00184273 | ||||
Approve | 17271262 | 517 days ago | IN | 0 ETH | 0.00188927 | ||||
Transfer | 17269600 | 517 days ago | IN | 0 ETH | 0.00424222 | ||||
Approve | 17261538 | 518 days ago | IN | 0 ETH | 0.00102841 | ||||
Transfer | 17261530 | 518 days ago | IN | 0 ETH | 0.00141171 | ||||
Approve | 17261500 | 518 days ago | IN | 0 ETH | 0.001585 | ||||
Approve | 16942735 | 564 days ago | IN | 0 ETH | 0.00109715 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ITR
Compiler Version
v0.8.7+commit.e28d00a7
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60806040526aa56fa5b99019a5c8000000600a553480156200002057600080fd5b50604080518082018252601881527f496e746572636f696e20496e766573746f7220546f6b656e000000000000000060208083019190915282518084018452600381526224aa2960e91b818301528351600081529182019093529091906200008833620002ae565b82516200009d90600390602086019062000333565b508151620000b390600490602085019062000333565b508051620000c9906005906020840190620003c2565b5060005b81518110156200013957600160066000848481518110620000f257620000f262000498565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000130816200046e565b915050620000cd565b506040516329965a1d60e01b815230600482018190527fac7fbab5f54a3ca8194167523c6753bfeb96a445279294b6125b68cce217705460248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad24906329965a1d90606401600060405180830381600087803b158015620001b457600080fd5b505af1158015620001c9573d6000803e3d6000fd5b50506040516329965a1d60e01b815230600482018190527faea199e31a596269b42cdafd93407f14436db6e4cad65417994c2eb37381e05a60248301526044820152731820a4b7618bde71dce8cdc73aab6c95905fad2492506329965a1d9150606401600060405180830381600087803b1580156200024757600080fd5b505af11580156200025c573d6000803e3d6000fd5b50505050505050620002a86aa56fa5b99019a5c8000000736ef5febbd2a56fab23f18a69d3fb9f4e2a70440b6107d062278d0069065a4da25d3016c000006064620002fe60201b60201c565b620004ae565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600f55600e55600c55600d55600b80546001600160a01b0319166001600160a01b0392909216919091179055600a5542601055565b828054620003419062000431565b90600052602060002090601f016020900481019282620003655760008555620003b0565b82601f106200038057805160ff1916838001178555620003b0565b82800160010185558215620003b0579182015b82811115620003b057825182559160200191906001019062000393565b50620003be9291506200041a565b5090565b828054828255906000526020600020908101928215620003b0579160200282015b82811115620003b057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003e3565b5b80821115620003be57600081556001016200041b565b600181811c908216806200044657607f821691505b602082108114156200046857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200049157634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b61205f80620004be6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063d8a5436011610097578063f2fde38b11610071578063f2fde38b1461036e578063fad8b32a14610381578063fc673c4f14610394578063fe9d9303146103a757600080fd5b8063d8a543601461031a578063d95b637114610322578063dd62ed3e1461033557600080fd5b80639bd9bbc6116100d35780639bd9bbc6146102e35780639fb7ef31146102f6578063a02fbbf4146102ff578063a9059cbb1461030757600080fd5b80638da5cb5b146102ad578063959b8c3f146102c857806395d89b41146102db57600080fd5b806323b872dd116101665780635db30bb1116101405780635db30bb11461026157806362ad1b831461026957806370a082311461027c578063715018a6146102a557600080fd5b806323b872dd14610238578063313ce5671461024b578063556f0dc71461025a57600080fd5b806306e48538146101ae57806306fdde03146101cc578063095ea7b3146101e15780630c428b611461020457806318160ddd1461021b5780631e83409a14610223575b600080fd5b6101b66103ba565b6040516101c39190611e18565b60405180910390f35b6101d461041c565b6040516101c39190611e65565b6101f46101ef366004611bea565b6104a5565b60405190151581526020016101c3565b61020d600d5481565b6040519081526020016101c3565b60025461020d565b610236610231366004611aa3565b6104bd565b005b6101f4610246366004611b16565b610882565b604051601281526020016101c3565b600161020d565b600a5461020d565b610236610277366004611b57565b610a42565b61020d61028a366004611aa3565b6001600160a01b031660009081526001602052604090205490565b610236610a77565b6000546040516001600160a01b0390911681526020016101c3565b6102366102d6366004611aa3565b610add565b6101d4610bfb565b6102366102f1366004611c16565b610c0a565b61020d600c5481565b61020d610c2d565b6101f4610315366004611bea565b610c54565b61020d610d07565b6101f4610330366004611add565b610d1e565b61020d610343366004611add565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61023661037c366004611aa3565b610dc0565b61023661038f366004611aa3565b610e8b565b6102366103a2366004611c6f565b610fa7565b6102366103b5366004611d2a565b610fdf565b6060600580548060200260200160405190810160405280929190818152602001828054801561041257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f4575b5050505050905090565b60606003805461042b90611fad565b80601f016020809104026020016040519081016040528092919081815260200182805461045790611fad565b80156104125780601f1061047957610100808354040283529160200191610412565b820191906000526020600020905b81548152906001019060200180831161048757509395945050505050565b6000336104b3818585610ffe565b5060019392505050565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561050357600080fd5b505afa158015610517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053b9190611d11565b600b546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561058457600080fd5b505afa158015610598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105bc9190611d11565b9050600081116106065760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b60448201526064015b60405180910390fd5b600e548111801561063d575061063a620186a0610634610624610c2d565b61062e8686611125565b90611131565b9061113d565b81115b156106955760405162461bcd60e51b815260206004820152602260248201527f706c6561736520636c61696d206c65737320746f6b656e7320706572206d6f6e6044820152610e8d60f31b60648201526084016105fd565b600c546000906106a99061062e428261113d565b90506011548114156106ca576012546106c29083611125565b6012556106d5565b601181905560128290555b6012546106f3620186a06106346106ea610c2d565b600a5490611131565b10156107675760405162461bcd60e51b815260206004820152603760248201527f706c6561736520776169742c20746f6f206d616e7920746f6b656e7320616c7260448201527f6561647920636c61696d65642074686973206d6f6e746800000000000000000060648201526084016105fd565b600a5461077d8361077760025490565b90611125565b11156107cb5760405162461bcd60e51b815260206004820181905260248201527f7468697320776f756c6420657863656564206d6178546f74616c537570706c7960448201526064016105fd565b6107f584836040518060200160405280600081525060405180602001604052806000815250611149565b600b5460405163a9059cbb60e01b815261dead6004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561084357600080fd5b505af1158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b9190611cef565b5050505050565b60006001600160a01b0383166108aa5760405162461bcd60e51b81526004016105fd90611e78565b6001600160a01b03841661090f5760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b6000339050610940818686866040518060200160405280600081525060405180602001604052806000815250611157565b61096c81868686604051806020016040528060008152506040518060200160405280600081525061128e565b6001600160a01b03808616600090815260096020908152604080832093851683529290522054838110156109f45760405162461bcd60e51b815260206004820152602960248201527f4552433737373a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b60648201526084016105fd565b610a088683610a038785611f96565b610ffe565b610a3682878787604051806020016040528060008152506040518060200160405280600081525060006113f4565b50600195945050505050565b610a4c3386610d1e565b610a685760405162461bcd60e51b81526004016105fd90611ebc565b61087b858585858560016115c8565b6000546001600160a01b03163314610ad15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b610adb60006116ab565b565b336001600160a01b0382161415610b425760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610b93573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19169055610bc2565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606004805461042b90611fad565b610c28338484846040518060200160405280600081525060016115c8565b505050565b6000610c4f610c46610c3d6116fb565b600f5490611131565b600d5490611125565b905090565b60006001600160a01b038316610c7c5760405162461bcd60e51b81526004016105fd90611e78565b6000339050610cad818286866040518060200160405280600081525060405180602001604052806000815250611157565b610cd981828686604051806020016040528060008152506040518060200160405280600081525061128e565b6104b381828686604051806020016040528060008152506040518060200160405280600081525060006113f4565b6000610c4f610d1560025490565b600a5490611718565b6000816001600160a01b0316836001600160a01b03161480610d8957506001600160a01b03831660009081526006602052604090205460ff168015610d8957506001600160a01b0380831660009081526008602090815260408083209387168352929052205460ff16155b80610db957506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff165b9392505050565b6000546001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b6001600160a01b038116610e7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b610e88816116ab565b50565b6001600160a01b038116331415610eee5760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610f42573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f6e565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b610fb13385610d1e565b610fcd5760405162461bcd60e51b81526004016105fd90611ebc565b610fd984848484611724565b50505050565b610ffa33838360405180602001604052806000815250611724565b5050565b6001600160a01b0383166110625760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105fd565b6001600160a01b0382166110c45760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105fd565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610db98284611f3d565b6000610db98284611f77565b6000610db98284611f55565b610fd98484848460016118d9565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b9190611ac0565b90506001600160a01b0381161561128557604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611252908a908a908a908a908a908a90600401611dbe565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b505050505b50505050505050565b6001600160a01b038516600090815260016020526040902054838110156113075760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b60648201526084016105fd565b6001600160a01b0380871660009081526001602052604080822087850390559187168152908120805486929061133e908490611f3d565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161139693929190611f08565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516113e391815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611ac0565b90506001600160a01b03811615611524576040516223de2960e01b81526001600160a01b038216906223de29906114ed908b908b908b908b908b908b90600401611dbe565b600060405180830381600087803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506115be565b81156115be576001600160a01b0386163b156115be5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a4016105fd565b5050505050505050565b6001600160a01b0386166116295760405162461bcd60e51b815260206004820152602260248201527f4552433737373a2073656e642066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b6001600160a01b03851661167f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f206164647265737360448201526064016105fd565b3361168e818888888888611157565b61169c81888888888861128e565b611285818888888888886113f4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c4f600c546106346010544261171890919063ffffffff16565b6000610db98284611f96565b6001600160a01b0384166117855760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b3361179581866000878787611157565b6001600160a01b0385166000908152600160205260409020548481101561180a5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b60648201526084016105fd565b6001600160a01b0386166000908152600160205260408120868303905560028054879290611839908490611f96565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161188793929190611f08565b60405180910390a36040518581526000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050505050565b6001600160a01b03851661192f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fd565b600033905084600260008282546119469190611f3d565b90915550506001600160a01b03861660009081526001602052604081208054879290611973908490611f3d565b90915550611989905081600088888888886113f4565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516119d093929190611f08565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016118c9565b600082601f830112611a2757600080fd5b813567ffffffffffffffff80821115611a4257611a42611ffe565b604051601f8301601f19908116603f01168101908282118183101715611a6a57611a6a611ffe565b81604052838152866020858801011115611a8357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ab557600080fd5b8135610db981612014565b600060208284031215611ad257600080fd5b8151610db981612014565b60008060408385031215611af057600080fd5b8235611afb81612014565b91506020830135611b0b81612014565b809150509250929050565b600080600060608486031215611b2b57600080fd5b8335611b3681612014565b92506020840135611b4681612014565b929592945050506040919091013590565b600080600080600060a08688031215611b6f57600080fd5b8535611b7a81612014565b94506020860135611b8a81612014565b935060408601359250606086013567ffffffffffffffff80821115611bae57600080fd5b611bba89838a01611a16565b93506080880135915080821115611bd057600080fd5b50611bdd88828901611a16565b9150509295509295909350565b60008060408385031215611bfd57600080fd5b8235611c0881612014565b946020939093013593505050565b600080600060608486031215611c2b57600080fd5b8335611c3681612014565b925060208401359150604084013567ffffffffffffffff811115611c5957600080fd5b611c6586828701611a16565b9150509250925092565b60008060008060808587031215611c8557600080fd5b8435611c9081612014565b935060208501359250604085013567ffffffffffffffff80821115611cb457600080fd5b611cc088838901611a16565b93506060870135915080821115611cd657600080fd5b50611ce387828801611a16565b91505092959194509250565b600060208284031215611d0157600080fd5b81518015158114610db957600080fd5b600060208284031215611d2357600080fd5b5051919050565b60008060408385031215611d3d57600080fd5b82359150602083013567ffffffffffffffff811115611d5b57600080fd5b611d6785828601611a16565b9150509250929050565b6000815180845260005b81811015611d9757602081850181015186830182015201611d7b565b81811115611da9576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c060808201819052600090611df990830185611d71565b82810360a0840152611e0b8185611d71565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611e595783516001600160a01b031683529284019291840191600101611e34565b50909695505050505050565b602081526000610db96020830184611d71565b60208082526024908201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b838152606060208201526000611f216060830185611d71565b8281036040840152611f338185611d71565b9695505050505050565b60008219821115611f5057611f50611fe8565b500190565b600082611f7257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f9157611f91611fe8565b500290565b600082821015611fa857611fa8611fe8565b500390565b600181811c90821680611fc157607f821691505b60208210811415611fe257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e8857600080fdfea26469706673582212208cd1ca1d480bc2a3355e84afbb0768c216703cbecd099c3e05d40bea4bc57b8b64736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80638da5cb5b116100f9578063d8a5436011610097578063f2fde38b11610071578063f2fde38b1461036e578063fad8b32a14610381578063fc673c4f14610394578063fe9d9303146103a757600080fd5b8063d8a543601461031a578063d95b637114610322578063dd62ed3e1461033557600080fd5b80639bd9bbc6116100d35780639bd9bbc6146102e35780639fb7ef31146102f6578063a02fbbf4146102ff578063a9059cbb1461030757600080fd5b80638da5cb5b146102ad578063959b8c3f146102c857806395d89b41146102db57600080fd5b806323b872dd116101665780635db30bb1116101405780635db30bb11461026157806362ad1b831461026957806370a082311461027c578063715018a6146102a557600080fd5b806323b872dd14610238578063313ce5671461024b578063556f0dc71461025a57600080fd5b806306e48538146101ae57806306fdde03146101cc578063095ea7b3146101e15780630c428b611461020457806318160ddd1461021b5780631e83409a14610223575b600080fd5b6101b66103ba565b6040516101c39190611e18565b60405180910390f35b6101d461041c565b6040516101c39190611e65565b6101f46101ef366004611bea565b6104a5565b60405190151581526020016101c3565b61020d600d5481565b6040519081526020016101c3565b60025461020d565b610236610231366004611aa3565b6104bd565b005b6101f4610246366004611b16565b610882565b604051601281526020016101c3565b600161020d565b600a5461020d565b610236610277366004611b57565b610a42565b61020d61028a366004611aa3565b6001600160a01b031660009081526001602052604090205490565b610236610a77565b6000546040516001600160a01b0390911681526020016101c3565b6102366102d6366004611aa3565b610add565b6101d4610bfb565b6102366102f1366004611c16565b610c0a565b61020d600c5481565b61020d610c2d565b6101f4610315366004611bea565b610c54565b61020d610d07565b6101f4610330366004611add565b610d1e565b61020d610343366004611add565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b61023661037c366004611aa3565b610dc0565b61023661038f366004611aa3565b610e8b565b6102366103a2366004611c6f565b610fa7565b6102366103b5366004611d2a565b610fdf565b6060600580548060200260200160405190810160405280929190818152602001828054801561041257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116103f4575b5050505050905090565b60606003805461042b90611fad565b80601f016020809104026020016040519081016040528092919081815260200182805461045790611fad565b80156104125780601f1061047957610100808354040283529160200191610412565b820191906000526020600020905b81548152906001019060200180831161048757509395945050505050565b6000336104b3818585610ffe565b5060019392505050565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a082319060240160206040518083038186803b15801561050357600080fd5b505afa158015610517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061053b9190611d11565b600b546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b15801561058457600080fd5b505afa158015610598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105bc9190611d11565b9050600081116106065760405162461bcd60e51b815260206004820152601060248201526f6e6f7468696e6720746f20636c61696d60801b60448201526064015b60405180910390fd5b600e548111801561063d575061063a620186a0610634610624610c2d565b61062e8686611125565b90611131565b9061113d565b81115b156106955760405162461bcd60e51b815260206004820152602260248201527f706c6561736520636c61696d206c65737320746f6b656e7320706572206d6f6e6044820152610e8d60f31b60648201526084016105fd565b600c546000906106a99061062e428261113d565b90506011548114156106ca576012546106c29083611125565b6012556106d5565b601181905560128290555b6012546106f3620186a06106346106ea610c2d565b600a5490611131565b10156107675760405162461bcd60e51b815260206004820152603760248201527f706c6561736520776169742c20746f6f206d616e7920746f6b656e7320616c7260448201527f6561647920636c61696d65642074686973206d6f6e746800000000000000000060648201526084016105fd565b600a5461077d8361077760025490565b90611125565b11156107cb5760405162461bcd60e51b815260206004820181905260248201527f7468697320776f756c6420657863656564206d6178546f74616c537570706c7960448201526064016105fd565b6107f584836040518060200160405280600081525060405180602001604052806000815250611149565b600b5460405163a9059cbb60e01b815261dead6004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561084357600080fd5b505af1158015610857573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087b9190611cef565b5050505050565b60006001600160a01b0383166108aa5760405162461bcd60e51b81526004016105fd90611e78565b6001600160a01b03841661090f5760405162461bcd60e51b815260206004820152602660248201527f4552433737373a207472616e736665722066726f6d20746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b6000339050610940818686866040518060200160405280600081525060405180602001604052806000815250611157565b61096c81868686604051806020016040528060008152506040518060200160405280600081525061128e565b6001600160a01b03808616600090815260096020908152604080832093851683529290522054838110156109f45760405162461bcd60e51b815260206004820152602960248201527f4552433737373a207472616e7366657220616d6f756e74206578636565647320604482015268616c6c6f77616e636560b81b60648201526084016105fd565b610a088683610a038785611f96565b610ffe565b610a3682878787604051806020016040528060008152506040518060200160405280600081525060006113f4565b50600195945050505050565b610a4c3386610d1e565b610a685760405162461bcd60e51b81526004016105fd90611ebc565b61087b858585858560016115c8565b6000546001600160a01b03163314610ad15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b610adb60006116ab565b565b336001600160a01b0382161415610b425760405162461bcd60e51b8152602060048201526024808201527f4552433737373a20617574686f72697a696e672073656c66206173206f70657260448201526330ba37b960e11b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610b93573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19169055610bc2565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191660011790555b60405133906001600160a01b038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60606004805461042b90611fad565b610c28338484846040518060200160405280600081525060016115c8565b505050565b6000610c4f610c46610c3d6116fb565b600f5490611131565b600d5490611125565b905090565b60006001600160a01b038316610c7c5760405162461bcd60e51b81526004016105fd90611e78565b6000339050610cad818286866040518060200160405280600081525060405180602001604052806000815250611157565b610cd981828686604051806020016040528060008152506040518060200160405280600081525061128e565b6104b381828686604051806020016040528060008152506040518060200160405280600081525060006113f4565b6000610c4f610d1560025490565b600a5490611718565b6000816001600160a01b0316836001600160a01b03161480610d8957506001600160a01b03831660009081526006602052604090205460ff168015610d8957506001600160a01b0380831660009081526008602090815260408083209387168352929052205460ff16155b80610db957506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff165b9392505050565b6000546001600160a01b03163314610e1a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fd565b6001600160a01b038116610e7f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105fd565b610e88816116ab565b50565b6001600160a01b038116331415610eee5760405162461bcd60e51b815260206004820152602160248201527f4552433737373a207265766f6b696e672073656c66206173206f70657261746f6044820152603960f91b60648201526084016105fd565b6001600160a01b03811660009081526006602052604090205460ff1615610f42573360009081526008602090815260408083206001600160a01b03851684529091529020805460ff19166001179055610f6e565b3360009081526007602090815260408083206001600160a01b03851684529091529020805460ff191690555b60405133906001600160a01b038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b610fb13385610d1e565b610fcd5760405162461bcd60e51b81526004016105fd90611ebc565b610fd984848484611724565b50505050565b610ffa33838360405180602001604052806000815250611724565b5050565b6001600160a01b0383166110625760405162461bcd60e51b815260206004820152602560248201527f4552433737373a20617070726f76652066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105fd565b6001600160a01b0382166110c45760405162461bcd60e51b815260206004820152602360248201527f4552433737373a20617070726f766520746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105fd565b6001600160a01b0383811660008181526009602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000610db98284611f3d565b6000610db98284611f77565b6000610db98284611f55565b610fd98484848460016118d9565b60405163555ddc6560e11b81526001600160a01b03861660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe8956024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b1580156111d357600080fd5b505afa1580156111e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120b9190611ac0565b90506001600160a01b0381161561128557604051633ad5cbc160e11b81526001600160a01b038216906375ab978290611252908a908a908a908a908a908a90600401611dbe565b600060405180830381600087803b15801561126c57600080fd5b505af1158015611280573d6000803e3d6000fd5b505050505b50505050505050565b6001600160a01b038516600090815260016020526040902054838110156113075760405162461bcd60e51b815260206004820152602760248201527f4552433737373a207472616e7366657220616d6f756e7420657863656564732060448201526662616c616e636560c81b60648201526084016105fd565b6001600160a01b0380871660009081526001602052604080822087850390559187168152908120805486929061133e908490611f3d565b92505081905550846001600160a01b0316866001600160a01b0316886001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc8261467798787878760405161139693929190611f08565b60405180910390a4846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516113e391815260200190565b60405180910390a350505050505050565b60405163555ddc6560e11b81526001600160a01b03861660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b6024820152600090731820a4b7618bde71dce8cdc73aab6c95905fad249063aabbb8ca9060440160206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190611ac0565b90506001600160a01b03811615611524576040516223de2960e01b81526001600160a01b038216906223de29906114ed908b908b908b908b908b908b90600401611dbe565b600060405180830381600087803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506115be565b81156115be576001600160a01b0386163b156115be5760405162461bcd60e51b815260206004820152604d60248201527f4552433737373a20746f6b656e20726563697069656e7420636f6e747261637460448201527f20686173206e6f20696d706c656d656e74657220666f7220455243373737546f60648201526c1ad95b9cd49958da5c1a595b9d609a1b608482015260a4016105fd565b5050505050505050565b6001600160a01b0386166116295760405162461bcd60e51b815260206004820152602260248201527f4552433737373a2073656e642066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b6001600160a01b03851661167f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f206164647265737360448201526064016105fd565b3361168e818888888888611157565b61169c81888888888861128e565b611285818888888888886113f4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c4f600c546106346010544261171890919063ffffffff16565b6000610db98284611f96565b6001600160a01b0384166117855760405162461bcd60e51b815260206004820152602260248201527f4552433737373a206275726e2066726f6d20746865207a65726f206164647265604482015261737360f01b60648201526084016105fd565b3361179581866000878787611157565b6001600160a01b0385166000908152600160205260409020548481101561180a5760405162461bcd60e51b815260206004820152602360248201527f4552433737373a206275726e20616d6f756e7420657863656564732062616c616044820152626e636560e81b60648201526084016105fd565b6001600160a01b0386166000908152600160205260408120868303905560028054879290611839908490611f96565b92505081905550856001600160a01b0316826001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a409887878760405161188793929190611f08565b60405180910390a36040518581526000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a3505050505050565b6001600160a01b03851661192f5760405162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fd565b600033905084600260008282546119469190611f3d565b90915550506001600160a01b03861660009081526001602052604081208054879290611973908490611f3d565b90915550611989905081600088888888886113f4565b856001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d8787876040516119d093929190611f08565b60405180910390a36040518581526001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016118c9565b600082601f830112611a2757600080fd5b813567ffffffffffffffff80821115611a4257611a42611ffe565b604051601f8301601f19908116603f01168101908282118183101715611a6a57611a6a611ffe565b81604052838152866020858801011115611a8357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060208284031215611ab557600080fd5b8135610db981612014565b600060208284031215611ad257600080fd5b8151610db981612014565b60008060408385031215611af057600080fd5b8235611afb81612014565b91506020830135611b0b81612014565b809150509250929050565b600080600060608486031215611b2b57600080fd5b8335611b3681612014565b92506020840135611b4681612014565b929592945050506040919091013590565b600080600080600060a08688031215611b6f57600080fd5b8535611b7a81612014565b94506020860135611b8a81612014565b935060408601359250606086013567ffffffffffffffff80821115611bae57600080fd5b611bba89838a01611a16565b93506080880135915080821115611bd057600080fd5b50611bdd88828901611a16565b9150509295509295909350565b60008060408385031215611bfd57600080fd5b8235611c0881612014565b946020939093013593505050565b600080600060608486031215611c2b57600080fd5b8335611c3681612014565b925060208401359150604084013567ffffffffffffffff811115611c5957600080fd5b611c6586828701611a16565b9150509250925092565b60008060008060808587031215611c8557600080fd5b8435611c9081612014565b935060208501359250604085013567ffffffffffffffff80821115611cb457600080fd5b611cc088838901611a16565b93506060870135915080821115611cd657600080fd5b50611ce387828801611a16565b91505092959194509250565b600060208284031215611d0157600080fd5b81518015158114610db957600080fd5b600060208284031215611d2357600080fd5b5051919050565b60008060408385031215611d3d57600080fd5b82359150602083013567ffffffffffffffff811115611d5b57600080fd5b611d6785828601611a16565b9150509250929050565b6000815180845260005b81811015611d9757602081850181015186830182015201611d7b565b81811115611da9576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0387811682528681166020830152851660408201526060810184905260c060808201819052600090611df990830185611d71565b82810360a0840152611e0b8185611d71565b9998505050505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611e595783516001600160a01b031683529284019291840191600101611e34565b50909695505050505050565b602081526000610db96020830184611d71565b60208082526024908201527f4552433737373a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252602c908201527f4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f60408201526b39103337b9103437b63232b960a11b606082015260800190565b838152606060208201526000611f216060830185611d71565b8281036040840152611f338185611d71565b9695505050505050565b60008219821115611f5057611f50611fe8565b500190565b600082611f7257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615611f9157611f91611fe8565b500290565b600082821015611fa857611fa8611fe8565b500390565b600181811c90821680611fc157607f821691505b60208210811415611fe257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610e8857600080fdfea26469706673582212208cd1ca1d480bc2a3355e84afbb0768c216703cbecd099c3e05d40bea4bc57b8b64736f6c63430008070033
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
Loading...
Loading
Loading...
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.Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.