Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Multi Chain
Multichain Addresses
8 addresses found via BlockscanLatest 25 from a total of 6,093 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Unstake By Ids | 16927449 | 1 hr 45 mins ago | IN | 0 ETH | 0.00742459 | ||||
Stake By Ids | 16923662 | 14 hrs 34 mins ago | IN | 0 ETH | 0.00219824 | ||||
Stake By Ids | 16923537 | 14 hrs 59 mins ago | IN | 0 ETH | 0.01482206 | ||||
Unstake By Ids | 16916460 | 1 day 14 hrs ago | IN | 0 ETH | 0.00298481 | ||||
Stake By Ids | 16913976 | 1 day 23 hrs ago | IN | 0 ETH | 0.00478582 | ||||
Unstake By Ids | 16913921 | 1 day 23 hrs ago | IN | 0 ETH | 0.00256986 | ||||
Unstake By Ids | 16911521 | 2 days 7 hrs ago | IN | 0 ETH | 0.00195856 | ||||
Stake By Ids | 16911201 | 2 days 8 hrs ago | IN | 0 ETH | 0.01130352 | ||||
Unstake By Ids | 16911014 | 2 days 9 hrs ago | IN | 0 ETH | 0.00124315 | ||||
Stake By Ids | 16909121 | 2 days 15 hrs ago | IN | 0 ETH | 0.00568032 | ||||
Unstake By Ids | 16909092 | 2 days 15 hrs ago | IN | 0 ETH | 0.00039559 | ||||
Unstake By Ids | 16909091 | 2 days 15 hrs ago | IN | 0 ETH | 0.00041148 | ||||
Unstake By Ids | 16909091 | 2 days 15 hrs ago | IN | 0 ETH | 0.00041148 | ||||
Unstake By Ids | 16909091 | 2 days 15 hrs ago | IN | 0 ETH | 0.002922 | ||||
Unstake By Ids | 16909075 | 2 days 15 hrs ago | IN | 0 ETH | 0.00247948 | ||||
Unstake By Ids | 16903607 | 3 days 10 hrs ago | IN | 0 ETH | 0.00620301 | ||||
Stake By Ids | 16901269 | 3 days 18 hrs ago | IN | 0 ETH | 0.00673038 | ||||
Unstake By Ids | 16900196 | 3 days 21 hrs ago | IN | 0 ETH | 0.00618153 | ||||
Unstake By Ids | 16896475 | 4 days 10 hrs ago | IN | 0 ETH | 0.00434541 | ||||
Stake By Ids | 16895103 | 4 days 14 hrs ago | IN | 0 ETH | 0.00323877 | ||||
Unstake By Ids | 16894410 | 4 days 17 hrs ago | IN | 0 ETH | 0.00164065 | ||||
Stake By Ids | 16893756 | 4 days 19 hrs ago | IN | 0 ETH | 0.00664325 | ||||
Unstake By Ids | 16892253 | 5 days 26 mins ago | IN | 0 ETH | 0.01736244 | ||||
Stake By Ids | 16879177 | 6 days 20 hrs ago | IN | 0 ETH | 0.00852751 | ||||
Unstake By Ids | 16869533 | 8 days 5 hrs ago | IN | 0 ETH | 0.00527107 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
TheEnigmaStaker
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721.sol"; contract TheEnigmaStaker is ERC721 { modifier stakingStarted() { require( startStakeDate != 0 && startStakeDate <= block.timestamp, "You are too early" ); _; } uint256 private startStakeDate = 1638389498; address nullAddress = 0x0000000000000000000000000000000000000000; address public minersAddress; //Mapping of enigma to timestamp mapping(uint256 => uint256) public tokenIdToTimeStamp; //Mapping of enigma to staker mapping(uint256 => address) public tokenIdToStaker; //Mapping of staker to enigma mapping(address => uint256[]) public stakerToTokenIds; // Mapping of address to its tokens with number of seconds for each token mapping(address => mapping(uint256 => uint256)) public totalStakingTimeByTokenForAddress; uint256 public totalTokensStaked = 0; constructor() ERC721("TheEnigmaStaker", "ENGST") {} fallback() external payable { } receive() external payable { } function setEnigmaContractAddress(address _minersAddress) external onlyOwner { minersAddress = _minersAddress; return; } /** * @dev Sets the date that users can start staking and unstaking */ function setStartStakeDate(uint256 _startStakeDate) external onlyOwner { startStakeDate = _startStakeDate; } function getTokensStaked(address staker) external view returns (uint256[] memory) { return stakerToTokenIds[staker]; } function remove(address staker, uint256 index) internal { if (index >= stakerToTokenIds[staker].length) return; for (uint256 i = index; i < stakerToTokenIds[staker].length - 1; i++) { stakerToTokenIds[staker][i] = stakerToTokenIds[staker][i + 1]; } stakerToTokenIds[staker].pop(); } function removeTokenIdFromStaker(address staker, uint256 tokenId) internal { for (uint256 i = 0; i < stakerToTokenIds[staker].length; i++) { if (stakerToTokenIds[staker][i] == tokenId) { //This is the tokenId to remove; remove(staker, i); } } } function stakeByIds(uint256[] memory tokenIds) external stakingStarted { for (uint256 i = 0; i < tokenIds.length; i++) { require( IERC721(minersAddress).ownerOf(tokenIds[i]) == msg.sender && tokenIdToStaker[tokenIds[i]] == nullAddress, "Token must be stakable by you!" ); IERC721(minersAddress).transferFrom( msg.sender, address(this), tokenIds[i] ); stakerToTokenIds[msg.sender].push(tokenIds[i]); tokenIdToTimeStamp[tokenIds[i]] = block.timestamp; tokenIdToStaker[tokenIds[i]] = msg.sender; totalTokensStaked += 1; } } function unstakeAll() external stakingStarted { require( stakerToTokenIds[msg.sender].length > 0, "Must have at least one token staked!" ); for (uint256 i = stakerToTokenIds[msg.sender].length; i > 0; i--) { uint256 tokenId = stakerToTokenIds[msg.sender][i - 1]; IERC721(minersAddress).transferFrom( address(this), msg.sender, tokenId ); totalStakingTimeByTokenForAddress[msg.sender][tokenId] += ((block.timestamp - tokenIdToTimeStamp[tokenId])); removeTokenIdFromStaker(msg.sender, tokenId); tokenIdToStaker[tokenId] = nullAddress; totalTokensStaked = totalTokensStaked - 1; } } function unstakeByIds(uint256[] memory tokenIds) external stakingStarted { for (uint256 i = 0; i < tokenIds.length; i++) { require( tokenIdToStaker[tokenIds[i]] == msg.sender, "Message Sender was not original staker!" ); IERC721(minersAddress).transferFrom( address(this), msg.sender, tokenIds[i] ); totalStakingTimeByTokenForAddress[msg.sender][tokenIds[i]] += ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]])); removeTokenIdFromStaker(msg.sender, tokenIds[i]); tokenIdToStaker[tokenIds[i]] = nullAddress; totalTokensStaked = totalTokensStaked - 1; } } function unstakeByIdByOwner(uint256 tokenId, address addr) external stakingStarted onlyOwner { require( tokenIdToStaker[tokenId] == addr, "Staker address is not valid!" ); IERC721(minersAddress).transferFrom( address(this), addr, tokenId ); totalStakingTimeByTokenForAddress[addr][tokenId] += ((block.timestamp - tokenIdToTimeStamp[tokenId])); removeTokenIdFromStaker(addr, tokenId); tokenIdToStaker[tokenId] = nullAddress; totalTokensStaked = totalTokensStaked - 1; } function getSecondsStakedByTokenId(uint256 tokenId) external view returns (uint256) { require( tokenIdToStaker[tokenId] != nullAddress, "Token is not staked!" ); uint256 secondsStaked = block.timestamp - tokenIdToTimeStamp[tokenId]; return secondsStaked; } function getStaker(uint256 tokenId) external view returns (address) { return tokenIdToStaker[tokenId]; } }
// SPDX-License-Identifier: MIT 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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./IERC20.sol"; import "./IERC20Metadata.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./IERC721Enumerable.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; import "./Ownable.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) internal _owners; // Mapping owner address to token count mapping(address => uint256) internal _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } function _batchMint(address to, uint256[] memory tokenIds) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); _balances[to] += tokenIds.length; for (uint256 i; i < tokenIds.length; i++) { require(!_exists(tokenIds[i]), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenIds[i]); _owners[tokenIds[i]] = to; emit Transfer(address(0), to, tokenIds[i]); } } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { // solhint-disable-next-line no-inline-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSecondsStakedByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokensStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minersAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minersAddress","type":"address"}],"name":"setEnigmaContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startStakeDate","type":"uint256"}],"name":"setStartStakeDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakerToTokenIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalStakingTimeByTokenForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"addr","type":"address"}],"name":"unstakeByIdByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526361a7d6fa600755600880546001600160a01b03191690556000600e553480156200002e57600080fd5b506040518060400160405280600f81526020016e2a3432a2b734b3b6b0a9ba30b5b2b960891b81525060405180604001604052806005815260200164115391d4d560da1b8152506000620000876200010560201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000e690600190602085019062000109565b508051620000fc90600290602084019062000109565b505050620001ec565b3390565b8280546200011790620001af565b90600052602060002090601f0160209004810192826200013b576000855562000186565b82601f106200015657805160ff191683800117855562000186565b8280016001018555821562000186579182015b828111156200018657825182559160200191906001019062000169565b506200019492915062000198565b5090565b5b8082111562000194576000815560010162000199565b600281046001821680620001c457607f821691505b60208210811415620001e657634e487b7160e01b600052602260045260246000fd5b50919050565b6128aa80620001fc6000396000f3fe6080604052600436106101dc5760003560e01c8063715018a611610102578063bd87f57711610095578063e3c998fe11610064578063e3c998fe14610542578063e985e9c514610562578063f2fde38b14610582578063f419eaf8146105a2576101e3565b8063bd87f577146104c2578063c4574039146104e2578063c87b56dd14610502578063d9ffad4714610522576101e3565b8063a22cb465116100d1578063a22cb4651461044d578063b0e31b2d1461046d578063b6518b3314610482578063b88d4fde146104a2576101e3565b8063715018a6146103ee5780638da5cb5b1461040357806391f3bbb61461041857806395d89b4114610438576101e3565b806335322f371161017a57806352eb77961161014957806352eb7796146103615780636352211e1461038e57806370a08231146103ae57806370f8f9d9146103ce576101e3565b806335322f37146102ec57806342842e0e1461030157806348aa19361461032157806352543e8714610341576101e3565b8063095ea7b3116101b6578063095ea7b31461026a578063136d70611461028a57806315df1fca146102b757806323b872dd146102cc576101e3565b806301ffc9a7146101e557806306fdde031461021b578063081812fc1461023d576101e3565b366101e357005b005b3480156101f157600080fd5b50610205610200366004611ff2565b6105c2565b604051610212919061217a565b60405180910390f35b34801561022757600080fd5b5061023061060a565b6040516102129190612185565b34801561024957600080fd5b5061025d61025836600461202a565b61069c565b60405161021291906120c1565b34801561027657600080fd5b506101e3610285366004611f20565b6106e8565b34801561029657600080fd5b506102aa6102a536600461202a565b610780565b60405161021291906126e4565b3480156102c357600080fd5b5061025d6107df565b3480156102d857600080fd5b506101e36102e7366004611df3565b6107ee565b3480156102f857600080fd5b506101e3610826565b34801561030d57600080fd5b506101e361031c366004611df3565b6109ec565b34801561032d57600080fd5b506101e361033c366004611f4b565b610a07565b34801561034d57600080fd5b506101e361035c36600461202a565b610cb7565b34801561036d57600080fd5b5061038161037c366004611d83565b610cfb565b6040516102129190612136565b34801561039a57600080fd5b5061025d6103a936600461202a565b610d67565b3480156103ba57600080fd5b506102aa6103c9366004611d83565b610d9c565b3480156103da57600080fd5b5061025d6103e936600461202a565b610de0565b3480156103fa57600080fd5b506101e3610dfb565b34801561040f57600080fd5b5061025d610e84565b34801561042457600080fd5b506101e3610433366004611d83565b610e93565b34801561044457600080fd5b50610230610ef2565b34801561045957600080fd5b506101e3610468366004611eef565b610f01565b34801561047957600080fd5b506102aa610fcf565b34801561048e57600080fd5b506102aa61049d36600461202a565b610fd5565b3480156104ae57600080fd5b506101e36104bd366004611e33565b610fe7565b3480156104ce57600080fd5b506102aa6104dd366004611f20565b611026565b3480156104ee57600080fd5b506102aa6104fd366004611f20565b611057565b34801561050e57600080fd5b5061023061051d36600461202a565b611074565b34801561052e57600080fd5b506101e361053d366004611f4b565b6110f6565b34801561054e57600080fd5b5061025d61055d36600461202a565b611417565b34801561056e57600080fd5b5061020561057d366004611dbb565b611432565b34801561058e57600080fd5b506101e361059d366004611d83565b611460565b3480156105ae57600080fd5b506101e36105bd366004612042565b611520565b60006001600160e01b031982166380ac58cd60e01b14806105f357506001600160e01b03198216635b5e139f60e01b145b806106025750610602826116cd565b90505b919050565b6060600180546106199061279d565b80601f01602080910402602001604051908101604052809291908181526020018280546106459061279d565b80156106925780601f1061066757610100808354040283529160200191610692565b820191906000526020600020905b81548152906001019060200180831161067557829003601f168201915b5050505050905090565b60006106a7826116e6565b6106cc5760405162461bcd60e51b81526004016106c39061248d565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006106f382610d67565b9050806001600160a01b0316836001600160a01b031614156107275760405162461bcd60e51b81526004016106c3906125ed565b806001600160a01b0316610739611703565b6001600160a01b0316148061075557506107558161057d611703565b6107715760405162461bcd60e51b81526004016106c39061232e565b61077b8383611707565b505050565b6008546000828152600b602052604081205490916001600160a01b03918216911614156107bf5760405162461bcd60e51b81526004016106c39061267f565b6000828152600a60205260408120546107d89042612743565b9392505050565b6009546001600160a01b031681565b6107ff6107f9611703565b82611775565b61081b5760405162461bcd60e51b81526004016106c39061262e565b61077b8383836117fa565b6007541580159061083957504260075411155b6108555760405162461bcd60e51b81526004016106c39061238b565b336000908152600c60205260409020546108815760405162461bcd60e51b81526004016106c390612449565b336000908152600c60205260409020545b80156109e957336000908152600c602052604081206108b2600184612743565b815481106108d057634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546009546040516323b872dd60e01b81529192506001600160a01b0316906323b872dd90610911903090339086906004016120d5565b600060405180830381600087803b15801561092b57600080fd5b505af115801561093f573d6000803e3d6000fd5b5050506000828152600a602052604090205461095c915042612743565b336000908152600d6020908152604080832085845290915281208054909190610986908490612717565b9091555061099690503382611927565b6008546000828152600b6020526040902080546001600160a01b0319166001600160a01b03909216919091179055600e546109d390600190612743565b600e5550806109e181612786565b915050610892565b50565b61077b83838360405180602001604052806000815250610fe7565b60075415801590610a1a57504260075411155b610a365760405162461bcd60e51b81526004016106c39061238b565b60005b8151811015610cb357336001600160a01b0316600b6000848481518110610a7057634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b031614610ab15760405162461bcd60e51b81526004016106c3906125a6565b60095482516001600160a01b03909116906323b872dd9030903390869086908110610aec57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b8152600401610b12939291906120d5565b600060405180830381600087803b158015610b2c57600080fd5b505af1158015610b40573d6000803e3d6000fd5b50505050600a6000838381518110610b6857634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000205442610b8a9190612743565b336000908152600d602052604081208451909190859085908110610bbe57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000206000828254610be39190612717565b92505081905550610c1b33838381518110610c0e57634e487b7160e01b600052603260045260246000fd5b6020026020010151611927565b600860009054906101000a90046001600160a01b0316600b6000848481518110610c5557634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001600e54610c9e9190612743565b600e5580610cab816127d8565b915050610a39565b5050565b610cbf611703565b6001600160a01b0316610cd0610e84565b6001600160a01b031614610cf65760405162461bcd60e51b81526004016106c3906124d9565b600755565b6001600160a01b0381166000908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610d5b57602002820191906000526020600020905b815481526020019060010190808311610d47575b50505050509050919050565b6000818152600360205260408120546001600160a01b0316806106025760405162461bcd60e51b81526004016106c390612400565b60006001600160a01b038216610dc45760405162461bcd60e51b81526004016106c3906123b6565b506001600160a01b031660009081526004602052604090205490565b600b602052600090815260409020546001600160a01b031681565b610e03611703565b6001600160a01b0316610e14610e84565b6001600160a01b031614610e3a5760405162461bcd60e51b81526004016106c3906124d9565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b610e9b611703565b6001600160a01b0316610eac610e84565b6001600160a01b031614610ed25760405162461bcd60e51b81526004016106c3906124d9565b600980546001600160a01b0383166001600160a01b031990911617905550565b6060600280546106199061279d565b610f09611703565b6001600160a01b0316826001600160a01b03161415610f3a5760405162461bcd60e51b81526004016106c390612274565b8060066000610f47611703565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610f8b611703565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fc3919061217a565b60405180910390a35050565b600e5481565b600a6020526000908152604090205481565b610ff8610ff2611703565b83611775565b6110145760405162461bcd60e51b81526004016106c39061262e565b611020848484846119b2565b50505050565b600c602052816000526040600020818154811061104257600080fd5b90600052602060002001600091509150505481565b600d60209081526000928352604080842090915290825290205481565b606061107f826116e6565b61109b5760405162461bcd60e51b81526004016106c390612557565b60006110a56119e5565b905060008151116110c557604051806020016040528060008152506107d8565b806110cf846119f7565b6040516020016110e0929190612092565b6040516020818303038152906040529392505050565b6007541580159061110957504260075411155b6111255760405162461bcd60e51b81526004016106c39061238b565b60005b8151811015610cb357600954825133916001600160a01b031690636352211e9085908590811061116857634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161118c91906126e4565b60206040518083038186803b1580156111a457600080fd5b505afa1580156111b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111dc9190611d9f565b6001600160a01b031614801561124a575060085482516001600160a01b0390911690600b9060009085908590811061122457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101518252810191909152604001600020546001600160a01b0316145b6112665760405162461bcd60e51b81526004016106c3906122ab565b60095482516001600160a01b03909116906323b872dd90339030908690869081106112a157634e487b7160e01b600052603260045260246000fd5b60200260200101516040518463ffffffff1660e01b81526004016112c7939291906120d5565b600060405180830381600087803b1580156112e157600080fd5b505af11580156112f5573d6000803e3d6000fd5b5050336000908152600c6020526040902084519092508491508390811061132c57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018101845560009384529183209091015582514291600a9185908590811061137357634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000208190555033600b60008484815181106113b257634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001600e60008282546113ff9190612717565b9091555081905061140f816127d8565b915050611128565b6000908152600b60205260409020546001600160a01b031690565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b611468611703565b6001600160a01b0316611479610e84565b6001600160a01b03161461149f5760405162461bcd60e51b81526004016106c3906124d9565b6001600160a01b0381166114c55760405162461bcd60e51b81526004016106c3906121ea565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6007541580159061153357504260075411155b61154f5760405162461bcd60e51b81526004016106c39061238b565b611557611703565b6001600160a01b0316611568610e84565b6001600160a01b03161461158e5760405162461bcd60e51b81526004016106c3906124d9565b6000828152600b60205260409020546001600160a01b038281169116146115c75760405162461bcd60e51b81526004016106c3906126ad565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906115fb903090859087906004016120d5565b600060405180830381600087803b15801561161557600080fd5b505af1158015611629573d6000803e3d6000fd5b5050506000838152600a6020526040902054611646915042612743565b6001600160a01b0382166000908152600d6020908152604080832086845290915281208054909190611679908490612717565b9091555061168990508183611927565b6008546000838152600b6020526040902080546001600160a01b0319166001600160a01b03909216919091179055600e546116c690600190612743565b600e555050565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600360205260409020546001600160a01b0316151590565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061173c82610d67565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611780826116e6565b61179c5760405162461bcd60e51b81526004016106c3906122e2565b60006117a783610d67565b9050806001600160a01b0316846001600160a01b031614806117e25750836001600160a01b03166117d78461069c565b6001600160a01b0316145b806117f257506117f28185611432565b949350505050565b826001600160a01b031661180d82610d67565b6001600160a01b0316146118335760405162461bcd60e51b81526004016106c39061250e565b6001600160a01b0382166118595760405162461bcd60e51b81526004016106c390612230565b61186483838361077b565b61186f600082611707565b6001600160a01b0383166000908152600460205260408120805460019290611898908490612743565b90915550506001600160a01b03821660009081526004602052604081208054600192906118c6908490612717565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b6001600160a01b0383166000908152600c602052604090205481101561077b576001600160a01b0383166000908152600c6020526040902080548391908390811061198557634e487b7160e01b600052603260045260246000fd5b906000526020600020015414156119a0576119a08382611b12565b806119aa816127d8565b91505061192a565b6119bd8484846117fa565b6119c984848484611c62565b6110205760405162461bcd60e51b81526004016106c390612198565b60408051602081019091526000815290565b606081611a1c57506040805180820190915260018152600360fc1b6020820152610605565b8160005b8115611a465780611a30816127d8565b9150611a3f9050600a8361272f565b9150611a20565b60008167ffffffffffffffff811115611a6f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a99576020820181803683370190505b5090505b84156117f257611aae600183612743565b9150611abb600a866127f3565b611ac6906030612717565b60f81b818381518110611ae957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611b0b600a8661272f565b9450611a9d565b6001600160a01b0382166000908152600c60205260409020548110611b3657610cb3565b805b6001600160a01b0383166000908152600c6020526040902054611b5d90600190612743565b811015611c12576001600160a01b0383166000908152600c60205260409020611b87826001612717565b81548110611ba557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110611bf457634e487b7160e01b600052603260045260246000fd5b60009182526020909120015580611c0a816127d8565b915050611b38565b506001600160a01b0382166000908152600c60205260409020805480611c4857634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590555050565b6000611c76846001600160a01b0316611d7d565b15611d7257836001600160a01b031663150b7a02611c92611703565b8786866040518563ffffffff1660e01b8152600401611cb494939291906120f9565b602060405180830381600087803b158015611cce57600080fd5b505af1925050508015611cfe575060408051601f3d908101601f19168201909252611cfb9181019061200e565b60015b611d58573d808015611d2c576040519150601f19603f3d011682016040523d82523d6000602084013e611d31565b606091505b508051611d505760405162461bcd60e51b81526004016106c390612198565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117f2565b506001949350505050565b3b151590565b600060208284031215611d94578081fd5b81356107d881612849565b600060208284031215611db0578081fd5b81516107d881612849565b60008060408385031215611dcd578081fd5b8235611dd881612849565b91506020830135611de881612849565b809150509250929050565b600080600060608486031215611e07578081fd5b8335611e1281612849565b92506020840135611e2281612849565b929592945050506040919091013590565b60008060008060808587031215611e48578081fd5b8435611e5381612849565b9350602085810135611e6481612849565b935060408601359250606086013567ffffffffffffffff80821115611e87578384fd5b818801915088601f830112611e9a578384fd5b813581811115611eac57611eac612833565b611ebe601f8201601f191685016126ed565b91508082528984828501011115611ed3578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215611f01578182fd5b8235611f0c81612849565b915060208301358015158114611de8578182fd5b60008060408385031215611f32578182fd5b8235611f3d81612849565b946020939093013593505050565b60006020808385031215611f5d578182fd5b823567ffffffffffffffff80821115611f74578384fd5b818501915085601f830112611f87578384fd5b813581811115611f9957611f99612833565b8381029150611fa98483016126ed565b8181528481019084860184860187018a1015611fc3578788fd5b8795505b83861015611fe5578035835260019590950194918601918601611fc7565b5098975050505050505050565b600060208284031215612003578081fd5b81356107d88161285e565b60006020828403121561201f578081fd5b81516107d88161285e565b60006020828403121561203b578081fd5b5035919050565b60008060408385031215612054578182fd5b823591506020830135611de881612849565b6000815180845261207e81602086016020860161275a565b601f01601f19169290920160200192915050565b600083516120a481846020880161275a565b8351908301906120b881836020880161275a565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061212c90830184612066565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561216e57835183529284019291840191600101612152565b50909695505050505050565b901515815260200190565b6000602082526107d86020830184612066565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601e908201527f546f6b656e206d757374206265207374616b61626c6520627920796f75210000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b602080825260119082015270596f752061726520746f6f206561726c7960781b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526024908201527f4d7573742068617665206174206c65617374206f6e6520746f6b656e207374616040820152636b65642160e01b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526027908201527f4d6573736167652053656e64657220776173206e6f74206f726967696e616c206040820152667374616b65722160c81b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b602080825260149082015273546f6b656e206973206e6f74207374616b65642160601b604082015260600190565b6020808252601c908201527f5374616b65722061646472657373206973206e6f742076616c69642100000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561270f5761270f612833565b604052919050565b6000821982111561272a5761272a612807565b500190565b60008261273e5761273e61281d565b500490565b60008282101561275557612755612807565b500390565b60005b8381101561277557818101518382015260200161275d565b838111156110205750506000910152565b60008161279557612795612807565b506000190190565b6002810460018216806127b157607f821691505b602082108114156127d257634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156127ec576127ec612807565b5060010190565b6000826128025761280261281d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146109e957600080fd5b6001600160e01b0319811681146109e957600080fdfea2646970667358221220f9649f5544a8147d99120b36ece991a65d1e88450a508197936f5872dab52a5e64736f6c63430008000033
Deployed ByteCode Sourcemap
107:5597:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:344:4;;;;;;;;;;-1:-1:-1;1500:344:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2618:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4164:295::-;;;;;;;;;;-1:-1:-1;4164:295:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3679:424::-;;;;;;;;;;-1:-1:-1;3679:424:4;;;;;:::i;:::-;;:::i;5234:346:14:-;;;;;;;;;;-1:-1:-1;5234:346:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;451:28::-;;;;;;;;;;;;;:::i;5178:364:4:-;;;;;;;;;;-1:-1:-1;5178:364:4;;;;;:::i;:::-;;:::i;3065:790:14:-;;;;;;;;;;;;;:::i;5608:179:4:-;;;;;;;;;;-1:-1:-1;5608:179:4;;;;;:::i;:::-;;:::i;3861:759:14:-;;;;;;;;;;-1:-1:-1;3861:759:14;;;;;:::i;:::-;;:::i;1345:140::-;;;;;;;;;;-1:-1:-1;1345:140:14;;;;;:::i;:::-;;:::i;1491:158::-;;;;;;;;;;-1:-1:-1;1491:158:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2243:313:4:-;;;;;;;;;;-1:-1:-1;2243:313:4;;;;;:::i;:::-;;:::i;1903:283::-;;;;;;;;;;-1:-1:-1;1903:283:4;;;;;:::i;:::-;;:::i;617:50:14:-;;;;;;;;;;-1:-1:-1;617:50:14;;;;;:::i;:::-;;:::i;1693:145:12:-;;;;;;;;;;;;;:::i;1061:85::-;;;;;;;;;;;;;:::i;1114:140:14:-;;;;;;;;;;-1:-1:-1;1114:140:14;;;;;:::i;:::-;;:::i;2780:102:4:-;;;;;;;;;;;;;:::i;4526:318::-;;;;;;;;;;-1:-1:-1;4526:318:4;;;;;:::i;:::-;;:::i;941:36:14:-;;;;;;;;;;;;;:::i;523:53::-;;;;;;;;;;-1:-1:-1;523:53:14;;;;;:::i;:::-;;:::i;5853:354:4:-;;;;;;;;;;-1:-1:-1;5853:354:4;;;;;:::i;:::-;;:::i;708:53:14:-;;;;;;;;;;-1:-1:-1;708:53:14;;;;;:::i;:::-;;:::i;846:88::-;;;;;;;;;;-1:-1:-1;846:88:14;;;;;:::i;:::-;;:::i;2948:451:4:-;;;;;;;;;;-1:-1:-1;2948:451:4;;;;;:::i;:::-;;:::i;2318:741:14:-;;;;;;;;;;-1:-1:-1;2318:741:14;;;;;:::i;:::-;;:::i;5586:116::-;;;;;;;;;;-1:-1:-1;5586:116:14;;;;;:::i;:::-;;:::i;4910:206:4:-;;;;;;;;;;-1:-1:-1;4910:206:4;;;;;:::i;:::-;;:::i;1987:240:12:-;;;;;;;;;;-1:-1:-1;1987:240:12;;;;;:::i;:::-;;:::i;4626:602:14:-;;;;;;;;;;-1:-1:-1;4626:602:14;;;;;:::i;:::-;;:::i;1500:344:4:-;1642:4;-1:-1:-1;;;;;;1681:40:4;;-1:-1:-1;;;1681:40:4;;:104;;-1:-1:-1;;;;;;;1737:48:4;;-1:-1:-1;;;1737:48:4;1681:104;:156;;;;1801:36;1825:11;1801:23;:36::i;:::-;1662:175;;1500:344;;;;:::o;2618:98::-;2672:13;2704:5;2697:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2618:98;:::o;4164:295::-;4280:7;4324:16;4332:7;4324;:16::i;:::-;4303:107;;;;-1:-1:-1;;;4303:107:4;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4428:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4428:24:4;;4164:295::o;3679:424::-;3759:13;3775:23;3790:7;3775:14;:23::i;:::-;3759:39;;3822:5;-1:-1:-1;;;;;3816:11:4;:2;-1:-1:-1;;;;;3816:11:4;;;3808:57;;;;-1:-1:-1;;;3808:57:4;;;;;;;:::i;:::-;3913:5;-1:-1:-1;;;;;3897:21:4;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3897:21:4;;:85;;;;3938:44;3962:5;3969:12;:10;:12::i;3938:44::-;3876:188;;;;-1:-1:-1;;;3876:188:4;;;;;;;:::i;:::-;4075:21;4084:2;4088:7;4075:8;:21::i;:::-;3679:424;;;:::o;5234:346:14:-;5405:11;;5333:7;5377:24;;;:15;:24;;;;;;5333:7;;-1:-1:-1;;;;;5377:24:14;;;5405:11;;5377:39;;5356:106;;;;-1:-1:-1;;;5356:106:14;;;;;;;:::i;:::-;5473:21;5515:27;;;:18;:27;;;;;;5497:45;;:15;:45;:::i;:::-;5473:69;5234:346;-1:-1:-1;;;5234:346:14:o;451:28::-;;;-1:-1:-1;;;;;451:28:14;;:::o;5178:364:4:-;5380:41;5399:12;:10;:12::i;:::-;5413:7;5380:18;:41::i;:::-;5359:137;;;;-1:-1:-1;;;5359:137:4;;;;;;;:::i;:::-;5507:28;5517:4;5523:2;5527:7;5507:9;:28::i;3065:790:14:-;206:14;;:19;;;;:56;;;247:15;229:14;;:33;;206:56;185:120;;;;-1:-1:-1;;;185:120:14;;;;;;;:::i;:::-;3159:10:::1;3180:1;3142:28:::0;;;:16:::1;:28;::::0;;;;:35;3121:122:::1;;;;-1:-1:-1::0;;;3121:122:14::1;;;;;;;:::i;:::-;3288:10;3259:9;3271:28:::0;;;:16:::1;:28;::::0;;;;:35;3254:595:::1;3308:5:::0;;3254:595:::1;;3369:10;3334:15;3352:28:::0;;;:16:::1;:28;::::0;;;;3381:5:::1;3385:1;3381::::0;:5:::1;:::i;:::-;3352:35;;;;;;-1:-1:-1::0;;;3352:35:14::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;3410:13:::1;::::0;3402:133:::1;::::0;-1:-1:-1;;;3402:133:14;;3352:35;;-1:-1:-1;;;;;;3410:13:14::1;::::0;3402:35:::1;::::0;:133:::1;::::0;3463:4:::1;::::0;3486:10:::1;::::0;3352:35;;3402:133:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;3641:27:14::1;::::0;;;:18:::1;:27;::::0;;;;;3623:45:::1;::::0;-1:-1:-1;3623:15:14::1;:45;:::i;:::-;3597:10;3563:45;::::0;;;:33:::1;:45;::::0;;;;;;;:54;;;;;;;;:107;;:54;;:45;:107:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;3685:44:14::1;::::0;-1:-1:-1;3709:10:14::1;3721:7:::0;3685:23:::1;:44::i;:::-;3771:11;::::0;::::1;3744:24:::0;;;:15:::1;:24;::::0;;;;:38;;-1:-1:-1;;;;;;3744:38:14::1;-1:-1:-1::0;;;;;3771:11:14;;::::1;3744:38:::0;;;::::1;::::0;;3817:17:::1;::::0;:21:::1;::::0;3771:11;;3817:21:::1;:::i;:::-;3797:17;:41:::0;-1:-1:-1;3315:3:14;::::1;::::0;::::1;:::i;:::-;;;;3254:595;;;;3065:790::o:0;5608:179:4:-;5741:39;5758:4;5764:2;5768:7;5741:39;;;;;;;;;;;;:16;:39::i;3861:759:14:-;206:14;;:19;;;;:56;;;247:15;229:14;;:33;;206:56;185:120;;;;-1:-1:-1;;;185:120:14;;;;;;;:::i;:::-;3950:9:::1;3945:669;3969:8;:15;3965:1;:19;3945:669;;;4062:10;-1:-1:-1::0;;;;;4030:42:14::1;:15;:28;4046:8;4055:1;4046:11;;;;;;-1:-1:-1::0;;;4046:11:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;4030:28;;;::::1;::::0;;;;;;-1:-1:-1;4030:28:14;;-1:-1:-1;;;;;4030:28:14::1;:42;4005:140;;;;-1:-1:-1::0;;;4005:140:14::1;;;;;;;:::i;:::-;4168:13;::::0;4272:11;;-1:-1:-1;;;;;4168:13:14;;::::1;::::0;4160:35:::1;::::0;4221:4:::1;::::0;4244:10:::1;::::0;4272:8;;4281:1;;4272:11;::::1;;;-1:-1:-1::0;;;4272:11:14::1;;;;;;;;;;;;;;;4160:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4394:18;:31;4413:8;4422:1;4413:11;;;;;;-1:-1:-1::0;;;4413:11:14::1;;;;;;;;;;;;;;;4394:31;;;;;;;;;;;;4376:15;:49;;;;:::i;:::-;4346:10;4312:45;::::0;;;:33:::1;:45;::::0;;;;4358:11;;4312:45;;;4358:8;;4367:1;;4358:11;::::1;;;-1:-1:-1::0;;;4358:11:14::1;;;;;;;;;;;;;;;4312:58;;;;;;;;;;;;:115;;;;;;;:::i;:::-;;;;;;;;4442:48;4466:10;4478:8;4487:1;4478:11;;;;;;-1:-1:-1::0;;;4478:11:14::1;;;;;;;;;;;;;;;4442:23;:48::i;:::-;4536:11;;;;;;;;;-1:-1:-1::0;;;;;4536:11:14::1;4505:15;:28;4521:8;4530:1;4521:11;;;;;;-1:-1:-1::0;;;4521:11:14::1;;;;;;;;;;;;;;;4505:28;;;;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;4505:42:14::1;;;;;-1:-1:-1::0;;;;;4505:42:14::1;;;;;;4602:1;4582:17;;:21;;;;:::i;:::-;4562:17;:41:::0;3986:3;::::1;::::0;::::1;:::i;:::-;;;;3945:669;;;;3861:759:::0;:::o;1345:140::-;1284:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:12;;1265:68;;;;-1:-1:-1;;;1265:68:12;;;;;;;:::i;:::-;1446:14:14::1;:32:::0;1345:140::o;1491:158::-;-1:-1:-1;;;;;1618:24:14;;;;;;:16;:24;;;;;;;;;1611:31;;;;;;;;;;;;;;;;;1579:16;;1611:31;;;1618:24;1611:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1491:158;;;:::o;2243:313:4:-;2355:7;2394:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2394:16:4;2441:19;2420:107;;;;-1:-1:-1;;;2420:107:4;;;;;;;:::i;1903:283::-;2015:7;-1:-1:-1;;;;;2059:19:4;;2038:108;;;;-1:-1:-1;;;2038:108:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2163:16:4;;;;;:9;:16;;;;;;;1903:283::o;617:50:14:-;;;;;;;;;;;;-1:-1:-1;;;;;617:50:14;;:::o;1693:145:12:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:12;;1265:68;;;;-1:-1:-1;;;1265:68:12;;;;;;;:::i;:::-;1799:1:::1;1783:6:::0;;1762:40:::1;::::0;-1:-1:-1;;;;;1783:6:12;;::::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1829:1;1812:19:::0;;-1:-1:-1;;;;;;1812:19:12::1;::::0;;1693:145::o;1061:85::-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:12;1061:85;:::o;1114:140:14:-;1284:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:12;;1265:68;;;;-1:-1:-1;;;1265:68:12;;;;;;;:::i;:::-;1201:13:14::1;:30:::0;;-1:-1:-1;;;;;1201:30:14;::::1;-1:-1:-1::0;;;;;;1201:30:14;;::::1;;::::0;;1114:140;:::o;2780:102:4:-;2836:13;2868:7;2861:14;;;;;:::i;4526:318::-;4668:12;:10;:12::i;:::-;-1:-1:-1;;;;;4656:24:4;:8;-1:-1:-1;;;;;4656:24:4;;;4648:62;;;;-1:-1:-1;;;4648:62:4;;;;;;;:::i;:::-;4766:8;4721:18;:32;4740:12;:10;:12::i;:::-;-1:-1:-1;;;;;4721:32:4;;;;;;;;;;;;;;;;;-1:-1:-1;4721:32:4;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4721:53:4;;;;;;;;;;;4804:12;:10;:12::i;:::-;-1:-1:-1;;;;;4789:48:4;;4828:8;4789:48;;;;;;:::i;:::-;;;;;;;;4526:318;;:::o;941:36:14:-;;;;:::o;523:53::-;;;;;;;;;;;;;:::o;5853:354:4:-;6035:41;6054:12;:10;:12::i;:::-;6068:7;6035:18;:41::i;:::-;6014:137;;;;-1:-1:-1;;;6014:137:4;;;;;;;:::i;:::-;6161:39;6175:4;6181:2;6185:7;6194:5;6161:13;:39::i;:::-;5853:354;;;;:::o;708:53:14:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;846:88::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;2948:451:4:-;3061:13;3111:16;3119:7;3111;:16::i;:::-;3090:110;;;;-1:-1:-1;;;3090:110:4;;;;;;;:::i;:::-;3211:21;3235:10;:8;:10::i;:::-;3211:34;;3298:1;3280:7;3274:21;:25;:118;;;;;;;;;;;;;;;;;3342:7;3351:18;:7;:16;:18::i;:::-;3325:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3255:137;2948:451;-1:-1:-1;;;2948:451:4:o;2318:741:14:-;206:14;;:19;;;;:56;;;247:15;229:14;;:33;;206:56;185:120;;;;-1:-1:-1;;;185:120:14;;;;;;;:::i;:::-;2405:9:::1;2400:653;2424:8;:15;2420:1;:19;2400:653;;;2493:13;::::0;2516:11;;2532:10:::1;::::0;-1:-1:-1;;;;;2493:13:14::1;::::0;2485:30:::1;::::0;2516:8;;2525:1;;2516:11;::::1;;;-1:-1:-1::0;;;2516:11:14::1;;;;;;;;;;;;;;;2485:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2485:57:14::1;;:124;;;;-1:-1:-1::0;2598:11:14::1;::::0;2582;;-1:-1:-1;;;;;2598:11:14;;::::1;::::0;2566:15:::1;::::0;2598:11:::1;::::0;2582:8;;2591:1;;2582:11;::::1;;;-1:-1:-1::0;;;2582:11:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;2566:28;;;::::1;::::0;;;;;;-1:-1:-1;2566:28:14;;-1:-1:-1;;;;;2566:28:14::1;:43;2485:124;2460:213;;;;-1:-1:-1::0;;;2460:213:14::1;;;;;;;:::i;:::-;2696:13;::::0;2800:11;;-1:-1:-1;;;;;2696:13:14;;::::1;::::0;2688:35:::1;::::0;2741:10:::1;::::0;2777:4:::1;::::0;2800:8;;2809:1;;2800:11;::::1;;;-1:-1:-1::0;;;2800:11:14::1;;;;;;;;;;;;;;;2688:137;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;2857:10:14::1;2840:28;::::0;;;:16:::1;:28;::::0;;;;2874:11;;2840:28;;-1:-1:-1;2874:8:14;;-1:-1:-1;2883:1:14;;2874:11;::::1;;;-1:-1:-1::0;;;2874:11:14::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;2840:46;;::::1;::::0;::::1;::::0;;-1:-1:-1;2840:46:14;;;;;;;;::::1;::::0;2920:11;;2935:15:::1;::::0;2901:18:::1;::::0;2920:8;;2929:1;;2920:11;::::1;;;-1:-1:-1::0;;;2920:11:14::1;;;;;;;;;;;;;;;2901:31;;;;;;;;;;;:49;;;;2995:10;2964:15;:28;2980:8;2989:1;2980:11;;;;;;-1:-1:-1::0;;;2980:11:14::1;;;;;;;;;;;;;;;2964:28;;;;;;;;;;;;:41;;;;;-1:-1:-1::0;;;;;2964:41:14::1;;;;;-1:-1:-1::0;;;;;2964:41:14::1;;;;;;3041:1;3020:17;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;2441:3:14;;-1:-1:-1;2441:3:14::1;::::0;::::1;:::i;:::-;;;;2400:653;;5586:116:::0;5645:7;5671:24;;;:15;:24;;;;;;-1:-1:-1;;;;;5671:24:14;;5586:116::o;4910:206:4:-;-1:-1:-1;;;;;5074:25:4;;;5047:4;5074:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4910:206::o;1987:240:12:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:12;;1265:68;;;;-1:-1:-1;;;1265:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;2075:22:12;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:12::1;;;;;;;:::i;:::-;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:12;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:12::1;-1:-1:-1::0;;;;;2203:17:12;;;::::1;::::0;;;::::1;::::0;;1987:240::o;4626:602:14:-;206:14;;:19;;;;:56;;;247:15;229:14;;:33;;206:56;185:120;;;;-1:-1:-1;;;185:120:14;;;;;;;:::i;:::-;1284:12:12::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;1273:23:12::1;:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;1273:23:12::1;;1265:68;;;;-1:-1:-1::0;;;1265:68:12::1;;;;;;;:::i;:::-;4751:24:14::2;::::0;;;:15:::2;:24;::::0;;;;;-1:-1:-1;;;;;4751:32:14;;::::2;:24:::0;::::2;:32;4730:107;;;;-1:-1:-1::0;;;4730:107:14::2;;;;;;;:::i;:::-;4856:13;::::0;4848:111:::2;::::0;-1:-1:-1;;;4848:111:14;;-1:-1:-1;;;;;4856:13:14;;::::2;::::0;4848:35:::2;::::0;:111:::2;::::0;4905:4:::2;::::0;4924;;4942:7;;4848:111:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;5042:27:14::2;::::0;;;:18:::2;:27;::::0;;;;;5024:45:::2;::::0;-1:-1:-1;5024:15:14::2;:45;:::i;:::-;-1:-1:-1::0;;;;;4970:39:14;::::2;;::::0;;;:33:::2;:39;::::0;;;;;;;:48;;;;;;;;:101;;:48;;:39;:101:::2;::::0;;;::::2;:::i;:::-;::::0;;;-1:-1:-1;5082:38:14::2;::::0;-1:-1:-1;5106:4:14;5112:7;5082:23:::2;:38::i;:::-;5158:11;::::0;::::2;5131:24:::0;;;:15:::2;:24;::::0;;;;:38;;-1:-1:-1;;;;;;5131:38:14::2;-1:-1:-1::0;;;;;5158:11:14;;::::2;5131:38:::0;;;::::2;::::0;;5200:17:::2;::::0;:21:::2;::::0;5158:11;;5200:21:::2;:::i;:::-;5180:17;:41:::0;-1:-1:-1;;4626:602:14:o;763:155:2:-;-1:-1:-1;;;;;;871:40:2;;-1:-1:-1;;;871:40:2;763:155;;;:::o;7713:125:4:-;7778:4;7801:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7801:16:4;:30;;;7713:125::o;586:96:1:-;665:10;586:96;:::o;12221:171:4:-;12295:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12295:29:4;-1:-1:-1;;;;;12295:29:4;;;;;;;;:24;;12348:23;12295:24;12348:14;:23::i;:::-;-1:-1:-1;;;;;12339:46:4;;;;;;;;;;;12221:171;;:::o;7996:445::-;8121:4;8162:16;8170:7;8162;:16::i;:::-;8141:107;;;;-1:-1:-1;;;8141:107:4;;;;;;;:::i;:::-;8258:13;8274:23;8289:7;8274:14;:23::i;:::-;8258:39;;8326:5;-1:-1:-1;;;;;8315:16:4;:7;-1:-1:-1;;;;;8315:16:4;;:63;;;;8371:7;-1:-1:-1;;;;;8347:31:4;:20;8359:7;8347:11;:20::i;:::-;-1:-1:-1;;;;;8347:31:4;;8315:63;:118;;;;8394:39;8418:5;8425:7;8394:23;:39::i;:::-;8307:127;7996:445;-1:-1:-1;;;;7996:445:4:o;11516:594::-;11683:4;-1:-1:-1;;;;;11656:31:4;:23;11671:7;11656:14;:23::i;:::-;-1:-1:-1;;;;;11656:31:4;;11635:119;;;;-1:-1:-1;;;11635:119:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;11772:16:4;;11764:65;;;;-1:-1:-1;;;11764:65:4;;;;;;;:::i;:::-;11840:39;11861:4;11867:2;11871:7;11840:20;:39::i;:::-;11941:29;11958:1;11962:7;11941:8;:29::i;:::-;-1:-1:-1;;;;;11981:15:4;;;;;;:9;:15;;;;;:20;;12000:1;;11981:15;:20;;12000:1;;11981:20;:::i;:::-;;;;-1:-1:-1;;;;;;;12011:13:4;;;;;;:9;:13;;;;;:18;;12028:1;;12011:13;:18;;12028:1;;12011:18;:::i;:::-;;;;-1:-1:-1;;12039:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;12039:21:4;-1:-1:-1;;;;;12039:21:4;;;;;;;;;12076:27;;12039:16;;12076:27;;;;;;;11516:594;;;:::o;1992:320:14:-;2082:9;2077:229;-1:-1:-1;;;;;2101:24:14;;;;;;:16;:24;;;;;:31;2097:35;;2077:229;;;-1:-1:-1;;;;;2157:24:14;;;;;;:16;:24;;;;;:27;;2188:7;;2157:24;2182:1;;2157:27;;;;-1:-1:-1;;;2157:27:14;;;;;;;;;;;;;;;;;:38;2153:143;;;2264:17;2271:6;2279:1;2264:6;:17::i;:::-;2134:3;;;;:::i;:::-;;;;2077:229;;7069:341:4;7220:28;7230:4;7236:2;7240:7;7220:9;:28::i;:::-;7279:48;7302:4;7308:2;7312:7;7321:5;7279:22;:48::i;:::-;7258:145;;;;-1:-1:-1;;;7258:145:4;;;;;;;:::i;3530:92::-;3606:9;;;;;;;;;-1:-1:-1;3606:9:4;;3530:92;:::o;271:703:13:-;327:13;544:10;540:51;;-1:-1:-1;570:10:13;;;;;;;;;;;;-1:-1:-1;;;570:10:13;;;;;;540:51;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:13;;-1:-1:-1;716:2:13;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:13;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:13;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:13;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:13;;;;;;;;-1:-1:-1;915:11:13;924:2;915:11;;:::i;:::-;;;787:150;;1655:331:14;-1:-1:-1;;;;;1734:24:14;;;;;;:16;:24;;;;;:31;1725:40;;1721:53;;1767:7;;1721:53;1801:5;1784:156;-1:-1:-1;;;;;1812:24:14;;;;;;:16;:24;;;;;:31;:35;;1846:1;;1812:35;:::i;:::-;1808:1;:39;1784:156;;;-1:-1:-1;;;;;1898:24:14;;;;;;:16;:24;;;;;1923:5;:1;1927;1923:5;:::i;:::-;1898:31;;;;;;-1:-1:-1;;;1898:31:14;;;;;;;;;;;;;;;;;1868:16;:24;1885:6;-1:-1:-1;;;;;1868:24:14;-1:-1:-1;;;;;1868:24:14;;;;;;;;;;;;1893:1;1868:27;;;;;;-1:-1:-1;;;1868:27:14;;;;;;;;;;;;;;;;;;:61;1849:3;;;;:::i;:::-;;;;1784:156;;;-1:-1:-1;;;;;;1949:24:14;;;;;;:16;:24;;;;;:30;;;;;-1:-1:-1;;;1949:30:14;;;;;;;;;;;;;;;;;;;;;;;;;;1655:331;;:::o;12945:1022:4:-;13095:4;13115:15;:2;-1:-1:-1;;;;;13115:13:4;;:15::i;:::-;13111:850;;;13182:2;-1:-1:-1;;;;;13166:36:4;;13224:12;:10;:12::i;:::-;13258:4;13284:7;13313:5;13166:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13166:170:4;;;;;;;;-1:-1:-1;;13166:170:4;;;;;;;;;;;;:::i;:::-;;;13146:763;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13519:13:4;;13515:380;;13561:106;;-1:-1:-1;;;13561:106:4;;;;;;;:::i;13515:380::-;13847:6;13841:13;13832:6;13828:2;13824:15;13817:38;13146:763;-1:-1:-1;;;;;;13398:55:4;-1:-1:-1;;;13398:55:4;;-1:-1:-1;13391:62:4;;13111:850;-1:-1:-1;13946:4:4;12945:1022;;;;;;:::o;718:413:0:-;1078:20;1116:8;;;718:413::o;14:259:15:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:15;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:15;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:15;1398:18;;;;1385:32;;1057:366::o;1428:1156::-;;;;;1600:3;1588:9;1579:7;1575:23;1571:33;1568:2;;;1622:6;1614;1607:22;1568:2;1666:9;1653:23;1685:33;1712:5;1685:33;:::i;:::-;1737:5;-1:-1:-1;1761:2:15;1800:18;;;1787:32;1828:35;1787:32;1828:35;:::i;:::-;1882:7;-1:-1:-1;1936:2:15;1921:18;;1908:32;;-1:-1:-1;1991:2:15;1976:18;;1963:32;2014:18;2044:14;;;2041:2;;;2076:6;2068;2061:22;2041:2;2119:6;2108:9;2104:22;2094:32;;2164:7;2157:4;2153:2;2149:13;2145:27;2135:2;;2191:6;2183;2176:22;2135:2;2232;2219:16;2254:2;2250;2247:10;2244:2;;;2260:18;;:::i;:::-;2302:52;2344:2;2325:13;;-1:-1:-1;;2321:27:15;2317:36;;2302:52;:::i;:::-;2289:65;;2377:2;2370:5;2363:17;2417:7;2412:2;2407;2403;2399:11;2395:20;2392:33;2389:2;;;2443:6;2435;2428:22;2389:2;2503;2498;2494;2490:11;2485:2;2478:5;2474:14;2461:45;2526:14;;2522:23;;;2515:39;;;;1558:1026;;;;-1:-1:-1;1558:1026:15;;-1:-1:-1;;1558:1026:15:o;2589:438::-;;;2715:2;2703:9;2694:7;2690:23;2686:32;2683:2;;;2736:6;2728;2721:22;2683:2;2780:9;2767:23;2799:33;2826:5;2799:33;:::i;:::-;2851:5;-1:-1:-1;2908:2:15;2893:18;;2880:32;2950:15;;2943:23;2931:36;;2921:2;;2986:6;2978;2971:22;3032:327;;;3161:2;3149:9;3140:7;3136:23;3132:32;3129:2;;;3182:6;3174;3167:22;3129:2;3226:9;3213:23;3245:33;3272:5;3245:33;:::i;:::-;3297:5;3349:2;3334:18;;;;3321:32;;-1:-1:-1;;;3119:240:15:o;3364:1002::-;;3479:2;3522;3510:9;3501:7;3497:23;3493:32;3490:2;;;3543:6;3535;3528:22;3490:2;3588:9;3575:23;3617:18;3658:2;3650:6;3647:14;3644:2;;;3679:6;3671;3664:22;3644:2;3722:6;3711:9;3707:22;3697:32;;3767:7;3760:4;3756:2;3752:13;3748:27;3738:2;;3794:6;3786;3779:22;3738:2;3835;3822:16;3857:2;3853;3850:10;3847:2;;;3863:18;;:::i;:::-;3910:2;3906;3902:11;3892:21;;3933:27;3956:2;3952;3948:11;3933:27;:::i;:::-;3994:15;;;4025:12;;;;4057:11;;;4087;;;4083:20;;4080:33;-1:-1:-1;4077:2:15;;;4131:6;4123;4116:22;4077:2;4158:6;4149:15;;4173:163;4187:2;4184:1;4181:9;4173:163;;;4244:17;;4232:30;;4205:1;4198:9;;;;;4282:12;;;;4314;;4173:163;;;-1:-1:-1;4355:5:15;3459:907;-1:-1:-1;;;;;;;;3459:907:15:o;4371:257::-;;4482:2;4470:9;4461:7;4457:23;4453:32;4450:2;;;4503:6;4495;4488:22;4450:2;4547:9;4534:23;4566:32;4592:5;4566:32;:::i;4633:261::-;;4755:2;4743:9;4734:7;4730:23;4726:32;4723:2;;;4776:6;4768;4761:22;4723:2;4813:9;4807:16;4832:32;4858:5;4832:32;:::i;4899:190::-;;5011:2;4999:9;4990:7;4986:23;4982:32;4979:2;;;5032:6;5024;5017:22;4979:2;-1:-1:-1;5060:23:15;;4969:120;-1:-1:-1;4969:120:15:o;5094:327::-;;;5223:2;5211:9;5202:7;5198:23;5194:32;5191:2;;;5244:6;5236;5229:22;5191:2;5285:9;5272:23;5262:33;;5345:2;5334:9;5330:18;5317:32;5358:33;5385:5;5358:33;:::i;5426:259::-;;5507:5;5501:12;5534:6;5529:3;5522:19;5550:63;5606:6;5599:4;5594:3;5590:14;5583:4;5576:5;5572:16;5550:63;:::i;:::-;5667:2;5646:15;-1:-1:-1;;5642:29:15;5633:39;;;;5674:4;5629:50;;5477:208;-1:-1:-1;;5477:208:15:o;5690:470::-;;5907:6;5901:13;5923:53;5969:6;5964:3;5957:4;5949:6;5945:17;5923:53;:::i;:::-;6039:13;;5998:16;;;;6061:57;6039:13;5998:16;6095:4;6083:17;;6061:57;:::i;:::-;6134:20;;5877:283;-1:-1:-1;;;;5877:283:15:o;6165:203::-;-1:-1:-1;;;;;6329:32:15;;;;6311:51;;6299:2;6284:18;;6266:102::o;6373:375::-;-1:-1:-1;;;;;6631:15:15;;;6613:34;;6683:15;;;;6678:2;6663:18;;6656:43;6730:2;6715:18;;6708:34;;;;6563:2;6548:18;;6530:218::o;6753:490::-;-1:-1:-1;;;;;7022:15:15;;;7004:34;;7074:15;;7069:2;7054:18;;7047:43;7121:2;7106:18;;7099:34;;;7169:3;7164:2;7149:18;;7142:31;;;6753:490;;7190:47;;7217:19;;7209:6;7190:47;:::i;:::-;7182:55;6956:287;-1:-1:-1;;;;;;6956:287:15:o;7248:635::-;7419:2;7471:21;;;7541:13;;7444:18;;;7563:22;;;7248:635;;7419:2;7642:15;;;;7616:2;7601:18;;;7248:635;7688:169;7702:6;7699:1;7696:13;7688:169;;;7763:13;;7751:26;;7832:15;;;;7797:12;;;;7724:1;7717:9;7688:169;;;-1:-1:-1;7874:3:15;;7399:484;-1:-1:-1;;;;;;7399:484:15:o;7888:187::-;8053:14;;8046:22;8028:41;;8016:2;8001:18;;7983:92::o;8080:221::-;;8229:2;8218:9;8211:21;8249:46;8291:2;8280:9;8276:18;8268:6;8249:46;:::i;8306:414::-;8508:2;8490:21;;;8547:2;8527:18;;;8520:30;8586:34;8581:2;8566:18;;8559:62;-1:-1:-1;;;8652:2:15;8637:18;;8630:48;8710:3;8695:19;;8480:240::o;8725:402::-;8927:2;8909:21;;;8966:2;8946:18;;;8939:30;9005:34;9000:2;8985:18;;8978:62;-1:-1:-1;;;9071:2:15;9056:18;;9049:36;9117:3;9102:19;;8899:228::o;9132:400::-;9334:2;9316:21;;;9373:2;9353:18;;;9346:30;9412:34;9407:2;9392:18;;9385:62;-1:-1:-1;;;9478:2:15;9463:18;;9456:34;9522:3;9507:19;;9306:226::o;9537:349::-;9739:2;9721:21;;;9778:2;9758:18;;;9751:30;9817:27;9812:2;9797:18;;9790:55;9877:2;9862:18;;9711:175::o;9891:354::-;10093:2;10075:21;;;10132:2;10112:18;;;10105:30;10171:32;10166:2;10151:18;;10144:60;10236:2;10221:18;;10065:180::o;10250:408::-;10452:2;10434:21;;;10491:2;10471:18;;;10464:30;10530:34;10525:2;10510:18;;10503:62;-1:-1:-1;;;10596:2:15;10581:18;;10574:42;10648:3;10633:19;;10424:234::o;10663:420::-;10865:2;10847:21;;;10904:2;10884:18;;;10877:30;10943:34;10938:2;10923:18;;10916:62;11014:26;11009:2;10994:18;;10987:54;11073:3;11058:19;;10837:246::o;11088:341::-;11290:2;11272:21;;;11329:2;11309:18;;;11302:30;-1:-1:-1;;;11363:2:15;11348:18;;11341:47;11420:2;11405:18;;11262:167::o;11434:406::-;11636:2;11618:21;;;11675:2;11655:18;;;11648:30;11714:34;11709:2;11694:18;;11687:62;-1:-1:-1;;;11780:2:15;11765:18;;11758:40;11830:3;11815:19;;11608:232::o;11845:405::-;12047:2;12029:21;;;12086:2;12066:18;;;12059:30;12125:34;12120:2;12105:18;;12098:62;-1:-1:-1;;;12191:2:15;12176:18;;12169:39;12240:3;12225:19;;12019:231::o;12255:400::-;12457:2;12439:21;;;12496:2;12476:18;;;12469:30;12535:34;12530:2;12515:18;;12508:62;-1:-1:-1;;;12601:2:15;12586:18;;12579:34;12645:3;12630:19;;12429:226::o;12660:408::-;12862:2;12844:21;;;12901:2;12881:18;;;12874:30;12940:34;12935:2;12920:18;;12913:62;-1:-1:-1;;;13006:2:15;12991:18;;12984:42;13058:3;13043:19;;12834:234::o;13073:356::-;13275:2;13257:21;;;13294:18;;;13287:30;13353:34;13348:2;13333:18;;13326:62;13420:2;13405:18;;13247:182::o;13434:405::-;13636:2;13618:21;;;13675:2;13655:18;;;13648:30;13714:34;13709:2;13694:18;;13687:62;-1:-1:-1;;;13780:2:15;13765:18;;13758:39;13829:3;13814:19;;13608:231::o;13844:411::-;14046:2;14028:21;;;14085:2;14065:18;;;14058:30;14124:34;14119:2;14104:18;;14097:62;-1:-1:-1;;;14190:2:15;14175:18;;14168:45;14245:3;14230:19;;14018:237::o;14260:403::-;14462:2;14444:21;;;14501:2;14481:18;;;14474:30;14540:34;14535:2;14520:18;;14513:62;-1:-1:-1;;;14606:2:15;14591:18;;14584:37;14653:3;14638:19;;14434:229::o;14668:397::-;14870:2;14852:21;;;14909:2;14889:18;;;14882:30;14948:34;14943:2;14928:18;;14921:62;-1:-1:-1;;;15014:2:15;14999:18;;14992:31;15055:3;15040:19;;14842:223::o;15070:413::-;15272:2;15254:21;;;15311:2;15291:18;;;15284:30;15350:34;15345:2;15330:18;;15323:62;-1:-1:-1;;;15416:2:15;15401:18;;15394:47;15473:3;15458:19;;15244:239::o;15488:344::-;15690:2;15672:21;;;15729:2;15709:18;;;15702:30;-1:-1:-1;;;15763:2:15;15748:18;;15741:50;15823:2;15808:18;;15662:170::o;15837:352::-;16039:2;16021:21;;;16078:2;16058:18;;;16051:30;16117;16112:2;16097:18;;16090:58;16180:2;16165:18;;16011:178::o;16194:177::-;16340:25;;;16328:2;16313:18;;16295:76::o;16376:251::-;16446:2;16440:9;16476:17;;;16523:18;16508:34;;16544:22;;;16505:62;16502:2;;;16570:18;;:::i;:::-;16606:2;16599:22;16420:207;;-1:-1:-1;16420:207:15:o;16632:128::-;;16703:1;16699:6;16696:1;16693:13;16690:2;;;16709:18;;:::i;:::-;-1:-1:-1;16745:9:15;;16680:80::o;16765:120::-;;16831:1;16821:2;;16836:18;;:::i;:::-;-1:-1:-1;16870:9:15;;16811:74::o;16890:125::-;;16958:1;16955;16952:8;16949:2;;;16963:18;;:::i;:::-;-1:-1:-1;17000:9:15;;16939:76::o;17020:258::-;17092:1;17102:113;17116:6;17113:1;17110:13;17102:113;;;17192:11;;;17186:18;17173:11;;;17166:39;17138:2;17131:10;17102:113;;;17233:6;17230:1;17227:13;17224:2;;;-1:-1:-1;;17268:1:15;17250:16;;17243:27;17073:205::o;17283:136::-;;17350:5;17340:2;;17359:18;;:::i;:::-;-1:-1:-1;;;17395:18:15;;17330:89::o;17424:380::-;17509:1;17499:12;;17556:1;17546:12;;;17567:2;;17621:4;17613:6;17609:17;17599:27;;17567:2;17674;17666:6;17663:14;17643:18;17640:38;17637:2;;;17720:10;17715:3;17711:20;17708:1;17701:31;17755:4;17752:1;17745:15;17783:4;17780:1;17773:15;17637:2;;17479:325;;;:::o;17809:135::-;;-1:-1:-1;;17869:17:15;;17866:2;;;17889:18;;:::i;:::-;-1:-1:-1;17936:1:15;17925:13;;17856:88::o;17949:112::-;;18007:1;17997:2;;18012:18;;:::i;:::-;-1:-1:-1;18046:9:15;;17987:74::o;18066:127::-;18127:10;18122:3;18118:20;18115:1;18108:31;18158:4;18155:1;18148:15;18182:4;18179:1;18172:15;18198:127;18259:10;18254:3;18250:20;18247:1;18240:31;18290:4;18287:1;18280:15;18314:4;18311:1;18304:15;18330:127;18391:10;18386:3;18382:20;18379:1;18372:31;18422:4;18419:1;18412:15;18446:4;18443:1;18436:15;18462:133;-1:-1:-1;;;;;18539:31:15;;18529:42;;18519:2;;18585:1;18582;18575:12;18600:133;-1:-1:-1;;;;;;18676:32:15;;18666:43;;18656:2;;18723:1;18720;18713:12
Swarm Source
ipfs://f9649f5544a8147d99120b36ece991a65d1e88450a508197936f5872dab52a5e
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.