ETH Price: $3,458.89 (+3.64%)

Contract

0xaA6e8D5baB906B5d1F270f95d38e92d51a7a9C8A
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Plugin231083722025-08-10 4:48:2389 days ago1754801303IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000115942.32826446
Add Plugin231058172025-08-09 20:13:2390 days ago1754770403IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000131762.61562978
Add Plugin231058032025-08-09 20:10:3590 days ago1754770235IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.00013042.58848871
Add Plugin231057732025-08-09 20:04:3590 days ago1754769875IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000130042.58145186
Add Plugin231057722025-08-09 20:04:2390 days ago1754769863IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000129982.58033985
Add Plugin230995372025-08-08 23:11:5991 days ago1754694719IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000116672.30829974
Add Plugin230983712025-08-08 19:17:1191 days ago1754680631IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000149252.95284121
Add Plugin230329832025-07-30 15:58:11100 days ago1753891091IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000259475.14324515
Add Plugin230193102025-07-28 18:03:47102 days ago1753725827IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000132562.61965475
Add Plugin230192872025-07-28 17:59:11102 days ago1753725551IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000130652.59302151
Add Plugin229373082025-07-17 7:04:35113 days ago1752735875IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000230234.33575838
Add Plugin229372932025-07-17 7:01:35113 days ago1752735695IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000206423.96432022
Add Plugin229045012025-07-12 17:12:11118 days ago1752340331IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000135562.68205662
Add Plugin227053402025-06-14 20:59:59146 days ago1749934799IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.00004090.7942557
Add Plugin227053292025-06-14 20:57:47146 days ago1749934667IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000041180.79970906
Add Plugin227049222025-06-14 19:36:11146 days ago1749929771IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.00003030.59093517
Add Plugin227048592025-06-14 19:23:35146 days ago1749929015IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000029830.58151518
Add Plugin227047542025-06-14 19:02:23146 days ago1749927743IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000032490.6330454
Add Plugin227047372025-06-14 18:58:59146 days ago1749927539IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000033970.66196165
Add Plugin226460672025-06-06 14:13:11154 days ago1749219191IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000161743.2001077
Add Plugin226185292025-06-02 17:38:59158 days ago1748885939IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000220284.3613014
Add Plugin224056962025-05-03 20:39:11188 days ago1746304751IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.00004330.8442584
Add Plugin224056552025-05-03 20:30:59188 days ago1746304259IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000042670.84285432
Add Plugin222952872025-04-18 10:27:59203 days ago1744972079IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000043810.85129664
Add Plugin222823812025-04-16 15:13:59205 days ago1744816439IN
0xaA6e8D5b...51a7a9C8A
0 ETH0.000072671.4360282
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer179734692023-08-22 23:15:23808 days ago1692746123
0xaA6e8D5b...51a7a9C8A
0.0008 ETH
Add Plugin179734692023-08-22 23:15:23808 days ago1692746123
0xaA6e8D5b...51a7a9C8A
0.0008 ETH
Transfer171031882023-04-22 16:51:23930 days ago1682182283
0xaA6e8D5b...51a7a9C8A
0.00008 ETH
Add Plugin171031882023-04-22 16:51:23930 days ago1682182283
0xaA6e8D5b...51a7a9C8A
0.00008 ETH
Transfer170895912023-04-20 18:54:47932 days ago1682016887
0xaA6e8D5b...51a7a9C8A
0.00008 ETH
Add Plugin170895912023-04-20 18:54:47932 days ago1682016887
0xaA6e8D5b...51a7a9C8A
0.00008 ETH
Transfer168226852023-03-14 0:39:23970 days ago1678754363
0xaA6e8D5b...51a7a9C8A
0.00023407 ETH
Transfer167894762023-03-09 8:31:35974 days ago1678350695
0xaA6e8D5b...51a7a9C8A
0.00029797 ETH
Transfer166221562023-02-13 20:15:35998 days ago1676319335
0xaA6e8D5b...51a7a9C8A
0.00031287 ETH
Transfer164382582023-01-19 3:46:351024 days ago1674099995
0xaA6e8D5b...51a7a9C8A
0.00182692 ETH
Add Plugin164382582023-01-19 3:46:351024 days ago1674099995
0xaA6e8D5b...51a7a9C8A
0.00182692 ETH
Transfer163935022023-01-12 21:48:471030 days ago1673560127
0xaA6e8D5b...51a7a9C8A
0.00028003 ETH
Transfer163067312022-12-31 19:07:231042 days ago1672513643
0xaA6e8D5b...51a7a9C8A
0.00018482 ETH
Transfer163067022022-12-31 19:01:351042 days ago1672513295
0xaA6e8D5b...51a7a9C8A
0.00017674 ETH
Transfer163066752022-12-31 18:56:111042 days ago1672512971
0xaA6e8D5b...51a7a9C8A
0.00018524 ETH
Transfer163066752022-12-31 18:56:111042 days ago1672512971
0xaA6e8D5b...51a7a9C8A
0.00020843 ETH
Transfer161196192022-12-05 15:53:231068 days ago1670255603
0xaA6e8D5b...51a7a9C8A
0.00014952 ETH
Add Plugin161196192022-12-05 15:53:231068 days ago1670255603
0xaA6e8D5b...51a7a9C8A
0.00014952 ETH
Transfer161010542022-12-03 1:38:351071 days ago1670031515
0xaA6e8D5b...51a7a9C8A
0.00009136 ETH
Add Plugin161010542022-12-03 1:38:351071 days ago1670031515
0xaA6e8D5b...51a7a9C8A
0.00009136 ETH
Transfer160982032022-12-02 16:05:231071 days ago1669997123
0xaA6e8D5b...51a7a9C8A
0.00014959 ETH
Add Plugin160982032022-12-02 16:05:231071 days ago1669997123
0xaA6e8D5b...51a7a9C8A
0.00014959 ETH
Transfer160981652022-12-02 15:57:351071 days ago1669996655
0xaA6e8D5b...51a7a9C8A
0.0001065 ETH
Add Plugin160981652022-12-02 15:57:351071 days ago1669996655
0xaA6e8D5b...51a7a9C8A
0.0001065 ETH
Transfer159991992022-11-18 20:10:591085 days ago1668802259
0xaA6e8D5b...51a7a9C8A
0.00010461 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Timestamp

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
/**
 *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

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"}]

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.