Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Approved Bui... | 20479699 | 31 days ago | IN | 0 ETH | 0.00042429 | ||||
Set Transaction ... | 15777334 | 690 days ago | IN | 0 ETH | 0.00075895 | ||||
Withdraw | 15593555 | 716 days ago | IN | 0 ETH | 0.00022019 | ||||
Add Approved Bui... | 15188891 | 779 days ago | IN | 0 ETH | 0.0120771 | ||||
Access | 15054115 | 800 days ago | IN | 0.00095443 ETH | 0.00378295 | ||||
Add Approved Bui... | 15047438 | 801 days ago | IN | 0 ETH | 0.0049225 | ||||
Add Approved Bui... | 15047059 | 801 days ago | IN | 0 ETH | 0.0417616 | ||||
Add Approved Bui... | 15047058 | 801 days ago | IN | 0 ETH | 0.0417788 | ||||
Add Approved Bui... | 15047057 | 801 days ago | IN | 0 ETH | 0.0417714 | ||||
0x60806040 | 15047056 | 801 days ago | IN | 0 ETH | 0.2676102 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
SHARE
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-29 */ // SPDX-License-Identifier: UNLICENSED // ⣿⣿⣿⣿⣿⠀⠀⣰⣿⣿⣿⣷⡀⠀⠀⣶⣶⣶⣦⡀⠀⠀⠀⣶⣶⡄⠀⠀⣶⣶⡆⠀⠀⣶⣶⠀⠀⠀⠀⢰⣶⣶⣶⣶⢀⠀⠀⣤⣶⣶⣦⡀⠀⠀⠀⣴⣶⣶⣦⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⢻⣿⠀⠀⠀⣿⣿⣿⠀⢸⣿⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢸⣿⡇⠀⣿⣿⠀⠀⣾⣿⠁⠈⣿⡇ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⣸⣿⠀⠀⠀⣿⣿⣿⡀⣿⡟⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⠀⣿⣿⡀⠀⠀⠀⠀⠘⣿⣷⠀⠀⠀ // ⣿⣿⠿⠿⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⣿⣿⡟⠀⠀⠀⣿⣿⣿⣷⣿⠀⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡿⠿⠀⠀⠀⠀⠀⢿⣿⣦⠀⠀⠀⠀⠈⣿⣿⡄⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠈⣿⣷⠀⠀⠀⣿⣿⢸⣿⣿⠈⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢀⣀⠀⠙⣿⣧⠀⠀⣀⣀⠀⠻⣿⡆ // ⣿⣿⠀⠀⠀⠀⠀⢿⣿⣤⣾⣿⠇⠀⠀⣿⣿⠀⣿⣿⠀⠀⠀⣿⣿⠀⣿⡇⠈⣿⡇⠀⠀⣿⣿⣤⣤⡄⠀⢸⣿⣧⣤⣤⡄⠀⢸⣿⣆⠀⣿⣿⠀⠀⣿⣿⡀⢀⣿⣿ // ⠛⠛⠀⠀⠀⠀⠀⠈⠛⠿⠿⠛⠀⠀⠀⠛⠛⠀⠘⠛⠃⠀⠀⠛⠛⠀⠛⠀⠈⠛⠃⠀⠀⠛⠛⠛⠛⠃⠀⠘⠛⠛⠛⠛⠃⠀⠀⠙⠿⠿⠟⠁⠀⠀⠀⠛⠿⠿⠛⠀ // https://formless.xyz/opportunities // pragma solidity >=0.8.0 <0.9.0; // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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 Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /// @title Contract code verification. /// @author [email protected] /// @notice Code verification library for determining the keccak256 /// hash of the runtime bytecode for deployed contracts. library CodeVerification { enum BuildType { WALLET, /* 0 */ SPLIT, /* 1 */ PFA_UNIT, /* 2 */ PFA_COLLECTION /* 3 */ } string public constant VERSION = "1.0.0"; /// @notice Returns the keccak256 hash of the runtime bytecode /// stored at the supplied `address_`. function readCodeHash(address address_) public view returns (bytes32) { bytes32 codeHash; assembly { codeHash := extcodehash(address_) } return codeHash; } } // ⣿⣿⣿⣿⣿⠀⠀⣰⣿⣿⣿⣷⡀⠀⠀⣶⣶⣶⣦⡀⠀⠀⠀⣶⣶⡄⠀⠀⣶⣶⡆⠀⠀⣶⣶⠀⠀⠀⠀⢰⣶⣶⣶⣶⢀⠀⠀⣤⣶⣶⣦⡀⠀⠀⠀⣴⣶⣶⣦⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⢻⣿⠀⠀⠀⣿⣿⣿⠀⢸⣿⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢸⣿⡇⠀⣿⣿⠀⠀⣾⣿⠁⠈⣿⡇ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⣸⣿⠀⠀⠀⣿⣿⣿⡀⣿⡟⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⠀⣿⣿⡀⠀⠀⠀⠀⠘⣿⣷⠀⠀⠀ // ⣿⣿⠿⠿⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⣿⣿⡟⠀⠀⠀⣿⣿⣿⣷⣿⠀⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡿⠿⠀⠀⠀⠀⠀⢿⣿⣦⠀⠀⠀⠀⠈⣿⣿⡄⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠈⣿⣷⠀⠀⠀⣿⣿⢸⣿⣿⠈⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢀⣀⠀⠙⣿⣧⠀⠀⣀⣀⠀⠻⣿⡆ // ⣿⣿⠀⠀⠀⠀⠀⢿⣿⣤⣾⣿⠇⠀⠀⣿⣿⠀⣿⣿⠀⠀⠀⣿⣿⠀⣿⡇⠈⣿⡇⠀⠀⣿⣿⣤⣤⡄⠀⢸⣿⣧⣤⣤⡄⠀⢸⣿⣆⠀⣿⣿⠀⠀⣿⣿⡀⢀⣿⣿ // ⠛⠛⠀⠀⠀⠀⠀⠈⠛⠿⠿⠛⠀⠀⠀⠛⠛⠀⠘⠛⠃⠀⠀⠛⠛⠀⠛⠀⠈⠛⠃⠀⠀⠛⠛⠛⠛⠃⠀⠘⠛⠛⠛⠛⠃⠀⠀⠙⠿⠿⠟⠁⠀⠀⠀⠛⠿⠿⠛⠀ // https://formless.xyz/opportunities // // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @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); } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // ⣿⣿⣿⣿⣿⠀⠀⣰⣿⣿⣿⣷⡀⠀⠀⣶⣶⣶⣦⡀⠀⠀⠀⣶⣶⡄⠀⠀⣶⣶⡆⠀⠀⣶⣶⠀⠀⠀⠀⢰⣶⣶⣶⣶⢀⠀⠀⣤⣶⣶⣦⡀⠀⠀⠀⣴⣶⣶⣦⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⢻⣿⠀⠀⠀⣿⣿⣿⠀⢸⣿⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢸⣿⡇⠀⣿⣿⠀⠀⣾⣿⠁⠈⣿⡇ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠀⣸⣿⠀⠀⠀⣿⣿⣿⡀⣿⡟⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⠀⣿⣿⡀⠀⠀⠀⠀⠘⣿⣷⠀⠀⠀ // ⣿⣿⠿⠿⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⣿⣿⡟⠀⠀⠀⣿⣿⣿⣷⣿⠀⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡿⠿⠀⠀⠀⠀⠀⢿⣿⣦⠀⠀⠀⠀⠈⣿⣿⡄⠀ // ⣿⣿⠀⠀⠀⠀⠀⣿⣿⠀⢸⣿⡇⠀⠀⣿⣿⠈⣿⣷⠀⠀⠀⣿⣿⢸⣿⣿⠈⣿⡇⠀⠀⣿⣿⠀⠀⠀⠀⢸⣿⡇⠀⠀⠀⠀⢀⣀⠀⠙⣿⣧⠀⠀⣀⣀⠀⠻⣿⡆ // ⣿⣿⠀⠀⠀⠀⠀⢿⣿⣤⣾⣿⠇⠀⠀⣿⣿⠀⣿⣿⠀⠀⠀⣿⣿⠀⣿⡇⠈⣿⡇⠀⠀⣿⣿⣤⣤⡄⠀⢸⣿⣧⣤⣤⡄⠀⢸⣿⣆⠀⣿⣿⠀⠀⣿⣿⡀⢀⣿⣿ // ⠛⠛⠀⠀⠀⠀⠀⠈⠛⠿⠿⠛⠀⠀⠀⠛⠛⠀⠘⠛⠃⠀⠀⠛⠛⠀⠛⠀⠈⠛⠃⠀⠀⠛⠛⠛⠛⠃⠀⠘⠛⠛⠛⠛⠃⠀⠀⠙⠿⠿⠟⠁⠀⠀⠀⠛⠿⠿⠛⠀ // https://formless.xyz/opportunities //⠀ /// @title Standard pay-for-access (PFA) contract interface for SHARE. /// @author [email protected] interface IPFA { /// @notice Returns the price per access in wei for content backed /// by this contract. function pricePerAccess() external view returns (uint256); /// @notice Sets the price per access in wei for content backed /// by this contract. function setPricePerAccess(uint256 pricePerAccess_) external; /// @notice If called with a value equal to the price per access /// of this contract, records a grant timestamp on chain which is /// read by decentralized distribution network (DDN) microservices /// to decrypt and serve the associated content for the tokenURI. function access(uint256 tokenId, address recipient) external payable; /// @notice Returns the timestamp in seconds of the award of a /// grant recorded on chain for the access of the content /// associated with this PFA. function grantTimestamp(address recipient_) external view returns (uint256); /// @notice Returns the time-to-live (TTL) in seconds of an /// awarded access grant for this PFA. Access to the associated ///content expires at `grant award timestamp + grant TTL`. function grantTTL() external view returns (uint256); /// @notice Returns true if this PFA supports licensing, where /// licensing is the ability for a separate contract to forward /// payment to this PFA in exchange for the ability to perpetually /// serve the underlying content on its behalf. For example, /// licensing may be used to achieve transaction gated playlisting /// of a collection of PFAs. function supportsLicensing() external view returns (bool); /// @notice Returns the price per license in wei for content /// backed by this contract. function pricePerLicense() external view returns (uint256); /// @notice If called with a `recipient` (licensee) contract which /// has proof of inclusion of this PFA (licensor) address in its /// payout distribution table, records a license timestamp on /// chain which is read by decentralized distribution (DDN) /// microservices to decrypt and serve the associated content for /// the tokenURI to users who have paid to access the licensee /// contract. /// @dev Proof of inclusion is in the form of source code /// verification of the licensee, as well as the assertion of /// immutable state of the licensee contract payout distribution /// table. Immutable state is verified using knowledge of the /// keccak256 hash of the runtime bytecode of the source code /// for approved licensees which implement a write-once /// distribution address table. function license(address recipient) external payable; /// @notice Returns the timestamp in seconds of the award of a /// grant recorded on chain for the access of the content /// associated with this PFA. function licenseTimestamp(address recipient_) external view returns (uint256); } /// @title SHARE protocol contract. /// @author [email protected] /// @notice A protocol which works in conjunction with SHARE /// decentralized distribution network (DDN) microservice endpoints /// to perform content distribtion on blockchain with creator /// controlled pay-for-access (PFA) micro-transactions. contract SHARE is Ownable, ReentrancyGuard { /// @notice Emitted when a successful access grant is awarded /// to a recipient address for a given PFA contract. event Grant( address indexed recipient, address indexed contractAddress, uint256 indexed tokenId ); /// @notice Emitted when a successful license grant is awarded /// to a recipient (licensee) address for a given PFA (licensor) contract. event License(address indexed licensor, address indexed licensee); string public constant VERSION = "1.0.0"; bytes32 private constant EOA_KECCAK256 = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; uint256 public _transactionFeeNumerator = 1; uint256 public _transactionFeeDenominator = 20; uint256 public _transactionCount = 0; bool public _codeVerificationEnabled = true; uint256 private constant UNIT_TOKEN_INDEX = 0; mapping(bytes32 => ApprovedBuild) internal _approvedHashes; mapping(address => mapping(address => uint256)) internal _grantTimestamps; mapping(address => mapping(address => uint256)) internal _licenseTimestamps; struct ApprovedBuild { CodeVerification.BuildType buildType; string compilerBinaryTarget; string compilerVersion; address authorAddress; bool exists; } constructor() public { addApprovedBuild( EOA_KECCAK256, CodeVerification.BuildType.WALLET, "", "", msg.sender ); } /// @notice Used to set the transaction fee for the protocol. /// Calculated using provided _numerator / _denominator. Note that /// SHARE PFA contracts can (optionally) be accessed _without_ /// using the SHARE protocol contract if the URI microservice /// endpoint is self-hosted, however the use of SHARE provided /// DDN endpoints requires an associated payment to the protocol. function setTransactionFee(uint256 numerator_, uint256 denominator_) public nonReentrant onlyOwner { _transactionFeeNumerator = numerator_; _transactionFeeDenominator = denominator_; } /// @notice Returns the consumer facing gross price to access the /// the asset. This price is calculated using `access price` + ///`access price` * `transaction fee`. function grossPricePerAccess(address contractAddress_, uint256 tokenId_) public view returns (uint256) { require(tokenId_ == UNIT_TOKEN_INDEX, "SHARE004"); IPFA asset = IPFA(contractAddress_); uint256 pricePerAccess = asset.pricePerAccess(); // Note that this contract is implemented with Solidity // version >=0.8.0 which has built-in overflow checks, // therefore using SafeMath is not required. uint256 protocolFee = (pricePerAccess * _transactionFeeNumerator) / _transactionFeeDenominator; return pricePerAccess + protocolFee; } /// @notice Returns the licensee facing gross price to license the /// the asset. This price is calculated using `license price` + ///`license price` * `transaction fee`. function grossPricePerLicense(address contractAddress_) public view returns (uint256) { IPFA asset = IPFA(contractAddress_); uint256 pricePerLicense = asset.pricePerLicense(); // Note that this contract is implemented with Solidity // version >=0.8.0 which has built-in overflow checks, // therefore using SafeMath is not required. uint256 protocolFee = (pricePerLicense * _transactionFeeNumerator) / _transactionFeeDenominator; return pricePerLicense + protocolFee; } /// @notice Instantiates the creator contract and calls the /// access method. If successful, this transaction produces a /// grant awarded to the sender with a corresponding TTL. function access(address contractAddress_, uint256 tokenId_) public payable nonReentrant { IPFA asset = IPFA(contractAddress_); uint256 grossPrice = grossPricePerAccess(contractAddress_, tokenId_); require(msg.value == grossPrice, "SHARE011"); asset.access{value: asset.pricePerAccess()}(tokenId_, msg.sender); _grantTimestamps[contractAddress_][msg.sender] = block.timestamp; emit Grant(msg.sender, contractAddress_, tokenId_); _transactionCount++; } /// @notice If called with a `licenseeContract_` contract which /// has proof of inclusion of the supplied `licensorContract_` /// PFA address in its payout distribution table, records a /// license timestamp on chain which is read by decentralized /// distribution network (DDN) microservices to decrypt and serve /// the associated content for the tokenURI to users who have /// paid to access the licensee contract. function license(address licensorContract_, address licenseeContract_) public payable nonReentrant { require(msg.sender == Ownable(licenseeContract_).owner(), "SHARE016"); uint256 grossPrice = grossPricePerLicense(licensorContract_); require(msg.value == grossPrice, "SHARE024"); IPFA asset = IPFA(licensorContract_); asset.license{value: asset.pricePerLicense()}(licenseeContract_); _licenseTimestamps[licensorContract_][licenseeContract_] = block .timestamp; emit License(licensorContract_, licenseeContract_); } /// @notice Returns the timestamp in seconds of the award of a /// grant recorded on chain for the access of the content /// associated with the supplied PFA and recipient address. function grantTimestamp(address contractAddress_, address recipient_) public view returns (uint256) { return _grantTimestamps[contractAddress_][recipient_]; } /// @notice Returns the timestamp in seconds of the award of a /// grant recorded on chain for the licensing of the content /// associated with the supplied PFA and recipient address. function licenseTimestamp( address licensorAddress_, address licenseeAddress_ ) public view returns (uint256) { return _licenseTimestamps[licensorAddress_][licenseeAddress_]; } /// @notice Withdraws contract balance. function withdraw() public nonReentrant onlyOwner { payable(msg.sender).transfer(address(this).balance); } /// @notice Enables or disables protocol source code verification /// for contracts interacting with the protocol. function setCodeVerificationEnabled(bool enable) public nonReentrant onlyOwner { _codeVerificationEnabled = enable; } /// @notice Adds the keccak256 hash of the runtime bytecode of /// an approved source code build for a SHARE protocol /// interoperable contract. If source code verification is turned /// on, the system will revert upon attempt to send ether to /// a contract built from non-approved source code. function addApprovedBuild( bytes32 codeHash, CodeVerification.BuildType buildType_, string memory compilerBinaryTarget_, string memory compilerVersion_, address authorAddress_ ) public onlyOwner nonReentrant { require( (buildType_ == CodeVerification.BuildType.WALLET || buildType_ == CodeVerification.BuildType.SPLIT || buildType_ == CodeVerification.BuildType.PFA_UNIT || buildType_ == CodeVerification.BuildType.PFA_COLLECTION), "SHARE017" ); _approvedHashes[codeHash] = ApprovedBuild( buildType_, compilerBinaryTarget_, compilerVersion_, authorAddress_, true ); } /// @notice Returns true if the keccak256 hash of the runtime /// bytecode stored at the given `address_` corresponds to a build /// of approved source code for SHARE protocol interoperability. function isApprovedBuild( address address_, CodeVerification.BuildType buildType_ ) public view returns (bool) { if (!_codeVerificationEnabled) { return true; } else { bytes32 codeHash = CodeVerification.readCodeHash(address_); if (_approvedHashes[codeHash].exists) { return _approvedHashes[codeHash].buildType == buildType_; } else { return false; } } } /// @notice Returns true if the supplied keccak256 /// hash corresponds to a build of approved source code for SHARE /// protocol interoperability. function isApprovedBuildHash( bytes32 hash, CodeVerification.BuildType buildType_ ) public view returns (bool) { if (!_codeVerificationEnabled) { return true; } else { if (_approvedHashes[hash].exists) { return _approvedHashes[hash].buildType == buildType_; } else { return false; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Grant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"licensor","type":"address"},{"indexed":true,"internalType":"address","name":"licensee","type":"address"}],"name":"License","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":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_codeVerificationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transactionFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_transactionFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"access","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"codeHash","type":"bytes32"},{"internalType":"enum CodeVerification.BuildType","name":"buildType_","type":"uint8"},{"internalType":"string","name":"compilerBinaryTarget_","type":"string"},{"internalType":"string","name":"compilerVersion_","type":"string"},{"internalType":"address","name":"authorAddress_","type":"address"}],"name":"addApprovedBuild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"}],"name":"grantTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"grossPricePerAccess","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress_","type":"address"}],"name":"grossPricePerLicense","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"enum CodeVerification.BuildType","name":"buildType_","type":"uint8"}],"name":"isApprovedBuild","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"enum CodeVerification.BuildType","name":"buildType_","type":"uint8"}],"name":"isApprovedBuildHash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"licensorContract_","type":"address"},{"internalType":"address","name":"licenseeContract_","type":"address"}],"name":"license","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"licensorAddress_","type":"address"},{"internalType":"address","name":"licenseeAddress_","type":"address"}],"name":"licenseTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCodeVerificationEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator_","type":"uint256"},{"internalType":"uint256","name":"denominator_","type":"uint256"}],"name":"setTransactionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260016002819055601460035560006004556005805460ff191690911790553480156200002f57600080fd5b506200003b3362000090565b600180556040805160208082018352600080835283519182019093528281526200008a927fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47092909133620000e0565b62000445565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620001405760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b60026001541415620001955760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640162000137565b60026001556000846003811115620001b157620001b1620003f2565b1480620001d257506001846003811115620001d057620001d0620003f2565b145b80620001f257506002846003811115620001f057620001f0620003f2565b145b806200021257506003846003811115620002105762000210620003f2565b145b6200024b5760405162461bcd60e51b8152602060048201526008602482015267534841524530313760c01b604482015260640162000137565b6040518060a001604052808560038111156200026b576200026b620003f2565b8152602080820186905260408083018690526001600160a01b0385166060840152600160809093018390526000898152600690925290208251815491929091839160ff1990911690836003811115620002c857620002c8620003f2565b02179055506020828101518051620002e792600185019201906200034c565b5060408201518051620003059160028401916020909101906200034c565b506060820151600390910180546080909301511515600160a01b026001600160a81b03199093166001600160a01b0390921691909117919091179055505060018055505050565b8280546200035a9062000408565b90600052602060002090601f0160209004810192826200037e5760008555620003c9565b82601f106200039957805160ff1916838001178555620003c9565b82800160010185558215620003c9579182015b82811115620003c9578251825591602001919060010190620003ac565b50620003d7929150620003db565b5090565b5b80821115620003d75760008155600101620003dc565b634e487b7160e01b600052602160045260246000fd5b600181811c908216806200041d57607f821691505b602082108114156200043f57634e487b7160e01b600052602260045260246000fd5b50919050565b61145380620004556000396000f3fe60806040526004361061011f5760003560e01c806378b3c640116100a0578063da41c48411610064578063da41c48414610343578063f2fde38b14610356578063f581fb6814610376578063f6773eb514610389578063ffa1ad74146103a957600080fd5b806378b3c64014610255578063807b944e1461026f57806386ada51e1461028f5780638da5cb5b146102d55780639816abf2146102fd57600080fd5b806341e74b36116100e757806341e74b36146101d45780634b3e5195146101f45780634b4b02dd1461020a5780636eca7aaf14610220578063715018a61461024057600080fd5b806306df481514610124578063332d13ad1461014d57806337d7d41e1461017d5780633ccfd60b1461019f5780633cef5f76146101b4575b600080fd5b34801561013057600080fd5b5061013a60045481565b6040519081526020015b60405180910390f35b34801561015957600080fd5b5061016d610168366004610fdb565b6103e7565b6040519015158152602001610144565b34801561018957600080fd5b5061019d610198366004611007565b610464565b005b3480156101ab57600080fd5b5061019d6104ce565b3480156101c057600080fd5b5061016d6101cf36600461103e565b610553565b3480156101e057600080fd5b5061013a6101ef36600461106a565b610653565b34801561020057600080fd5b5061013a60035481565b34801561021657600080fd5b5061013a60025481565b34801561022c57600080fd5b5061019d61023b366004611096565b61072c565b34801561024c57600080fd5b5061019d610795565b34801561026157600080fd5b5060055461016d9060ff1681565b34801561027b57600080fd5b5061019d61028a366004611162565b6107cb565b34801561029b57600080fd5b5061013a6102aa3660046111f5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156102e157600080fd5b506000546040516001600160a01b039091168152602001610144565b34801561030957600080fd5b5061013a6103183660046111f5565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61019d6103513660046111f5565b6109b4565b34801561036257600080fd5b5061019d61037136600461122e565b610bff565b61019d61038436600461106a565b610c9a565b34801561039557600080fd5b5061013a6103a436600461122e565b610e40565b3480156103b557600080fd5b506103da604051806040016040528060058152602001640312e302e360dc1b81525081565b604051610144919061124b565b60055460009060ff166103fc5750600161045e565b600083815260066020526040902060030154600160a01b900460ff161561045a5781600381111561042f5761042f6112a0565b60008481526006602052604090205460ff166003811115610452576104526112a0565b14905061045e565b5060005b92915050565b600260015414156104905760405162461bcd60e51b8152600401610487906112b6565b60405180910390fd5b60026001556000546001600160a01b031633146104bf5760405162461bcd60e51b8152600401610487906112ed565b60029190915560035560018055565b600260015414156104f15760405162461bcd60e51b8152600401610487906112b6565b60026001556000546001600160a01b031633146105205760405162461bcd60e51b8152600401610487906112ed565b60405133904780156108fc02916000818181858888f1935050505015801561054c573d6000803e3d6000fd5b5060018055565b60055460009060ff166105685750600161045e565b604051636e1d8a9d60e01b81526001600160a01b0384166004820152600090731d4b15733d0401fe86a24b1b687c166f3e74bc5d90636e1d8a9d90602401602060405180830381865af41580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e79190611322565b600081815260066020526040902060030154909150600160a01b900460ff16156106495782600381111561061d5761061d6112a0565b60008281526006602052604090205460ff166003811115610640576106406112a0565b1491505061045e565b600091505061045e565b6000811561068e5760405162461bcd60e51b815260206004820152600860248201526714d21054914c0c0d60c21b6044820152606401610487565b60008390506000816001600160a01b0316635bc3c82c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f79190611322565b905060006003546002548361070c9190611351565b6107169190611370565b90506107228183611392565b9695505050505050565b6002600154141561074f5760405162461bcd60e51b8152600401610487906112b6565b60026001556000546001600160a01b0316331461077e5760405162461bcd60e51b8152600401610487906112ed565b6005805460ff191691151591909117905560018055565b6000546001600160a01b031633146107bf5760405162461bcd60e51b8152600401610487906112ed565b6107c96000610ede565b565b6000546001600160a01b031633146107f55760405162461bcd60e51b8152600401610487906112ed565b600260015414156108185760405162461bcd60e51b8152600401610487906112b6565b60026001556000846003811115610831576108316112a0565b148061084e5750600184600381111561084c5761084c6112a0565b145b8061086a57506002846003811115610868576108686112a0565b145b8061088657506003846003811115610884576108846112a0565b145b6108bd5760405162461bcd60e51b8152602060048201526008602482015267534841524530313760c01b6044820152606401610487565b6040518060a001604052808560038111156108da576108da6112a0565b8152602080820186905260408083018690526001600160a01b0385166060840152600160809093018390526000898152600690925290208251815491929091839160ff1990911690836003811115610934576109346112a0565b021790555060208281015180516109519260018501920190610f2e565b506040820151805161096d916002840191602090910190610f2e565b506060820151600390910180546080909301511515600160a01b026001600160a81b03199093166001600160a01b0390921691909117919091179055505060018055505050565b600260015414156109d75760405162461bcd60e51b8152600401610487906112b6565b6002600181905550806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4191906113aa565b6001600160a01b0316336001600160a01b031614610a8c5760405162461bcd60e51b815260206004820152600860248201526729a420a92298189b60c11b6044820152606401610487565b6000610a9783610e40565b9050803414610ad35760405162461bcd60e51b815260206004820152600860248201526714d21054914c0c8d60c21b6044820152606401610487565b6000839050806001600160a01b031663d6062e44826001600160a01b031663ce1ebbf86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190611322565b6040516001600160e01b031960e084901b1681526001600160a01b03871660048201526024016000604051808303818588803b158015610b8857600080fd5b505af1158015610b9c573d6000803e3d6000fd5b5050506001600160a01b038087166000818152600860209081526040808320948a1680845294909152808220429055519294509092507f55310234f77cbf7ca00a671b7e7acf95d660ac8a428eec47b4cd377da8f5cc7a91a35050600180555050565b6000546001600160a01b03163314610c295760405162461bcd60e51b8152600401610487906112ed565b6001600160a01b038116610c8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610487565b610c9781610ede565b50565b60026001541415610cbd5760405162461bcd60e51b8152600401610487906112b6565b6002600155816000610ccf8284610653565b9050803414610d0b5760405162461bcd60e51b8152602060048201526008602482015267534841524530313160c01b6044820152606401610487565b816001600160a01b03166395e9463f836001600160a01b0316635bc3c82c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c9190611322565b6040516001600160e01b031960e084901b168152600481018790523360248201526044016000604051808303818588803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506001600160a01b03851660008181526007602090815260408083203380855292528083204290555187945090917fdc1e872d7927b949dd471e2dd9d43153685b5564c9a6aaf82246e27c0a9f2a2891a460048054906000610e31836113c7565b90915550506001805550505050565b6000808290506000816001600160a01b031663ce1ebbf86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaa9190611322565b9050600060035460025483610ebf9190611351565b610ec99190611370565b9050610ed58183611392565b95945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054610f3a906113e2565b90600052602060002090601f016020900481019282610f5c5760008555610fa2565b82601f10610f7557805160ff1916838001178555610fa2565b82800160010185558215610fa2579182015b82811115610fa2578251825591602001919060010190610f87565b50610fae929150610fb2565b5090565b5b80821115610fae5760008155600101610fb3565b803560048110610fd657600080fd5b919050565b60008060408385031215610fee57600080fd5b82359150610ffe60208401610fc7565b90509250929050565b6000806040838503121561101a57600080fd5b50508035926020909101359150565b6001600160a01b0381168114610c9757600080fd5b6000806040838503121561105157600080fd5b823561105c81611029565b9150610ffe60208401610fc7565b6000806040838503121561107d57600080fd5b823561108881611029565b946020939093013593505050565b6000602082840312156110a857600080fd5b813580151581146110b857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126110e657600080fd5b813567ffffffffffffffff80821115611101576111016110bf565b604051601f8301601f19908116603f01168101908282118183101715611129576111296110bf565b8160405283815286602085880101111561114257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561117a57600080fd5b8535945061118a60208701610fc7565b9350604086013567ffffffffffffffff808211156111a757600080fd5b6111b389838a016110d5565b945060608801359150808211156111c957600080fd5b506111d6888289016110d5565b92505060808601356111e781611029565b809150509295509295909350565b6000806040838503121561120857600080fd5b823561121381611029565b9150602083013561122381611029565b809150509250929050565b60006020828403121561124057600080fd5b81356110b881611029565b600060208083528351808285015260005b818110156112785785810183015185820160400152820161125c565b8181111561128a576000604083870101525b50601f01601f1916929092016040019392505050565b634e487b7160e01b600052602160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561133457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561136b5761136b61133b565b500290565b60008261138d57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156113a5576113a561133b565b500190565b6000602082840312156113bc57600080fd5b81516110b881611029565b60006000198214156113db576113db61133b565b5060010190565b600181811c908216806113f657607f821691505b6020821081141561141757634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220405614da63955074900fbe3f07378e00ecc771fc7e48b466c521611a7d214ae264736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806378b3c640116100a0578063da41c48411610064578063da41c48414610343578063f2fde38b14610356578063f581fb6814610376578063f6773eb514610389578063ffa1ad74146103a957600080fd5b806378b3c64014610255578063807b944e1461026f57806386ada51e1461028f5780638da5cb5b146102d55780639816abf2146102fd57600080fd5b806341e74b36116100e757806341e74b36146101d45780634b3e5195146101f45780634b4b02dd1461020a5780636eca7aaf14610220578063715018a61461024057600080fd5b806306df481514610124578063332d13ad1461014d57806337d7d41e1461017d5780633ccfd60b1461019f5780633cef5f76146101b4575b600080fd5b34801561013057600080fd5b5061013a60045481565b6040519081526020015b60405180910390f35b34801561015957600080fd5b5061016d610168366004610fdb565b6103e7565b6040519015158152602001610144565b34801561018957600080fd5b5061019d610198366004611007565b610464565b005b3480156101ab57600080fd5b5061019d6104ce565b3480156101c057600080fd5b5061016d6101cf36600461103e565b610553565b3480156101e057600080fd5b5061013a6101ef36600461106a565b610653565b34801561020057600080fd5b5061013a60035481565b34801561021657600080fd5b5061013a60025481565b34801561022c57600080fd5b5061019d61023b366004611096565b61072c565b34801561024c57600080fd5b5061019d610795565b34801561026157600080fd5b5060055461016d9060ff1681565b34801561027b57600080fd5b5061019d61028a366004611162565b6107cb565b34801561029b57600080fd5b5061013a6102aa3660046111f5565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b3480156102e157600080fd5b506000546040516001600160a01b039091168152602001610144565b34801561030957600080fd5b5061013a6103183660046111f5565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61019d6103513660046111f5565b6109b4565b34801561036257600080fd5b5061019d61037136600461122e565b610bff565b61019d61038436600461106a565b610c9a565b34801561039557600080fd5b5061013a6103a436600461122e565b610e40565b3480156103b557600080fd5b506103da604051806040016040528060058152602001640312e302e360dc1b81525081565b604051610144919061124b565b60055460009060ff166103fc5750600161045e565b600083815260066020526040902060030154600160a01b900460ff161561045a5781600381111561042f5761042f6112a0565b60008481526006602052604090205460ff166003811115610452576104526112a0565b14905061045e565b5060005b92915050565b600260015414156104905760405162461bcd60e51b8152600401610487906112b6565b60405180910390fd5b60026001556000546001600160a01b031633146104bf5760405162461bcd60e51b8152600401610487906112ed565b60029190915560035560018055565b600260015414156104f15760405162461bcd60e51b8152600401610487906112b6565b60026001556000546001600160a01b031633146105205760405162461bcd60e51b8152600401610487906112ed565b60405133904780156108fc02916000818181858888f1935050505015801561054c573d6000803e3d6000fd5b5060018055565b60055460009060ff166105685750600161045e565b604051636e1d8a9d60e01b81526001600160a01b0384166004820152600090731d4b15733d0401fe86a24b1b687c166f3e74bc5d90636e1d8a9d90602401602060405180830381865af41580156105c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105e79190611322565b600081815260066020526040902060030154909150600160a01b900460ff16156106495782600381111561061d5761061d6112a0565b60008281526006602052604090205460ff166003811115610640576106406112a0565b1491505061045e565b600091505061045e565b6000811561068e5760405162461bcd60e51b815260206004820152600860248201526714d21054914c0c0d60c21b6044820152606401610487565b60008390506000816001600160a01b0316635bc3c82c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f79190611322565b905060006003546002548361070c9190611351565b6107169190611370565b90506107228183611392565b9695505050505050565b6002600154141561074f5760405162461bcd60e51b8152600401610487906112b6565b60026001556000546001600160a01b0316331461077e5760405162461bcd60e51b8152600401610487906112ed565b6005805460ff191691151591909117905560018055565b6000546001600160a01b031633146107bf5760405162461bcd60e51b8152600401610487906112ed565b6107c96000610ede565b565b6000546001600160a01b031633146107f55760405162461bcd60e51b8152600401610487906112ed565b600260015414156108185760405162461bcd60e51b8152600401610487906112b6565b60026001556000846003811115610831576108316112a0565b148061084e5750600184600381111561084c5761084c6112a0565b145b8061086a57506002846003811115610868576108686112a0565b145b8061088657506003846003811115610884576108846112a0565b145b6108bd5760405162461bcd60e51b8152602060048201526008602482015267534841524530313760c01b6044820152606401610487565b6040518060a001604052808560038111156108da576108da6112a0565b8152602080820186905260408083018690526001600160a01b0385166060840152600160809093018390526000898152600690925290208251815491929091839160ff1990911690836003811115610934576109346112a0565b021790555060208281015180516109519260018501920190610f2e565b506040820151805161096d916002840191602090910190610f2e565b506060820151600390910180546080909301511515600160a01b026001600160a81b03199093166001600160a01b0390921691909117919091179055505060018055505050565b600260015414156109d75760405162461bcd60e51b8152600401610487906112b6565b6002600181905550806001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a4191906113aa565b6001600160a01b0316336001600160a01b031614610a8c5760405162461bcd60e51b815260206004820152600860248201526729a420a92298189b60c11b6044820152606401610487565b6000610a9783610e40565b9050803414610ad35760405162461bcd60e51b815260206004820152600860248201526714d21054914c0c8d60c21b6044820152606401610487565b6000839050806001600160a01b031663d6062e44826001600160a01b031663ce1ebbf86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b499190611322565b6040516001600160e01b031960e084901b1681526001600160a01b03871660048201526024016000604051808303818588803b158015610b8857600080fd5b505af1158015610b9c573d6000803e3d6000fd5b5050506001600160a01b038087166000818152600860209081526040808320948a1680845294909152808220429055519294509092507f55310234f77cbf7ca00a671b7e7acf95d660ac8a428eec47b4cd377da8f5cc7a91a35050600180555050565b6000546001600160a01b03163314610c295760405162461bcd60e51b8152600401610487906112ed565b6001600160a01b038116610c8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610487565b610c9781610ede565b50565b60026001541415610cbd5760405162461bcd60e51b8152600401610487906112b6565b6002600155816000610ccf8284610653565b9050803414610d0b5760405162461bcd60e51b8152602060048201526008602482015267534841524530313160c01b6044820152606401610487565b816001600160a01b03166395e9463f836001600160a01b0316635bc3c82c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c9190611322565b6040516001600160e01b031960e084901b168152600481018790523360248201526044016000604051808303818588803b158015610db957600080fd5b505af1158015610dcd573d6000803e3d6000fd5b505050506001600160a01b03851660008181526007602090815260408083203380855292528083204290555187945090917fdc1e872d7927b949dd471e2dd9d43153685b5564c9a6aaf82246e27c0a9f2a2891a460048054906000610e31836113c7565b90915550506001805550505050565b6000808290506000816001600160a01b031663ce1ebbf86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eaa9190611322565b9050600060035460025483610ebf9190611351565b610ec99190611370565b9050610ed58183611392565b95945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054610f3a906113e2565b90600052602060002090601f016020900481019282610f5c5760008555610fa2565b82601f10610f7557805160ff1916838001178555610fa2565b82800160010185558215610fa2579182015b82811115610fa2578251825591602001919060010190610f87565b50610fae929150610fb2565b5090565b5b80821115610fae5760008155600101610fb3565b803560048110610fd657600080fd5b919050565b60008060408385031215610fee57600080fd5b82359150610ffe60208401610fc7565b90509250929050565b6000806040838503121561101a57600080fd5b50508035926020909101359150565b6001600160a01b0381168114610c9757600080fd5b6000806040838503121561105157600080fd5b823561105c81611029565b9150610ffe60208401610fc7565b6000806040838503121561107d57600080fd5b823561108881611029565b946020939093013593505050565b6000602082840312156110a857600080fd5b813580151581146110b857600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126110e657600080fd5b813567ffffffffffffffff80821115611101576111016110bf565b604051601f8301601f19908116603f01168101908282118183101715611129576111296110bf565b8160405283815286602085880101111561114257600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600080600060a0868803121561117a57600080fd5b8535945061118a60208701610fc7565b9350604086013567ffffffffffffffff808211156111a757600080fd5b6111b389838a016110d5565b945060608801359150808211156111c957600080fd5b506111d6888289016110d5565b92505060808601356111e781611029565b809150509295509295909350565b6000806040838503121561120857600080fd5b823561121381611029565b9150602083013561122381611029565b809150509250929050565b60006020828403121561124057600080fd5b81356110b881611029565b600060208083528351808285015260005b818110156112785785810183015185820160400152820161125c565b8181111561128a576000604083870101525b50601f01601f1916929092016040019392505050565b634e487b7160e01b600052602160045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561133457600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561136b5761136b61133b565b500290565b60008261138d57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156113a5576113a561133b565b500190565b6000602082840312156113bc57600080fd5b81516110b881611029565b60006000198214156113db576113db61133b565b5060010190565b600181811c908216806113f657607f821691505b6020821081141561141757634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220405614da63955074900fbe3f07378e00ecc771fc7e48b466c521611a7d214ae264736f6c634300080b0033
Deployed Bytecode Sourcemap
22686:9471:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23495:36;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;23495:36:0;;;;;;;;31727:427;;;;;;;;;;-1:-1:-1;31727:427:0;;;;;:::i;:::-;;:::i;:::-;;;795:14:1;;788:22;770:41;;758:2;743:18;31727:427:0;630:187:1;24703:239:0;;;;;;;;;;-1:-1:-1;24703:239:0;;;;;:::i;:::-;;:::i;:::-;;29285:120;;;;;;;;;;;;;:::i;31048:508::-;;;;;;;;;;-1:-1:-1;31048:508:0;;;;;:::i;:::-;;:::i;25133:654::-;;;;;;;;;;-1:-1:-1;25133:654:0;;;;;:::i;:::-;;:::i;23442:46::-;;;;;;;;;;;;;;;;23392:43;;;;;;;;;;;;;;;;29538:163;;;;;;;;;;-1:-1:-1;29538:163:0;;;;;:::i;:::-;;:::i;14381:103::-;;;;;;;;;;;;;:::i;23538:43::-;;;;;;;;;;-1:-1:-1;23538:43:0;;;;;;;;30031:800;;;;;;;;;;-1:-1:-1;30031:800:0;;;;;:::i;:::-;;:::i;28608:204::-;;;;;;;;;;-1:-1:-1;28608:204:0;;;;;:::i;:::-;-1:-1:-1;;;;;28758:34:0;;;28726:7;28758:34;;;:16;:34;;;;;;;;:46;;;;;;;;;;;;;28608:204;13730:87;;;;;;;;;;-1:-1:-1;13776:7:0;13803:6;13730:87;;-1:-1:-1;;;;;13803:6:0;;;4397:51:1;;4385:2;4370:18;13730:87:0;4251:203:1;29019:213:0;;;;;;;;;;-1:-1:-1;29019:213:0;;;;;:::i;:::-;-1:-1:-1;;;;;29170:36:0;;;29143:7;29170:36;;;:18;:36;;;;;;;;:54;;;;;;;;;;;;;29019:213;27777:627;;;;;;:::i;:::-;;:::i;14639:201::-;;;;;;;;;;-1:-1:-1;14639:201:0;;;;;:::i;:::-;;:::i;26765:550::-;;;;;;:::i;:::-;;:::i;25981:581::-;;;;;;;;;;-1:-1:-1;25981:581:0;;;;;:::i;:::-;;:::i;23222:40::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23222:40:0;;;;;;;;;;;;:::i;31727:427::-;31877:24;;31855:4;;31877:24;;31872:275;;-1:-1:-1;31925:4:0;31918:11;;31872:275;31966:21;;;;:15;:21;;;;;:28;;;-1:-1:-1;;;31966:28:0;;;;31962:174;;;32057:10;32022:45;;;;;;;;:::i;:::-;:21;;;;:15;:21;;;;;:31;;;:45;;;;;;;;:::i;:::-;;32015:52;;;;31962:174;-1:-1:-1;32115:5:0;31962:174;31727:427;;;;:::o;24703:239::-;16922:1;17520:7;;:19;;17512:63;;;;-1:-1:-1;;;17512:63:0;;;;;;;:::i;:::-;;;;;;;;;16922:1;17653:7;:18;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23:::1;13942:68;;;;-1:-1:-1::0;;;13942:68:0::1;;;;;;;:::i;:::-;24845:24:::2;:37:::0;;;;24893:26:::2;:41:::0;16878:1;17832:22;;24703:239::o;29285:120::-;16922:1;17520:7;;:19;;17512:63;;;;-1:-1:-1;;;17512:63:0;;;;;;;:::i;:::-;16922:1;17653:7;:18;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23:::1;13942:68;;;;-1:-1:-1::0;;;13942:68:0::1;;;;;;;:::i;:::-;29346:51:::2;::::0;29354:10:::2;::::0;29375:21:::2;29346:51:::0;::::2;;;::::0;::::2;::::0;;;29375:21;29354:10;29346:51;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;16878:1:0;17832:22;;29285:120::o;31048:508::-;31198:24;;31176:4;;31198:24;;31193:356;;-1:-1:-1;31246:4:0;31239:11;;31193:356;31302:39;;-1:-1:-1;;;31302:39:0;;-1:-1:-1;;;;;4415:32:1;;31302:39:0;;;4397:51:1;31283:16:0;;31302;;:29;;4370:18:1;;31302:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31360:25;;;;:15;:25;;;;;:32;;;:25;;-1:-1:-1;;;;31360:32:0;;;;31356:182;;;31459:10;31420:49;;;;;;;;:::i;:::-;:25;;;;:15;:25;;;;;:35;;;:49;;;;;;;;:::i;:::-;;31413:56;;;;;31356:182;31517:5;31510:12;;;;;25133:654;25254:7;25287:28;;25279:49;;;;-1:-1:-1;;;25279:49:0;;6773:2:1;25279:49:0;;;6755:21:1;6812:1;6792:18;;;6785:29;-1:-1:-1;;;6830:18:1;;;6823:38;6878:18;;25279:49:0;6571:331:1;25279:49:0;25339:10;25357:16;25339:35;;25385:22;25410:5;-1:-1:-1;;;;;25410:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25385:47;;25626:19;25707:26;;25666:24;;25649:14;:41;;;;:::i;:::-;25648:85;;;;:::i;:::-;25626:107;-1:-1:-1;25751:28:0;25626:107;25751:14;:28;:::i;:::-;25744:35;25133:654;-1:-1:-1;;;;;;25133:654:0:o;29538:163::-;16922:1;17520:7;;:19;;17512:63;;;;-1:-1:-1;;;17512:63:0;;;;;;;:::i;:::-;16922:1;17653:7;:18;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23:::1;13942:68;;;;-1:-1:-1::0;;;13942:68:0::1;;;;;;;:::i;:::-;29660:24:::2;:33:::0;;-1:-1:-1;;29660:33:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;17832:22:0;;29538:163::o;14381:103::-;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23;13942:68;;;;-1:-1:-1;;;13942:68:0;;;;;;;:::i;:::-;14446:30:::1;14473:1;14446:18;:30::i;:::-;14381:103::o:0;30031:800::-;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23;13942:68;;;;-1:-1:-1;;;13942:68:0;;;;;;;:::i;:::-;16922:1:::1;17520:7;;:19;;17512:63;;;;-1:-1:-1::0;;;17512:63:0::1;;;;;;;:::i;:::-;16922:1;17653:7;:18:::0;30337:33:::2;30323:10;:47;;;;;;;;:::i;:::-;;:114;;;-1:-1:-1::0;30405:32:0::2;30391:10;:46;;;;;;;;:::i;:::-;;30323:114;:184;;;-1:-1:-1::0;30472:35:0::2;30458:10;:49;;;;;;;;:::i;:::-;;30323:184;:260;;;-1:-1:-1::0;30542:41:0::2;30528:10;:55;;;;;;;;:::i;:::-;;30323:260;30300:320;;;::::0;-1:-1:-1;;;30300:320:0;;7958:2:1;30300:320:0::2;::::0;::::2;7940:21:1::0;7997:1;7977:18;;;7970:29;-1:-1:-1;;;8015:18:1;;;8008:38;8063:18;;30300:320:0::2;7756:331:1::0;30300:320:0::2;30659:164;;;;;;;;30687:10;30659:164;;;;;;;;:::i;:::-;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;-1:-1:-1;;;;;30659:164:0;::::2;::::0;;;;30808:4:::2;30659:164:::0;;;;;;;-1:-1:-1;30631:25:0;;;:15:::2;:25:::0;;;;;:192;;;;:25;;:192;;:25;;-1:-1:-1;;30631:192:0;;::::2;::::0;;::::2;::::0;::::2;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;30631:192:0::2;::::0;;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;30631:192:0::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;:::i;:::-;-1:-1:-1::0;30631:192:0::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;;-1:-1:-1::0;;;30631:192:0::2;-1:-1:-1::0;;;;;;30631:192:0;;;-1:-1:-1;;;;;30631:192:0;;::::2;::::0;;;;;;;::::2;::::0;;-1:-1:-1;;30631:192:0;17832:22;;-1:-1:-1;;;30031:800:0:o;27777:627::-;16922:1;17520:7;;:19;;17512:63;;;;-1:-1:-1;;;17512:63:0;;;;;;;:::i;:::-;16922:1;17653:7;:18;;;;27949:17:::1;-1:-1:-1::0;;;;;27941:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;27927:48:0::1;:10;-1:-1:-1::0;;;;;27927:48:0::1;;27919:69;;;::::0;-1:-1:-1;;;27919:69:0;;8550:2:1;27919:69:0::1;::::0;::::1;8532:21:1::0;8589:1;8569:18;;;8562:29;-1:-1:-1;;;8607:18:1;;;8600:38;8655:18;;27919:69:0::1;8348:331:1::0;27919:69:0::1;27999:18;28020:39;28041:17;28020:20;:39::i;:::-;27999:60;;28091:10;28078:9;:23;28070:44;;;::::0;-1:-1:-1;;;28070:44:0;;8886:2:1;28070:44:0::1;::::0;::::1;8868:21:1::0;8925:1;8905:18;;;8898:29;-1:-1:-1;;;8943:18:1;;;8936:38;8991:18;;28070:44:0::1;8684:331:1::0;28070:44:0::1;28125:10;28143:17;28125:36;;28172:5;-1:-1:-1::0;;;;;28172:13:0::1;;28193:5;-1:-1:-1::0;;;;;28193:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28172:64;::::0;-1:-1:-1;;;;;;28172:64:0::1;::::0;;;;;;-1:-1:-1;;;;;4415:32:1;;28172:64:0::1;::::0;::::1;4397:51:1::0;4370:18;;28172:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;28247:37:0;;::::1;;::::0;;;:18:::1;:37;::::0;;;;;;;:56;;::::1;::::0;;;;;;;;;;28306:29:::1;28247:88:::0;;28351:45;28247:56;;-1:-1:-1;28247:37:0;;-1:-1:-1;28351:45:0::1;::::0;::::1;-1:-1:-1::0;;16878:1:0;17832:22;;-1:-1:-1;;27777:627:0:o;14639:201::-;13776:7;13803:6;-1:-1:-1;;;;;13803:6:0;12675:10;13950:23;13942:68;;;;-1:-1:-1;;;13942:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14728:22:0;::::1;14720:73;;;::::0;-1:-1:-1;;;14720:73:0;;9222:2:1;14720:73:0::1;::::0;::::1;9204:21:1::0;9261:2;9241:18;;;9234:30;9300:34;9280:18;;;9273:62;-1:-1:-1;;;9351:18:1;;;9344:36;9397:19;;14720:73:0::1;9020:402:1::0;14720:73:0::1;14804:28;14823:8;14804:18;:28::i;:::-;14639:201:::0;:::o;26765:550::-;16922:1;17520:7;;:19;;17512:63;;;;-1:-1:-1;;;17512:63:0;;;;;;;:::i;:::-;16922:1;17653:7;:18;26914:16;26896:10:::1;26963:47;26914:16:::0;27001:8;26963:19:::1;:47::i;:::-;26942:68;;27042:10;27029:9;:23;27021:44;;;::::0;-1:-1:-1;;;27021:44:0;;9629:2:1;27021:44:0::1;::::0;::::1;9611:21:1::0;9668:1;9648:18;;;9641:29;-1:-1:-1;;;9686:18:1;;;9679:38;9734:18;;27021:44:0::1;9427:331:1::0;27021:44:0::1;27076:5;-1:-1:-1::0;;;;;27076:12:0::1;;27096:5;-1:-1:-1::0;;;;;27096:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27076:65;::::0;-1:-1:-1;;;;;;27076:65:0::1;::::0;;;;;;::::1;::::0;::::1;9937:25:1::0;;;27130:10:0::1;9978:18:1::0;;;9971:60;9910:18;;27076:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;27152:34:0;::::1;;::::0;;;:16:::1;:34;::::0;;;;;;;27187:10:::1;27152:46:::0;;;;;;;;27201:15:::1;27152:64:::0;;27232:45;27268:8;;-1:-1:-1;27187:10:0;;27232:45:::1;::::0;::::1;27288:17;:19:::0;;;:17:::1;:19;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;16878:1:0;17832:22;;-1:-1:-1;;;;26765:550:0:o;25981:581::-;26085:7;26110:10;26128:16;26110:35;;26156:23;26182:5;-1:-1:-1;;;;;26182:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26156:49;;26399:19;26481:26;;26440:24;;26422:15;:42;;;;:::i;:::-;26421:86;;;;:::i;:::-;26399:108;-1:-1:-1;26525:29:0;26399:108;26525:15;:29;:::i;:::-;26518:36;25981:581;-1:-1:-1;;;;;25981:581:0:o;15000:191::-;15074:16;15093:6;;-1:-1:-1;;;;;15110:17:0;;;-1:-1:-1;;;;;;15110:17:0;;;;;;15143:40;;15093:6;;;;;;;15143:40;;15074:16;15143:40;15063:128;15000:191;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:150:1;271:20;;320:1;310:12;;300:40;;336:1;333;326:12;300:40;196:150;;;:::o;351:274::-;432:6;440;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;545:9;532:23;522:33;;574:45;615:2;604:9;600:18;574:45;:::i;:::-;564:55;;351:274;;;;;:::o;822:248::-;890:6;898;951:2;939:9;930:7;926:23;922:32;919:52;;;967:1;964;957:12;919:52;-1:-1:-1;;990:23:1;;;1060:2;1045:18;;;1032:32;;-1:-1:-1;822:248:1:o;1075:131::-;-1:-1:-1;;;;;1150:31:1;;1140:42;;1130:70;;1196:1;1193;1186:12;1211:341;1292:6;1300;1353:2;1341:9;1332:7;1328:23;1324:32;1321:52;;;1369:1;1366;1359:12;1321:52;1408:9;1395:23;1427:31;1452:5;1427:31;:::i;:::-;1477:5;-1:-1:-1;1501:45:1;1542:2;1527:18;;1501:45;:::i;1557:315::-;1625:6;1633;1686:2;1674:9;1665:7;1661:23;1657:32;1654:52;;;1702:1;1699;1692:12;1654:52;1741:9;1728:23;1760:31;1785:5;1760:31;:::i;:::-;1810:5;1862:2;1847:18;;;;1834:32;;-1:-1:-1;;;1557:315:1:o;1877:273::-;1933:6;1986:2;1974:9;1965:7;1961:23;1957:32;1954:52;;;2002:1;1999;1992:12;1954:52;2041:9;2028:23;2094:5;2087:13;2080:21;2073:5;2070:32;2060:60;;2116:1;2113;2106:12;2060:60;2139:5;1877:273;-1:-1:-1;;;1877:273:1:o;2155:127::-;2216:10;2211:3;2207:20;2204:1;2197:31;2247:4;2244:1;2237:15;2271:4;2268:1;2261:15;2287:719;2330:5;2383:3;2376:4;2368:6;2364:17;2360:27;2350:55;;2401:1;2398;2391:12;2350:55;2437:6;2424:20;2463:18;2500:2;2496;2493:10;2490:36;;;2506:18;;:::i;:::-;2581:2;2575:9;2549:2;2635:13;;-1:-1:-1;;2631:22:1;;;2655:2;2627:31;2623:40;2611:53;;;2679:18;;;2699:22;;;2676:46;2673:72;;;2725:18;;:::i;:::-;2765:10;2761:2;2754:22;2800:2;2792:6;2785:18;2846:3;2839:4;2834:2;2826:6;2822:15;2818:26;2815:35;2812:55;;;2863:1;2860;2853:12;2812:55;2927:2;2920:4;2912:6;2908:17;2901:4;2893:6;2889:17;2876:54;2974:1;2967:4;2962:2;2954:6;2950:15;2946:26;2939:37;2994:6;2985:15;;;;;;2287:719;;;;:::o;3011:842::-;3139:6;3147;3155;3163;3171;3224:3;3212:9;3203:7;3199:23;3195:33;3192:53;;;3241:1;3238;3231:12;3192:53;3277:9;3264:23;3254:33;;3306:45;3347:2;3336:9;3332:18;3306:45;:::i;:::-;3296:55;;3402:2;3391:9;3387:18;3374:32;3425:18;3466:2;3458:6;3455:14;3452:34;;;3482:1;3479;3472:12;3452:34;3505:50;3547:7;3538:6;3527:9;3523:22;3505:50;:::i;:::-;3495:60;;3608:2;3597:9;3593:18;3580:32;3564:48;;3637:2;3627:8;3624:16;3621:36;;;3653:1;3650;3643:12;3621:36;;3676:52;3720:7;3709:8;3698:9;3694:24;3676:52;:::i;:::-;3666:62;;;3778:3;3767:9;3763:19;3750:33;3792:31;3817:5;3792:31;:::i;:::-;3842:5;3832:15;;;3011:842;;;;;;;;:::o;3858:388::-;3926:6;3934;3987:2;3975:9;3966:7;3962:23;3958:32;3955:52;;;4003:1;4000;3993:12;3955:52;4042:9;4029:23;4061:31;4086:5;4061:31;:::i;:::-;4111:5;-1:-1:-1;4168:2:1;4153:18;;4140:32;4181:33;4140:32;4181:33;:::i;:::-;4233:7;4223:17;;;3858:388;;;;;:::o;4459:247::-;4518:6;4571:2;4559:9;4550:7;4546:23;4542:32;4539:52;;;4587:1;4584;4577:12;4539:52;4626:9;4613:23;4645:31;4670:5;4645:31;:::i;4711:597::-;4823:4;4852:2;4881;4870:9;4863:21;4913:6;4907:13;4956:6;4951:2;4940:9;4936:18;4929:34;4981:1;4991:140;5005:6;5002:1;4999:13;4991:140;;;5100:14;;;5096:23;;5090:30;5066:17;;;5085:2;5062:26;5055:66;5020:10;;4991:140;;;5149:6;5146:1;5143:13;5140:91;;;5219:1;5214:2;5205:6;5194:9;5190:22;5186:31;5179:42;5140:91;-1:-1:-1;5292:2:1;5271:15;-1:-1:-1;;5267:29:1;5252:45;;;;5299:2;5248:54;;4711:597;-1:-1:-1;;;4711:597:1:o;5313:127::-;5374:10;5369:3;5365:20;5362:1;5355:31;5405:4;5402:1;5395:15;5429:4;5426:1;5419:15;5445:355;5647:2;5629:21;;;5686:2;5666:18;;;5659:30;5725:33;5720:2;5705:18;;5698:61;5791:2;5776:18;;5445:355::o;5805:356::-;6007:2;5989:21;;;6026:18;;;6019:30;6085:34;6080:2;6065:18;;6058:62;6152:2;6137:18;;5805:356::o;6382:184::-;6452:6;6505:2;6493:9;6484:7;6480:23;6476:32;6473:52;;;6521:1;6518;6511:12;6473:52;-1:-1:-1;6544:16:1;;6382:184;-1:-1:-1;6382:184:1:o;7096:127::-;7157:10;7152:3;7148:20;7145:1;7138:31;7188:4;7185:1;7178:15;7212:4;7209:1;7202:15;7228:168;7268:7;7334:1;7330;7326:6;7322:14;7319:1;7316:21;7311:1;7304:9;7297:17;7293:45;7290:71;;;7341:18;;:::i;:::-;-1:-1:-1;7381:9:1;;7228:168::o;7401:217::-;7441:1;7467;7457:132;;7511:10;7506:3;7502:20;7499:1;7492:31;7546:4;7543:1;7536:15;7574:4;7571:1;7564:15;7457:132;-1:-1:-1;7603:9:1;;7401:217::o;7623:128::-;7663:3;7694:1;7690:6;7687:1;7684:13;7681:39;;;7700:18;;:::i;:::-;-1:-1:-1;7736:9:1;;7623:128::o;8092:251::-;8162:6;8215:2;8203:9;8194:7;8190:23;8186:32;8183:52;;;8231:1;8228;8221:12;8183:52;8263:9;8257:16;8282:31;8307:5;8282:31;:::i;10042:135::-;10081:3;-1:-1:-1;;10102:17:1;;10099:43;;;10122:18;;:::i;:::-;-1:-1:-1;10169:1:1;10158:13;;10042:135::o;10182:380::-;10261:1;10257:12;;;;10304;;;10325:61;;10379:4;10371:6;10367:17;10357:27;;10325:61;10432:2;10424:6;10421:14;10401:18;10398:38;10395:161;;;10478:10;10473:3;10469:20;10466:1;10459:31;10513:4;10510:1;10503:15;10541:4;10538:1;10531:15;10395:161;;10182:380;;;:::o
Swarm Source
ipfs://405614da63955074900fbe3f07378e00ecc771fc7e48b466c521611a7d214ae2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.