More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 845 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Stake | 18192408 | 410 days ago | IN | 0 ETH | 0.00191199 | ||||
Stake | 18192406 | 410 days ago | IN | 0 ETH | 0.0040247 | ||||
Stake | 17999027 | 437 days ago | IN | 0 ETH | 0.0016842 | ||||
Stake | 17869189 | 456 days ago | IN | 0 ETH | 0.00780786 | ||||
Stake | 17869148 | 456 days ago | IN | 0 ETH | 0.00197479 | ||||
Stake | 17856489 | 457 days ago | IN | 0 ETH | 0.00821632 | ||||
Stake | 17856488 | 457 days ago | IN | 0 ETH | 0.00422436 | ||||
Stake | 17852203 | 458 days ago | IN | 0 ETH | 0.00189978 | ||||
Unstake | 17827682 | 461 days ago | IN | 0 ETH | 0.00164318 | ||||
Stake | 17824392 | 462 days ago | IN | 0 ETH | 0.00351007 | ||||
Stake | 17820396 | 462 days ago | IN | 0 ETH | 0.00342459 | ||||
Stake | 17751067 | 472 days ago | IN | 0 ETH | 0.00150293 | ||||
Stake | 17660502 | 485 days ago | IN | 0 ETH | 0.0014101 | ||||
Unstake | 17618189 | 491 days ago | IN | 0 ETH | 0.00459689 | ||||
Stake | 17610431 | 492 days ago | IN | 0 ETH | 0.00254446 | ||||
Stake | 17513157 | 506 days ago | IN | 0 ETH | 0.00733602 | ||||
Stake | 17513147 | 506 days ago | IN | 0 ETH | 0.0023244 | ||||
Stake | 17505843 | 507 days ago | IN | 0 ETH | 0.00155237 | ||||
Stake | 17499653 | 507 days ago | IN | 0 ETH | 0.00446608 | ||||
Stake | 17498382 | 508 days ago | IN | 0 ETH | 0.00503363 | ||||
Stake | 17498372 | 508 days ago | IN | 0 ETH | 0.00541758 | ||||
Stake | 17496067 | 508 days ago | IN | 0 ETH | 0.00233749 | ||||
Stake | 17492024 | 508 days ago | IN | 0 ETH | 0.00161745 | ||||
Stake | 17491376 | 509 days ago | IN | 0 ETH | 0.00272007 | ||||
Stake | 17491323 | 509 days ago | IN | 0 ETH | 0.00269126 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MutariuumStaking
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import '@openzeppelin/contracts/access/Ownable.sol'; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import "./interfaces/IMuutariumStaking.sol"; contract MutariuumStaking is IMuutariumStaking, Ownable { uint256 private constant _BITMASK_NUMBER_STAKED = (1 << 64) - 1; uint256 private constant _BITPOS_CAN_STAKE = 1 << 64; uint256 private constant _BITPOS_CAN_UNSTAKE = 1 << 65; uint256 private constant _BITMASK_STAKING_STATUS = 3 << 64; /** * @dev Mapping from nft address to * - mapping from tokenId to packed staking infos * packed staking info * Bits Layout: * - [0..159] Address of the original owner of the NFT * - [160..255] Timestamp of the staking */ mapping(address => mapping(uint256 => uint256)) private _packedStakingInfos; /** * @dev Mapping from nft address to packed contract infos * Bits Layout: * - [0..63] Number of NFTs currently staked * - [64..65] Staking status (INACTIVE, ACTIVE, PAUSED, LOCKED) */ mapping(address => uint256) private _packedContractInfos; /** * @dev Mapping from user address to nonce (aka: how many time this user * has used a signature provided by the contract owner) */ mapping(address => uint256) private _signatureNonces; /** Public Views */ /** * @notice get the current owner and time when the stake started of an NFT * @return StakingInfos */ function stakingInfos(address nft, uint256 tokenId) external view returns(StakingInfos memory) { (address owner, uint256 stakedAt) = _unpackStakingInfos(_packedStakingInfos[nft][tokenId]); return StakingInfos({ owner: owner, stakedAt: stakedAt }); } /** * @notice Get the number of NFTs currently staked and the current staking status of an NFT collection * @param nft The address of the collection * @return CollectionInfos */ function collectionInfos(address nft) external view returns(CollectionInfos memory) { (StakingStatus status, uint256 numberStaked) = _unpackContractInfos(_packedContractInfos[nft]); return CollectionInfos({ numberStaked: numberStaked, status: status }); } /** Public function calls */ /** * @notice Stake a list of nfts from a specific collection * @param nft The address of the collection * @param tokenIds the list of nfts from that collection * * - The status of the collection needs to be ACTIVE * - The staking contract must be approved on that collection for this sender */ function stake(address nft, uint256[] calldata tokenIds) external { require( _canStake(nft), "Staking is not active on this collection" ); require( IERC721(nft).isApprovedForAll(msg.sender, address(this)), "Missing approval for this collection" ); for (uint256 i = 0; i < tokenIds.length; i++) { require( IERC721(nft).ownerOf(tokenIds[i]) == msg.sender, string(abi.encodePacked( "You don't own token #", Strings.toString(tokenIds[i]), " from the contract ", Strings.toHexString(uint256(uint160(nft)), 20) )) ); IERC721(nft).transferFrom(msg.sender, address(this), tokenIds[i]); _packedStakingInfos[nft][tokenIds[i]] = _packStakingInfos(msg.sender, block.timestamp); _packedContractInfos[nft]++; emit Stake(nft, msg.sender, tokenIds[i]); } } /** * @notice Set an NFT that was sent by mistake to this contract as staked * @param nft The address of the collection * @param tokenId The nft from that collection * @param signature The approval from the owner to claim that stake * * - The NFT needs to be owned by this contract * - There should be no staking record for that NFT */ function recoverStake(address nft, uint256 tokenId, bytes calldata signature) external { require( IERC721(nft).ownerOf(tokenId) == address(this), "I'm not holding that NFT" ); require( _packedStakingInfos[nft][tokenId] == 0, "That NFT is already marked as staked" ); require( _verifySignature(nft, tokenId, signature), "This operation was not approved by the contract owner" ); _signatureNonces[msg.sender]++; _packedStakingInfos[nft][tokenId] = _packStakingInfos(msg.sender, block.timestamp); _packedContractInfos[nft]++; emit Stake(nft, msg.sender, tokenId); } /** * @notice Unstake a list of nfts from a specific collection * * @param nft The address of the collection * @param tokenIds the list of nfts from that collection * * - The nft must have been been staked by the caller */ function unstake(address nft, uint256[] calldata tokenIds) external { for (uint256 i = 0; i < tokenIds.length; i++) { (address owner, ) = _unpackStakingInfos(_packedStakingInfos[nft][tokenIds[i]]); require(owner == msg.sender, "You didn't stake this token"); _packedContractInfos[nft]--; IERC721(nft).transferFrom(address(this), owner, tokenIds[i]); delete _packedStakingInfos[nft][tokenIds[i]]; emit Unstake(nft, msg.sender, tokenIds[i]); } } /** Admin functions calls */ /** * @notice Enable or disable staking or unstaking for a specific collection * * @param nft The address of the collection * @param canStake If staking should be enabled or disabled * @param canUnstake If ustaking should be enabled or disabled */ function setStakingStatus(address nft, bool canStake, bool canUnstake) external onlyOwner { uint256 status = 0; if (canStake) { status = status | _BITPOS_CAN_STAKE; } if (canUnstake) { status = status | _BITPOS_CAN_UNSTAKE; } _packedContractInfos[nft] = _packedContractInfos[nft] & _BITMASK_NUMBER_STAKED | status; } /** Internal functions */ function _packStakingInfos(address staker, uint256 timestamp) private pure returns(uint256) { return (timestamp << 160) | uint160(staker); } function _unpackStakingInfos(uint256 pack) private pure returns(address, uint256) { return ( address(uint160(pack)), pack >> 160 ); } function _packContractInfos(StakingStatus status, uint256 numberStaked) private pure returns(uint256) { return (uint8(status) << 64) | numberStaked; } function _unpackContractInfos(uint256 pack) private pure returns(StakingStatus, uint256) { return ( StakingStatus((pack >> 64) & 3), uint256(uint64(pack)) ); } function _canStake(address nft) private view returns(bool) { return (_packedContractInfos[nft] & _BITPOS_CAN_STAKE) > 0; } function _canUnstake(address nft) private view returns(bool) { return (_packedContractInfos[nft] & _BITPOS_CAN_UNSTAKE) > 0; } function _verifySignature(address nft, uint256 tokenId, bytes calldata signature) internal view returns (bool){ bytes32 message = keccak256(abi.encodePacked(msg.sender, _signatureNonces[msg.sender], nft, tokenId)); bytes32 hash = keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", message ) ); address signer = ECDSA.recover(hash, signature); return signer == owner(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IMuutariumStaking { event Stake( address indexed contractAddress, address indexed staker, uint256 indexed tokenId ); event Unstake( address indexed contractAddress, address indexed staker, uint256 indexed tokenId ); enum StakingStatus { NONE, STAKE, UNSTAKE, ALL } struct StakingInfos { address owner; uint256 stakedAt; } struct CollectionInfos { uint256 numberStaked; StakingStatus status; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.3) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/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`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) 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 // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unstake","type":"event"},{"inputs":[{"internalType":"address","name":"nft","type":"address"}],"name":"collectionInfos","outputs":[{"components":[{"internalType":"uint256","name":"numberStaked","type":"uint256"},{"internalType":"enum IMuutariumStaking.StakingStatus","name":"status","type":"uint8"}],"internalType":"struct IMuutariumStaking.CollectionInfos","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"recoverStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"bool","name":"canStake","type":"bool"},{"internalType":"bool","name":"canUnstake","type":"bool"}],"name":"setStakingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakingInfos","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"stakedAt","type":"uint256"}],"internalType":"struct IMuutariumStaking.StakingInfos","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nft","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000032620000266200003860201b60201c565b6200004060201b60201c565b62000104565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612b2c80620001146000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b1461011e578063c9a3911e1461013c578063ecd7b2ff14610158578063eec9b66b14610174578063f2fde38b1461019057610093565b80630f23395214610098578063508ae2b0146100c85780635dbe4756146100f8578063715018a614610114575b600080fd5b6100b260048036038101906100ad91906119cb565b6101ac565b6040516100bf9190611a58565b60405180910390f35b6100e260048036038101906100dd9190611a73565b610249565b6040516100ef9190611b46565b60405180910390f35b610112600480360381019061010d9190611bc6565b6102d0565b005b61011c61059b565b005b6101266105af565b6040516101339190611c35565b60405180910390f35b61015660048036038101906101519190611bc6565b6105d8565b005b610172600480360381019061016d9190611ca6565b610a30565b005b61018e60048036038101906101899190611d52565b610d5e565b005b6101aa60048036038101906101a59190611a73565b610e27565b005b6101b46118d1565b600080610210600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054610eaa565b9150915060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152509250505092915050565b610251611901565b60008061029c600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ebc565b9150915060405180604001604052808281526020018360038111156102c4576102c3611aa0565b5b81525092505050919050565b60005b82829050811015610595576000610352600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086868681811061033757610336611da5565b5b90506020020135815260200190815260200160002054610eaa565b5090503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ba90611e31565b60405180910390fd5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061041390611e80565b91905055508473ffffffffffffffffffffffffffffffffffffffff166323b872dd308387878781811061044957610448611da5565b5b905060200201356040518463ffffffff1660e01b815260040161046e93929190611eb8565b600060405180830381600087803b15801561048857600080fd5b505af115801561049c573d6000803e3d6000fd5b50505050600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008585858181106104f4576104f3611da5565b5b905060200201358152602001908152602001600020600090558383838181106105205761051f611da5565b5b905060200201353373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c60405160405180910390a450808061058d90611eef565b9150506102d3565b50505050565b6105a3610eed565b6105ad6000610f6b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105e18361102f565b610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790611fa9565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161065b929190611fc9565b602060405180830381865afa158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190612007565b6106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d2906120a6565b60405180910390fd5b60005b82829050811015610a2a573373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e85858581811061072f5761072e611da5565b5b905060200201356040518263ffffffff1660e01b815260040161075291906120c6565b602060405180830381865afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906120f6565b73ffffffffffffffffffffffffffffffffffffffff16146107cc8484848181106107c0576107bf611da5565b5b90506020020135611085565b6107ed8673ffffffffffffffffffffffffffffffffffffffff1660146111e5565b6040516020016107fe92919061222c565b6040516020818303038152906040529061084e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084591906122b0565b60405180910390fd5b508373ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106108805761087f611da5565b5b905060200201356040518463ffffffff1660e01b81526004016108a593929190611eb8565b600060405180830381600087803b1580156108bf57600080fd5b505af11580156108d3573d6000803e3d6000fd5b505050506108e13342611421565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085858581811061093557610934611da5565b5b90506020020135815260200190815260200160002081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061099e90611eef565b91905055508282828181106109b6576109b5611da5565b5b905060200201353373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f760405160405180910390a48080610a2290611eef565b9150506106de565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610a8091906120c6565b602060405180830381865afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac191906120f6565b73ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e9061231e565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba1906123b0565b60405180910390fd5b610bb684848484611448565b610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec90612442565b60405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c4590611eef565b9190505550610c543342611421565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cf890611eef565b9190505550823373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f760405160405180910390a450505050565b610d66610eed565b60008215610d7d5768010000000000000000811790505b8115610d925768020000000000000000811790505b8067ffffffffffffffff600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541617600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b610e2f610eed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e95906124d4565b60405180910390fd5b610ea781610f6b565b50565b6000808260a084901c91509150915091565b6000806003604084901c166003811115610ed957610ed8611aa0565b5b8367ffffffffffffffff1691509150915091565b610ef5611579565b73ffffffffffffffffffffffffffffffffffffffff16610f136105af565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090612540565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008068010000000000000000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205416119050919050565b6060600082036110cc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506111e0565b600082905060005b600082146110fe5780806110e790611eef565b915050600a826110f7919061258f565b91506110d4565b60008167ffffffffffffffff81111561111a576111196125c0565b5b6040519080825280601f01601f19166020018201604052801561114c5781602001600182028036833780820191505090505b5090505b600085146111d95760018261116591906125ef565b9150600a856111749190612623565b60306111809190612654565b60f81b81838151811061119657611195611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856111d2919061258f565b9450611150565b8093505050505b919050565b6060600060028360026111f89190612688565b6112029190612654565b67ffffffffffffffff81111561121b5761121a6125c0565b5b6040519080825280601f01601f19166020018201604052801561124d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061128557611284611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106112e9576112e8611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026113299190612688565b6113339190612654565b90505b60018111156113d3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061137557611374611da5565b5b1a60f81b82828151811061138c5761138b611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806113cc90611e80565b9050611336565b5060008414611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90612716565b60405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1660a083901b17905092915050565b60008033600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487876040516020016114a1949392919061279f565b6040516020818303038152906040528051906020012090506000816040516020016114cc9190612864565b60405160208183030381529060405280519060200120905060006115348287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611581565b905061153e6105af565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050949350505050565b600033905090565b600080600061159085856115a8565b9150915061159d816115f9565b819250505092915050565b60008060418351036115e95760008060006020860151925060408601519150606086015160001a90506115dd878285856117c5565b945094505050506115f2565b60006002915091505b9250929050565b6000600481111561160d5761160c611aa0565b5b8160048111156116205761161f611aa0565b5b03156117c2576001600481111561163a57611639611aa0565b5b81600481111561164d5761164c611aa0565b5b0361168d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611684906128d6565b60405180910390fd5b600260048111156116a1576116a0611aa0565b5b8160048111156116b4576116b3611aa0565b5b036116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90612942565b60405180910390fd5b6003600481111561170857611707611aa0565b5b81600481111561171b5761171a611aa0565b5b0361175b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611752906129d4565b60405180910390fd5b60048081111561176e5761176d611aa0565b5b81600481111561178157611780611aa0565b5b036117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890612a66565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118005760006003915091506118c8565b601b8560ff16141580156118185750601c8560ff1614155b1561182a5760006004915091506118c8565b60006001878787876040516000815260200160405260405161184f9493929190612ab1565b6020604051602081039080840390855afa158015611871573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118bf576000600192509250506118c8565b80600092509250505b94509492505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060400160405280600081526020016000600381111561192757611926611aa0565b5b81525090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061196282611937565b9050919050565b61197281611957565b811461197d57600080fd5b50565b60008135905061198f81611969565b92915050565b6000819050919050565b6119a881611995565b81146119b357600080fd5b50565b6000813590506119c58161199f565b92915050565b600080604083850312156119e2576119e161192d565b5b60006119f085828601611980565b9250506020611a01858286016119b6565b9150509250929050565b611a1481611957565b82525050565b611a2381611995565b82525050565b604082016000820151611a3f6000850182611a0b565b506020820151611a526020850182611a1a565b50505050565b6000604082019050611a6d6000830184611a29565b92915050565b600060208284031215611a8957611a8861192d565b5b6000611a9784828501611980565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611ae057611adf611aa0565b5b50565b6000819050611af182611acf565b919050565b6000611b0182611ae3565b9050919050565b611b1181611af6565b82525050565b604082016000820151611b2d6000850182611a1a565b506020820151611b406020850182611b08565b50505050565b6000604082019050611b5b6000830184611b17565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b8657611b85611b61565b5b8235905067ffffffffffffffff811115611ba357611ba2611b66565b5b602083019150836020820283011115611bbf57611bbe611b6b565b5b9250929050565b600080600060408486031215611bdf57611bde61192d565b5b6000611bed86828701611980565b935050602084013567ffffffffffffffff811115611c0e57611c0d611932565b5b611c1a86828701611b70565b92509250509250925092565b611c2f81611957565b82525050565b6000602082019050611c4a6000830184611c26565b92915050565b60008083601f840112611c6657611c65611b61565b5b8235905067ffffffffffffffff811115611c8357611c82611b66565b5b602083019150836001820283011115611c9f57611c9e611b6b565b5b9250929050565b60008060008060608587031215611cc057611cbf61192d565b5b6000611cce87828801611980565b9450506020611cdf878288016119b6565b935050604085013567ffffffffffffffff811115611d0057611cff611932565b5b611d0c87828801611c50565b925092505092959194509250565b60008115159050919050565b611d2f81611d1a565b8114611d3a57600080fd5b50565b600081359050611d4c81611d26565b92915050565b600080600060608486031215611d6b57611d6a61192d565b5b6000611d7986828701611980565b9350506020611d8a86828701611d3d565b9250506040611d9b86828701611d3d565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f596f75206469646e2774207374616b65207468697320746f6b656e0000000000600082015250565b6000611e1b601b83611dd4565b9150611e2682611de5565b602082019050919050565b60006020820190508181036000830152611e4a81611e0e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e8b82611995565b915060008203611e9e57611e9d611e51565b5b600182039050919050565b611eb281611995565b82525050565b6000606082019050611ecd6000830186611c26565b611eda6020830185611c26565b611ee76040830184611ea9565b949350505050565b6000611efa82611995565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f2c57611f2b611e51565b5b600182019050919050565b7f5374616b696e67206973206e6f7420616374697665206f6e207468697320636f60008201527f6c6c656374696f6e000000000000000000000000000000000000000000000000602082015250565b6000611f93602883611dd4565b9150611f9e82611f37565b604082019050919050565b60006020820190508181036000830152611fc281611f86565b9050919050565b6000604082019050611fde6000830185611c26565b611feb6020830184611c26565b9392505050565b60008151905061200181611d26565b92915050565b60006020828403121561201d5761201c61192d565b5b600061202b84828501611ff2565b91505092915050565b7f4d697373696e6720617070726f76616c20666f72207468697320636f6c6c656360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b6000612090602483611dd4565b915061209b82612034565b604082019050919050565b600060208201905081810360008301526120bf81612083565b9050919050565b60006020820190506120db6000830184611ea9565b92915050565b6000815190506120f081611969565b92915050565b60006020828403121561210c5761210b61192d565b5b600061211a848285016120e1565b91505092915050565b600081905092915050565b7f596f7520646f6e2774206f776e20746f6b656e20230000000000000000000000600082015250565b6000612164601583612123565b915061216f8261212e565b601582019050919050565b600081519050919050565b60005b838110156121a3578082015181840152602081019050612188565b60008484015250505050565b60006121ba8261217a565b6121c48185612123565b93506121d4818560208601612185565b80840191505092915050565b7f2066726f6d2074686520636f6e74726163742000000000000000000000000000600082015250565b6000612216601383612123565b9150612221826121e0565b601382019050919050565b600061223782612157565b915061224382856121af565b915061224e82612209565b915061225a82846121af565b91508190509392505050565b6000601f19601f8301169050919050565b60006122828261217a565b61228c8185611dd4565b935061229c818560208601612185565b6122a581612266565b840191505092915050565b600060208201905081810360008301526122ca8184612277565b905092915050565b7f49276d206e6f7420686f6c64696e672074686174204e46540000000000000000600082015250565b6000612308601883611dd4565b9150612313826122d2565b602082019050919050565b60006020820190508181036000830152612337816122fb565b9050919050565b7f54686174204e465420697320616c7265616479206d61726b656420617320737460008201527f616b656400000000000000000000000000000000000000000000000000000000602082015250565b600061239a602483611dd4565b91506123a58261233e565b604082019050919050565b600060208201905081810360008301526123c98161238d565b9050919050565b7f54686973206f7065726174696f6e20776173206e6f7420617070726f7665642060008201527f62792074686520636f6e7472616374206f776e65720000000000000000000000602082015250565b600061242c603583611dd4565b9150612437826123d0565b604082019050919050565b6000602082019050818103600083015261245b8161241f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124be602683611dd4565b91506124c982612462565b604082019050919050565b600060208201905081810360008301526124ed816124b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061252a602083611dd4565b9150612535826124f4565b602082019050919050565b600060208201905081810360008301526125598161251d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061259a82611995565b91506125a583611995565b9250826125b5576125b4612560565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006125fa82611995565b915061260583611995565b925082820390508181111561261d5761261c611e51565b5b92915050565b600061262e82611995565b915061263983611995565b92508261264957612648612560565b5b828206905092915050565b600061265f82611995565b915061266a83611995565b925082820190508082111561268257612681611e51565b5b92915050565b600061269382611995565b915061269e83611995565b92508282026126ac81611995565b915082820484148315176126c3576126c2611e51565b5b5092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612700602083611dd4565b915061270b826126ca565b602082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b60008160601b9050919050565b600061274e82612736565b9050919050565b600061276082612743565b9050919050565b61277861277382611957565b612755565b82525050565b6000819050919050565b61279961279482611995565b61277e565b82525050565b60006127ab8287612767565b6014820191506127bb8286612788565b6020820191506127cb8285612767565b6014820191506127db8284612788565b60208201915081905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612823601c83612123565b915061282e826127ed565b601c82019050919050565b6000819050919050565b6000819050919050565b61285e61285982612839565b612843565b82525050565b600061286f82612816565b915061287b828461284d565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128c0601883611dd4565b91506128cb8261288a565b602082019050919050565b600060208201905081810360008301526128ef816128b3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061292c601f83611dd4565b9150612937826128f6565b602082019050919050565b6000602082019050818103600083015261295b8161291f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006129be602283611dd4565b91506129c982612962565b604082019050919050565b600060208201905081810360008301526129ed816129b1565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a50602283611dd4565b9150612a5b826129f4565b604082019050919050565b60006020820190508181036000830152612a7f81612a43565b9050919050565b612a8f81612839565b82525050565b600060ff82169050919050565b612aab81612a95565b82525050565b6000608082019050612ac66000830187612a86565b612ad36020830186612aa2565b612ae06040830185612a86565b612aed6060830184612a86565b9594505050505056fea26469706673582212201b2e5357b50da1292d58dea9e7e024c3487ec09875257b0ee8280fcc70fbff4764736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c80638da5cb5b116100665780638da5cb5b1461011e578063c9a3911e1461013c578063ecd7b2ff14610158578063eec9b66b14610174578063f2fde38b1461019057610093565b80630f23395214610098578063508ae2b0146100c85780635dbe4756146100f8578063715018a614610114575b600080fd5b6100b260048036038101906100ad91906119cb565b6101ac565b6040516100bf9190611a58565b60405180910390f35b6100e260048036038101906100dd9190611a73565b610249565b6040516100ef9190611b46565b60405180910390f35b610112600480360381019061010d9190611bc6565b6102d0565b005b61011c61059b565b005b6101266105af565b6040516101339190611c35565b60405180910390f35b61015660048036038101906101519190611bc6565b6105d8565b005b610172600480360381019061016d9190611ca6565b610a30565b005b61018e60048036038101906101899190611d52565b610d5e565b005b6101aa60048036038101906101a59190611a73565b610e27565b005b6101b46118d1565b600080610210600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002054610eaa565b9150915060405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001828152509250505092915050565b610251611901565b60008061029c600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610ebc565b9150915060405180604001604052808281526020018360038111156102c4576102c3611aa0565b5b81525092505050919050565b60005b82829050811015610595576000610352600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086868681811061033757610336611da5565b5b90506020020135815260200190815260200160002054610eaa565b5090503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146103c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ba90611e31565b60405180910390fd5b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061041390611e80565b91905055508473ffffffffffffffffffffffffffffffffffffffff166323b872dd308387878781811061044957610448611da5565b5b905060200201356040518463ffffffff1660e01b815260040161046e93929190611eb8565b600060405180830381600087803b15801561048857600080fd5b505af115801561049c573d6000803e3d6000fd5b50505050600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008585858181106104f4576104f3611da5565b5b905060200201358152602001908152602001600020600090558383838181106105205761051f611da5565b5b905060200201353373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f390b1276974b9463e5d66ab10df69b6f3d7b930eb066a0e66df327edd2cc811c60405160405180910390a450808061058d90611eef565b9150506102d3565b50505050565b6105a3610eed565b6105ad6000610f6b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6105e18361102f565b610620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061790611fa9565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663e985e9c533306040518363ffffffff1660e01b815260040161065b929190611fc9565b602060405180830381865afa158015610678573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069c9190612007565b6106db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d2906120a6565b60405180910390fd5b60005b82829050811015610a2a573373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e85858581811061072f5761072e611da5565b5b905060200201356040518263ffffffff1660e01b815260040161075291906120c6565b602060405180830381865afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906120f6565b73ffffffffffffffffffffffffffffffffffffffff16146107cc8484848181106107c0576107bf611da5565b5b90506020020135611085565b6107ed8673ffffffffffffffffffffffffffffffffffffffff1660146111e5565b6040516020016107fe92919061222c565b6040516020818303038152906040529061084e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084591906122b0565b60405180910390fd5b508373ffffffffffffffffffffffffffffffffffffffff166323b872dd33308686868181106108805761087f611da5565b5b905060200201356040518463ffffffff1660e01b81526004016108a593929190611eb8565b600060405180830381600087803b1580156108bf57600080fd5b505af11580156108d3573d6000803e3d6000fd5b505050506108e13342611421565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085858581811061093557610934611da5565b5b90506020020135815260200190815260200160002081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061099e90611eef565b91905055508282828181106109b6576109b5611da5565b5b905060200201353373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f760405160405180910390a48080610a2290611eef565b9150506106de565b50505050565b3073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16636352211e856040518263ffffffff1660e01b8152600401610a8091906120c6565b602060405180830381865afa158015610a9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac191906120f6565b73ffffffffffffffffffffffffffffffffffffffff1614610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e9061231e565b60405180910390fd5b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205414610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba1906123b0565b60405180910390fd5b610bb684848484611448565b610bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bec90612442565b60405180910390fd5b600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610c4590611eef565b9190505550610c543342611421565b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002081905550600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190610cf890611eef565b9190505550823373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f99039fcf0a98f484616c5196ee8b2ecfa971babf0b519848289ea4db381f85f760405160405180910390a450505050565b610d66610eed565b60008215610d7d5768010000000000000000811790505b8115610d925768020000000000000000811790505b8067ffffffffffffffff600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541617600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b610e2f610eed565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e95906124d4565b60405180910390fd5b610ea781610f6b565b50565b6000808260a084901c91509150915091565b6000806003604084901c166003811115610ed957610ed8611aa0565b5b8367ffffffffffffffff1691509150915091565b610ef5611579565b73ffffffffffffffffffffffffffffffffffffffff16610f136105af565b73ffffffffffffffffffffffffffffffffffffffff1614610f69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6090612540565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008068010000000000000000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205416119050919050565b6060600082036110cc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506111e0565b600082905060005b600082146110fe5780806110e790611eef565b915050600a826110f7919061258f565b91506110d4565b60008167ffffffffffffffff81111561111a576111196125c0565b5b6040519080825280601f01601f19166020018201604052801561114c5781602001600182028036833780820191505090505b5090505b600085146111d95760018261116591906125ef565b9150600a856111749190612623565b60306111809190612654565b60f81b81838151811061119657611195611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856111d2919061258f565b9450611150565b8093505050505b919050565b6060600060028360026111f89190612688565b6112029190612654565b67ffffffffffffffff81111561121b5761121a6125c0565b5b6040519080825280601f01601f19166020018201604052801561124d5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061128557611284611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106112e9576112e8611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026113299190612688565b6113339190612654565b90505b60018111156113d3577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061137557611374611da5565b5b1a60f81b82828151811061138c5761138b611da5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806113cc90611e80565b9050611336565b5060008414611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e90612716565b60405180910390fd5b8091505092915050565b60008273ffffffffffffffffffffffffffffffffffffffff1660a083901b17905092915050565b60008033600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205487876040516020016114a1949392919061279f565b6040516020818303038152906040528051906020012090506000816040516020016114cc9190612864565b60405160208183030381529060405280519060200120905060006115348287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611581565b905061153e6105af565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16149350505050949350505050565b600033905090565b600080600061159085856115a8565b9150915061159d816115f9565b819250505092915050565b60008060418351036115e95760008060006020860151925060408601519150606086015160001a90506115dd878285856117c5565b945094505050506115f2565b60006002915091505b9250929050565b6000600481111561160d5761160c611aa0565b5b8160048111156116205761161f611aa0565b5b03156117c2576001600481111561163a57611639611aa0565b5b81600481111561164d5761164c611aa0565b5b0361168d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611684906128d6565b60405180910390fd5b600260048111156116a1576116a0611aa0565b5b8160048111156116b4576116b3611aa0565b5b036116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90612942565b60405180910390fd5b6003600481111561170857611707611aa0565b5b81600481111561171b5761171a611aa0565b5b0361175b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611752906129d4565b60405180910390fd5b60048081111561176e5761176d611aa0565b5b81600481111561178157611780611aa0565b5b036117c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b890612a66565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156118005760006003915091506118c8565b601b8560ff16141580156118185750601c8560ff1614155b1561182a5760006004915091506118c8565b60006001878787876040516000815260200160405260405161184f9493929190612ab1565b6020604051602081039080840390855afa158015611871573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118bf576000600192509250506118c8565b80600092509250505b94509492505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b6040518060400160405280600081526020016000600381111561192757611926611aa0565b5b81525090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061196282611937565b9050919050565b61197281611957565b811461197d57600080fd5b50565b60008135905061198f81611969565b92915050565b6000819050919050565b6119a881611995565b81146119b357600080fd5b50565b6000813590506119c58161199f565b92915050565b600080604083850312156119e2576119e161192d565b5b60006119f085828601611980565b9250506020611a01858286016119b6565b9150509250929050565b611a1481611957565b82525050565b611a2381611995565b82525050565b604082016000820151611a3f6000850182611a0b565b506020820151611a526020850182611a1a565b50505050565b6000604082019050611a6d6000830184611a29565b92915050565b600060208284031215611a8957611a8861192d565b5b6000611a9784828501611980565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110611ae057611adf611aa0565b5b50565b6000819050611af182611acf565b919050565b6000611b0182611ae3565b9050919050565b611b1181611af6565b82525050565b604082016000820151611b2d6000850182611a1a565b506020820151611b406020850182611b08565b50505050565b6000604082019050611b5b6000830184611b17565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112611b8657611b85611b61565b5b8235905067ffffffffffffffff811115611ba357611ba2611b66565b5b602083019150836020820283011115611bbf57611bbe611b6b565b5b9250929050565b600080600060408486031215611bdf57611bde61192d565b5b6000611bed86828701611980565b935050602084013567ffffffffffffffff811115611c0e57611c0d611932565b5b611c1a86828701611b70565b92509250509250925092565b611c2f81611957565b82525050565b6000602082019050611c4a6000830184611c26565b92915050565b60008083601f840112611c6657611c65611b61565b5b8235905067ffffffffffffffff811115611c8357611c82611b66565b5b602083019150836001820283011115611c9f57611c9e611b6b565b5b9250929050565b60008060008060608587031215611cc057611cbf61192d565b5b6000611cce87828801611980565b9450506020611cdf878288016119b6565b935050604085013567ffffffffffffffff811115611d0057611cff611932565b5b611d0c87828801611c50565b925092505092959194509250565b60008115159050919050565b611d2f81611d1a565b8114611d3a57600080fd5b50565b600081359050611d4c81611d26565b92915050565b600080600060608486031215611d6b57611d6a61192d565b5b6000611d7986828701611980565b9350506020611d8a86828701611d3d565b9250506040611d9b86828701611d3d565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082825260208201905092915050565b7f596f75206469646e2774207374616b65207468697320746f6b656e0000000000600082015250565b6000611e1b601b83611dd4565b9150611e2682611de5565b602082019050919050565b60006020820190508181036000830152611e4a81611e0e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611e8b82611995565b915060008203611e9e57611e9d611e51565b5b600182039050919050565b611eb281611995565b82525050565b6000606082019050611ecd6000830186611c26565b611eda6020830185611c26565b611ee76040830184611ea9565b949350505050565b6000611efa82611995565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f2c57611f2b611e51565b5b600182019050919050565b7f5374616b696e67206973206e6f7420616374697665206f6e207468697320636f60008201527f6c6c656374696f6e000000000000000000000000000000000000000000000000602082015250565b6000611f93602883611dd4565b9150611f9e82611f37565b604082019050919050565b60006020820190508181036000830152611fc281611f86565b9050919050565b6000604082019050611fde6000830185611c26565b611feb6020830184611c26565b9392505050565b60008151905061200181611d26565b92915050565b60006020828403121561201d5761201c61192d565b5b600061202b84828501611ff2565b91505092915050565b7f4d697373696e6720617070726f76616c20666f72207468697320636f6c6c656360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b6000612090602483611dd4565b915061209b82612034565b604082019050919050565b600060208201905081810360008301526120bf81612083565b9050919050565b60006020820190506120db6000830184611ea9565b92915050565b6000815190506120f081611969565b92915050565b60006020828403121561210c5761210b61192d565b5b600061211a848285016120e1565b91505092915050565b600081905092915050565b7f596f7520646f6e2774206f776e20746f6b656e20230000000000000000000000600082015250565b6000612164601583612123565b915061216f8261212e565b601582019050919050565b600081519050919050565b60005b838110156121a3578082015181840152602081019050612188565b60008484015250505050565b60006121ba8261217a565b6121c48185612123565b93506121d4818560208601612185565b80840191505092915050565b7f2066726f6d2074686520636f6e74726163742000000000000000000000000000600082015250565b6000612216601383612123565b9150612221826121e0565b601382019050919050565b600061223782612157565b915061224382856121af565b915061224e82612209565b915061225a82846121af565b91508190509392505050565b6000601f19601f8301169050919050565b60006122828261217a565b61228c8185611dd4565b935061229c818560208601612185565b6122a581612266565b840191505092915050565b600060208201905081810360008301526122ca8184612277565b905092915050565b7f49276d206e6f7420686f6c64696e672074686174204e46540000000000000000600082015250565b6000612308601883611dd4565b9150612313826122d2565b602082019050919050565b60006020820190508181036000830152612337816122fb565b9050919050565b7f54686174204e465420697320616c7265616479206d61726b656420617320737460008201527f616b656400000000000000000000000000000000000000000000000000000000602082015250565b600061239a602483611dd4565b91506123a58261233e565b604082019050919050565b600060208201905081810360008301526123c98161238d565b9050919050565b7f54686973206f7065726174696f6e20776173206e6f7420617070726f7665642060008201527f62792074686520636f6e7472616374206f776e65720000000000000000000000602082015250565b600061242c603583611dd4565b9150612437826123d0565b604082019050919050565b6000602082019050818103600083015261245b8161241f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006124be602683611dd4565b91506124c982612462565b604082019050919050565b600060208201905081810360008301526124ed816124b1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061252a602083611dd4565b9150612535826124f4565b602082019050919050565b600060208201905081810360008301526125598161251d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061259a82611995565b91506125a583611995565b9250826125b5576125b4612560565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006125fa82611995565b915061260583611995565b925082820390508181111561261d5761261c611e51565b5b92915050565b600061262e82611995565b915061263983611995565b92508261264957612648612560565b5b828206905092915050565b600061265f82611995565b915061266a83611995565b925082820190508082111561268257612681611e51565b5b92915050565b600061269382611995565b915061269e83611995565b92508282026126ac81611995565b915082820484148315176126c3576126c2611e51565b5b5092915050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000612700602083611dd4565b915061270b826126ca565b602082019050919050565b6000602082019050818103600083015261272f816126f3565b9050919050565b60008160601b9050919050565b600061274e82612736565b9050919050565b600061276082612743565b9050919050565b61277861277382611957565b612755565b82525050565b6000819050919050565b61279961279482611995565b61277e565b82525050565b60006127ab8287612767565b6014820191506127bb8286612788565b6020820191506127cb8285612767565b6014820191506127db8284612788565b60208201915081905095945050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b6000612823601c83612123565b915061282e826127ed565b601c82019050919050565b6000819050919050565b6000819050919050565b61285e61285982612839565b612843565b82525050565b600061286f82612816565b915061287b828461284d565b60208201915081905092915050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006128c0601883611dd4565b91506128cb8261288a565b602082019050919050565b600060208201905081810360008301526128ef816128b3565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b600061292c601f83611dd4565b9150612937826128f6565b602082019050919050565b6000602082019050818103600083015261295b8161291f565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006129be602283611dd4565b91506129c982612962565b604082019050919050565b600060208201905081810360008301526129ed816129b1565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612a50602283611dd4565b9150612a5b826129f4565b604082019050919050565b60006020820190508181036000830152612a7f81612a43565b9050919050565b612a8f81612839565b82525050565b600060ff82169050919050565b612aab81612a95565b82525050565b6000608082019050612ac66000830187612a86565b612ad36020830186612aa2565b612ae06040830185612a86565b612aed6060830184612a86565b9594505050505056fea26469706673582212201b2e5357b50da1292d58dea9e7e024c3487ec09875257b0ee8280fcc70fbff4764736f6c63430008110033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.