Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 115 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Add Plugin | 23108372 | 89 days ago | IN | 0 ETH | 0.00011594 | ||||
| Add Plugin | 23105817 | 90 days ago | IN | 0 ETH | 0.00013176 | ||||
| Add Plugin | 23105803 | 90 days ago | IN | 0 ETH | 0.0001304 | ||||
| Add Plugin | 23105773 | 90 days ago | IN | 0 ETH | 0.00013004 | ||||
| Add Plugin | 23105772 | 90 days ago | IN | 0 ETH | 0.00012998 | ||||
| Add Plugin | 23099537 | 91 days ago | IN | 0 ETH | 0.00011667 | ||||
| Add Plugin | 23098371 | 91 days ago | IN | 0 ETH | 0.00014925 | ||||
| Add Plugin | 23032983 | 100 days ago | IN | 0 ETH | 0.00025947 | ||||
| Add Plugin | 23019310 | 102 days ago | IN | 0 ETH | 0.00013256 | ||||
| Add Plugin | 23019287 | 102 days ago | IN | 0 ETH | 0.00013065 | ||||
| Add Plugin | 22937308 | 113 days ago | IN | 0 ETH | 0.00023023 | ||||
| Add Plugin | 22937293 | 113 days ago | IN | 0 ETH | 0.00020642 | ||||
| Add Plugin | 22904501 | 118 days ago | IN | 0 ETH | 0.00013556 | ||||
| Add Plugin | 22705340 | 146 days ago | IN | 0 ETH | 0.0000409 | ||||
| Add Plugin | 22705329 | 146 days ago | IN | 0 ETH | 0.00004118 | ||||
| Add Plugin | 22704922 | 146 days ago | IN | 0 ETH | 0.0000303 | ||||
| Add Plugin | 22704859 | 146 days ago | IN | 0 ETH | 0.00002983 | ||||
| Add Plugin | 22704754 | 146 days ago | IN | 0 ETH | 0.00003249 | ||||
| Add Plugin | 22704737 | 146 days ago | IN | 0 ETH | 0.00003397 | ||||
| Add Plugin | 22646067 | 154 days ago | IN | 0 ETH | 0.00016174 | ||||
| Add Plugin | 22618529 | 158 days ago | IN | 0 ETH | 0.00022028 | ||||
| Add Plugin | 22405696 | 188 days ago | IN | 0 ETH | 0.0000433 | ||||
| Add Plugin | 22405655 | 188 days ago | IN | 0 ETH | 0.00004267 | ||||
| Add Plugin | 22295287 | 203 days ago | IN | 0 ETH | 0.00004381 | ||||
| Add Plugin | 22282381 | 205 days ago | IN | 0 ETH | 0.00007267 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
|||
|---|---|---|---|---|---|---|---|
| Transfer | 17973469 | 808 days ago | 0.0008 ETH | ||||
| Add Plugin | 17973469 | 808 days ago | 0.0008 ETH | ||||
| Transfer | 17103188 | 930 days ago | 0.00008 ETH | ||||
| Add Plugin | 17103188 | 930 days ago | 0.00008 ETH | ||||
| Transfer | 17089591 | 932 days ago | 0.00008 ETH | ||||
| Add Plugin | 17089591 | 932 days ago | 0.00008 ETH | ||||
| Transfer | 16822685 | 970 days ago | 0.00023407 ETH | ||||
| Transfer | 16789476 | 974 days ago | 0.00029797 ETH | ||||
| Transfer | 16622156 | 998 days ago | 0.00031287 ETH | ||||
| Transfer | 16438258 | 1024 days ago | 0.00182692 ETH | ||||
| Add Plugin | 16438258 | 1024 days ago | 0.00182692 ETH | ||||
| Transfer | 16393502 | 1030 days ago | 0.00028003 ETH | ||||
| Transfer | 16306731 | 1042 days ago | 0.00018482 ETH | ||||
| Transfer | 16306702 | 1042 days ago | 0.00017674 ETH | ||||
| Transfer | 16306675 | 1042 days ago | 0.00018524 ETH | ||||
| Transfer | 16306675 | 1042 days ago | 0.00020843 ETH | ||||
| Transfer | 16119619 | 1068 days ago | 0.00014952 ETH | ||||
| Add Plugin | 16119619 | 1068 days ago | 0.00014952 ETH | ||||
| Transfer | 16101054 | 1071 days ago | 0.00009136 ETH | ||||
| Add Plugin | 16101054 | 1071 days ago | 0.00009136 ETH | ||||
| Transfer | 16098203 | 1071 days ago | 0.00014959 ETH | ||||
| Add Plugin | 16098203 | 1071 days ago | 0.00014959 ETH | ||||
| Transfer | 16098165 | 1071 days ago | 0.0001065 ETH | ||||
| Add Plugin | 16098165 | 1071 days ago | 0.0001065 ETH | ||||
| Transfer | 15999199 | 1085 days ago | 0.00010461 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Timestamp
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-16 */ // Sources flattened with hardhat v2.9.3 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // SPDX-License-Identifier: UNLICENSED // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = _setInitializedVersion(1); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { bool isTopLevelCall = _setInitializedVersion(version); if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(version); } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { _setInitializedVersion(type(uint8).max); } function _setInitializedVersion(uint8 version) private returns (bool) { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, and for the lowest level // of initializers, because in other contexts the contract may have been reentered. if (_initializing) { require( version == 1 && !AddressUpgradeable.isContract(address(this)), "Initializable: contract is already initialized" ); return false; } else { require(_initialized < version, "Initializable: contract is already initialized"); _initialized = version; return true; } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_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 { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts/utils/introspection/[email protected] // 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); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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; } // File contracts/utils/IOtoCoMaster.sol pragma solidity ^0.8.0; interface IOtoCoMaster { /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev See {OtoCoMaster-baseFee}. */ function baseFee() external view returns (uint256 fee); receive() external payable; } // File contracts/utils/IOtoCoPlugin.sol pragma solidity ^0.8.0; interface IOtoCoPlugin { /** * Plugin initializer with a fuinction template to be used. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * * @param pluginData The parameters to create a new instance of plugin. */ function addPlugin(uint256 seriesId, bytes calldata pluginData) external payable; /** * Allow attach a previously deployed plugin if possible * @dev This function should run enumerous amounts of verifications before allow the attachment. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * * @param pluginData The parameters to remove a instance of the plugin. */ function attachPlugin(uint256 seriesId, bytes calldata pluginData) external payable; /** * Plugin initializer with a fuinction template to be used. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * * @param pluginData The parameters to remove a instance of the plugin. */ function removePlugin(uint256 seriesId, bytes calldata pluginData) external payable; } // File @openzeppelin/contracts/utils/[email protected] // 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; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _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); } } // File contracts/OtoCoPlugin.sol pragma solidity ^0.8.0; abstract contract OtoCoPlugin is IOtoCoPlugin, Ownable { // Reference to the OtoCo Master to transfer plugin cost IOtoCoMaster public otocoMaster; /** * Modifier to allow only series owners to change content. * @param tokenId The plugin index to update. */ modifier onlySeriesOwner(uint256 tokenId) { require(otocoMaster.ownerOf(tokenId) == msg.sender, "OtoCoPlugin: Not the entity owner."); _; } /** * Modifier to check if the function set the correct amount of ETH value and transfer it to master. * If baseFee are 0 or sender is OtoCoMaster this step is jumped. * @dev in the future add/attact/remove could be called from OtoCo Master. In those cases no transfer should be called. */ modifier transferFees() { if (otocoMaster.baseFee() > 0 && msg.sender != address(otocoMaster)) payable(otocoMaster).transfer(msg.value); _; } constructor(address payable _otocoMaster) Ownable() { otocoMaster = IOtoCoMaster(_otocoMaster); } /** * Plugin initializer with a fuinction template to be used. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * @dev Override this function to implement your elements. * @param pluginData The parameters to create a new instance of plugin. */ function addPlugin(uint256 seriesId, bytes calldata pluginData) external payable virtual override; /** * Allow attach a previously deployed plugin if possible * @dev This function should run enumerous amounts of verifications before allow the attachment. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * @dev Override this function to implement your elements. * @param pluginData The parameters to remove a instance of the plugin. */ function attachPlugin(uint256 seriesId, bytes calldata pluginData) external payable virtual override { revert("OtoCoPlugin: Attach elements are not possible on this plugin."); } /** * Plugin initializer with a fuinction template to be used. * @dev To decode initialization data use i.e.: (string memory name) = abi.decode(pluginData, (string)); * @dev Override this function to implement your elements. * @param pluginData The parameters to remove a instance of the plugin. */ function removePlugin(uint256 seriesId, bytes calldata pluginData) external payable virtual override { revert("OtoCoPlugin: Remove elements are not possible on this plugin."); } } // File contracts/plugins/Timestamp.sol pragma solidity ^0.8.0; /** * Master Registry Contract. */ contract Timestamp is OtoCoPlugin { event DocumentTimestamped(uint256 indexed seriesId, uint256 timestamp, string filename, string cid); // Upgradeable contract initializer constructor (address payable otocoMaster) OtoCoPlugin(otocoMaster) {} /** * Create a new timestamp for the entity. May only be called by the owner of the series. * * @param seriesId The series ID be updated. * @param pluginData filename and cid of the document to be timestamped abi encoded. */ function addPlugin(uint256 seriesId, bytes calldata pluginData) public onlySeriesOwner(seriesId) transferFees() payable override { ( string memory filename, string memory cid ) = abi.decode(pluginData, (string, string)); emit DocumentTimestamped(seriesId, block.timestamp, filename, cid); } /** * Allow manager of the plugin to migrate previous Timestamps. * * @param seriesId The series ID be updated. * @param pluginData filename, cid and timestamp of the document to be timestamped abi encoded. */ function migrateTimestamp(uint256 seriesId, bytes calldata pluginData) public onlyOwner { ( string memory filename, string memory cid, uint256 timestamp ) = abi.decode(pluginData, (string, string, uint256)); emit DocumentTimestamped(seriesId, timestamp, filename, cid); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"otocoMaster","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"seriesId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"string","name":"filename","type":"string"},{"indexed":false,"internalType":"string","name":"cid","type":"string"}],"name":"DocumentTimestamped","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"},{"inputs":[{"internalType":"uint256","name":"seriesId","type":"uint256"},{"internalType":"bytes","name":"pluginData","type":"bytes"}],"name":"addPlugin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seriesId","type":"uint256"},{"internalType":"bytes","name":"pluginData","type":"bytes"}],"name":"attachPlugin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seriesId","type":"uint256"},{"internalType":"bytes","name":"pluginData","type":"bytes"}],"name":"migrateTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"otocoMaster","outputs":[{"internalType":"contract IOtoCoMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"seriesId","type":"uint256"},{"internalType":"bytes","name":"pluginData","type":"bytes"}],"name":"removePlugin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620012c8380380620012c8833981810160405281019062000037919062000184565b80620000586200004c620000a160201b60201c565b620000a960201b60201c565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620001fe565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200017e81620001e4565b92915050565b6000602082840312156200019757600080fd5b6000620001a7848285016200016d565b91505092915050565b6000620001bd82620001c4565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620001ef81620001b0565b8114620001fb57600080fd5b50565b6110ba806200020e6000396000f3fe60806040526004361061007b5760003560e01c8063949c485b1161004e578063949c485b14610107578063efcf936e14610123578063f2fde38b1461013f578063f9bcfa15146101685761007b565b80631b03917414610080578063715018a6146100a95780638629d6a8146100c05780638da5cb5b146100dc575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190610ac9565b610193565b005b3480156100b557600080fd5b506100be61026d565b005b6100da60048036038101906100d59190610ac9565b6102f5565b005b3480156100e857600080fd5b506100f1610330565b6040516100fe9190610c36565b60405180910390f35b610121600480360381019061011c9190610ac9565b610359565b005b61013d60048036038101906101389190610ac9565b610638565b005b34801561014b57600080fd5b5061016660048036038101906101619190610963565b610673565b005b34801561017457600080fd5b5061017d61076b565b60405161018a9190610c51565b60405180910390f35b61019b610791565b73ffffffffffffffffffffffffffffffffffffffff166101b9610330565b73ffffffffffffffffffffffffffffffffffffffff161461020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020690610ccc565b60405180910390fd5b600080600084848101906102239190610a21565b925092509250857fba592f4cb312ca18d764a0d563b87f9b277fc2e07336257478318817fce7291082858560405161025d93929190610d27565b60405180910390a2505050505050565b610275610791565b73ffffffffffffffffffffffffffffffffffffffff16610293610330565b73ffffffffffffffffffffffffffffffffffffffff16146102e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e090610ccc565b60405180910390fd5b6102f36000610799565b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032790610c8c565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b823373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016103cc9190610d0c565b60206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c919061098c565b73ffffffffffffffffffffffffffffffffffffffff1614610472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046990610cec565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ef25c3a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104dc57600080fd5b505afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190610aa0565b11801561056f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156105de57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156105dc573d6000803e3d6000fd5b505b60008084848101906105f091906109b5565b91509150857fba592f4cb312ca18d764a0d563b87f9b277fc2e07336257478318817fce7291042848460405161062893929190610d27565b60405180910390a2505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066a90610cac565b60405180910390fd5b61067b610791565b73ffffffffffffffffffffffffffffffffffffffff16610699610330565b73ffffffffffffffffffffffffffffffffffffffff16146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690610ccc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690610c6c565b60405180910390fd5b61076881610799565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061087061086b84610d91565b610d6c565b90508281526020810184848401111561088857600080fd5b610893848285610e3e565b509392505050565b6000813590506108aa81611056565b92915050565b6000815190506108bf81611056565b92915050565b60008083601f8401126108d757600080fd5b8235905067ffffffffffffffff8111156108f057600080fd5b60208301915083600182028301111561090857600080fd5b9250929050565b600082601f83011261092057600080fd5b813561093084826020860161085d565b91505092915050565b6000813590506109488161106d565b92915050565b60008151905061095d8161106d565b92915050565b60006020828403121561097557600080fd5b60006109838482850161089b565b91505092915050565b60006020828403121561099e57600080fd5b60006109ac848285016108b0565b91505092915050565b600080604083850312156109c857600080fd5b600083013567ffffffffffffffff8111156109e257600080fd5b6109ee8582860161090f565b925050602083013567ffffffffffffffff811115610a0b57600080fd5b610a178582860161090f565b9150509250929050565b600080600060608486031215610a3657600080fd5b600084013567ffffffffffffffff811115610a5057600080fd5b610a5c8682870161090f565b935050602084013567ffffffffffffffff811115610a7957600080fd5b610a858682870161090f565b9250506040610a9686828701610939565b9150509250925092565b600060208284031215610ab257600080fd5b6000610ac08482850161094e565b91505092915050565b600080600060408486031215610ade57600080fd5b6000610aec86828701610939565b935050602084013567ffffffffffffffff811115610b0957600080fd5b610b15868287016108c5565b92509250509250925092565b610b2a81610dde565b82525050565b610b3981610e1a565b82525050565b6000610b4a82610dc2565b610b548185610dcd565b9350610b64818560208601610e4d565b610b6d81610ee0565b840191505092915050565b6000610b85602683610dcd565b9150610b9082610ef1565b604082019050919050565b6000610ba8603d83610dcd565b9150610bb382610f40565b604082019050919050565b6000610bcb603d83610dcd565b9150610bd682610f8f565b604082019050919050565b6000610bee602083610dcd565b9150610bf982610fde565b602082019050919050565b6000610c11602283610dcd565b9150610c1c82611007565b604082019050919050565b610c3081610e10565b82525050565b6000602082019050610c4b6000830184610b21565b92915050565b6000602082019050610c666000830184610b30565b92915050565b60006020820190508181036000830152610c8581610b78565b9050919050565b60006020820190508181036000830152610ca581610b9b565b9050919050565b60006020820190508181036000830152610cc581610bbe565b9050919050565b60006020820190508181036000830152610ce581610be1565b9050919050565b60006020820190508181036000830152610d0581610c04565b9050919050565b6000602082019050610d216000830184610c27565b92915050565b6000606082019050610d3c6000830186610c27565b8181036020830152610d4e8185610b3f565b90508181036040830152610d628184610b3f565b9050949350505050565b6000610d76610d87565b9050610d828282610e80565b919050565b6000604051905090565b600067ffffffffffffffff821115610dac57610dab610eb1565b5b610db582610ee0565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b6000610de982610df0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610e2582610e2c565b9050919050565b6000610e3782610df0565b9050919050565b82818337600083830152505050565b60005b83811015610e6b578082015181840152602081019050610e50565b83811115610e7a576000848401525b50505050565b610e8982610ee0565b810181811067ffffffffffffffff82111715610ea857610ea7610eb1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f746f436f506c7567696e3a2041747461636820656c656d656e74732061726560008201527f206e6f7420706f737369626c65206f6e207468697320706c7567696e2e000000602082015250565b7f4f746f436f506c7567696e3a2052656d6f766520656c656d656e74732061726560008201527f206e6f7420706f737369626c65206f6e207468697320706c7567696e2e000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f746f436f506c7567696e3a204e6f742074686520656e74697479206f776e6560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b61105f81610dde565b811461106a57600080fd5b50565b61107681610e10565b811461108157600080fd5b5056fea2646970667358221220c5a0c0f5ab6d47c6d23f0ddf54f697128c2444caab8d05742fe9317b2da566ac64736f6c63430008030033000000000000000000000000752b0073422a7f9cda7f71b5fe7f12a1789e6506
Deployed Bytecode
0x60806040526004361061007b5760003560e01c8063949c485b1161004e578063949c485b14610107578063efcf936e14610123578063f2fde38b1461013f578063f9bcfa15146101685761007b565b80631b03917414610080578063715018a6146100a95780638629d6a8146100c05780638da5cb5b146100dc575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190610ac9565b610193565b005b3480156100b557600080fd5b506100be61026d565b005b6100da60048036038101906100d59190610ac9565b6102f5565b005b3480156100e857600080fd5b506100f1610330565b6040516100fe9190610c36565b60405180910390f35b610121600480360381019061011c9190610ac9565b610359565b005b61013d60048036038101906101389190610ac9565b610638565b005b34801561014b57600080fd5b5061016660048036038101906101619190610963565b610673565b005b34801561017457600080fd5b5061017d61076b565b60405161018a9190610c51565b60405180910390f35b61019b610791565b73ffffffffffffffffffffffffffffffffffffffff166101b9610330565b73ffffffffffffffffffffffffffffffffffffffff161461020f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161020690610ccc565b60405180910390fd5b600080600084848101906102239190610a21565b925092509250857fba592f4cb312ca18d764a0d563b87f9b277fc2e07336257478318817fce7291082858560405161025d93929190610d27565b60405180910390a2505050505050565b610275610791565b73ffffffffffffffffffffffffffffffffffffffff16610293610330565b73ffffffffffffffffffffffffffffffffffffffff16146102e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e090610ccc565b60405180910390fd5b6102f36000610799565b565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032790610c8c565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b823373ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016103cc9190610d0c565b60206040518083038186803b1580156103e457600080fd5b505afa1580156103f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041c919061098c565b73ffffffffffffffffffffffffffffffffffffffff1614610472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046990610cec565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636ef25c3a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104dc57600080fd5b505afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190610aa0565b11801561056f5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156105de57600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156105dc573d6000803e3d6000fd5b505b60008084848101906105f091906109b5565b91509150857fba592f4cb312ca18d764a0d563b87f9b277fc2e07336257478318817fce7291042848460405161062893929190610d27565b60405180910390a2505050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066a90610cac565b60405180910390fd5b61067b610791565b73ffffffffffffffffffffffffffffffffffffffff16610699610330565b73ffffffffffffffffffffffffffffffffffffffff16146106ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e690610ccc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690610c6c565b60405180910390fd5b61076881610799565b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061087061086b84610d91565b610d6c565b90508281526020810184848401111561088857600080fd5b610893848285610e3e565b509392505050565b6000813590506108aa81611056565b92915050565b6000815190506108bf81611056565b92915050565b60008083601f8401126108d757600080fd5b8235905067ffffffffffffffff8111156108f057600080fd5b60208301915083600182028301111561090857600080fd5b9250929050565b600082601f83011261092057600080fd5b813561093084826020860161085d565b91505092915050565b6000813590506109488161106d565b92915050565b60008151905061095d8161106d565b92915050565b60006020828403121561097557600080fd5b60006109838482850161089b565b91505092915050565b60006020828403121561099e57600080fd5b60006109ac848285016108b0565b91505092915050565b600080604083850312156109c857600080fd5b600083013567ffffffffffffffff8111156109e257600080fd5b6109ee8582860161090f565b925050602083013567ffffffffffffffff811115610a0b57600080fd5b610a178582860161090f565b9150509250929050565b600080600060608486031215610a3657600080fd5b600084013567ffffffffffffffff811115610a5057600080fd5b610a5c8682870161090f565b935050602084013567ffffffffffffffff811115610a7957600080fd5b610a858682870161090f565b9250506040610a9686828701610939565b9150509250925092565b600060208284031215610ab257600080fd5b6000610ac08482850161094e565b91505092915050565b600080600060408486031215610ade57600080fd5b6000610aec86828701610939565b935050602084013567ffffffffffffffff811115610b0957600080fd5b610b15868287016108c5565b92509250509250925092565b610b2a81610dde565b82525050565b610b3981610e1a565b82525050565b6000610b4a82610dc2565b610b548185610dcd565b9350610b64818560208601610e4d565b610b6d81610ee0565b840191505092915050565b6000610b85602683610dcd565b9150610b9082610ef1565b604082019050919050565b6000610ba8603d83610dcd565b9150610bb382610f40565b604082019050919050565b6000610bcb603d83610dcd565b9150610bd682610f8f565b604082019050919050565b6000610bee602083610dcd565b9150610bf982610fde565b602082019050919050565b6000610c11602283610dcd565b9150610c1c82611007565b604082019050919050565b610c3081610e10565b82525050565b6000602082019050610c4b6000830184610b21565b92915050565b6000602082019050610c666000830184610b30565b92915050565b60006020820190508181036000830152610c8581610b78565b9050919050565b60006020820190508181036000830152610ca581610b9b565b9050919050565b60006020820190508181036000830152610cc581610bbe565b9050919050565b60006020820190508181036000830152610ce581610be1565b9050919050565b60006020820190508181036000830152610d0581610c04565b9050919050565b6000602082019050610d216000830184610c27565b92915050565b6000606082019050610d3c6000830186610c27565b8181036020830152610d4e8185610b3f565b90508181036040830152610d628184610b3f565b9050949350505050565b6000610d76610d87565b9050610d828282610e80565b919050565b6000604051905090565b600067ffffffffffffffff821115610dac57610dab610eb1565b5b610db582610ee0565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b6000610de982610df0565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000610e2582610e2c565b9050919050565b6000610e3782610df0565b9050919050565b82818337600083830152505050565b60005b83811015610e6b578082015181840152602081019050610e50565b83811115610e7a576000848401525b50505050565b610e8982610ee0565b810181811067ffffffffffffffff82111715610ea857610ea7610eb1565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f746f436f506c7567696e3a2041747461636820656c656d656e74732061726560008201527f206e6f7420706f737369626c65206f6e207468697320706c7567696e2e000000602082015250565b7f4f746f436f506c7567696e3a2052656d6f766520656c656d656e74732061726560008201527f206e6f7420706f737369626c65206f6e207468697320706c7567696e2e000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4f746f436f506c7567696e3a204e6f742074686520656e74697479206f776e6560008201527f722e000000000000000000000000000000000000000000000000000000000000602082015250565b61105f81610dde565b811461106a57600080fd5b50565b61107681610e10565b811461108157600080fd5b5056fea2646970667358221220c5a0c0f5ab6d47c6d23f0ddf54f697128c2444caab8d05742fe9317b2da566ac64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000752b0073422a7f9cda7f71b5fe7f12a1789e6506
-----Decoded View---------------
Arg [0] : otocoMaster (address): 0x752B0073422A7F9Cda7f71B5fE7F12a1789e6506
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000752b0073422a7f9cda7f71b5fe7f12a1789e6506
Deployed Bytecode Sourcemap
32134:1469:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33256:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28452:103;;;;;;;;;;;;;:::i;:::-;;31289:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27801:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32659:348;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31822:191;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28710:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29463:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33256:342;28032:12;:10;:12::i;:::-;28021:23;;:7;:5;:7::i;:::-;:23;;;28013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33370:22:::1;33407:17:::0;33439::::1;33481:10;;33470:49;;;;;;;:::i;:::-;33355:164;;;;;;33555:8;33535:55;33565:9;33576:8;33586:3;33535:55;;;;;;;;:::i;:::-;;;;;;;;28092:1;;;33256:342:::0;;;:::o;28452:103::-;28032:12;:10;:12::i;:::-;28021:23;;:7;:5;:7::i;:::-;:23;;;28013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28517:30:::1;28544:1;28517:18;:30::i;:::-;28452:103::o:0;31289:191::-;31401:71;;;;;;;;;;:::i;:::-;;;;;;;;27801:87;27847:7;27874:6;;;;;;;;;;;27867:13;;27801:87;:::o;32659:348::-;32746:8;29729:10;29697:42;;:11;;;;;;;;;;;:19;;;29717:7;29697:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;29689:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;30188:1:::1;30164:11;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:25;:63;;;;;30215:11;;;;;;;;;;;30193:34;;:10;:34;;;;30164:63;30160:109;;;30237:11;;;;;;;;;;;30229:29;;:40;30259:9;30229:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;30160:109;32814:22:::2;32851:17:::0;32893:10:::2;;32882:40;;;;;;;:::i;:::-;32799:123;;;;32958:8;32938:61;32968:15;32985:8;32995:3;32938:61;;;;;;;;:::i;:::-;;;;;;;;30280:1;;32659:348:::0;;;;:::o;31822:191::-;31934:71;;;;;;;;;;:::i;:::-;;;;;;;;28710:201;28032:12;:10;:12::i;:::-;28021:23;;:7;:5;:7::i;:::-;:23;;;28013:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28819:1:::1;28799:22;;:8;:22;;;;28791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28875:28;28894:8;28875:18;:28::i;:::-;28710:201:::0;:::o;29463:31::-;;;;;;;;;;;;;:::o;26523:98::-;26576:7;26603:10;26596:17;;26523:98;:::o;29071:191::-;29145:16;29164:6;;;;;;;;;;;29145:25;;29190:8;29181:6;;:17;;;;;;;;;;;;;;;;;;29245:8;29214:40;;29235:8;29214:40;;;;;;;;;;;;29071:191;;:::o;7:345:1:-;;110:66;126:49;168:6;126:49;:::i;:::-;110:66;:::i;:::-;101:75;;199:6;192:5;185:21;237:4;230:5;226:16;275:3;266:6;261:3;257:16;254:25;251:2;;;292:1;289;282:12;251:2;305:41;339:6;334:3;329;305:41;:::i;:::-;91:261;;;;;;:::o;358:139::-;;442:6;429:20;420:29;;458:33;485:5;458:33;:::i;:::-;410:87;;;;:::o;503:143::-;;591:6;585:13;576:22;;607:33;634:5;607:33;:::i;:::-;566:80;;;;:::o;665:351::-;;;782:3;775:4;767:6;763:17;759:27;749:2;;800:1;797;790:12;749:2;836:6;823:20;813:30;;866:18;858:6;855:30;852:2;;;898:1;895;888:12;852:2;935:4;927:6;923:17;911:29;;989:3;981:4;973:6;969:17;959:8;955:32;952:41;949:2;;;1006:1;1003;996:12;949:2;739:277;;;;;:::o;1036:273::-;;1141:3;1134:4;1126:6;1122:17;1118:27;1108:2;;1159:1;1156;1149:12;1108:2;1199:6;1186:20;1224:79;1299:3;1291:6;1284:4;1276:6;1272:17;1224:79;:::i;:::-;1215:88;;1098:211;;;;;:::o;1315:139::-;;1399:6;1386:20;1377:29;;1415:33;1442:5;1415:33;:::i;:::-;1367:87;;;;:::o;1460:143::-;;1548:6;1542:13;1533:22;;1564:33;1591:5;1564:33;:::i;:::-;1523:80;;;;:::o;1609:262::-;;1717:2;1705:9;1696:7;1692:23;1688:32;1685:2;;;1733:1;1730;1723:12;1685:2;1776:1;1801:53;1846:7;1837:6;1826:9;1822:22;1801:53;:::i;:::-;1791:63;;1747:117;1675:196;;;;:::o;1877:284::-;;1996:2;1984:9;1975:7;1971:23;1967:32;1964:2;;;2012:1;2009;2002:12;1964:2;2055:1;2080:64;2136:7;2127:6;2116:9;2112:22;2080:64;:::i;:::-;2070:74;;2026:128;1954:207;;;;:::o;2167:633::-;;;2312:2;2300:9;2291:7;2287:23;2283:32;2280:2;;;2328:1;2325;2318:12;2280:2;2399:1;2388:9;2384:17;2371:31;2429:18;2421:6;2418:30;2415:2;;;2461:1;2458;2451:12;2415:2;2489:63;2544:7;2535:6;2524:9;2520:22;2489:63;:::i;:::-;2479:73;;2342:220;2629:2;2618:9;2614:18;2601:32;2660:18;2652:6;2649:30;2646:2;;;2692:1;2689;2682:12;2646:2;2720:63;2775:7;2766:6;2755:9;2751:22;2720:63;:::i;:::-;2710:73;;2572:221;2270:530;;;;;:::o;2806:778::-;;;;2968:2;2956:9;2947:7;2943:23;2939:32;2936:2;;;2984:1;2981;2974:12;2936:2;3055:1;3044:9;3040:17;3027:31;3085:18;3077:6;3074:30;3071:2;;;3117:1;3114;3107:12;3071:2;3145:63;3200:7;3191:6;3180:9;3176:22;3145:63;:::i;:::-;3135:73;;2998:220;3285:2;3274:9;3270:18;3257:32;3316:18;3308:6;3305:30;3302:2;;;3348:1;3345;3338:12;3302:2;3376:63;3431:7;3422:6;3411:9;3407:22;3376:63;:::i;:::-;3366:73;;3228:221;3488:2;3514:53;3559:7;3550:6;3539:9;3535:22;3514:53;:::i;:::-;3504:63;;3459:118;2926:658;;;;;:::o;3590:284::-;;3709:2;3697:9;3688:7;3684:23;3680:32;3677:2;;;3725:1;3722;3715:12;3677:2;3768:1;3793:64;3849:7;3840:6;3829:9;3825:22;3793:64;:::i;:::-;3783:74;;3739:128;3667:207;;;;:::o;3880:538::-;;;;4024:2;4012:9;4003:7;3999:23;3995:32;3992:2;;;4040:1;4037;4030:12;3992:2;4083:1;4108:53;4153:7;4144:6;4133:9;4129:22;4108:53;:::i;:::-;4098:63;;4054:117;4238:2;4227:9;4223:18;4210:32;4269:18;4261:6;4258:30;4255:2;;;4301:1;4298;4291:12;4255:2;4337:64;4393:7;4384:6;4373:9;4369:22;4337:64;:::i;:::-;4319:82;;;;4181:230;3982:436;;;;;:::o;4424:118::-;4511:24;4529:5;4511:24;:::i;:::-;4506:3;4499:37;4489:53;;:::o;4548:187::-;4663:65;4722:5;4663:65;:::i;:::-;4658:3;4651:78;4641:94;;:::o;4741:364::-;;4857:39;4890:5;4857:39;:::i;:::-;4912:71;4976:6;4971:3;4912:71;:::i;:::-;4905:78;;4992:52;5037:6;5032:3;5025:4;5018:5;5014:16;4992:52;:::i;:::-;5069:29;5091:6;5069:29;:::i;:::-;5064:3;5060:39;5053:46;;4833:272;;;;;:::o;5111:366::-;;5274:67;5338:2;5333:3;5274:67;:::i;:::-;5267:74;;5350:93;5439:3;5350:93;:::i;:::-;5468:2;5463:3;5459:12;5452:19;;5257:220;;;:::o;5483:366::-;;5646:67;5710:2;5705:3;5646:67;:::i;:::-;5639:74;;5722:93;5811:3;5722:93;:::i;:::-;5840:2;5835:3;5831:12;5824:19;;5629:220;;;:::o;5855:366::-;;6018:67;6082:2;6077:3;6018:67;:::i;:::-;6011:74;;6094:93;6183:3;6094:93;:::i;:::-;6212:2;6207:3;6203:12;6196:19;;6001:220;;;:::o;6227:366::-;;6390:67;6454:2;6449:3;6390:67;:::i;:::-;6383:74;;6466:93;6555:3;6466:93;:::i;:::-;6584:2;6579:3;6575:12;6568:19;;6373:220;;;:::o;6599:366::-;;6762:67;6826:2;6821:3;6762:67;:::i;:::-;6755:74;;6838:93;6927:3;6838:93;:::i;:::-;6956:2;6951:3;6947:12;6940:19;;6745:220;;;:::o;6971:118::-;7058:24;7076:5;7058:24;:::i;:::-;7053:3;7046:37;7036:53;;:::o;7095:222::-;;7226:2;7215:9;7211:18;7203:26;;7239:71;7307:1;7296:9;7292:17;7283:6;7239:71;:::i;:::-;7193:124;;;;:::o;7323:278::-;;7482:2;7471:9;7467:18;7459:26;;7495:99;7591:1;7580:9;7576:17;7567:6;7495:99;:::i;:::-;7449:152;;;;:::o;7607:419::-;;7811:2;7800:9;7796:18;7788:26;;7860:9;7854:4;7850:20;7846:1;7835:9;7831:17;7824:47;7888:131;8014:4;7888:131;:::i;:::-;7880:139;;7778:248;;;:::o;8032:419::-;;8236:2;8225:9;8221:18;8213:26;;8285:9;8279:4;8275:20;8271:1;8260:9;8256:17;8249:47;8313:131;8439:4;8313:131;:::i;:::-;8305:139;;8203:248;;;:::o;8457:419::-;;8661:2;8650:9;8646:18;8638:26;;8710:9;8704:4;8700:20;8696:1;8685:9;8681:17;8674:47;8738:131;8864:4;8738:131;:::i;:::-;8730:139;;8628:248;;;:::o;8882:419::-;;9086:2;9075:9;9071:18;9063:26;;9135:9;9129:4;9125:20;9121:1;9110:9;9106:17;9099:47;9163:131;9289:4;9163:131;:::i;:::-;9155:139;;9053:248;;;:::o;9307:419::-;;9511:2;9500:9;9496:18;9488:26;;9560:9;9554:4;9550:20;9546:1;9535:9;9531:17;9524:47;9588:131;9714:4;9588:131;:::i;:::-;9580:139;;9478:248;;;:::o;9732:222::-;;9863:2;9852:9;9848:18;9840:26;;9876:71;9944:1;9933:9;9929:17;9920:6;9876:71;:::i;:::-;9830:124;;;;:::o;9960:624::-;;10187:2;10176:9;10172:18;10164:26;;10200:71;10268:1;10257:9;10253:17;10244:6;10200:71;:::i;:::-;10318:9;10312:4;10308:20;10303:2;10292:9;10288:18;10281:48;10346:78;10419:4;10410:6;10346:78;:::i;:::-;10338:86;;10471:9;10465:4;10461:20;10456:2;10445:9;10441:18;10434:48;10499:78;10572:4;10563:6;10499:78;:::i;:::-;10491:86;;10154:430;;;;;;:::o;10590:129::-;;10651:20;;:::i;:::-;10641:30;;10680:33;10708:4;10700:6;10680:33;:::i;:::-;10631:88;;;:::o;10725:75::-;;10791:2;10785:9;10775:19;;10765:35;:::o;10806:308::-;;10958:18;10950:6;10947:30;10944:2;;;10980:18;;:::i;:::-;10944:2;11018:29;11040:6;11018:29;:::i;:::-;11010:37;;11102:4;11096;11092:15;11084:23;;10873:241;;;:::o;11120:99::-;;11206:5;11200:12;11190:22;;11179:40;;;:::o;11225:169::-;;11343:6;11338:3;11331:19;11383:4;11378:3;11374:14;11359:29;;11321:73;;;;:::o;11400:96::-;;11466:24;11484:5;11466:24;:::i;:::-;11455:35;;11445:51;;;:::o;11502:126::-;;11579:42;11572:5;11568:54;11557:65;;11547:81;;;:::o;11634:77::-;;11700:5;11689:16;;11679:32;;;:::o;11717:174::-;;11828:57;11879:5;11828:57;:::i;:::-;11815:70;;11805:86;;;:::o;11897:133::-;;12000:24;12018:5;12000:24;:::i;:::-;11987:37;;11977:53;;;:::o;12036:154::-;12120:6;12115:3;12110;12097:30;12182:1;12173:6;12168:3;12164:16;12157:27;12087:103;;;:::o;12196:307::-;12264:1;12274:113;12288:6;12285:1;12282:13;12274:113;;;12373:1;12368:3;12364:11;12358:18;12354:1;12349:3;12345:11;12338:39;12310:2;12307:1;12303:10;12298:15;;12274:113;;;12405:6;12402:1;12399:13;12396:2;;;12485:1;12476:6;12471:3;12467:16;12460:27;12396:2;12245:258;;;;:::o;12509:281::-;12592:27;12614:4;12592:27;:::i;:::-;12584:6;12580:40;12722:6;12710:10;12707:22;12686:18;12674:10;12671:34;12668:62;12665:2;;;12733:18;;:::i;:::-;12665:2;12773:10;12769:2;12762:22;12552:238;;;:::o;12796:180::-;12844:77;12841:1;12834:88;12941:4;12938:1;12931:15;12965:4;12962:1;12955:15;12982:102;;13074:2;13070:7;13065:2;13058:5;13054:14;13050:28;13040:38;;13030:54;;;:::o;13090:225::-;13230:34;13226:1;13218:6;13214:14;13207:58;13299:8;13294:2;13286:6;13282:15;13275:33;13196:119;:::o;13321:248::-;13461:34;13457:1;13449:6;13445:14;13438:58;13530:31;13525:2;13517:6;13513:15;13506:56;13427:142;:::o;13575:248::-;13715:34;13711:1;13703:6;13699:14;13692:58;13784:31;13779:2;13771:6;13767:15;13760:56;13681:142;:::o;13829:182::-;13969:34;13965:1;13957:6;13953:14;13946:58;13935:76;:::o;14017:221::-;14157:34;14153:1;14145:6;14141:14;14134:58;14226:4;14221:2;14213:6;14209:15;14202:29;14123:115;:::o;14244:122::-;14317:24;14335:5;14317:24;:::i;:::-;14310:5;14307:35;14297:2;;14356:1;14353;14346:12;14297:2;14287:79;:::o;14372:122::-;14445:24;14463:5;14445:24;:::i;:::-;14438:5;14435:35;14425:2;;14484:1;14481;14474:12;14425:2;14415:79;:::o
Swarm Source
ipfs://c5a0c0f5ab6d47c6d23f0ddf54f697128c2444caab8d05742fe9317b2da566ac
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.