From 13a15c2ebdc6ad6a107b87d35e8e4119f6b55364 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 16 Aug 2021 23:31:18 +0200 Subject: [PATCH 001/186] Feature: Create docs for v4 introduction --- content/concepts/images/v4-nft-1.png | Bin 0 -> 6827 bytes content/concepts/v4-nft.md | 23 +++++++++++++++++++++++ content/concepts/v4-roles.md | 20 ++++++++++++++++++++ data/sidebars/concepts.yml | 7 +++++++ 4 files changed, 50 insertions(+) create mode 100644 content/concepts/images/v4-nft-1.png create mode 100644 content/concepts/v4-nft.md create mode 100644 content/concepts/v4-roles.md diff --git a/content/concepts/images/v4-nft-1.png b/content/concepts/images/v4-nft-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a45eb96c9bea6a940111b8548dc50a100405211c GIT binary patch literal 6827 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 Date: Tue, 17 Aug 2021 12:11:30 +0200 Subject: [PATCH 002/186] Improve v4 docs --- content/concepts/v4-nft.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 1899e731..681cf482 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -10,6 +10,12 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +### Combining ERC721 and ERC20 + +ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. + +Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. + ![Image 1](images/v4-nft-1.png) Once the contract is deployed, it will be available on the Ocean Marketplace for trade. From 6baece929bdbe9b801bdc849a3ecc3159628f2b8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 17 Aug 2021 12:24:01 +0200 Subject: [PATCH 003/186] Improve v4 docs --- content/concepts/images/v4-nft-2.png | Bin 0 -> 15956 bytes content/concepts/v4-nft.md | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 content/concepts/images/v4-nft-2.png diff --git a/content/concepts/images/v4-nft-2.png b/content/concepts/images/v4-nft-2.png new file mode 100644 index 0000000000000000000000000000000000000000..379f67e2d9ed32b7c99ecaa61b28126d183516a0 GIT binary patch literal 15956 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 literal 0 HcmV?d00001 diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 681cf482..8a2eac5e 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -10,13 +10,15 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +![Image 1](images/v4-nft-1.png) + ### Combining ERC721 and ERC20 ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. -![Image 1](images/v4-nft-1.png) +![Combining ERC721 and ERC20](images/v4-nft-2.png) Once the contract is deployed, it will be available on the Ocean Marketplace for trade. From fb742723a829dab208fa3b84f515a2865057dcee Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 26 Sep 2021 23:13:44 +0200 Subject: [PATCH 004/186] Improve v4 doc --- content/concepts/v4-nft.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 8a2eac5e..86012c64 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -8,7 +8,7 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca ### How will Ocean Protocol support the NFT market? -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract which will allow users to deploy ERC721 contract instances on any of the supported networks. The deployed contract can be associated with Metadata information which describes, also published on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will store the information about the asset, and associated access rights defined through roles. +Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract, allowing users to deploy ERC721 contract instances on any supported networks.The deployed contract can be associated with Metadata information that describes the unique asset. The Metadata is also stored on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will contain information about the NFT, and associated access rights defined through roles. ![Image 1](images/v4-nft-1.png) @@ -20,7 +20,6 @@ Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blo ![Combining ERC721 and ERC20](images/v4-nft-2.png) -Once the contract is deployed, it will be available on the Ocean Marketplace for trade. ### Other References From 1f2c5953acb1bebd18db3b829e697e1099628de4 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 11:49:24 +0200 Subject: [PATCH 005/186] Issue-#701: Improve v4-NFT doc --- content/concepts/images/v4-nft-1.PNG | Bin 0 -> 40446 bytes content/concepts/images/v4-nft-1.png | Bin 6827 -> 0 bytes content/concepts/images/v4-nft-2.png | Bin 15956 -> 0 bytes content/concepts/v4-nft.md | 33 ++++++++++++++++----------- 4 files changed, 20 insertions(+), 13 deletions(-) create mode 100644 content/concepts/images/v4-nft-1.PNG delete mode 100644 content/concepts/images/v4-nft-1.png delete mode 100644 content/concepts/images/v4-nft-2.png diff --git a/content/concepts/images/v4-nft-1.PNG b/content/concepts/images/v4-nft-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bf850be6c055fe8a54f7278114bb3f23dbe5fe6b GIT binary patch literal 40446 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 UhKx@Ro4}uq70!}s{#(p{06!L1(*OVf literal 0 HcmV?d00001 diff --git a/content/concepts/images/v4-nft-1.png b/content/concepts/images/v4-nft-1.png deleted file mode 100644 index a45eb96c9bea6a940111b8548dc50a100405211c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6827 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 diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index 86012c64..de49c40e 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -1,30 +1,37 @@ -### What is NFT? +### NFTS -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). -### How are NFTs handled in the Blockchain world? +### Terminology -[EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). +- **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. -### How will Ocean Protocol support the NFT market? +- **Base IP holder** means the holder of the Base IP. Represented as the the actor that did the initial "publish" action. -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/ERC721Factory.sol) contract, allowing users to deploy ERC721 contract instances on any supported networks.The deployed contract can be associated with Metadata information that describes the unique asset. The Metadata is also stored on-chain. The [Metadata](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/metadata/Metadata.sol) contract will contain information about the NFT, and associated access rights defined through roles. +- **Sub-licensee** is the holder of the sub-license. Represented as the entity that controls address ERC721.\_owners[tokenId=x]. -![Image 1](images/v4-nft-1.png) +- **To Publish**: Claim copyright or exclusive base license -### Combining ERC721 and ERC20 +- **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -ERC20 interface represents fungible tokens. ERC721 and ERC20 combined together can be used for sub-licensing. These sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +### Supporting NFT using Ocean Protocol -Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) provides functionality to create comibinations of ERC721 and ERC20 contract pairs, each of this pair can represent a different sub-license. +Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their own ERC721 instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creater of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -![Combining ERC721 and ERC20](images/v4-nft-2.png) +### Sub licensing the Base IP +ERC721 tokens are non-fungiable, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenzing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. + +### Use case + +Alice is author of a book. Alice wants to hold the copyright of her work but, allow others to read her book. So, She creates 2 versions of her book namely: digital copy, physcial copy. She assigns Bob as the manager for the digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for digital edition of the book. Alice tokensises her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates a sub-licenses of her book by creating two ERC20 tokens and transerfers the digital copy token to Bob's wallet. + +![Image 1](images/v4-nft-1.PNG) ### Other References - https://en.wikipedia.org/wiki/Non-fungible_token -- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e -- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 - https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d +- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 +- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e - https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70 From e94e22275a162a992edadfe85901e43c86feb6f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 11:58:15 +0200 Subject: [PATCH 006/186] Issue-#701: Improve v4-NFT doc --- content/concepts/v4-nft.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index de49c40e..caca9b3a 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -16,15 +16,15 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca ### Supporting NFT using Ocean Protocol -Ocean Protocol defines an [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their own ERC721 instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creater of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. +Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. ### Sub licensing the Base IP -ERC721 tokens are non-fungiable, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenzing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. ### Use case -Alice is author of a book. Alice wants to hold the copyright of her work but, allow others to read her book. So, She creates 2 versions of her book namely: digital copy, physcial copy. She assigns Bob as the manager for the digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for digital edition of the book. Alice tokensises her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates a sub-licenses of her book by creating two ERC20 tokens and transerfers the digital copy token to Bob's wallet. +Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. ![Image 1](images/v4-nft-1.PNG) From 932c02af9badd8d1eb9b2b5cb878989be00fa9f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Sep 2021 12:13:55 +0200 Subject: [PATCH 007/186] Issue-#701: Improve v4-NFT doc --- content/concepts/v4-nft.md | 17 +++++++++++------ content/concepts/v4-roles.md | 11 ++++++++--- data/sidebars/concepts.yml | 2 +- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/content/concepts/v4-nft.md b/content/concepts/v4-nft.md index caca9b3a..99c283a8 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/v4-nft.md @@ -1,8 +1,13 @@ -### NFTS +--- +title: v4 NFT introduction +description: The page describes NFT, IP and sub-licensing using Ocean Protocol's contracts, and use case. +--- + +## NFTS A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). -### Terminology +## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. @@ -14,21 +19,21 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -### Supporting NFT using Ocean Protocol +## Supporting NFT using Ocean Protocol Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -### Sub licensing the Base IP +## Sub licensing the Base IP ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. -### Use case +## Use case Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. ![Image 1](images/v4-nft-1.PNG) -### Other References +## Other References - https://en.wikipedia.org/wiki/Non-fungible_token - https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d diff --git a/content/concepts/v4-roles.md b/content/concepts/v4-roles.md index ee73a683..dfe547cb 100644 --- a/content/concepts/v4-roles.md +++ b/content/concepts/v4-roles.md @@ -1,11 +1,16 @@ -### Roles +--- +title: v4 roles and permissions +description: The page describes the roles and permissions present in ERC721Template contract. +--- + +## Roles [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: - NFT Owner - Manager -#### NFT Owner +## NFT Owner - NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. @@ -14,7 +19,7 @@ - NFT Owner can add/remove Managers. - Clean all permissions -#### Manager +## Manager - A public address with a `Magner` role can update the metadata - Can deploy new ERC20 contract which is associtated with the `ERC721` contract. diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 1719eec0..3c629645 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -25,7 +25,7 @@ - title: DDO Metadata link: /concepts/ddo-metadata/ -- group: NFTs +- group: NFTs (upcoming v4 release) items: - title: Introduction link: /concepts/v4-nft/ From 3d873de972d676c542a8e6e0a91cabaa99abc011 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 28 Sep 2021 09:07:27 -0700 Subject: [PATCH 008/186] draft v4 ddo --- content/concepts/ddo-metadata.md | 349 ------------------------------- content/concepts/did-ddo.md | 258 ++++++++++++++++------- 2 files changed, 185 insertions(+), 422 deletions(-) delete mode 100644 content/concepts/ddo-metadata.md diff --git a/content/concepts/ddo-metadata.md b/content/concepts/ddo-metadata.md deleted file mode 100644 index 94dfb94f..00000000 --- a/content/concepts/ddo-metadata.md +++ /dev/null @@ -1,349 +0,0 @@ ---- -title: DDO Metadata -description: Specification of the DDO subset dedicated to asset metadata -slug: /concepts/ddo-metadata/ -section: concepts ---- - -## Overview - -This page defines the schema for asset _metadata_. Metadata is the subset of an Ocean DDO that holds information about the asset. - -The schema is based on public schema.org [DataSet schema](https://schema.org/Dataset). - -Standardizing labels is key to effective searching, sorting and filtering (discovery). - -This page specifies metadata attributes that _must_ be included, and that _may_ be included. These attributes are organized hierarchically, from top-layer attributes like `"main"` to sub-level attributes like `"main.type"`. This page also provides DDO metadata examples. - -## Rules for Metadata Storage and Control in Ocean - -The publisher publishes an asset DDO (including metadata) onto the chain. - -The publisher may be the asset owner, or a marketplace acting on behalf of the owner. - -Most metadata fields may be modified after creation. The blockchain records the provenance of changes. - -DDOs (including metadata) are found in two places: - -- _Remote_ - main storage, on-chain. File URLs are always encrypted. One may actually encrypt all metadata, at a severe cost to discoverability. -- _Local_ - local cache. All fields are in plaintext. - -Ocean Aquarius helps manage metadata. It can be used to write DDOs to the chain, read from the chain, and has a local cache of the DDO in plaintext with fast search. - -## Fields for Metadata - -An asset represents a resource in Ocean, e.g. a dataset or an algorithm. - -A `metadata` object has the following attributes, all of which are objects. Some are only required for local or remote, and are specified as such. - -| Attribute | Required | Description | -| --------------------------- | -------- | ---------------------------------------------------------- | -| **`main`** | **Yes** | Main attributes | -| **`encryptedFiles`** | Remote | Encrypted string of the `attributes.main.files` object. | -| **`encryptedServices`** | Remote | Encrypted string of the `attributes.main.services` object. | -| **`status`** | No | Status attributes | -| **`additionalInformation`** | No | Optional attributes | - -The `main` and `additionalInformation` attributes are independent of the asset type. - -## Fields for `attributes.main` - -The `main` object has the following attributes. - -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | -| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`files`** | Array of files object |**Yes** | Array of `File` objects including the encrypted file urls. | -| **`dateCreated`** | DateTime |**Yes** | The date on which the asset was created by the originator. ISO 8601 format, Coordinated Universal Time, e.g. `2019-01-31T08:38:32Z`. | -| **`datePublished`** | DateTime | Remote | The date on which the asset DDO is registered into the metadata store (Aquarius) | - -## Fields for `attributes.main.files` - -The `files` object has a list of `file` objects. - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`index`** |**Yes** | Index number starting from 0 of the file. | -| **`contentType`** |**Yes** | File format. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | No | File name. | -| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | No | Size of the file in bytes. | -| **`encoding`** | No | File encoding (e.g. UTF-8). | -| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | - -## Fields for `attributes.status` - -A `status` object has the following attributes. - -| Attribute | Type | Required | Description | -| --------------------- | ------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`isListed`** | Boolean | No | Use to flag unsuitable content. True by default. If it's false, the content must not be returned. | -| **`isRetired`** | Boolean | No | Flag retired content. False by default. If it's true, the content may either not be returned, or returned with a note about retirement. | -| **`isOrderDisabled`** | Boolean | No | For temporarily disabling ordering assets, e.g. when file host is in maintenance. False by default. If it's true, no ordering of assets for download or compute should be allowed. | - -## Fields for `attributes.additionalInformation` - -All the additional information will be stored as part of the `additionalInformation` section. - -| Attribute | Type | Required | -| --------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`description`** | Text | No | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`workExample`** | Text | No | Example of the concept of this asset. This example is part of the metadata, not an external link. | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47). | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | - -## Fields - Other Suggestions - -Here are example attributes to help an asset's discoverability. - -| Attribute | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`updateFrequency`** | An indication of update latency - i.e. How often are updates expected (seldom, annually, quarterly, etc.), or is the resource static that is never expected to get updated. | -| **`structuredMarkup`** | A link to machine-readable structured markup (such as ttl/json-ld/rdf) describing the dataset. | - -## DDO Metadata Example - Local - -This is what the DDO metadata looks like. All fields are in plaintext. This is before it's stored on-chain or when it's retrieved and decrypted into a local cache. - -```json -{ - "main": { - "name": "Madrid Weather forecast", - "dateCreated": "2019-05-16T12:36:14.535Z", - "author": "Norwegian Meteorological Institute", - "type": "dataset", - "license": "Public Domain", - "price": "123000000000000000000", - "files": [ - { - "index": 0, - "url": "https://example-url.net/weather/forecast/madrid/350750305731.xml", - "contentLength": "0", - "contentType": "text/xml", - "compression": "none" - } - ] - }, - "additionalInformation": { - "description": "Weather forecast of Europe/Madrid in XML format", - "copyrightHolder": "Norwegian Meteorological Institute", - "categories": ["Other"], - "links": [], - "tags": [], - "updateFrequency": null, - "structuredMarkup": [] - }, - "status": { - "isListed": true, - "isRetired": false, - "isOrderDisabled": false - } -} -``` - -## DDO Metadata Example - Remote - -The previous example was for a local cache, with all fields in plaintext. - -Here's the same example, for remote on-chain storage. That is, it's how metadata looks as a response to querying Aquarius (remote metadata). - -How remote is changed, compared to local: - -- `url` is removed from all objects in the `files` array -- `encryptedFiles` is added. - -```json -{ - "service": [ - { - "index": 0, - "serviceEndpoint": "http://aquarius:5000/api/v1/aquarius/assets/ddo/{did}", - "type": "metadata", - "attributes": { - "main": { - "type": "dataset", - "name": "Madrid Weather forecast", - "dateCreated": "2019-05-16T12:36:14.535Z", - "author": "Norwegian Meteorological Institute", - "license": "Public Domain", - "files": [ - { - "contentLength": "0", - "contentType": "text/xml", - "compression": "none", - "index": 0 - } - ], - "datePublished": "2019-05-16T12:41:01Z" - }, - "encryptedFiles": "0x7a0d1c66ae861…df43aa9", - "additionalInformation": { - "description": "Weather forecast of Europe/Madrid in XML format", - "copyrightHolder": "Norwegian Meteorological Institute", - "categories": ["Other"], - "links": [], - "tags": [], - "updateFrequency": null, - "structuredMarkup": [] - }, - "status": { - "isListed": true, - "isRetired": false, - "isOrderDisabled": false - } - } - } - ] -} -``` - -## Fields when `attributes.main.type = algorithm` - -An asset of type `algorithm` has the following additional attributes under `main.algorithm`: - -| Attribute | Type | Required | Description | -| --------------- | -------- | -------- | --------------------------------------------- | -| **`container`** | `Object` |**Yes** | Object describing the Docker container image. | -| **`language`** | `string` | No | Language used to implement the software | -| **`format`** | `string` | No | Packaging format of the software. | -| **`version`** | `string` | No | Version of the software. | - -The `container` object has the following attributes: - -| Attribute | Type | Required | Description | -| ---------------- | -------- | -------- | ----------------------------------------------------------------- | -| **`entrypoint`** | `string` |**Yes** | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` |**Yes** | Name of the Docker image. | -| **`tag`** | `string` |**Yes** | Tag of the Docker image. | -| **`checksum`** | `string` |**Yes** | Checksum of the Docker image. | - -```json -{ - "index": 0, - "serviceEndpoint": "http://localhost:5000/api/v1/aquarius/assets/ddo/{did}", - "type": "metadata", - "attributes": { - "main": { - "author": "John Doe", - "dateCreated": "2019-02-08T08:13:49Z", - "license": "CC-BY", - "name": "My super algorithm", - "type": "algorithm", - "algorithm": { - "language": "scala", - "format": "docker-image", - "version": "0.1", - "container": { - "entrypoint": "node $ALGO", - "image": "node", - "tag": "10", - "checksum": "efb2c764274b745f5fc37f97c6b0e761" - } - }, - "files": [ - { - "name": "build_model", - "url": "https://raw.gith ubusercontent.com/oceanprotocol/test-algorithm/master/javascript/algo.js", - "index": 0, - "checksum": "efb2c764274b745f5fc37f97c6b0e761", - "contentLength": "4535431", - "contentType": "text/plain", - "encoding": "UTF-8", - "compression": "zip" - } - ] - }, - "additionalInformation": { - "description": "Workflow to aggregate weather information", - "tags": ["weather", "uk", "2011", "workflow", "aggregation"], - "copyrightHolder": "John Doe" - } - } -} -``` - -## Fields when `attributes.main.type = compute` - -An asset with a service of type `compute` has the following additional attributes under `main.privacy`: - -| Attribute | Type | Required | Description | -| --------------------------------- | ------------------ | -------- | ---------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` |**Yes** | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` |**Yes** | If True, the algo job will have network access (stil WIP) | -| **`publisherTrustedAlgorithms `** | Array of `Objects` |**Yes** | If Empty , then any published algo is allowed. (see below) | - -The `publisherTrustedAlgorithms ` is an array of objects with the following structure: - -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` |**Yes** | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` |**Yes** | Hash of ( algorithm's encryptedFiles + files section (as string) ) | -| **`containerSectionChecksum`** | `string` |**Yes** | Hash of the algorithm container section (as string) | - -To produce `filesChecksum`: - -```javascript -sha256( - algorithm_ddo.service['metadata'].attributes.encryptedFiles + - JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) -) -``` - -To produce `containerSectionChecksum`: - -```javascript -sha256( - JSON.Stringify( - algorithm_ddo.service['metadata'].attributes.main.algorithm.container - ) -) -``` - -### Example of a compute service - -```json -{ - "type": "compute", - "index": 1, - "serviceEndpoint": "https://provider.oceanprotocol.com", - "attributes": { - "main": { - "name": "dataAssetComputingService", - "creator": "0xA32C84D2B44C041F3a56afC07a33f8AC5BF1A071", - "datePublished": "2021-02-17T06:31:33Z", - "cost": "1", - "timeout": 3600, - "privacy": { - "allowRawAlgorithm": true, - "allowNetworkAccess": false, - "publisherTrustedAlgorithms": [ - { - "did": "0xxxxx", - "filesChecksum": "1234", - "containerSectionChecksum": "7676" - }, - { - "did": "0xxxxx", - "filesChecksum": "1232334", - "containerSectionChecksum": "98787" - } - ] - } - } - } -} -``` diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 5ceccff8..3620f097 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -24,8 +24,17 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - An asset should have a DID and DDO. The DDO should include metadata about the asset. - The DDO can only can be modified by _owners_ or _delegated users_. - There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. -- The DDO is stored on-chain. It's stored in in plaintext, with two exceptions: (1) the field for resource-access url is encrypted (2) the whole DDO may be encrypted, if the publisher is willing to lose 100% of discoverability. -- A metadata cache like Aquarius can help in reading and writing DDO data from the chain. +- A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. + +## Flow for publishing / retrieving DDOs + +- The DDO is stored on-chain. +- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) +- Each DID has a state, which is held by the NFT Contract (also stored in the DDO.status.status). The possible states are: + * 0 = active + * 1 = end-of-life + * 2 = deprecated (by another asset) + * 3 = revoked by publisher ## DID Structure @@ -34,98 +43,120 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` +where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" is the address of the ERC721 contract that represents that asset. It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). -The part after `did:op:` is the asset's on-chain Ethereum address (minus the "0x"). One can be computed from the other; therefore there is a 1:1 mapping between did and Ethereum address. ## DDO Attributes -![DDO Content](images/ddo-content.png) A DDO has these standard attributes: -- `@context` -- `id` -- `created` -- `updated` -- `publicKey` -- `authentication` -- `proof` -- `verifiableCredential` +- `@context` = array, contexts used for validation +- `id` = string, address of ERC721 contract +- `created` = updated by aquarius, contains the date of publishing (block.timestamp) +- `updated` = updated by aquarius, contains the date of the update (block.timestamp) +- `proof` = proof of ownership + In Ocean, the DDO also has: -- `dataToken` -- `service` -- `credentials` - optional flag, which describes the credentials needed to access a dataset (see below) +- `version` - stores version information (`v4` for us) +- `metadata` - stores metadata information [Metadata](#metadata) +- `service` - stores an array of services [Service](#service) +- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) +- `status` - stores status related fields [Status](#status) +- `files` and `encryptedFiles` - stores file(s) informations [Files](#files) +- `event` - stores the last event information [Event](#event) -Asset metadata must be included as one of the objects inside the `"service"` array, with type `"metadata"`. -## DDO Service Types +## Metadata +The object has the following attributes. -There are many possible service types for a DDO. +| Attribute | Type | Required | Description | +| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. +| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | +| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | +| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -- `metadata` - describing the asset -- `access` - describing how the asset can be downloaded -- `compute` - describing how the asset can be computed upon +Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: -Each asset has a `metadata` service and at least one other service. +### Algorithm attributes -Each service is distinguished by the `DDO.service.type` attribute. +An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -Each service has an `attributes` section holding the information related to the service. That section _must_ have a `main` sub-section, holding all the mandatory information that a service has to provide. +| Attribute | Type | Required | Description | +| ------------------- | ----------------------| ----------- |--------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`format`** | `string` | no | Packaging format of the software. | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Object` | yes | Object describing the Docker container image. | -A part of the `attributes.main` sub-section, other optional sub-sections like `attributes.extra` can be added. These depend on the service type. +The `container` object has the following attributes: -Each service has a `timeout` (in seconds) section describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. +| Attribute | Type | Required | Description | +| ------------------- | -------- | --------- | --------------------------------------------------- | +| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | yes | Name of the Docker image. | +| **`tag`** | `string` | yes | Tag of the Docker image. | +| **`checksum`** | `string` | yes | Checksum of the Docker image. | -The `cost` attribute is obsolete, as of Ocean V3. As of V3, to consume an asset, one sends exactly 1.0 datatokens of the asset, so a `cost` is not needed. -## DDO Service Example -Here is an example DDO service: -```json -"service": [ - { - "index": 0, - "type": "metadata", - "serviceEndpoint": "https://service/api/v1/metadata/assets/ddo/did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea", - "attributes": { - "main": {}, - "additionalInformation": {}, - "curation": {} - } - }, - { - "index": 1, - "type": "access", - "serviceEndpoint": "http://localhost:8030/api/v1/provider/services/consume", - "attributes": { - "main": { - "cost":"10", - "timeout":0 - }, - "additionalInformation": {} - } - }, - { - "index": 2, - "type": "compute", - "serviceEndpoint": "http://localhost:8030/api/v1/provider/services/compute", - "attributes": { - "main": { - "cost":"10", - "timeout":3600 - }, - "additionalInformation": {} - } - } -] + +## Service + +| Attribute | Type | Required | Description | +| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`serviceEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. | +| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | + + +Depending on the service type, the following attributes are applied: + +### Compute datasets attributes + +An asset with a service of type `compute` has the following additional attributes under `privacy` object : + +| Attribute | Type | Required | Description | +| ---------------------------- | ----------------------| ----------- |---------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | +| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `Objects` | yes | If Empty , then any published algo is allowed. (see below) | + +The `publisherTrustedAlgorithms ` is an array of objects with the following structure: + +| Attribute | Type | Required | Description | +| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | +| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | + +To produce filesChecksum: +``` +sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) ``` -## DDO Credentials for Fine-Grained Permissions +To produce containerSectionChecksum: +``` +sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) +``` + +## Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -140,7 +171,9 @@ Ocean also supports `"deny"` credentials: if a consumer has any of these credent Here's an example object with both `"allow"` and `"deny"` entries. ```json -"credentials":{ +{ + {...}, + "credentials":{ "allow":[ { "type":"address", @@ -150,19 +183,22 @@ Here's an example object with both `"allow"` and `"deny"` entries. ] } ] - }, - "deny":[ - { + }, + "deny":[ + { "type":"address", "values":[ "0x2222", "0x333" ] - } - ] + } + ] + } } ``` +``` + For future usage, we can extend that with different credentials types. Example: ```json @@ -171,3 +207,79 @@ For future usage, we can extend that with different credentials types. Example: "values": ["profile1", "profile2"] } ``` + + + + +## Status +The `status` object contains the following attributes: + +| Attribute | Type | Required | Description | +| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | +| **`status`** | `number` | yes | Status of the asset (see above) | +| **`isListed`** | `boolean` | no | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | + +```json +{ + {...}, + "status": { + "status": 0, + "isListed": true, + "isOrderDisabled": false + } +``` +## Files + +The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls + +Each `file` object has the following attributes, with the details necessary to consume and validate the data. + +| Attribute | Required | Description | +| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`contentType`** |**Yes** | File format. | +| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | +| **`name`** | No | File name. | +| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | No | Size of the file in bytes. | +| **`encoding`** | No | File encoding (e.g. UTF-8). | +| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. + +Exanple: + +```json +{ + {..}, + files:{ + "files": [ + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + } +} +``` + +## Event +The `event` section contains informations about the latest transaction that created or update the ddo +This section is auto-completed by aquarius. + +```json +{ + {...}, + "event": { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1, + } +``` From 1ac817e813be8fb48f8cd2ff92cd0e9984c27f78 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Mon, 4 Oct 2021 03:54:02 -0700 Subject: [PATCH 009/186] fixes --- content/concepts/did-ddo.md | 79 ++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 15 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 3620f097..39146d3b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -30,7 +30,7 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - The DDO is stored on-chain. - It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) -- Each DID has a state, which is held by the NFT Contract (also stored in the DDO.status.status). The possible states are: +- Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: * 0 = active * 1 = end-of-life * 2 = deprecated (by another asset) @@ -43,7 +43,7 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" is the address of the ERC721 contract that represents that asset. +where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -54,17 +54,17 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO has these standard attributes: - `@context` = array, contexts used for validation -- `id` = string, address of ERC721 contract +- `id` = string, computed as sha256(address of ERC721 contract + chainId) - `created` = updated by aquarius, contains the date of publishing (block.timestamp) - `updated` = updated by aquarius, contains the date of the update (block.timestamp) -- `proof` = proof of ownership +- `proof` = proof of ownership, optional In Ocean, the DDO also has: - `version` - stores version information (`v4` for us) - `metadata` - stores metadata information [Metadata](#metadata) -- `service` - stores an array of services [Service](#service) +- `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) @@ -83,7 +83,7 @@ The object has the following attributes. | **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`inLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| | **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | @@ -97,9 +97,8 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | ------------------- | ----------------------| ----------- |--------------------------------------------------- | | **`language`** | `string` | no | Language used to implement the software | -| **`format`** | `string` | no | Packaging format of the software. | | **`version`** | `string` | no | Version of the software. | -| **`container`** | `Object` | yes | Object describing the Docker container image. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | The `container` object has the following attributes: @@ -114,15 +113,17 @@ The `container` object has the following attributes: -## Service +## Services | Attribute | Type | Required | Description | | ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`serviceEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. | -| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds.| +| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | Depending on the service type, the following attributes are applied: @@ -136,7 +137,7 @@ An asset with a service of type `compute` has the following additional attribute | **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | | **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | | **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `Objects` | yes | If Empty , then any published algo is allowed. (see below) | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -156,6 +157,54 @@ To produce containerSectionChecksum: sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) ``` +Example: +```json + + +{ + {...}, + "services":[ + { + "type":"access", + "name":"Download service", + "description":"Download service", + "datatokenAddress":"0x123", + "providerEndpoint":"https://myprovider", + "timeout":0 + }, + { + "type":"compute", + "name":"Compute service", + "description":"Compute service", + "datatokenAddress":"0x124", + "providerEndpoint":"https://myprovider", + "timeout":0, + "privacy":{ + "allowRawAlgorithm":false, + "allowNetworkAccess":true, + "publisherTrustedAlgorithmPublishers":[ + "0x234", + "0x235" + ], + "publisherTrustedAlgorithms":[ + { + "did":"did:op:123", + "filesChecksum":"100", + "containerSectionChecksum":"200" + }, + { + "did":"did:op:124", + "filesChecksum":"110", + "containerSectionChecksum":"210" + } + ] + } + } + ] +} + +``` + ## Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. From b28951f3672a7e9b48a6fc96cd162eebbf7687c8 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Mon, 4 Oct 2021 04:28:05 -0700 Subject: [PATCH 010/186] fix lint --- content/concepts/did-ddo.md | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 39146d3b..fdeb70f9 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -31,10 +31,10 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - The DDO is stored on-chain. - It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) - Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - * 0 = active - * 1 = end-of-life - * 2 = deprecated (by another asset) - * 3 = revoked by publisher + - 0 = active + - 1 = end-of-life + - 2 = deprecated (by another asset) + - 3 = revoked by publisher ## DID Structure @@ -43,6 +43,7 @@ In Ocean, a DID is a string that looks like: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` + where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -72,6 +73,7 @@ In Ocean, the DDO also has: ## Metadata + The object has the following attributes. | Attribute | Type | Required | Description | @@ -148,18 +150,20 @@ The `publisherTrustedAlgorithms ` is an array of objects with the following stru | **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | To produce filesChecksum: -``` + +```js sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) ``` To produce containerSectionChecksum: -``` + +```js sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) ``` Example: -```json +```json { {...}, @@ -246,7 +250,6 @@ Here's an example object with both `"allow"` and `"deny"` entries. } ``` -``` For future usage, we can extend that with different credentials types. Example: @@ -261,6 +264,7 @@ For future usage, we can extend that with different credentials types. Example: ## Status + The `status` object contains the following attributes: | Attribute | Type | Required | Description | @@ -278,6 +282,7 @@ The `status` object contains the following attributes: "isOrderDisabled": false } ``` + ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -317,6 +322,7 @@ Exanple: ``` ## Event + The `event` section contains informations about the latest transaction that created or update the ddo This section is auto-completed by aquarius. From 3f6069fb0ff433be10e162fee3f083a2fd1409c5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 5 Oct 2021 03:42:12 -0700 Subject: [PATCH 012/186] add ddo flow --- content/concepts/did-ddo.md | 22 ++++++++++++++++++++++ content/concepts/images/DDO_flow.png | Bin 0 -> 69347 bytes 2 files changed, 22 insertions(+) create mode 100644 content/concepts/images/DDO_flow.png diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fdeb70f9..57133d29 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -36,6 +36,28 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - 2 = deprecated (by another asset) - 3 = revoked by publisher +Here is the complete flow: + +```text +title DDO flow + +User(Ocean library) -> User(Ocean library): Prepare DDO +User(Ocean library) -> Provider: encrypt DDO +Provider -> User(Ocean library): encryptedDDO +User(Ocean library) -> ERC721 contract: publish encryptedDDO +Aquarius <-> ERC721 contract: monitors ERC721 contract and gets MetdadataCreated Event (contains encryptedDDO) +Aquarius -> ERC721 contract: calls getMetaData() +Aquarius -> Provider: decrypt encryptedDDO, signed request using Aquarius's private key +Provider -> ERC721 contract: checks state using getMetaData() +Provider -> Provider: depending on metadataState (expired,retired) and aquarius address, validates the request +Provider -> Aquarius: DDO +Aquarius -> Aquarius : validate DDO +Aquarius -> Aquarius : cache DDO +``` + +![DDO_flow](images/DDO_flow.png) + + ## DID Structure In Ocean, a DID is a string that looks like: diff --git a/content/concepts/images/DDO_flow.png b/content/concepts/images/DDO_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fe3790f8919567b954fa50c8f0b91b1f3fab42 GIT binary patch literal 69347 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 Date: Tue, 5 Oct 2021 03:46:19 -0700 Subject: [PATCH 013/186] more details on state --- content/concepts/did-ddo.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 57133d29..ef18e425 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -26,16 +26,20 @@ DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) d - There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. - A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. -## Flow for publishing / retrieving DDOs +## State -- The DDO is stored on-chain. -- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider and you will might get the clear text ddo (depends on access rights, state, etc) - Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - 0 = active - 1 = end-of-life - 2 = deprecated (by another asset) - 3 = revoked by publisher + +## Flow for publishing / retrieving DDOs + +- The DDO is stored on-chain. +- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider. + Here is the complete flow: ```text @@ -291,7 +295,7 @@ The `status` object contains the following attributes: | Attribute | Type | Required | Description | | ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`status`** | `number` | yes | Status of the asset (see above) | +| **`state`** | `number` | yes | State of the asset (see [State](#state) ) | | **`isListed`** | `boolean` | no | If this asset should be displayed | | **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | From a5351ef7fdf0efd4bd9bf5fb9c9add6cbb5cf758 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 04:37:25 -0700 Subject: [PATCH 014/186] update --- content/concepts/did-ddo.md | 132 ++++++++++++++++++++++++++++++++++-- 1 file changed, 125 insertions(+), 7 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ef18e425..c87e8fd8 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -78,24 +78,30 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene ## DDO Attributes -A DDO has these standard attributes: +A DDO has these standard attributes (required): - `@context` = array, contexts used for validation - `id` = string, computed as sha256(address of ERC721 contract + chainId) -- `created` = updated by aquarius, contains the date of publishing (block.timestamp) -- `updated` = updated by aquarius, contains the date of the update (block.timestamp) +- `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 +- `updated` = contains the date of last update, ISO Date Time Format - `proof` = proof of ownership, optional In Ocean, the DDO also has: -- `version` - stores version information (`v4` for us) +- `version` - string, stores version information (example: `v4.0.0`) +- `chainId` - integer, stores chainId of the network used - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) + + +In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: + - `event` - stores the last event information [Event](#event) +- `stats` - stores several fields for statistics [Stats](#stats) ## Metadata @@ -106,7 +112,7 @@ The object has the following attributes. | ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| | **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | +| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | | **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | | **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | @@ -261,8 +267,7 @@ Here's an example object with both `"allow"` and `"deny"` entries. "0x456" ] } - ] - }, + ], "deny":[ { "type":"address", @@ -364,3 +369,116 @@ This section is auto-completed by aquarius. "chainId": 1, } ``` + +## Stats + +The `stats` section contains different statics fields +This section is auto-completed by aquarius. + +```json +{ + {...}, + "stats": { + "consumes":4 + } +``` + + +## DDO Hash +In order to ensure the integrity, a hash is computed for each DDO, following the next steps: + + - remove `event` object from root (if exists) + - remove `stats` object from root (if exists) + - hash = sha256(JSON.stringify(DDO)) + + The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: + ``` + event MetadataCreated( + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes hash, + string metaDataDecryptorAddress, + uint256 timestamp, + uint256 blockNumber + ); + event MetadataUpdated( + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes hash, + string metaDataDecryptorAddress, + uint256 timestamp, + uint256 blockNumber + ); +``` + +Aquarius should always chech the hash after data is decrypted(provider api called), in order to ensure ddo integrity. + + +## Full DDO Example: +``` +{ + "@context": ["https://w3id.org/did/v1"], + "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "version": "v4.0.0", + "chainId": 1, + "metadata":{ + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms", + }, + files:{ + "files": [ + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + }, + "services":[ + { + "type":"access", + "name":"Download service", + "description":"Download service", + "datatokenAddress":"0x123", + "providerEndpoint":"https://myprovider", + "timeout":0 + } + ], + "credentials":{ + "allow":[ + { + "type":"address", + "values":[ + "0x123", + "0x456" + ] + } + ], + "deny":[ + { + "type":"address", + "values":[ + "0x2222", + "0x333" + ] + } + ] + }, + "status": { + "status": 0, + "isListed": true, + "isOrderDisabled": false + } +} +``` From 5ca7156e475bf62662fb51f442cfbe0ea954fc56 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 05:59:17 -0700 Subject: [PATCH 015/186] update events --- content/concepts/did-ddo.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c87e8fd8..4e7e6725 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -399,19 +399,18 @@ In order to ensure the integrity, a hash is computed for each DDO, following the string decryptorUrl, bytes flags, bytes data, - bytes hash, - string metaDataDecryptorAddress, + bytes metaDataHash, uint256 timestamp, uint256 blockNumber ); - event MetadataUpdated( + +event MetadataUpdated( address indexed updatedBy, uint8 state, string decryptorUrl, bytes flags, bytes data, - bytes hash, - string metaDataDecryptorAddress, + bytes metaDataHash, uint256 timestamp, uint256 blockNumber ); From 08925a8e53e0a23f269fed47dd52ede8fdf9ba62 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sat, 9 Oct 2021 06:03:02 -0700 Subject: [PATCH 016/186] fix lint --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4e7e6725..1ec28db6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -385,6 +385,7 @@ This section is auto-completed by aquarius. ## DDO Hash + In order to ensure the integrity, a hash is computed for each DDO, following the next steps: - remove `event` object from root (if exists) @@ -392,7 +393,8 @@ In order to ensure the integrity, a hash is computed for each DDO, following the - hash = sha256(JSON.stringify(DDO)) The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: - ``` + + ```solidity event MetadataCreated( address indexed createdBy, uint8 state, @@ -420,7 +422,8 @@ Aquarius should always chech the hash after data is decrypted(provider api calle ## Full DDO Example: -``` + +```json { "@context": ["https://w3id.org/did/v1"], "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", From 12cefa23ff1f0f5f7c166d818aaed36c29cd3390 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 17:48:40 +0200 Subject: [PATCH 017/186] Issue-#701: Update v4 related doc --- content/concepts/images/use-case-1.PNG | Bin 0 -> 34049 bytes content/concepts/images/use-case-2.PNG | Bin 0 -> 49288 bytes content/concepts/images/v4-nft-1.PNG | Bin 40446 -> 0 bytes content/concepts/{v4-nft.md => nft.md} | 14 +++++++++++--- content/concepts/{v4-roles.md => roles.md} | 0 data/sidebars/concepts.yml | 11 ++++------- 6 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 content/concepts/images/use-case-1.PNG create mode 100644 content/concepts/images/use-case-2.PNG delete mode 100644 content/concepts/images/v4-nft-1.PNG rename content/concepts/{v4-nft.md => nft.md} (83%) rename content/concepts/{v4-roles.md => roles.md} (100%) diff --git a/content/concepts/images/use-case-1.PNG b/content/concepts/images/use-case-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2703a81d5594eb76f93bab34a2868ace2b36bab5 GIT binary patch literal 34049 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%0DUnx(jaRdx&GtYM@(c^pH~sT-cYXdW5RKiR9^G+ z!*KDsnx3@2bK$oEpu-eH3R_w0Y!jn zi*W+Za;hLCUU#bAY!bS<$Ij!`nH-!4`eF>M(Dml1d4uHriE^a*2#=Tc$w|@UH=Mr+ z9JxCkB;h<=lOdOcVwL=Pe26~l=p;}S(Carvd^92w2_=kDQ`5&Y^RmEt{$4GQ| z8p|u+&OWe(bEzTBNu-LiXwh)pyXggvIU@@GgsUU7@8%XOIoo;c1&w@tv%Z;A-O@W5 z(rUP`7*~Qk3Rvhul}xz5B>0X!pwJw(`vR~}St_AM%bUuMGD21Ehb(h3WZv7^b2!e&!b-S;@1gC+6$X^V!weH4`QaQbE46IH|fOonakAbXKEYqWcW&wFNu z?37OHr$5#K`B9D6CjV?@h)y!8d41(U6)934?YtH4J3w0ZLm4N17p(L<4qNII$GH+H z@%O-~@*C*i4X1>zP194P>Opa>5fMn1N8z2~f}5g&e|KG+Xu0}KgX^1Bdo*=`^EgMg zo|7^>++;7C|0An`?$t@F?)ao3@r(Kcd8e7S(YckFygIb~A8?XM6ynU%#okHa(+bcf?vF%f&SSwT}$piKeEyyk&Em6Q zLk(^kTu|4la2>nmRqc@{;U^PqksvvZ-t`)e2yMoRjUCzj5fP4LF=inrKksYtrg_j&4`_qVU&RA1!YH=0~4x@cs1!}Riz0c*M6LUnSL^?sBJl)I zMS@XRBapg0_bx2&hjU(9t~a`eplug8c7RT56B}wyz;`Y1ZMFt?C@7vrpWG#$uaCgE z^%Y-w@4Xbf-^kSuo5KOVE(MV&WS`YhvX3WfG<=MOC29Abdvq>SG-A&J^Wa0|pdZRR zjeAwW|Lx0>)<38Tok&4vCNLWMz3%kcDzlogFrNN0zGFJvE7|DIGu(wuzG(6;*LyS- z@&em@EF=6C{(36sQn5}$@ElQmrB#-slI$+e6#aD28|^1~Uu{?u#C%2q z0@9bVtPa?(nyc3%@0dFLDCnEI2ywJ}VPv_X?C5jUXkW_w!51(}%EKi>Y-4ycHpGvQ z+oKCpKCmjXD6&6gWC`fSf;DmQB(|Z+-{UP~UP4FuYjCPuh6uX9jke7HO|AFJN_yZkHHxy=D>&4Obc|Y zIfTTHBpac8c*HK=Gs9Y)1>{5;lsOZbO_LnC9_`~{JHBDD!)tv$FAPuj^c1VYPnAE%W5< z52ioCDNHiq;(&dVChNPAC9MXv&cFVsdZ#L{VEbSSC$6izZ`vs46c3rB%-O_+qb7o8 zxKX*5aSfJc=-mfqwNHCK@b|PMk^J@U?%<2IU=AV9=f4rcb%P@<20~rU8AnqNag+7) zHZuB)!sgy%OnuY5cGYGMwLX>FqqBQxZ9{;W^*roF0 zS3wHkwqR7N2iwzi64Dvs9pOgiIv>hEs}zcNsOlGZKFdaXXjFIb59F@s)#kb-4y6*< zFZ05txevDaiCW9OoiUe++&$oxOsM0CR*<(XP$(brLzajvPGC%Eme}%`yRc~nI1A>T zImS!pS>`COc%FFT8P`&ZhYaqgjxi3XDZT2uM63LY*fig44M(x9ZP$BL6UCC8*u>{F?+{P~rJ(xV%A@SLx9gl5Ib{4Q7&{e+8 zTulwltfqO$jri;(DRW`V;B@~j&M0%SI*rOJw|C4o7O=x#gY1i<3aS|T<3eYxe{I|) zBYjNjp4xU#8#-Pv9(U&LJjQcxAi&5Q*h+BJnz5oz7O~<+ z_QM-V-rQC@;pBo)@29sj1M%U7P~hT(4@3G_#IVL{YPgCJ!h4d zvJR-(d9?zM4;w#njEpnmNy>7w8^2 zsSRzYfgO*(n_kkFQ}jApqv{F6J9gx#C3tMt-NyBYmDr;DqboM9Dv7_OEN^_|Y~tyh z%c;?}uL>@}4s)*S58tzxqJO<#c?Y6DGVv^Iy~DlFZ_Y!xoC@w-e1ij88HSR1 ztL6WEDm^uYXc5|HyweNG{LC;neSW$dbJs5>KYVg0A0wV7=9j!mNZWF|+N+qDV3+NMqd>Zc0 zk_sjyY@>zRSf?|GfkYHn&p@?V8!a*K(urRZK3F8WN5Ntr#cS}$$ESz*Po7{uRuo-4f#D`ch3^&Y{~1syAI?n zfj$P{di89)*G*>cXPWJ9aePEG6j`m{qi*#K`$?Oz|B93dfm&)&s;d%)1JcO|phD<> z9XA&~*&d|5BK1c5a%VvTivgRJR4iN#%jDfp+3()6-F-6<@J8^>|JrYE#D(6~Cy`?` zBNNNuTs_c$?4ZPvIbEn}!G`YsYQ|LSuIT?>?dWfzoylCm5p#UMd>3d|W@ zt}JL(zQX!IC(!#tG;3q{qGjle@U>N-2K*2n|GECZ^q0907TVlJ&}!&LQh*H1{5T~f z;k!&WtpEnNO@3Z~mL%7yqF(`OWN!%OixN;a;#c(i>iMT>?KWq?LOvi`;o&VOq*4Fz zz&Z~<6=xpdS3Mz6wnc)Vir&$~b%UtYg?=>)mZUw(!T#dWvHpDXNH!__7ylV$N`O?s zx-2cA6WP%!_qjWX!kCu-Hf-}KS9TuHSZj^+BkqkzPSno6{I@4Ar0C8|b6Zoi*VbAq zBpx_B6X~@}I6=JUeXq`JpJzi>`{++y=Xb}E9m!Y}o9^xJ=URZeFGHaL-C10B;2rgo z6D*p5NBOA`wEY}GZ2%SykU2u_Tk(A${n#Sw0bcX(f>_UriJYpU+US=mZ(k!Nz{ce# zh%NFw436#3&mV{hSO?uE)sPkAHD3CrIatjF6tcSylq}HOk}Vk;Y>He{Z=D z8IXhNBe85C>&-t+Qpug#@*@UPZ9XrLdn#WbKl;?v=g+o`-&7O+fvui5TAsp&zaU?| z6EUA&JfE6vY$CQ(>jYHM9s~U5=f+B(g^2bfd1EPHS?A>`L0(0{ds{7r(HcnQ3qj2y z@yTLeMH*^aJY?WM@`I4-F=u>o_b=!k?bUwNo4-}R9fF6yB8UYKSo#_M5seOInuH)~ zd;Aa6()AH=nbeZ)cU7?G@n)4R9z`&mEG5FI>X_x)0VM{fb-% z3jRz6Xz%22M~vhajRLEfpEGzjQ(pV{U90fYTF+~B4?{}KiTv_)S8l6KC$YuQ`7V!i z(0#uDdfeWfO(}?b?Eg4Kvsy_IM;L~P5tyfMS1ws0M20qP2}+e0wuJv(C{PptT#YBg zmyFWQdTWw(UYhSCTnR)~tmEhvj>(ExRN9(I<3ef=&1i5y`+lwei~osaZMvoTAW(32 z16#O&qfV8#;f6j#x*#918xdDt2paE%E__i?lvuR?tnh^4&IvWjWf%eqRXK z^o=%VB!plBD4Y=nNvpvf>f_W=U@1j*O;P2Y>{gou^ALUtS&#!Ji7rL{Nh1+;j>W{bvyfK*f1<)pnju9lZ!W zPj?@z4)7}S7^(at_|B*OS$%+t<9|R&Dfq6G;I>;H| zC2o^ivY_9Iz3_SHrd`Zo4RNo&Zfv@$*tB`#J%Z6r)l@?`r`9>p?TlZ+PYw!!!N%Or z2`CvPs{|B#s)I*&I{bKeEuO1SnF(@Ky*l6J^PN9-z(c~jRTB4U^=gB%hOMRZyu?-_ zSv%?1#p?(x+<5vmGHdI1C#rm5X?N)FLf@sKKfH1qEKI}GN0Hz^Mgqp5@{%T^p;i@N zqONF0eX6^`J;A}K2{VN2)9&AcoMLf{9XO|Z)VoAZ-Th}`=`**9N4ielEkFZAesz{@ z4R1^>ZF-4rUhZ}cwV4Yul)8A*JK4vp`-C5$)&_)Ecc;$UK92IZ)M6|@mKn1rmX`mB zNf-}6_D#jZtafg^@^-*4V;qRThC^r-GpT>1<0yji*Cp)NiEEL4R*fAsVY5?TWHR#v zQgn`b*Hw*f7Kls))6*J5v~9&3f{Cwd@{_n3QxQn^-G#PS=sxh-o`+w5mn7q3es;0A zUdY8~f0%VJ57&7D1Id1KFYD8gKW1s5J$z{qWkAe^D%CV^D`Z2>(|oI<-|gna@M+0^ zhp8fmjw7&2-_=$#c^<-_M`0(rbjb(W$~1;O5plj(6&p7rk3HC#7XmlUsT44;}43OgU%O-f~r|4)poh?OQ6JkE6so#~{Y!y=T8D$vaoO!e?U0nSs~y zb=txp4^r?^3z3hU-|3VmE5evON;^|V0-tbN0l8|cSNq}LHc67MmvUlu)6IL|dg!}( zMZho3$;_P?`Sb}E;bA>LF?fzr>*Hp03?o;}Px$doeh-z7(nD`fh>pO$C4Abnu*`Aq z{0{XZ=bp?p)M3v!9Ec#X2lcze0>s;Wd2{i`qN2vGUCh#I>59L_#G?uSmb?CK*lN`% zoH9q*i|!VIrqhDNR<2Bcm#T$=-9QTnu1(k!5v%i4*T;Kgb2xbLA@p=CgtMg+K`nZo zcwH=xx2fC{oH9JI>gb`B_dG*oa>iSBDkd|ws>2p3y!^@}^@I7`=ldC?ng-lG{5iK2 zOEhzn5|*In2*%YKWkT6_%6^BNo_I zAF-^5C!Q9#QKYHidEODZgdPpBD+eK9e!54J$MF$N>`So3vxpyJlFJW>^DS>+2jG{7Y? zIq18Xf`cYRTN-7p#AIXpr=53bYf4lJHw@K?upJe&8|qvhI)4bj(A6Xh)ss3Gs^f6nAs$D;qQPKG+eytS!*+{$w zVwJ*st>vyw!K*!yB`7_~!|J-e^JG*&PSB2qmt~Kgli!VR^3KFrzh$z?Ighu)amqx4 zEdSI!l}I1GU8ANa-ky0{Vl(eQ5~<$?Om^8#@HHLar3s6aNsQpcpwJ!XNm`I?@CdA{ zyAp6vwPRfeu1uj0NuId_|LeU1x(7JGF$tRcGsYDvR?AitYQ=@#b3XlqUEdnKN($(E zk9plF-qG|Gm9ll$EoKccmy+i0;Yn9Hib!ggG5F#=rBtN~K_^C@AfdJB3=-C^tF)kC^1!wBg zxBrgfe!bQWKhUKg1Tx?Ip8>0E<;X=tZro~qk2Hv@<1$7YLZb!V*QuP8S&Ou**4g{v z-aRPZUauhGxD1Y-div>Bx&Bi0>ZGsWg_-#B8a{*aUFo-L9c4acio{cVFRlEu&MhxOz7YAGpp(&R`5l_i*t+v^SUdQYN#5?qrD^2Q}Ls28i6Xk zf;*(7lrVRh>yI~EOsn{;hO#`f>~o~9>+d9P2t}=jH~nDFS58yEHnoU*RIQ6@1Z4Sq zf@w{-wlTY#D`vt^R`u+EQ1(;3rV^L$rM|pD2Evh$*elEf{;usS0u*sVBfB8Pe^K~G zN7#hYOiC2dmY{=O4MAm1mqx_!$z6J{%T*BAtTMf^-8#Ybaebjwh+o&fqFTX&<6LK1 z)8v zAXTMG2_hww5EMi}1Pl;50Sih;U!+L~X#znM2mull3DKbRCfz^?5CQ2B2>d4K_kDX` z=eN(ku5+IMNOUqY&&-;&?)zSAlB5&eD!xF<_O^aW*ysck_U`KKtmp52x!-W%6{{7g z*GJ=|2q(QB!3=Vvvt^&jXxqrWTdbEu*Ov=4ifby?L?o9DjDbCs;I?kv7ljJ|@=GTq))T;Zlqt`O5j=by9iS z^5dzJjnMw|Zpp?{ji96Cx%#DuQ4Rd4BHX#%OSEebMFYG?rF8EMl7}dM^WFh^h7ITK zGo+v*+_?I3uRUoRH;lwrYd|B7#uraVKp(?YhI#MfBd^Sj4IiYaN3;r6pWxF;Kz=^b zRn+7Edcv-ql(W&PX5;Jp{Y|2bOvTl?Y^|}Fpu5Iqj@6R~R&bOh&ZgT$-)ZlyB;WVE z_cUr>gbhT)Q0=2f7)MaTRKs2#uFJd%B^t70eRezE$S0frWI|%rr8ryKCd)3Qr7DP* zsWOW^DP-+6{LozA&#?jhSgk%}u2F}!XKnRphKB7C%NlRjZTC0pd=2s`K}e;$tyh$~ zMMwS3yG7Os#(UabiqVQ9i;6(~rC!O%I|Wk9G8sq7QuX%X76Mt-it6OKRgJNBbl)N8 z6kaUKSg6J6Ymt(sI?FpHbUw=M$6QwbWSLbIo!L+;Y;>D2BLAA@=j{A+=?G8~q#Z7@o6p3r2Y4~u&b8!MZ|demlrpa@MWJs5AY@6#f_I45kJ>gE?{4&_e|31xdJ`CQ@rH$z&Rk&eOXQ62;}^<= z7X?y1pTvx4!l-qVcEOYzeR70wv`1fRSFQjtt0#F2|Cf!%{KZLiA;>dxFaKiElI9d4 z2@Tio%X|#_u#(%Hg^&Nt7vc2_(}zOEV>3;dQ%J0WPYa-7lt!N8>>-_?8Rv%WhtK+%pS3lfwIz6bF>-pP2_w+M!Qesf=j%7 z&ojfU5p#LRXygTg7%yA^=6@>O>(tLs zs?~_hzIefYXy8@L*F{5k`64dk8#Ed3;lq6u*U94Jxs`>osrj1+y3E`ll098N(B$@| zFoh9>O4rHmPl`dBa~^baE5|P5NzZY`%YifF?YU?p232v!r^cicqK0&SWe&{$*o|ZN z5}ONqTjouYnhSkdUj8%UF<8U6Wu3t?J>%LWcgckHa2T*-#;*bXytS^%^&Fh4ZUe7T z&+12y8cl5B8wFmtHHO!Z@`w5r+ey9ibcz~#U}?3280Zyo62C zO3PkSeWM(NdB}63B`!9$;)HqAr1sUS*J~9TOUA-xd5i=N2Qeg%b8(eB<>E^96@R`J zr9v-iWqtN(!fgxPMy7bo#?2i$aYoSF{#gg&OXE}te??J@t6;6>(6Yjsuz-_3o~TW? z9Cx`R!yI6`pb8Y{6xW_+Ru=}2ZUhz!wfL=BPP2*w#8WC)?cTXUOT+|-*q^+VA(}Q=JSZ6A=GAk* z{ZGWco~tMiF=G3d(^y`0t5+Eh(hG0!6i&E2+mrU>Ii^Up@UzF3SPaHmEPq;WPp)wg z=%2)=$+Yh2aOzjg1(rNEa$Spj#clMLm#7vxjAeIHqRs-__nc8@;h0#W(kZiqZ$6WZ zX_ECBsLmQRR9~)$iDTULpg&~f`A;c|sgxA4UczTAl3`%KsbMEC(MFSo4hE`Nrv+dm zTjCJGz&$s?tC`<(F@W;Qm{{drUx@iRfPe2hk@bv?L49z_HbMsfdJK`8X4r1|v%>>B zJG<-ys*vyi)oSx+oB7?}J;+9%9yRhG?=SdP(rEZVO-ZNIebS=zx}5m{L@lsN=)R9V zA#A-#rl#1yg#0BA8maM&%M9E6Vx;w9>BWr0{C{6IRSzYlM9W-T)0Yx62#(j05aTm? zq-U2kQ*S1W$Vi>6H$uG{;5-MN>N~k3$E)nC+-xs0R9|S)r?y~|N9+o)8e`o=MWsX;cLvsb0LzYuF$vcavc=CO{Tgwi~T zA4zKQ*3*#_id9>8@YR*d<}bip@rFubn=^Fp8|l?}wm1hx)0i3sKfR~nLo)j1Z`kvq zcnh`l@K9jpYU?vK)4JJn?}&@3F*DH{WNl?w`MW*)s3pW_I#NB^O-1QnRnMe3U{pOs=h?)A9!< z>tpXii+b$sXgO8-dZg{f&QHf3nZv)nxnn$~e(KvY+qqGYZy0`N#>N=5X>)RMEf5%s zx%KnamV{ZbwDFs;*5cd#_R)DISMh?}Pth(J>jU(NVbAiRzFNgt#)+r5 zkIGkj{|FVhyCra|_g+66Vx?C0yD`2jt`;}X0_kvFC4;e&n~1c!KTuV6oUkhj8ZEHG zG_Zjs$@UPJO5DxPl#hoBAjPm%)QF$o?pYWrPzE@8U7k88Skawi?spotv^Zbjba7=i zvWzhEarckPTevKVLP0?y+3H!VhIMz|MJwKL_l{vUm;_L+d4&&(7kJ%owuZinSfC|& z@A9e^-U^4Ni)pdb*?TKpt;_Cyd&Pz+&b_i2&{==4zW$!t=TiDj&9M&PE7}Ajec9eF zdvE^%*aSh(fA{;D(2s;{fhGAhRn>OeseN%E=RY><@QU4FHJTp2h%~6jw4|$=VW$Dc zdZoj6sxY6a26DXtOv%3jS??uBKv)wx-xbDm%&i92g)gIL^`{n#l$x~akvr=I+Dp}s z5&BO;KXmc0<=Z~Gr)8zxC)=tHDhC`a8DX69z1%hw?ktJH$+pH-)h%^f1Hk9Q)O&!u zQpZ!=v1~vrC%m$sahVB>yy`=tTqsAD71TDT;nfTmOnuFI+G7%wK&^5r1{=c`(ys z7)ddKG<yB5x-i>v&p(PI!|-jQ<|+)e6c0D zjXrgJS3tZ9G%u9mB%q_K>yl-F;)Od@1nj=zC+?={R~1yYdHG?Mnn{46*PqX{;!DG(%q9b?G^e>?4DdMj!46EE5cFn?mNbza6JLyHMS=u6eM(lpc zK3+H~^=!WM>33#NDN)(hlT!~iMFMJ6DYm1F1)K~UDPGU-4HN=DkNbt59%x#IJVskygDU{kRkfL_AC502TC-6XF}k3 z%e{@{_o+@XPG3_a76*LI?ckgI-6Af^=^Hc{xt7v1x>c=MIKdwy2tC$*!SnT!DMGe( z(nm^XDWauW5@{8?IA>$@S5kQ`tiK@8Or(4-O8rD&wss`6z)eDJ&4F1GDVBXu%rGa; z>ivWC^Crhz?%<;oU)TqP}$G4%HikY&AouYPA77_8evEKDFA|Dr@YC_IUxPhRik;5oLtv!H z*(xxRF}`NOD>rCct1Sn=|$?y(EPXJ6V{<<$?uNbj|dq*q>? zPK5P~`P2wE0y3ltVCNB+T)IuMGuMrrhI!kQp|&dg1Kten=RC{T{3afSVF1}&PgPDM z>B}Alq5p!165ZZ(-SRRxC$cDJMv_-8 z6)=1vvOShUaV}ql$ki~HMQi&ZbFmoBim8`YX%77|RElxZ zmiF{WsM4em%bPGpSLuX!kiGL*)KwVdo2!>F5a$D2f1ZtbL+{Iu!6v-AWvFr1zT*bL zp7ldeznMqT4if5k6FZ@-NU7$S+&J#DgcAW*X>S5s4&=R7Q0K6qfHTP!5inf=NGT2u zO;9|?zD+4|bUKVYbR3fJtTL2v;*y8X`Qo|vjcwXL^ir}_RJ36W1sZ7c>hhV%RU#Ko z()DpgRKEau=9Nm=^pSRj2)ehpEIudUALUAMH2r~EncMSyd%B*|!qx}&mmJKW5j8;^ zbhP312=Z|gny0+}fat&FBJHO+E!lrtHJtgYY!m z4lB=#p)#zG>W5QpB0VB(6}tIja^xcN&(V&Mr$ypi5XGz9q~lO}V>|bkdAJa%qSejJ zF~=(+1;+JPeB#0P=53GCC~vLDy(JCY;+7*PKu=BY#Zj-YciMy7K!`)b97T#Dc)KKH(;w$vuUO6iG*vcJpi6*yq6w zwsqp@o14gqcb z`v(xJWBKO}E>&-MR0Un0>XX5hM=;KubO(hno=>Hh+Zxo!PvPcoDjv_e6t=#DTh?PV zZm8aB;z`$j;n6&3Y5mKLvR0T@xf}NolPVZ4du}vYB}c_h1?0D3kJx@Fn;FcMA3G~A ziVy$85IJ#DF(DS3`me1Y=pS{_))R$aGtV2I*Vpn(9eh90WjmTIM=Px=Q^~6H$hSjG zQZ=tuJ7|j`FbCpReJq`8VJMrvaBssCuX#kb2h7oWyn)5>!Xoj8p;pO;bh-m~IsbCD z+me-^){i2-ttysw+-}sh6E;~2Ab>Nrxp`F>SLeI)s+%RQz?JeT_E_f+;a%yezncna zW>dr;9`5?ho!@%y+oh&vzl(#O6aKacTm6PjpNIHP<|an;*aj1}Suyb9a)lHIy-aA2 zt{US&#T+)P1~MkpRt7wc%21K8AXtbu><0mOW8kOs|)KX_|{J?ntZlEl``{NMP=?NP5UPfLB@p^iCZvXhkGOkX#dwVv3`T?*{?C1ZbI`6H|NvWw) z8F;!YyJsA?*la1@(-HOUQV%#ye@_Ihe;#`FtOTfT#nIZdxOh`F1hoguI%r)k8bny} z)XmO9lix$X=*tum`B3#QHvhjfwZG~Q%JRZ(gV5mRSOjrF)DRH?L9=WMyZKSoGt|C+ zwaEj8@iMwgByEe?GwpO#0>Jwf1&pmE`|WJYJ^rTwYcviF zAj;f_iFV%JmGf*RNC^A)o)Q99_zy8tw8g4!Obw zJ_q6 zo*ku1*-Q)Fs>UKmOT)mhoksV|_;SxG$|ko@lYMea6}ipF4j{&8xQasriJj1hOMN8D3X}tXuo${%+>>)g?0my3~nVZH6_|Qeutc zpAFtx-;lK3g-#b_Gr}CG*FX$$Oc+^-~_5~M(x9k%R z?sCD4p7X(IHKo~0Mo(pW>Q&y%hSO1f0@Zm_*c$Iugp0zloDH*P5B8pnPz_i%#cpPL z8ZP=!tW?L9nm$=l)dx zy|SH$ujB!X8M-cAsbIx(Ll}+KIa%mglEHeOU0GCWZ@VgFR9XX@xRVQNR5T&DUM&s) zOHP|QlzvXGu*T#iwx1zKV!d8B#;sOid8baL)lE+KF`WR@?ZZA`bJ!fPwJ758w9>*A?MIvJ!^*HOba${!v@093t~GZGwWVU%c6E~L z;1};sPA*m5t`CO3ABqA^q<-~t&d60oInXGTy5T!DCwbvP&>tO;hBkfIdQyOA|H{7Mmgl?eBL<=+f!d4u!;lO3~OAF#{1zY1I*WdC48b$E; z=MfD`v&w~?gT975w)}?V5H~CujWnC;D z)AVFrckOZshP=U;DphG`<`oR5n!6gay6D*VlyI^(rYtz9Hr3pr#`S9{kyBWSo+in6QSf-R0CN`6=%2gT5$uMdy+m9 z_^r;BMtWq+j+JNg@WJVrpe(h7jJ`zA$Rrt&QyJFtCV}~JHP)ROdilhcleqO>dSTz2 z3l8`4sam|`paO42n95$_T|T2VN{N?@K8;eM2)?3WgK!F!T`a1XTJ!mmg%- zGL@WnR=ImPj-uH*H-K>Ko4Q=-q?Ak8LWgFF>oXTJys4Yk!%XvIr7^UyfI~wnpNl^| z);M@HYe!!D7uzM?}@DNLTah__L!9f$BJB=%TBr}#QDZv*+yYK*X@O1f#k4Ph#O$a$se6P zmjq-K5?)Xhjm!U{A8YDzU%Os)G&h=c(rbvKKCN7FsuA6PGmxmQR1(WHqm6%Mjcmqc z7$ZIMHwPCrBt(M-$FTxy>r8pQjAaMSpxkOz)?x>n1Zi5GH$gT!Fs+PLJ5;1i4gF>E z+*T5?Jz?|Fe)JhfLZ%X#(aB1y{IsN}^?oW#NzBmSATY{aIIS+WX7u%RysgSzwU)HH zrdWFH1C^D0ig{{kZcmo+vB@PKW2<;joCvG(Z)TUHF}5*g=S=NFv&Xs4BEK7wFES3s zc1IKz7TOIHgW`*nRX#LZ3Z)hTiX4?GuJRy~T4~b0rxt^XH{CmiT?zWE^ zQR;=dHI0dI$`mBUU*Gc#MJ%&5gei7rRq=}`iQrWRy*r$3UsIdc=rJ}@IPB&W1V}GJ zwIvocXO13?x4(+)$#--27s;JANgY5ZH8RT8(%Pq(Q4U`Hhn#DxH;>H6?yTf7&Fg4j zSOrHju{Oj5J(umf+u9<@@vvrS^cd!{j zqT9`Oe{sxDa=ERcI+GM+v!b2}0TmMdz6do+mtt!MfqTQAh=fx!rFEOk3$fm^o$t}} z-5bbXR}35`eB>e}Za+NyDNQEZm%ugfvTiTFq&37CdRQLe>r}%?>3~ZrBzKsmV7@ z@533>a#wrbs4T&;kejA?vGJQzDhm~vN|bj030&;6`uoi~ugQ{VhERla4#}5t5t&aI zQHx|5`>5?Fp{)ZEHpAsc$^>_@x?c5q=g~6LG&>c1nvN#QG#`ojKDiYdMk!#N0!RJP zplU(R(h~$szZ%iNNK{<_S|MN?SQa(xF4x+At5_KSF>~+3$t!PdFvkyDKi5?0jegAH z1rk|}#~ufXN~W=H`(}^d(tlF$wXNW zX^{CITe?dby$bF3CgYBH3A4W5z#++Z!y|7rx2_C!WQ{&`#8{|Hoa*7(P}x;sOTHwn z;F__1b17C#c1_Z~!#OCmvN?*XgS*}|QweEjkjZ(lsv?!8$4vdX_R;6r9;SJWN#cTg zZtMzIe9<`@WoC&Y)_5i_(GDR#WoT-S#%73MAmQ#EO;7JE4PTbcR7-`r+3O%gpYbDmp)OhcJDoP+<&sTeE zO=TZpXCh$)6Ety;xk)4{|3-xGpIK0LhOs!)%VXR~TeS@db(B2G?DQu00JTJN2CqcwP? zU>A?tZ&;YOnl2yj7Uik-Zvb>vu_w{!i&UX=5NVI z*k@ItcllIYgids}P$a1r?5)l6=EG3&wyzxfjM5fEAJqCvO~usgW%577GY{gj;>8|p z&K>=0J>OY1`A6j#Qw}Pk)py7{e~ekw!Ss66lI9z9EOFYSdU9VHZmw6{05f@6;-x%6 zz2NV)^{Vj)Lf_%U`FP68Prrf%@sh{XTrwHGa(-oQ{>fXkY$@{SZ?)76qkSL#w2Z zWQ@)!76tY+iNT8F>h0F!wNX}s3Ij2VuO8GLTQWLsL@R_HAu}p$J^b=kYjqiabDV=s zY$X!2_ngC~s=smjiycH=PGWSbjC2emeA6a914<^$1_B-wT+QA4s?hIw{xEvi1_%X2ob!#M)wcGHCku-w6th1%3TayRezu*C$8S<} z6xB(_s$DX%a4!^jW^0m&+Hsfmmmj~sN6Z5nBPzH_HGxr z_DEyyCU4KujbZCMpQnG7Z`QNoloJ|J*-jVUlv2#LiV$5!sG!XQ_>N^zk=DNd3BxrI zVe+zWA)0OlU7Fktfh?u;xqD*fW4-zgMdVaPnN{WAxR*aFhNwag9&T~ZsKL8@CX-MI zovxNuL)41iwPlf45t zcF8l^2+7Yto8I)$1UkMW2^0ph{_c=yW1d%%14or!P1}11owp-Jmju&XGO^&jdt9?= z_^}pnawkv7VV(R&(x_MM)12QXQROa|70gpVz{S!-pBtd4AFQ2PUE7L(iHSz7i$0qg zTVyhbhQ>C$PyvyB%SUpJ(^7FUMO3`Z)CwYfCf^sKG#QD291#8_#@$|yUh?rPapEJ> zy1VdLBhP68=k>ticq2_(b%y=W^i+p9x+i~Lzh6{odS6=89Mg0-&o#0@Dx-#&U}i3f z=+4-j%-}atT{5Lv57Q|vWDAD^3^85mXj->JzFUrb(R8yU+?GB)T3mO}UZEg*CQW!g6V7pv04SxYe^>kcW<&D}%krs5h|bAJ`Y;?gNn1DaVTUeCU;v07BAOF>Fwc zx;PjsZ+%8V?yXmMbfH#&jE^Qmf@@bn@{uw7L}t6$)(cCV0p|f`$mPK>C|bZTg2M-u zOyrB^URhY^iWRYd^>t-By9(!R3ce%8{aTQa^@iySGDwX>Ih^DB|h~;bMb|2FkW$UaF*ZX$6EX2U}ipP%*KZg8oaqc zaWrmV{dz{z{P3eC2s>}dJI?44;EAM(Y%ZwFLXR~J09g8mQP3OSd1C_+dSAZaF5DK1aD3z$SMDKQg+E!U(P zEsJZ;UgJXg-Y&cGt+9D#$VOH z>Naaq-7Xz@)COvqS^xN(QmF2I5oXI4{^u@|!m}-^EQNS8BRLLkYtyYCZ z>_f57v_Hw;oGKpsA|^g2`7*O7*e2EQ*T?zQ6qCsM)vt}wBx}g(6`Bce2O#Z))|ow# z_Q4AZq{WLZro>3{;wgyu+1V=l*XuIR(qFi&AkK40X(=Nu%JzkzMq~xZSGZT$!iT0h z$kr-3l7X$k`m&aKijH!e0B?&lu2q)IGeLNjPIF&ctHGe|mkI6P!123ZLxyKmv6gR+ zBvR|FPNsdYDB@ks2RU#E&P&{}p6<2ALi=M6S&Tq7;?%|YVQCVq@;5RMWsRX9&y;&! z0iZ!nfpTD*7U?H7`o_-Y)YWIfVx){Gtbt8d?r`!m5ee7^Zp+)e7hbfmK#onkR+jcw zfq#`OLn!}h`;|DaCw}wHX(Q>Om(iM2KZgjU7hChT5*egQb5S#gH}_9I^s_5d<<94B zyLN5ySGI12;-&exk$A;RQwNvA8zz6+4Ifxaru?J01p8~LgxO2&oUkZxN8gW%Nsbw8 zE5%eK`TYoOH+p14w%8dcdjC+|hYTBoU@zld!Gjw(wT&Mh3ZX~4h#hz~1lY<6CeK1h z<9hGqqabx)#=582lIk<6Kr}A4HwXx+BVy$wWE66QQew~8>dJ{3JR>BV^+MowDs!{ z$uJS|uA#K3QYInyLgFf`%a+dti@zH_EUmtF9o2!WBQzMf64adQ41zq6)(oasn>w=) z(<9q`k@>}KgHb2bjX;sO)rD6C`SI6^DW*G)T|XH-5~oDDaa-QsiByCfGuzJ5CLR zR>zEl_gY)PcSQC`F6+dKNN;Y=ZV_uO13isZR!9jcaCJs|B-&(CuM&M2$P3boEWOh> z^@ne(e$NMZ|9mJK4}R<1--2g46p65bCc9oXvSK&d7~Q2Sa;p}kXUQ(I){9DsOqCx) zl*OBBB^xXC4|naO;Ak1x^k8s@!%m+8l+K)!FR=6+9}2i}H0!TT<@aP)=xQr?4;NzN zI_@rV=ildK!0kT@+-r=UQd#2q;OyN!1oPEP`!l;XY3vNTv+P{e5Y$Ji+JOxqR8p6O z7)Q4BG4!omF4#)%JSy_V!QCjHi_^%L&;HN` zgPQ5S)Ns2zrsgrw9Jt>j7BD>m%HF`da*Y1#hQG#FZ0OmStUP4w!n_vUT0?06Pogdr z&^HdLpZ`B3>w;Ne|71v+_W!?R-5ol|+3j#N9xr{0(|BY_Rnn?gJ%B2C*(3}fj0U&7 zja@!HU~h?kC%tM$EE`Gu(DOt?X_6xc+(EKn24Dn>e1Co1w+)+5 z@N~DRt>33j#lSS*Ru1N0>(lMj0hKp42h4-WU6cUfbg4fmC2xAS__$OC2Ns@`KdFL$ zmmZg{ig%ZF`X|e+OPzW>r22Yzbr}SUqs^`;vP9t8bdCbU2Y0@SKs;Etp<(= z_a-Ej#<)Epd^Xhn;PmH?)Q~bQyPEg{eza_U+(<(3z^hsJ7Dn<)*ls_!T-$=c@VRRG zVh!IiI_}81zU?Un5u{X^QxCtlx(?)<=W`sjUmOew+CpBdfW)#cq5iot zya6W=fh%sV#=6SN#h7drLf|~0XCDr~15~M957uUTwPgDIUlVPib3+kq0~OWtt>@|K z?)bcByNoY{KAz)jp^NmIe^&a?D^LfCmz|YP1?lOclMZ~E8iD+M#Rzg2aOWl3V*F?el@^4tfAl3XnkThDlCJBs#EP7b>me}To|>VGI|qsDH)?j7 z^8mtin~aoqA3_vcV604gE5vS8ET3Jnxr0s~4r z6HGSgziD%Jt4bBwP&){Jqrp2y_$Q^d^>o;V-MTrusK9n#MEu5H*iHBS7I6V6=?wL> z+8ORMR4HDX<3p%%VuW(!fS8qVOFhD_!%s5(>rB|FIKo+a#D)k$YH@?P)73UUU2sw4 zS=?8q_J0yYsf0MpVF}x_*>7XxIAly{4fE8Q9r*a>={a*>(j|%s=72(a@dKsg`Rg4N z8^j6Rom6|qeZTaO_M4kR%+xMmNq#L7N1Qfz*f(xrZy`^-ePNUQsrrIg;{ z^#RKPNrc<}+Xrp3R*kEaVPE^NwPCz|czZQ8_YFeXq;fPs;<7w)ptQ zkY4HA)VFYaM4a0id~-&Ud>uZ~S`9UXx=WIs;FSG>?}-r z38d?5nsfI-renfHlylTV1URVdzON;9mUdvmTq*klUceqC^}3Z319sLo$b?TmH5ihrHJHRQo#&+K$yO2337mMSa^_T)E|E>u`x zFP7f#3D=L$JxA)Y?K1My=1qW!d^YMIG0bO;$X~C`_dEKG_BDtv6r<^EuiSB+v$Pms z6y?){neV!uU4H3qI*X>t8h5N{i^J3*D}e|TsdJ_p49WU`H5BC zvz@8tD379bZONVkaKat_$#j()HU`aLP!Ck%Y4a+{w}sMOVi~y`ownl6g!b#v7Kyq_ z`!nZh&6Zz>t8CubM@%6S-E!H5EdD;}kI@aWc(-^Lsn zu;WyLZJVnB~~>N~mu_PchSWKQDxrCvIE9gLR_#$8k>{PEv&x+<)Ie(=Fm zXCY8EJ>wF7!}dlX;p_eEc%E$+4$9WvKm;vy#TNzZM(GVWFWHFpfZ}OcE-w-zbaNBy zNL61*-%56p18JpZ?p*~68!+#=xS;M zsD!v)_z*XZtCV4zQ|>_~dRTRtt-X<Ne=z(w6c!X|sTKf^>{Gb?4KxytzuOlo1Kts&Ivh zo;Z%ORBzUep0oMkt~ZrH&ov2D--^MwgU02NvfWUMt; ze3q{v2e7)};Ji5iQSp7dEyp-L<4#!W-d25pOOW>ym0Th$1m(D~-1)7_uXLUCAmCQw zZ9khWYelQ>;snqegIqz2SZa4;U?A6QX9PqRyrx0VmdB*q=j?zVC2)%9E z?J3Or{D+&Mi6o$v0>MPj!dGx>40!%d2eMkey3M6h$)1t9dp>TVNUG)SBjKhc$R^vo z;ljpW2XOP{z0IVH^NGJe$!*|$GUyEiZ-_7XszC-%FZX1GY;b%^gg2gVT&ahka{?wN zrv6MBQ(jI4)tcGzK@JXkeV9StX(h&k>VfyOdIBB(m#jt29$B8fEtsK^c+?vo0i9#G zGSO7?$@ti*%nP;lABx5=zl0a3?5TxHW?R59=dtY)F;lr0R4lVpqBcySIo0B@)Dt(< z(vRLCq?H0{dq~0>$W9+G|I53)|6=0h=dYH$CE^DXPefm{6777{v&lWp{jTr|+?Th} zJKuVQke!YlQpO;Ttn7X`Wv;_S)J@TvlgUGL<{dneuFj>g;a zzMqs|3fp~OBF{vsQToHF^jmLlH3Pw{CaP2p)laBLK-Tgl>3t5F4{~Gg9+~;_Nb$#E zQk~DP&g9X;5)ZP?{#Fs-eQXN>ZDl96-v+oFmaSA9U3PmBW~h}X4K0YSmws{z^K{Ue z4=P{;aPBf{!}T5Z=aINaGFMB&ci?ima(0V$%SM;JJKe~N2@%7pu4UHgNiJY_(tmil z1yt{xy%68*r@8Qc$r*CZ5t!O@s;bd{_K+e0SdSJZmoo)9PSLM-;$Y?ZJC(2xbY9A1 zu?M^K*YcN4EYUT)quL7*vtnU>Rj|njB79)f8+HwI3Bd#S0Z1cpBDDF>mpAgc(WO61zL30~rm=Ydu0l%eb%XwlW<1xpZR{l2Wk?-#C~S6%Yn!d2 zmi`(T(@Yim+-2=>8NtKRdhCB!Pwt!W`=e6@Q~4$NqNA@7e-sde%YSWdPLLh%t?_Z+ z7Ur_=Odfnx4a%D-1}yh1oza>iD60{biXpE5@5zn#?nBkyJZ zEeDD2x#ZTfDtt?5yS5hlv%fF@?|l~J=jW#gc-8`q^1qB}G|=0DWeh?=%D!8*KzGcJ stH9G5I0W>`9s_FI^5iHUt+}mTeEcUCt&*}nvcJEs1=GY{yY=Y*0PWg(4FCWD literal 0 HcmV?d00001 diff --git a/content/concepts/images/use-case-2.PNG b/content/concepts/images/use-case-2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..3fa8390516c6e996b8aa9560e5642a26310b0558 GIT binary patch literal 49288 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 DVT%Da literal 0 HcmV?d00001 diff --git a/content/concepts/images/v4-nft-1.PNG b/content/concepts/images/v4-nft-1.PNG deleted file mode 100644 index bf850be6c055fe8a54f7278114bb3f23dbe5fe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40446 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 UhKx@Ro4}uq70!}s{#(p{06!L1(*OVf diff --git a/content/concepts/v4-nft.md b/content/concepts/nft.md similarity index 83% rename from content/concepts/v4-nft.md rename to content/concepts/nft.md index 99c283a8..56afa38a 100644 --- a/content/concepts/v4-nft.md +++ b/content/concepts/nft.md @@ -27,11 +27,19 @@ Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contract ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. -## Use case -Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transefers the digital copy token to Bob's wallet. +## Use case 1 + +Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. -![Image 1](images/v4-nft-1.PNG) +![Image 1](images/use-case-1.PNG) + + +## Use case 2 + +Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. + +![Image 2](images/use-case-2.PNG) ## Other References diff --git a/content/concepts/v4-roles.md b/content/concepts/roles.md similarity index 100% rename from content/concepts/v4-roles.md rename to content/concepts/roles.md diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 3c629645..0edff29b 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,6 +6,10 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ + - title: NFTs + link: /concepts/nft/ + - title: Roles + link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments @@ -25,13 +29,6 @@ - title: DDO Metadata link: /concepts/ddo-metadata/ -- group: NFTs (upcoming v4 release) - items: - - title: Introduction - link: /concepts/v4-nft/ - - title: Roles - link: /concepts/v4-roles/ - - group: Contribute items: - title: Ways to Contribute From fc20ff3d72743c0911647511ae2b05c4150432ea Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 20:58:27 +0200 Subject: [PATCH 018/186] Issue-#701: WIP Architecture diagram --- content/concepts/architecture.md | 2 +- content/concepts/images/architecture.PNG | Bin 0 -> 23963 bytes content/concepts/images/architecture.png | Bin 132456 -> 0 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 content/concepts/images/architecture.PNG delete mode 100644 content/concepts/images/architecture.png diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 8d2e6976..56f250f7 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -7,7 +7,7 @@ description: Simplicity and Interoperability via a Datatokens Core Here is the Ocean architecture. -![Ocean Protocol tools architecture](images/architecture.png) +![Ocean Protocol tools architecture](images/architecture.PNG) Here’s an overview of the figure. diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..757eebd82f9ddc150a85112aba4fbf59403a4dcc GIT binary patch literal 23963 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 IozAEK6KbVm;s5{u literal 0 HcmV?d00001 diff --git a/content/concepts/images/architecture.png b/content/concepts/images/architecture.png deleted file mode 100644 index f479632ee22048899aa64d2f758baef49eef0f9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132456 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


o_FW?X?eaW6+6;$LW>xsCKI$W0O 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�Q(^nlRXg~SZfTaaadItUv8TtP} zi2pA*DuwGCEzyUPl4}ys?EB{Bz)w@IOkraT^Pd1N4|mfma3%2_vx>(WQ$6?D_Z!9? zo;`Ilocez}r6=VU?8t#{ow}@4k`NcOKD4e&0G#Xppr}9q6?N)nLvy?lAoVIE%RHti zA>nhd>bFzcqwm(R9xl#cYsqDz_piADmRS*1ln7Ou>)~+vG^#?Y?FmK1qMgDWuTy`p zaxs87iq3Bk{$wDhx9J{ue>bz<^b~1~0b*>0G(6mAkLa^Oj_wb{$U;coA#CHRFDTVI ztp;{ROy(nZ(XiO|am)r61R9Np(rQDgL*yL>07u-^(Bxm03#rzLFMo(R@zhLx_EiiCSV@1#p?XuqywOyR>BJ9DQ07D5J+IDl!_FWB7u?0FE_8C zK=cxleRBnuL@t4jkxY`VBlz5!GJ(TwhvQDGwQfI1YA>Wxjrn1&ok+ z&LgpY!Dw1dx#0oj$Di+4|MP_Zal)J5Vm&ktd4ewDB{=PT*mtzyF4iMUEcGU~Y{SuOOj+hCWUl2rKl(+~tKvg=bxq00=Qdea*5?VT>@hrJw_C^zAe0uwEU-o8wDuAA4T zP&!TGhK<4;tu#z}=S->p@58tODBGgvQgo9@FXY2^=|2PaKN2Ehk{crqwTD&dE{;$_ zbaAf_@C&UT$_?9v{QZV+n4dzX7#26NQAf{v*mcB+$_z z0sBgVRB?IT24EC@shmxM$^-O8)k<<9So_6{#S|c62cUL`_^=qLXPIlfhe(C_Z)&5A zPg4i(J^=?uTx@KrDVP}POkW5pkW1fusDc)gic@iGvlQfw7+x@_*(|%Ry6<6NU;v~6 z3-Rr-Ao%ZwR#u-Z@8U?9^x6Q0Z8_I}w$a`S?0Ky({5dA4M;-6^J;mSssufvOOD{j4 zZ8_D{)PN2&gFnlg>rny&19t}^^5jc&ti*u3Lq>G;R4_gggn+M~A3$@S5XAo`O=Gn{ zferZg%b(v93k}v_t;q)9e#R9;b+H@|#<2PL_yEj-)Ik;axVpCF$7$!Y{R|_#0 zC9A;(5OZ_8&lSt*B81vn@paac;#>Jb6-1{oQ7)0QkW7r0u~*3_8Nh_nJ5tWi|$@|j$o zXw0zn!%v7CzoD_Q^3$l)%NYl7(Sg7~-$poP?@!IW0fVfnJq+Gsq@hXhNT1a2v8Y6= zXM<9fIg>Bln97Pt=9;a~UT0cRii*vPlWw!$gf83t>;jvf zqJN`uG+*MvFh8Oq_9dqHec3+Vb(fNK`SZ{6=gWCZWy{6I+r%`}UVBnf(i&+eAZD#@ z_IhQfm>y=e9e8Lo-e-1<$?0s5*K(0pt?PdaCRsOZVOQUh>$0+Hvp+Fbw@et1zMdWA z62r^%5DNZ!b~7Vtq2J!AT~a=>nC7UHPJmllB@A>RIfZ2%$jZXR$`?ZAYjJos9ASzn ze_@W|XqTKvhA5%-OmMyvZue##*0Ja@8pAV*B8CR3s_VHoyKWxSJ;=L63&K)C>cG+k5t5e3S5DSC zX+7HB=J2@>cWnBu5qllT_A#r{7}6o2%y=StbB>*phIq>W3Mj`j^KHI4Sh39~H`-y% zoWR=W9qkvVbKc%zbHMd98@BD-uVJOzg-R9vN;_U*_=$)-+UDt;v+3I6xyfN?lrn7d zrG1Uw0L=-xdh~S>%8JK~6j6&^(((eEPSjzk-Y{L1__q1-a3Kzv0J;?(@ z%=u*1N7i|TUa>j2*iXXNdLoitku>k6S`~U)^yZdal>*IW&xIFgPzCz)v%^zIdqjt> zE+K!AOF$uSN}cX!L4adA9@{8FR;1pRfC;so<5j86L^}v{%Ot(#dE@He(7pU>alMF% zLmgcgGS0-BmCje)2q$o2wQWX-0n-oqs+WTWP8{Peggh)A@4qHUfe{8Fi0r%byKmxU z{~H85I9OC}#$EtD|CK)<4qtJ{>29HPYN~a6quhGEV$8T&77V-OT<9=Fzy!Wt1(>VG zW{1Q3aVw6^YlX4_CVe9^1gMm;3jeqCW_{OlUN$RcRRjlCy7h9uI3D=YXiicJr-`HS zlJ|G9rkkMeh`bV#&ANrcz99Cc6uK0~S268gV||bq+UtiO)ametOb*1jh!Nw7a=`ee z`%%+mohK}cZ(z{~979pyuYs%$Y{4II@Ecrx#JoCJ*MwBQJ42+gszaEeL?M!bpL^Jn zaHnGkGNh>1Gy8RD@^8CD=L4UHbxLjN=lk{hQvp3}%cGd%tv79Vy+4$d8Xj>cPouQa z+r+iltuA_j#z*U`N@k7K5J;f2o{f4+k%-NPpU}Qr!#AUBeHdgS<8ZuaXzjhfL%@mZ zurD~ggz2HZqi64~TqF=l&Kp*COyQN3IR7&RHtC`_F+K>(uXuKFwl+K+n~(94IFQad z>0sDq{B*=WcD{27de2!^UYib(@Y8^;N~GFX3`o{C@&{KR$nB7SQWn$Vl5P5_mc`_MgqlnksuzS9=QMlQ9lGoRdL&Rb=0UDH8 zo=2oITS()*${Z@E#jTYU?QhrVmH0~#1t?OJ^~=CR2prW6l(7n%PF+nLXeg&Qv3E~v z)DQ~v@c%x`8C}dJJH1BWr8mLPT}gb4#jI^Re58m?Z^@}fVQ5XX ztSnno>Y+X(J!hsYL=MS=Pw@3&L+wJPu4!S#Gz!7U-C zu*)U$u)<>9p7Rt}uk9V#hx@gEZ~@Ukr8D&sUC-FjB3?q~a~G3Gi^c_g8QWoqm}!2k z$jco^rFTvg-pnGAZAvlQ6Hq>93C34>02HUj&7#Bi_FY}VbW?y*GeW+2&yo49qQ)l{I2fH z?y-cSy~A@kze2f2q*YhaYxq!5(Nma1DJqa?F|-!^t5a87m6ggQL$L> z6BB~?tN*p+)@cb7UMti3+-4&5eJKGEiybB2%?Z8~B|%w!_7S5N(5_p}>3E%aa}n*DaX* zf=pFY`F%h(i~M|`mGxyb)%BrD4yEz2&~R+p!K+lv@?D2R}x0|l!pTO2O${nC2cAEv8{ z0eKhhjIEle{mM&fZVF%W{Me>njN4$b<>M|hV52gQ9bUP2TM6)jYA&LZOlBROEkjix z3n$+0YkUxuPUdWljL_mk+h(`k+ihFfoeqPFxN_E*>~0#@@HOIisByAB;+Z#+!V5#} zf1|!Od*R}|JJ~fulG#!JA?iz8g6JOB{$OK|h(pCBIXR;&6fd=liV`@0ihp?xW z9x_k!E?e~Uv!U>!_(5Y8xGu+&>=}~qZnuoJMR_R#GLKx3_yvW$D;*n3tLFdk65Z~v zSLyD_`-EjGNd-MLG_*KseJX37*|IR}`JuUhdkBNx^jPg=C|6h@Aw}rU#upJ}Q1x7y zQ8*bSfC135va){g?@$O`mwZ1Sg2Kb{CFuN{AijU^_sFyz)re_EW$$!s27D~$A0#ox!DI@f*)PbIw&BxZeDTwv_!CEm2j_HQg&zWik*S$(S?PZna)VrDt^Sn0)Rx zTOg`G`8$!IQRSDHv;~S@bgCn-Y*jbIFwKMSaQM>`8R(QlO=48Oc3w=6=Gsyh z_Ltf)Oey`wXc{&uVCz0%-?HMLQ>Q>qZ{`|lT;*&-p3yon2?6ReXjzPT{$8Riw0J`O zJ2&|QzqIzUGPt$&VvAA=5`QTo{NAg@c3C{`)`ooXtAU+yLwyQhw(^IPC2(BofBpq`M;L|kJ;^=iW?3P`pQ0Wq^h zcR4qQPCC>+`hL$d@4Gx-0*?ad+KzpLOs3?+Tgnmp}>+EXe`k=<&Ok5?3O^FC_jMY;8!W9q!x!4 z4Y+U$+)%Icg)J6Ox>?r6Kvk$<*9 z`=% zk@lZIGR`RaA`v==CM3l0>*k^yuPP8Yat+Rt8=e_M5l*{f-DTB~$NJl>u+aPxsjBHG zJ;8=%pb7zjEbn?))LEmnF&CaIH!ZAk=p)oVRF0Zz5O${uqgRxB*f%43E9M~X;af!2 zo&Ar{J9e)oGCafRV)y1Stin$V$e{=oSuV|fTQTCWv`D1gzfx5r@ZvNWyvj<{PmqaB z=`smDh3_F?v`+eSh)1SZ+NC1>h`pl7EN!CW-JWiL9Tyzot=d<=$(JeS1t*%Tv*Wa0 zBPMwl6Jr@&aXINhZ@96qA^l>Xou-q!8(eocc7R~sa>?mt#smx2?{DklBbN~28x@ex z1QK3*%hfcmZ=u8oEsz{m^vg5AU2fM(E2K>)6kG9K2+v@rN1jJnehX~*Or_A6M~va; z!`JfG({(Yy_8qJ)4TUw;n2Xp$h7gcV4^L0$7MrlTXLVuW!sUe`^rl7L)v8nN)AvEt^IHA91FS!IA&eG?BA%slL`K8_}o-pzU zd;R@o!bkd-bdd9@e=Ll>h zVm-D@b~~H99wZH^6f0>DUKhNZA8em5WXBMO>q)h@4Sb7MvTi!Xa>Y?*pDrY!gQy|G;hSwH77!cuYb*7--xr?#Zf>~U4Saj8-ayWz3nEDh&tUx&H|0!2 zG&xD+((6r0!6a)PFYieyEoLOu-a*1eh`KZv#wDJ|l_2WpLzS;s>cm7EIp#WpwtebZ zEg2DQeZ+guc0dXd28eK=*8-4AiCfs`!xSp~`Y_OO_p|)iyF~18proXf5ER<4DkUW) zE*@Hk&?zM}w)Sk9E-MvsLy2mqRoy=qDFxR$RPOa)>|_L z5-lw)Glbor#qtW8EKPtjk@Mx=KQ3l zHha8S2U7U@j46^ za_4fMn!G8u+4pi*kQhr2Mnui7XY%Uq#1Cy}XO~2y#%R6O1!Sq&SXseAqEYzk0Op$| zM@w~Jwej!Hup^#CoaleYEs7v}cRX99QmMIZ+o}~;R#Gya$@4l2@54ZJIi9B1@x(OS zkljw>{BqOs86?lciH_oSeX9#5;%+EsQ*G~cH%LfLeG260Dk>_pykdv<3`P^*^Aop_ zl;hD^yb>RQpah5qX9?G{<8#wOzd}IN)z^#s`sGw0nZhU{BXfyJu-C}8*=EoAZc$rN z-vE7j@K>!ff6e_aefZZaA|9LJKdqB{rjn{GxdsbFLjd z?HP|f3!Ap{V^Uv{W>umtHCx{y$g4OUXB5BpMv)Ci6r@1W^QN$PuhF{#kqLKLWZ#2#I5%5TN>%FLDjz1n9a5zeF4wXU*9-sD>kGakL4LI| zlt{ZdotmBoP<#f%F)T}9k&X$rd+1C7!$V!)asFT7k2t?M+;0QTRP|b5@VKYC}&yD@0cZ$;za#k z5WpU@SgA?mk3}}{GeqXhvQzTY82{k#kj?pO3#iBJ8yGk^H~_TQw`yrWC6{y8`IfX+ zi#cP2K*mMOU*OOz=9&+KGRkq?EG#1rU4A1c4c!lc;)-82G`>^GG1KcMr6z`E=V`62 zo~%vVhx4;dDGdD@kC>xeoy@q_^mLTe(E`1y@JY0~-xgf*ca_rLYy7Ml96M_6b<0h@ zT3gN|dpDw*7V|bVue83N887$F2~Mw!oP1L&MI%h#a8l5gyXwo_tX*e_`TZ8cSWU-nMb~$2-ULRgD4lf3Q z#$R69wl%-XXrM(x&GaRgc_s!3S4)<>;)8U1%3oC;@Yx^k4Dgl2Rt*U5;l8-e2wk0$l)!l$12TzW!dKP?w>xJ&}Ac8yN%=4)kS>fj}Cnq>os}+VqWK zsgH+EQ}f^(hU)dlW{XO1e-#%{NF%ev=#nu+4xcovP1qydFhEw6P$sKtMgXM*wgmFV z4Ro}5l#N?NgTv_8t0=a4+U9UT@e?MpT@;mp_?i4f3xChCvE%N$L1CCrxc$__`ijL#P%tgB(SIKxrer*nemSJH@4(%f8-7o4g)FBJ@|;e;)7c0bGF za^~i0(O;;98W61u4aFgf#P1-d{Bz=+HpoiDd$pDfNjcDKNg4 z+2(A1o-*+|jxJPautwnj$t$6?8M*rc|H{ByRMR$QdKBLU`s^x@*kiZyIG`V`I{b}* zZ9O6pcJmE3ZH1Gx9!dkpjGF2@mzVBNV&I9>^RofEgP;w01kyEU=uKF%xweIfiH%wU z|I#>ZAGoEGnjBC)8#jJx3Kkr4QZ@=3Ca#JL<_{9Ikx~<|5K?e(u`$qMdPwSQZ*TYL z4@D%0o+ zykLA6EYjHW)Zc+Zl!*8tke)}x{(!R;Ul!-2Rd|2ccPMui%Msf0n8lyk4UWII&T`;g zO2U$8q{Qfz=NPmbbYE*IrO!qdH*P(sUH;`&OOH>SKXp@x}>6eXI%ZUwy#U^&3 zw#A|3Di&|9%0mHXHgIyYb8@=6x#bzN(SIW0A0iSA#v~*K(x{?tI|=F3=9P$(_6hJ? zWAW1L+-7eDr$mk%z5M$_`!&~la$nz@#Gg}C`uKDg z!MKbT4h~+k+N8S|HF}*?83*gcJW@&7L0$-)g^=6b*KNp;=;0#F?+v{7u%km1Yz@d; z?fzlQf44&N0n=aiAYTFp&40bL?EeehkF?9u|3urAx(fYd;U0RC)7Pi%%1D4lwCsfV zT(KOrCFXEXi<&4pK;vLW>CRoZ*yb6Rk-6ErOqx#zyNTLv?%UMvxeMFrZ`Y{K?%dj~ zzk}+yT&zHUrv1HPpC4Y~FV|mj!8c_Ebh)K9qGrL}gIx2l5M<1UuhAbpLDuZ)fFA;5 z3NAYOe19)5V<16oN$6IVChy++j=P(F!8!A$b_;Ccw?rNURVJ%#55@sg^kPeG7FCtP z%Y3)dLzi(S{Vi(h6&1@+5|Sl8SLht7(n$On8Ig#eg)*14LS^r_L)UDXc90Qc>ol0;W%V z=zC+AMVY&TydJA_Nv8bbT)+yvbqtA>>pOAKY}&s$J_w`p6kNV-N%N<9>Lf!c>tL<( ztmRUNgMrGi+G@E`m2lkjmCSo+BlfG2hvIYv>U7LZcVry)8LZ&`+;H+{E>wi@j&`oI zr|G(AZM9Q@IO3y2XbiwB1-V7ErI9tQYUC_J}Um# zTTb;B+*%||#8s8(Ltk>;72lejl*UI+AYY|3$Gud7i^`I5iqSFSXJKSrj@E8*5U@lf z#(&>mG2Ht4qQn>eF*pA`Kq9#AnWi5;M3Ies$D7#%HH5scbdLBVlY)lgAO}qW6%`v+ zpzo;J;MB3yUvwq%Aq3U)(SilKt1?;*Q?D4*6B_ILtousKY&?Fcy~lWbT@-ax$7grM z@nCD}NdFFYNw8H=&}N<4N~d={H81o^AkB@|)&UfAjv?*r z=BRR3J*UJK^^m{lZ@%Pqs9RZMQ0AqYUaJ#+_$MJ-BuvH9sqLQ)BN;~fa222RnLMAH z#?0c)4``yOL5*5N_|RMc>>@=uzC4zWW_B}C)j`LPmt$I(2Q2tZ8LzSEy4x9O#7<^PGNTD={sO5yEonUDk*>CDCC6E@C?iN#tkx(sh*sp4)X{0)gvll8qXi=gC z#zy$f1iis1axlfw)e@ywrZ_yl3CA_oy<(}N$|SO|oiD)tRP;nuKX~OIom!KYf%!tr zc-G{0(YIB`#uATRLZOHVK^oZGIVI&v|C_t@HbJ(>|tM!HZMNtUu ztvhA$;hvQ9eq&*w&0UTbwmo~t^;hBWnTebV_1{LX(dY=1eAJUtn29*EoTrIjgRkvF zdl>B-C8(DfQYxL%5c--PLj2I0{X47q*6lOkg9cpry>`37abrvk*LQ^s#8$KxW(KxV z8NNVg8vijhxMKJ^&&K=-6-6{w%0eVi^@5Gd+<^P3XnO^@azMG5W$>L(QTR;AdoZbD1IpFTZ5WBEH_u8HeRL(T5) z7qmKL79}0?!^e}$h|mE0?REL6HMhQ=g^;joZH=3P;t0_NE2!7R(((gSI9FIMzIXfW z-W>^~iCLx1TN#Ig!NWUacJwy;Xe&3KzFo`ORjjZY82r-ILZU`d0!^$iV(p*lA zx90qD(4L{u#%PQ2+2A^>K+hmWMYG6i#rggP8nEp9q371KKFRtZ#e+hIPD_dYdckj8 zD$&lp=DXtoPW*llxwUv8TE0Q5&*VO0O^r^dZ%h%_#J8btIB@Rw{c@gy41e=vYVpX{ zpw&fYFf#TG!?!R5V}I$L23u;DW0q`f!!^f__vL5aNAz-Vzus3!$kgQIr`Oj{B1HY4 zSb#fW$A54NElSoT0L`c4a85@jr%$>O zA`0C&%*o!#3O-;&Ads!Ct(V^dtRN6e;1wXt;2+j={xoI@CE5DXwq|i08N%!R`|K>r zIdGzS&IlR-5tOUX@>gaD6r&oxbLGs9z)w*&ufJZ|H&2W_^ZZl$fQBhQZ(*Y#^eZCee=jdaRMvcOY*zT3e>oX4SbEYU6>dQ3x0?rsnQ zucwmU%BaD18}^Dg8ia@qf4a@9{ZoR3s0aD0tCV514Q+xI>chELrbdO;yj3>}y#l<8 zrN(wRfED@zb(dSj{(_Bdb@8gLI zhK=rNIzQCCxrl>+F$P&VgwUnrOT3>ZPe?W8ClpRuCJKWs^bc+LO&({#a-ocRU&YPj z4De=zzKFEG0vRWEw0G$i2G%q@fZ58)sdj(1C60LtdX&lFobT`7Z)GHf5CCdcMTukF z-Q7LCFQml8j_FVOki7eXCe~-w6oo|v493pT6<$-InYp2G-59-Yev`oea8Y_m^M$40 z2n)@nP%0RFGeO;XsK9*>`%22NG%r{jC*8(-v@P*{UlLnB2U8d06V|PJ6`W z9C7h(2+_PdaY44(4*A~9X}BQ1kO%pt0P)ca?=&JLM3*sz%kk`qfa`s-r@MO_AdC65 z$w&5W+uPdyyYW3Gu6kYOpe{Zhj>*TGr}muXOm5!)&x(sKq?QZF>VLv^r+wzX3@Q z#TJ^U{L)gD%=2jxb~TbY6&YCbU8PbIZrxI_Ql{CHaep6`#G}4#tSF^_jhxMiVS|mP zw(w{sfTy#~GrK6<&GY4K+zx6F`>v(u%#A*jF>5VWzax`DSMzIWSrv$8ak zg)dU52zO?*+J|1lVB7ZSZegC)A$_t>Y5r>z10PEB9N$G?h5qGwjG3LrIyfJ~kVN?d+Pw>GGsYf74HV^PK%hqb=kogL6va(t~?m^`-R?&y)F zsi-Jvt4|a5{2N#a-I-BGh7Ee(|zY5DsF z6~>fG95!r(w33?ihGe)XJG(e!I59uibR9zgcO756#c$BY zP8!>8oW^KuH%4POcGB3kZR^HqY^Sjr+vc0!d+YrHS!-tQ$;>(XyZ2}RxGZ1+5Mrxf zyAK5;N5=+085bh)`=AVUn_zpPJ#K}rZ8t#-IO7PYRJF-0X&6{aUM8otEXKtmv#V=) zz+RFa+eI5rSq8U)3H-kZ1SQa6$!?Rdtg7a7b!}rl39om0Ls|Xg65YK-UT2r*7hz#~ zvU77&TOTnsQ8NjwT2tOJt??fyq~l%nS@I?XZ4X~WQhi91MUn*XYfEq6Sw8ta6L-Ln z8f)-#DUo_sDp(t`C=85K(`uQhH}!qssMqLaWoEA3X_sTYv^m=xd^mj*Ys=iO!QlOv z*-JXQ9?dC^KXM2b&pB-%DXkB7StR6nrqZ=Y=MmQxlw|+(lRU^y&y*?w7kDWb7Xy*% zbmp0mx32_(K5HW*QYtDpIeFq#b4aqX0-j+^HPR_5r^m|eD2y~^7OoXru*QU)wgryl z3Du&XiErXm{=SkBz((g*SACRyF5)F_LZRh$ChV)BX%!*~jfw&&9UE=VK#cG$jlLDg zVbRha?T#eqSG~TZ!JxFor^m%Rp}xUsK~hc|n{a=kw9#Qn3Wovxb6n*(RU)9c-r^=Ts5>cpYpua=le&KK^>7O zp%$_skUk6^we;^YG;AQt>CBit99GHQLHO0P^MGtV8nFF`cAVHTl@bHUw{|g+hPj3E z(I^5SD=W;=8@Xz<__6|_PLYH8B8EO0Ra#Y1LG~_$w;++$SPgJ~!Gl~%s|a14Ss^1Z zwv`15iOb1^NXGX&Y*FQGINy3C7X`>w^!HKvp}(k3w~m91dgkaQnkm=+a=Dh;?7S%~ ze{QM1d@p(zy1gc}Vj<6f_*cg}xI$x~h#mv|Cw-ePQK*UIhyd7plWq99>M%&R(^HEd)XQm)M@Ksnr(ZDn;ez~3JThyg3(t)y9(h|jGS zFg0I*h2cnLWn|dc*c|^O#HgX+;XS*axxYoB!Uq9_lGANNCmvmguUio-subuP?CegT zU_XG$R%<~0CYOl*t_0-EjxWktSkqpiBC(4e@qcfZ^?i=vb9m_QNq7i2KqeQN+}rWo zP&FitV}gdO5sB5G0W{`X2GcR8YCqYO#S%{R%Y3t%8(j|?fi|xeOgvdf!uihI_uaJO ze2Ehm0$o&B$EuLM?U2P*)ls_`PM=@Xe2*i{-{%ywh7}{%JO@Wqo7;+|G({7T`)Sbr zAq1iN>oeKNOVYN#oW^mCwlYt7S_~9TcnTs;e)I}B&I)|171zRSzl}GA{b_1fDu>};8T{v-jC)4xOZ}ov z1b}#Ra$iv(KQ5}|pE`jpl50_j5Jae;x35{Tx^K*nwH3Tm#(ag<~5~ANqXS@ZOfjUUcEAR#vA}>=^GK<(&}~l*jQM6bJ!ieFlKZD zMx#KyXCjU5K!U*^&3LoR+uhy$gM*IhO9a?%Q%^^y0|@BwWWATHfr0qYXK3is^78lE z*#&?%y0FmP*l28Q{Hn|GnUo?<5}5eDG`#KM*D1~PMENZ0SrE#=Cx{m5T)srXwy+?m zyS>IYjrczA1(<$kd6Cl-CXOK?){p=RfbajPz(f))Qj&f$9$I37Oyq26J}H3y5CEXNNLilDcTSFb*)1LTKAwo{TEg` zP^aOgUd={U0Q-C1GnN*Dw3G%fMVEJ%GsW5bW|TGnIdCe+X;i48DpzzT(zo3Aef&yA>1~?9R4|G710x0&Q z&F+r}AmOU5EiBvvgh~PIlaH*8lg;?Y;;mu3>&4{6#CnreN@V1?#_$w?HY&)^?+Rgy z*z_MT0w&J9R8;%CVQbj_BgRa69gi6&kfc=S<`+U?m~?5dpg{|}5I3?Yk>9DI6aPY4 zB&k%SzVksEiYeKOQ)wWQ#;i{c*|R#)LDtj-u80* zIgjS>OwiGDe?5ciqR2rhZ7=SsAoF=zk_I$wIURb$W6g@ZRTf_D*ugO2EI|1Sy8JqM zhwF2uz@3cC2j9?^CwJjTAqk=EgKQ`IDOmaJr(62ob?@5lMB znKME55A`{x
y)-2iS?0He6~#9`gAkrjmAI;e~^8zJno`hn==%pWnL@BMC6 zJJxGMSIo$siJGsHY?J)Au`MoJ&>&D-=KPz1W$*N9T4JIT$&vIoPHw}Gb1REGf-a%W zU%mfYjzga0lBt@>r}Wo+FJTi?~W(aQ6@}aF*3OG zxij9De^T8sgMZySoevkr*N?g+M+2wG^d+Zm6nk+o@r!doOLLwk%{%|9VV&ZiJ-Du8 zx`hQrH65k5mnYw*Wr2i|+xvUHHYeJUzNfZIpn@P95CizN;QMO(`}=`n03fSNOhp6) zBLSS(6TRunhaK;N8n$n+eR=xhqsa*2Szxw6(39~{*S8D3oaGM>Ic2@!w2#BbIwUOkI;3-97PVl z-gS_fyueMH;OM#IkY=smv7Wvv-|1L6!i(H_w`cF?7iT#m-}}xFj|T5D&p%T$Drl~q zQw9hKWAZu&|I^rpI^~6|CF!RtsJa1%ueas*say^?7jx{ekh3f@R%l7Ww=6N zzYsmwZfzL=vkDB1n~?JYA5eI+} z`ohAisg|^}(kvERKZPZ+(+YJ>0KGIeIl0m0-QLmh3f6!TsjS}B6&B-vO(kI%ohY-} z1A%x~@Eqz{^$)OqL9d$(1$JzAEH1Y`5qkYQpe!uCyzB`C9({@$m(wS?4-i_8N@mUr z*@>DQM#G7-B7@t*zSto3@Z`h`3GM5BaSF5JvdGm-IcieZShcmKuRcs|Ye#8)*PTQJ zoRndp<5WlrvuY#UXajLEHU}~;XKoe6$#}qPZ5H+9h33uiYtNjkzRxrw38+?+5on%8 zbn&sba>S?zh=EI2f1LDGCdcmlCS7(mV6++fg@}reFS`X z#ic5xjFlrUtJg1%Uw6$=4Ojb}3~F*sm_a(~8yT7E5It+X%3{gzAXJ1;d;$=Ve=KRH z#%UMMX6A%+<@?RLC)_76(HI#Ru?{Kx;5Lno4IG}Ojn#!U6XJrJif4&W*{|F>)GE}4 zVS!h-PwqsL`cmE|2(e2IWE# z1y=foNBEdN>zfCbnVr1zR9eop@b!FI}T(d$5CVlPj8~;?3sFqPPx#5+Pi-o52j42r)%Sn zyuEb81WwL3pLzv5zl9nu0k)bPLEr4ySQ2LD58Yl*a>>0h{F~-?hoeCYQFnAu?)9Ft zYxiSd1GYU<_hZ#kV2aXq{W0!m@*N{D6MO$Y7E+A{D~nW6$w7+E{uX9%V&OqKRdiTK5MbM@BKGm^FzX;2{cU#>M4}{hA}4 zU}hz@`em?LNM(OL_t|SSExr6jn~PmrL3SYcS3Y*kq)JYPmm7aTAQWgLOgGI$;Ag`{ zAu-Ph`S4a<_3lIiaTgr~7jvxaXO!ky<^1DJzUqvmB=^VtWzM+Lwz54}YRW*htekB1 z?G~rH?Be@B!ktWKGTyp<4y>^W$ScZ{q(w#_y;0iX@%O;@R|n?y7<8Y_9B1EQ8XvUsJjv(b0{6&rIbR_f9&fN*tV+vScu8%lp1e z@_5|@fwp8%Lx=^l4f5!suQT6e3q^zW#7vx5Tz-W`EgQkj$i+}z4#g2DY z^237+q@bb={@G_d<;(Nnpw)IFlutssSy-IU=9OH{kWAJom(tuyqn@b zU-Io6lZ-ATsx@C3OxURQHii{^DTh-ieyFYgn@gJirLBWOPFSff!wQv_v-1UMI;m+M z`ieIuNtFZSx2~|(VLZ`1YRdVWjLmW~{EQS&+aeo6|#Zkv@M9 zP@4k~2L9WR0+IjCstA%!D#mojkALNdeM6i~;yiQ<)hnF76MDRi$G`tl+mr-XWzL{n zYw?vRw573Gfa0C^ae0qs-Nn#d*DJ56&)c6PUvZp1?SRGH+QD$8DCZPoiX*AHZwCEj zIe$InZ4jVsD18v#B&wt@9qOP#>{tR$&JW;5+4BPU{_Ep* zp>Et1bY|IOta&VkFA@~0{H?V&nKG$EsF+6%e_#4wu>4AK9`FsxU5`##HVPv1&Uw`= zTIwSsewM(PKM-+w{~$Jb)r60`JQ~`%0!c?thKWJe{h(1oy@od0otWbdvDAZvzQf`A z9W8X^#|Ri+%_V`inA>aNu(|n>7013w9kdbYZ=zOryY0Awx!~c=&P3&y5t~)iJos4W zq3WtzheHFUSF-Jx9KL$zTy=c^ zceFHsh0B%GUGc_`6eS5TG0XreD8Sq?xwuZ4FDwp{dF+5tI%&2>)Xy_F=Upx$4xFA{ z{+ZlB2rV?NloP*TWKzDUuAy8}oi9QOg2kM_6Qh)y@S2%orePdlhFJy%6*w8oylS~r z5M4WMp4cT8zNgQ%N%Z^7@C;ZqEw@eE^ZS8;V#lqI`@7hgk(v(tKI$~2fJ-f9?9JyEFLz$-q&ajpCbK2O*>sWWtHJLB zSOm~7Hg)T3*Aqrk3~opw>cKx5;}W+51(;GG(5R4ENX7%30M=-EM+x?9I2qT#s3I>m z4y=-?ywHzPNb1OkxVzKw&C8h|A4F4OVQx%Qk-KO$@qCx9Lha6|X;4DW zyk`WwntY#=QNLi}IoSEO&6n8GHziN-Xq*x(#op;6MfVldueY~<^SB)W!@1rYw)*{bXnC2;nj8Ah+Cnin$V5qiIvhNF zd0CkzuoF#_ZEk1)Mz*PdWeTtgZ+a}jL%`bhul;%9qB`w(y%xV_+#Z5WRUEcmZ>1{j zv+sBTA`h7w|DTl0C&M=Q2>co2q}J)Ibb>YPH&(uZhSlzH)@&t_&nu`sETzzyA=6K9 zg?Gx0&gNQZ}~0Syb<#puVDQ zJ?&RRADNMXpD}TNcULrb^!D;V3|whk+>Gm2+(359gi^_m*0B!rVyNh|460@4@8+!a z=yNPRohrZfQqv-mCbM|$!lcRD*!k(C@gC8WAKwn4NL^013Fl1%1G02e`q-d_;yc=C zXZ4il81yxbj87!piN6wxcrmB2#FLyb5L6gu)ugb>#Uu5PuX`=Z6C(N@9@nwCBy_OP zBLy!j%IkSpUvL%63>2E~b(p$LuBc@&Wkx=|e8!meEX>e*WQu!g>?#JDHhD`%IIkX{ zI`|sP$Or;%i(8%x;7|es#HVKXj|83j4H}3Rc~&E0kM$y~xmZ89&px2%^-+fDT9hy}UAsEsBn8W!AhU$xbGm&y`meTy-hXVe=Aa z#jHMYDA%_$!mj43V28wm%y3UhYwj{oO!4oRu0U|Cpt=T$_wy}4vjoWeVq#(_!~y_I z_UQ2ND;pa=z$D4a%1Tein}(M{74n^_!FEUb z!?pA+Th7M`U0z6IAWX?HCBYoIT|7)^@C|AnOrcqHl~7_e3*jG{o|CQZ{^IjZWl3t+ z#5sD+ZC+pFekaS=J@d!7^$`dJ%T36DI6GoYMi_!#yWc$dT_A)KJ#3i$ScA>X(eb9X z_A6&bR!WNN&L9%N6(&GF*xqLKdbIzKN!G@3#Iqdu;@E@4+dWm-ZKdBJsrlfZ?vUe# z@&)0X(l(6m#$)w2;9?^|#ZlbGhlCKKK{qnCbYD0c=<$3a`z~gsV`cy`;PaMN2P|fz7ZuB?_;q;%u*BUlqoG&p(vXxGz7lV4NBEbaD`dc(s&Pj$WA%zCh# z(Gcnr%OCgPQ-UKo(_En*i-k7{WD_|Z47Q!*d@osfVu)d(2R|4nst)=pLmG?p44l}) zf|mbvyLPK$2iMX$$Wu^l5A>RiP&;a=p)fm%EuRhC5f)Dtm#fOFtFw{KWB!aKqYo(Q z+od=27>i=Gt2D%sn^z;rWT3?~P^1_P#pFpNk?l+~wrVpN$9#YqyAQ79s#V#wlj-1f zkgxpGnNWd-ScUxpGp1Hz6BXt_?EULcsNp=nMs*3_FV4L8>yG(#uFDDw*dUR*_&B5HwNs6>g($#Cntdw#=^;2tVpBVZ~?GvcXoCj&Q{HU6YU%1By3P`Mi7?E z&wY#y82#-AIt>OblKQk?U(LVh8letOe?6c1p`v9KtqsY60S99!3b5fAUTZ_7(d03_#@ zAELabCMG5Z1r|0oA>oB>MFpC~jTK3OEI}a8kZ_2zn(qOR*X=a4E*%jhq%jr!Pzj%q z`aLmeZ)_!Ij`IW?Jf=m0$*50M=QcTilcKlxw|UiqwauZF*-Z)1VdvGze)g@z=vMAA zC||532IdzM(xZhushpXR#2Kxc{W0KQRybx03MHAION;Ik$A`61Flz@`59|)p%pOYX)222?T}}(bz?`b) zj=0|2_7H-|;$lXH)_QG8EY46^4;o~=tLDsJN)vsG+i`#0@af>(xGI(JO~~5jG%q1; z@u@SorJQ~Y(vPmp3O*5&qWK>?qpt2sjt(q2Y<^kU5gkOt!06PJ@8jja!6^LI)l~o& z25?a>wzlj6bbn)G55mwcnR6W6xh;?Nc#3OsmMy zVh_W4w9<{&N=p8c{?2Q^St?6iT3Vlp3m@dih#un6F8_zxarVdLh_l zQyPSKSgN!*t*rQ3Va6Q#-3SFPnMqemP3>;0Cjb!RRW&po4rlrRM0`(=u$meNa65E# z$3VzMyV<&~uI}l%)0(EsnZ#o=AX%4p5&dbxWUnfm?)VFocrG0M1wXNIuR(UZ3Xf|9 zd0e^qhUnEwlU05Fqx<`b6AeooJ(<7gmy@!uT6CM%8?_eYn_5ure6hGJJ^S;=!;i5~ z7{(*R74u`fOdabxp%uR{x$OJZ!Xc-K zSh~cNlfrnAF~*M(VUQsq+6h=h|Cu!_zauJyExnj0wP>gOrjC{DuMQ`RyoYzr{ui@# z`JHcc=PJw?9yvt(oFA+OgtevIGUwKn97+Aj(XLJk+@R4v4HV?@D!^EOL6Whj148>oyDKvj6BB@6li>ikX$k4+Z5DIIc0~Ew z6zGK9_J0J;Tjz#R@Jmr6LE*a@He8-5`6#a!3HY+t(BK}`c~X-24F+=t7?dC( zQBlz!Kb8RMXes-M(hV2QT1>k=O-p5RRcSGoq1aOG?_}6OKZ;hqTYH_`GMf{P#`<42 zY$pNK(W~Yoq1=$7ltJDV`(7)!r6E24s$@105Q|ZoPDht(%Nm%OP?&AEtPXKy=A?`g z;>Q}39J5XC6ceeQ|8wYygga}{29v0!_iJ!Xh$|+(&&Z`f?}#25Qosk?8n#7=U+|0` z^3Yvf(Hyp1*NB_2CT(!6%^XEe6(|Xgq2BG7phYtDkbI~V)F&q=7Z>jXaVfk1qh9`M z5h4LXE;=qQE^cm*g4(qJg>67g%+uupV8$8!`b27a{&oD7OC1XqEz-zn$H3@@G1-xO2cPR>i@g z9{8#}Dypd^)zn-7sXr)4$oDm|nJ0WEFZD0+8PWZA&o%@GJod7?e^`hcW|T^R7!xqR zJ6UhlB91k0Cg-z}aPvw2i()lnt{k4-knB16oRlnP0S_}t>6@0Kf*s?%5bswh|1qZV z381SM!(cv+>@~clA%S%zmGgQ#{p9M6>8-766LUU zYB*R}TJg&Sznzw%qCH?a7V!eNisl=am>3xu`C6h(OGD!Z2;o5cL@4A%aADDZRcioA zaOTJh;YRqVe)#r+zxO^Q+p@>U?Ci|idt&f zJv`I+60nAR1|Oe~%9!G}B?!>Y^wd&)XgT+t<;74sH*C)_tRtJ=52yu(Ela(!HF<}7 z;K}KB^;u)xJUxByViObR1(T!!7IJ(03)m%D`0^nY=zReiMB1$Lw+Z(YG36vBfy`Hr zVD{SCDp-sxE+b=gN;|)nirM)cQqV9*Z71YM>By|ZnB`y3;lHX}0|O zC(#$Wr^4h=E>@ySQj~I9!ZHOgxMD$>$!nRcVs}J$930YkZSb?`-}|UY9^s09SnXL& z#gWU{QxbBtVvoRuL}zvRT)dNz4}6SJ^w}X~a&5;2x|Rp1JuuNPyyG_10L>7p*-O)5 zCmK_@f$yycJDKw^HrMLjNQrGFm@k{m{x>W7MJefboW%)U$`k#1!IA@Q~Jj()Px*y(Rw+3NPCnC)HB(NRf;N(0% z+x4V+UPseKUX4p13UTjw?|6o4sI;N3I@@d*s#q&_d`OV0QK=@-9`YC(F082cj}Spks_>%Eb1ymgv>_Io@1}*Si+{C z1)04oXrm2pZ*~GBrZlB5RqI52c1GGh*X9)?bWjr;9iyv`w1(%Bjz)pxB#)$zR?MaV z14xz@qZ*Mn?e_4hz*D2+G?H#(G5p6K+Zh35Gm*|IZ}mrR+`)xFx2wxVEJX91`e~`< zp6hK#k%iU4^Xs?%b!a^xi~V4u?w` zPii7@ur8To+kp2MStD=<6%v*-XK3&8kuXPxC}d*)ikImVDduI1H51A^Y}fu%RM3Xr zNyU;rAoJ(iY$o3o3`Hs_Dn4GDo9w^INL_S!Ozh9F=yMp|8r)Il8*wW!@LBL z+kR6!PML%I*U;O+lv|F=1m`F-MDKn;nKm~!x7UxV53Y}hj@YQ1?S}I9D_x`WF?G$O zd`^Mi)P0b&p|I?W33AlM6oPn`!;)k4+Rb<7vjM#KT1eFLdIv5%*;Xb8lG^eBZ>kWn z;w#TSYe^9qpHa?8OA!h>dWVT3-|Tl=!p@1bk#iJdlefTM zlJ|-SFuNYo**|-_8?N-vL?e^SBC5p%*-f((*DiynMhNjYE*T1@sy25In%zd8Ax2V` z7&)dA(6#N4t_p^hj%JJ|6OQ*H31L>^+uq1jJKxC*e%||dP$C~}e#39RxUC8nZ}#`O zn8?$%al*tKWp%MxMt`{sDh#jQ^mk?(!l}_|sBO&ZUa*rL`$tb7e3bpIUYME54lfp# z(s!PhkZE&kLU9C1)Sj0IM>@B+YdnGji3;8K6&j>7Tv25Q7y%07zLMt5DQ?0_vAer# zvIcL9*#2Zo5thi%S~-jdHan3Qt%!sn>;(3YBJA*nj8!>M_5b;HUE%vL)y`(v$&KUmN#~p9>%J zS(5dmA_XYn-+3A1iu`pda-+VdG&I-p5%Jh<_1%bO!o(2Q0KJ{_PV6k0fYa(^xNkm? z!Jru<3!4$1GLnO&nGXg}<6zu>>;)R9l)%C#TWx#{VwweC7 zxxQMvrI}K+V8WO?Z|X_@M%U%K+(EPU9VnNORq5pZA;D5c+a3s$g#`>I6RfABsS3Ph zxz|}v`JujaKZXXUvFtJ^XOfy3Yc7sOgZ_M6l~~)0=3MT(>dkoz97rj64{gq>BnxJ4 zBIhyh2|etpWJC47du`qvt@C=%fk=#t+NKIf2lS~Bn@!GPrWKpW)w7|H!52n?85wc` zhrWEql-J~%nUZ-M6y0SSqwF6S8!NN1KD;A7&eP+h(MTg`5z+mL)frW5+3r{Ot6{tW zhvr~LjMNkd$GP*LBK3(BL94xAKz@ztrk`xq^d!ltLM1}o?v*fHa~(zEGeIw;`TbqhU>+Q9*My_)JCTz)em3|9IijV9t;sehB@lmQ(%ZZo1M<+eq29FKDua2 zw3Cu|Ad3}gM`s;#bv*Qyp4~vjJTd8-F#N@9BhS?v4qf5Pn%mGxj-TgtylXpRB6+C% zsHP9Pi*Ww5jD0SE-}dV+rlOCVKweUExZY$;U_~N`%Y~@7a$KKsZCA2XF6-E;kQC;Z z@cvEz(g}E#WqHOnfxrXbfW}Kd6%7MJWr?H~pVg((QIO}kZ|&Nwm^K|c3mMc~J(9}q z#a-5|vGv+|=f0R7F3{4@qnIe42l|6XuPSL8Oc3SRg64X%U*-71Ma<`L^}f^ooKqc< zOCwSwQ&w7TWLf?XhCp_l9i)c>QZ$xCwIjqpef{xT#DtW5V9Y@_+MZusSS--(eH1Et zv%0kUKkr>1e#Ftbx*fG8KW9Ha@A=lhp|wPz)d@ zv*sL)4zja!)m>eQ2dwO9ndlgRI##+0%uxFEr`960aKA62Bt(_(eB-Lq4(G)-&uIK153@Y7V4eXDHZC7aBQS#Dq0c@Fwn8h^yj zjBmD?6fvktyx9cDlI6zv+<(4N9`4G@)qb^f~kJH=9dxrvy-u!-bkdEE%ucfqa_H`e?{)oXW& z5-&g^7I@v6r^t2}beZd#X(DRoa z(`{Vb^@!-*RE^CrvUbJ{>IgP3*HpFDmnAJaufodt{81cx5W{kESA$d1c1{qI5zUU( zhlc)usK9~D9y-5S`E@h=ca;b#QdV|6H6Fdn3+=T48DzM)m&J`?Q^&o(mCjNzv|iNY zU(N3+;ARg^6F&14RaM1Dlpu1p;myE~$H#KCT>>{+ylu9#?$rYSWg}ajpT?M$Rg7Zm zmsqTP0tnVXl76;u>p*5QPjY(Frr3&JnHN&ZfgLWcR&)NSFiUzSHn#u-Ng3eN$52?a z-lFpUUOuy>L`64lYekRAp482xsAW_TkzX2jW`K|u!redd`Nc0~iYc34Q#n0LOGne| zD84Ajbe-NI1h#~h;m3APrWbWl{l4627F9Lk#?c{`Fe-_)XG+F5i)RpgFc~Y|Pmc## zk8A-4hR&_M0*+-(TY8jI77NsaZa3EtIk~!=3r3Kkn9J`&wciy~qB1glIx=X&zni<1 zCOq#S7$BT~X7I)ke-(@_u59Dej|qE%ygQm3Jd~2T9>GC{TNV)rVhDp2DweUblm-rK zA-czbQ|14LmxmR3vXvweX>l{P$!$?+%4x{Opiqa8mm}+ETRhJ^Y{nRY3ieL+G{M6) z6xC)44!dmH>6?9hRpC|-~t zi6b=3rXFIN%#g}8fMi0$-TowZ@<^V?ju#b(79Z)iMV)K}a!%_snw?vu?+CWbRnC)y zrG;--f0iN17o28NwNTTR*(prz%lN^3Zkoh?m4vtI+tkM*U5tOEr5mv!Xk_%aDwXD& z*297kDmFaC)6Y5+!5BF@gQ2Ww`*^1C@3~}A(s3$B6%(@3Er~mZTJNXVVcMyD5caY+DNCA`~CCu(tSCdD!=7XhwlhxT+56Vn}9c^r!6mAP6$VJLICnx+B z2OzF?h|bO?^Ryv!f%adKB6+pnIwo20>~^jXr4d2)pS&xeJpI)f*RJP#M)fq(r4zEY zy5~J}As|UAs??N~Ff4r6k39Z~zIlCoCPjz5?CHd)9QAQ{QG1WJVrlTm!v=>Q8l#WK z5}B70KJlEpuRwdeMd+ga%C6vQH;*sF0W{F%>A-uJb3%N4--FhWFx8W&)iD0ES4^LE zA`smkKpTGii&jJ8`FG|`aC&X62CC*>-qA^68UG1S=E94J#1 zV(u9$g3PtN^*YB)CFwyRG83IL=CFXoRI!G8sWmj zimc%sP8ZI{Kn6}LI5OOMQ=qNpqDH|tK1`xaJ= z>2kau&`+T%K4evYurts1nJWH-?S5E*oNaH?+vn@b>{-Y}W{$ENBCcTikft~NViz8E zK*~h4%J)@@BljQ^k@V}ftqHa-)&vI5xTH!9pXJn(O(j(TJWv@9t8cs?R=c(CaC>i> zPr+x{@1<>NeQ{f2PN!Tu@Us9)rMI}x`TA`Lk^Ovf^*z?4Q5?CLSis3;!#HHVA`Umo z2KEoaM(5n=9MJd5v{_o@q~M?#3ouZ`{#bh)k=F<|9zzYL0@{qq(!XiX!>rG0cr*tdJIX_rr6} zwwv%^(H;1%OG}Reu1()|RpK(w`|I_k4e8UBZGE@=e;(2lgc*e;H7&^eBivlHEOJwB zZC$?!tn?iSS9Rl}yWHa?&sik3wqa->ph1zcDo-tO6~V#Ai=>gV7w{TpPPRd`v;|DG zr3V(BE2cr=i^yT5Fh|$^c91=*kYY97YIUsuK@NLeu?X(|MbJV}0}s zW|pnKI{FQnf`=51a&5IIjP&RG#S1<+jUPqTR*hXv_4QGRzxo{lFV=?wW*x&VX2Yq9 z2WOpFV_70vlTtOctPEylszXkXGT@eRaTy`YTZ>vVF$p2PR<8L)OV}s`qnX)hDRI9A zcSV#mGZgVoiId{kEEId2A)je?pJ(3*NpMlqvPxgU!LN3*SwE$RBsa^KW|rTDhG9yn zO_lYL-Jh?tvKdd2P4#JOjFsa@;j_&_2-qGVc%q~gCDpQA`yZ93S;ZY?aSfakA!sB_5+EZP|D3I!Q%3^NZfkI*rKX3=iOou{ zn5Oo+V&tm?+#~K8#uI;tqLPdgnVMCvD~!>qDsrvCrr(siQ9zfc^5{uRN_(a-Qpf;* zO81o#74(qVew3v)EjspHSdQa(biHzXoC?C!);4eHD0$BIb=Gan#RfOLB`dCQS9On; zPX3(7A(2=q1n?YAWNw30kDr3#BC0H z^+2aeAb0dfYrhZSMZ=uH$NkGM0iTb6TR=z8&(DA7#umw&o|cA2#lY;AxjYy=;r@NT@6^BY_O%|5 z^gZt!IZ+2!UY{j#9O?&+?Y)nrisW4ab37oOE%@EB_bUT4^F>7n5ZDHOEk#U99z)=gknUquR~Q z4Y>Xf205=VKAETWNYiPfHTxrG(?Fe5sAt3TRRhR)&d7yTzQX72!K_~%mdVz4`;m%G2&{4LT@#pyq6eBROK2N z!7LkPi{zcK-j0V?|;?rqH*=7G_#&t5jKTj&LytBRJZ5x{a4(N>8)&6mRjjE9hlz8~=Fbw0+u^Bo~E} z*S3<Jt zUy7$Bn8Pmhh$tzMd8lylFNa&D0N-liw}#k(&&w=z8d)9{&z|Fihiod@D%{L`UNhMZ z5rZqJ>l-LNK!YwmK0eTzaz8ZV;OO|@A^;k84-P`|X;{kNG60eljjiu3;mptklYJzo z#l~n)@OXhX*sR%Jitt}71?>g5^?0n0sWIkn)aLm_ffno!x`x2AwK?Zk9E>U=UFYF) z<|SXItNo%m>VkY8XB;n&JHEe0---EKCmFq0h&Q7>V>63$S3R$d!9>biI&RYmYhR%K z78Vw)z~`TXb94^b(#_GKfdi=$?VuggGOkPhRN)^--u>du82RB4_CM=jZ%^9gN4;$m z{;=Y-pP5{CNQC^C&_bvXFu%0he4ivIq(m8r_+@@FAS0&pdXMfOR&d#ATEI^I1eK<* zyWswArvt)GgGX_ zVhU;vNnk!#jo#x#CYSp$qM)xYCU#-B`|2c`k8H-;+?sNn6s6^!r*d3ey0)AypJ&Sw zHyoO*gcSVNTHx4&HB|GGB?~EtQSIC67r7ncD95uZrId#;f65;3K{?z#o^$W_3U{CP z-!BS?oF~6Qf6O?dZAbrxI- zj7w_{J`b`tK9fOJv;dcb$i^%`Z(*#bCwkiOzu!uicF?Ah$-FlteN|d|`gHJl6#~TF zq<|oei1-EHYBc`$DXM2@#G)hqH#Z4iMoPQY#lW6II+}QR-p|(1qDmlC^sqn@GSKhn zu)5$%ieN}Qx())g#lEu?5q&H2^1##6B>VwU-f%LIFbg7EE#dL} zLqDtjVwR8@!>45#Uv9aQFGBrSyX0G*9;Lb}ieBGyIf@gS zD{l#*NuXWc(oV}$>A48xOs_M-xoY%N)T7F+%H3aHplCeMU3a&VG(L|L8Hr8V(eZe5 znVH>U5mK#e&KkR^(dUp$PSCWvUTlo~e8HF!lSNruP|&U(i;9R{zuZ@A3jT5=ryiD^ z7Zm4$0u9TWT_{z`8a|d`ZT%u?=wIn-vFCi6y`S7>3C|7wwwJJAD(#%-yBsGo!%&G zDeA(eT_|LTwaY~#UB=SCk5nn@>D`r!4FPyNXnJ|QXQ1eUozHLA+H8J*@SA(HJ-f-D zrq_*Se?6o~k3=4{Wn{Jk@r+l_>$}Nvuz5Q}3+E|P_zP)G@Esq&WuD#!YJ=s8zHxTr z`eL^0`(JikF{WWS87%)enG#(Y`yE-ofA0+=*by+J$71AXW%PV{)tSb-IBCUl6@lzn zk_$SRXU^esvCEX(>K8x@Av1@(A2}(T-L3+XgKT>X=a-@;6AXnnpQ=5$cP7}q#)PSJ(@yXEPc(8 zhYJDuA!c{=B%>%oUq0FQ&#N(WF%;n-1GQTIWWNK;-TPTCp!(Ja2*n)5^gKIz`x5e` zx(k&P$Eg*Fx;fnVqr_uc-Rj=&ip+E(tae^Vw-N;T<#i|H;UaF=&u$ZOVO%fLIylG2 z>V~?~*fIzRJx?l5a4m_~I{5G}3`?1utv_5+g4#{FPXs$#K294}ve;g#bvk<8p9G!; z7wKIKH#)xbQ2a}Iuw`J)`e{`rqsj#VA^ebJ#7@cY3x3ZF@!xu(PC8PUwJfTk?w`s! z^LAZusiB2L(mJ^dF=2DD)hPVkTcd*%r<928kj_=5hu>myWfnk)ES4HORmC{g<;4ak z>Sm3+S$|QQC+^9`kp3>?8xZ(tHS1lx7PUc1Z#M0;)3Xw_TFj02DdfAnPVpB_XLD6 z_IzO=HJ`bX_;v%o+_K;__Ws8T)GeR((LLre$dP4@qV2!lVOq1w`ePBFY_dKS9 z&!3Z3pS}M_5F@4_uI0rlx(Er+avRS|$6GnI7siuD4IR7A#b+d;SZF8JKWcI?X1}wL>)rf5ogg$I`9s!Y_B( zVE$zuEbtW7u6r$@wdUHnt}i6``uav2g2<&95cn8MJU3r5u-tou23!~`r{cwCle80+ z1#p~mawFPbMZ*`=DPcg=?x)`1Qe*Saf=qmI{Ja*#d##XFCj-2lG2gR`~c9f#L%Uy4;P7FPAOdUAiOt6It}qJrqx69$FZh zN^8Xi{F4hc7sD~pHP*AsW__(oGerSd&jqB+p&5(ykjsyFRY$^OlOC>z6d*w>o2A^N zb&SI7h_U=wsShuST%QLyOkSqL@o0x)`uslv2KxGQ9|iyuaURG18x19KQ(bD9${8Va z8SlsLN6v;X+qp^#l)3`JI?P>M56628IJ6lVaOpg)IgKXQKknZEKYd-t-5gdzN0gBn zA2zYTFiwj;u_`q~WNa#Qs5gTH!qba$6%|zhYlDD>jJGgp5?sfjsej{=aj@touOhM= z{IzbYp|FHu4MEE4#OG`o4ailcagN+LPWgRiOid*3QiPPFKf;(oz%q_`k(+1$D^PK60F4#3)ETFg*g|QBXLAT?w9@xXDPamS_CIdggsyblPFqw7MTx&7NxcWZGmmlN|QUY5kmFG?D_QV@}bPsxaD-R zX#(y;q0Q-6@QlWblGXU}kfW+A0a@`eepK%RTGWveflME)jFIGwd?&1+u&Tw>@$E3y zdW1+$k?;(*W4{u!Z|oqM0%;a1NXA-Th`4uTWCYMHwgU)+9uK(~Fo}y*?t@i^G8P@p za%pUdlq#b&zOO0y2NcFxddX_*K<1-hStO%=%G_bGx-I7CU^E{&cDsv- zYX!A6>0G{|eYyDPMB~Ta66_r0#Y(A;7&N+6IHN@cWw>&X~ zp>>SLJVGK{U+qnvlA^Q`!c>-rF{D^3`>(zwrWU*9_&35~W2*$%z-puG>t`1=2goMs zPY;&u*`cnD>g~_@*gYKOy=%2;7OR#s?r>>pg=j(Obk(!wuHRwVbe{4F>CS( zDnW-dRdIR;w@&OL=AV=#Qu=$>W~jV)O}7lf&41{<|L$t#Kt(0o^m6-+A>qLjPH6t^ zQUg)wNiKZ{!B(kas2S+_pG-PiJV(9GE04C|U8hp| zBcX**wxrv6$lXda1{xZgV)&*2Hx_A~O8%q!G!dVgFX0#NEIdhKikwCVtL!kf&Yqmt zAT3L}3^sO7du)r_A0pVM&br5`onW>IFFU)e4TP(^yE}l2m>R0B1-6jlA_w`F-%>^J z)yNJA5E>LXJ?)y{2Duv}`3WW`UXL2y%rZJ-_-`^24y;MznS4WyOm9ACVvP@QIUV!o z@@O9Y#1~^-QXsq|n%)RuCJCl7CR(gfSa&}&g>OC|7Nm`fODrDsHUhi0j4@8t=o#k< zmtsEA@SRG?Z1dqd9coswNc{QsRUheGCCr0{xtGmPVNdmRktj>MA6-!6R5xbIERzqM zuA@z#H^Xtf{mbH0@?jGnF|nXxEY$Z=HIEW+)6MR{@hqKXb>2DGsF;|`I-U?Vv6LaZ zPdW!SuE$oPPNA;XANj8e^wzfUY0MX8@hq+x^7P;K!Qh`xpl$~}E;WfvI1sUPQNY)T zA6^fY7kpMv{XMUAw@uDs;tVwd;jY9=Q@%DlgvNEBh_ho4!Ja8sgX5u2hD50Uqxzyd zNs|;ONt*O#WGiI#VF zvrA+|j^m!_h|jV5LnsKL>3gAR*}{(1JoluM-t*}grrD3QAoq$JJWFVpF^WKOB$iK5 zlSG^rJZWCm3jl4(q;e&+Xa}x!LiVTC{A%^Mir6O|wo7+N-*Z72rDRdsl6go#kNA)x zns6{UKN?+h=GUg-h@akam3D!fmwNuBf{eVzM8DpIxHhvB9{IniGg+dYvlU!hYinyW zGkB7CW%gv2ZjhJPtN#FITTw~7*W+d^xwLrX*ARnbMO2k*C=mha;N9=bxA*M45@@51 z6+4|!kwmOwu2)~)nbo3)mA`DUH*ABIRGfprolslV~@@f%@12iI$BYqT^pn{vZ|c^)PP#+#Sd*LR;tpYTAR zPmhpvK>6e8`3yjm6FWeVhnt5-xkgRkz|O0|^aIfW8OPD!UoP5*hlQPubPi;mrYGP+NNy@LBIL3kBj?0EQqPJ^gF0@a5IjFFidy zAha5g6;;e`zQdPLIQFbgns#kW;FmDimES)MS`7)mR8YtY0=O0*aj7B9`}uN8R6(`e zW%Ps%E?`d#KPc20L-+m?fnGNh=_bPJNdjmM&yr1K~4_X=*Y;*o&jWW92^`pjB#@SCP(o0`TIPv4%i%V0X`@n``AM3 z>*~NK%8_5WV$;%i0B9JntvX$8!W2_LFwoRou9gLg_EAKO7!9TfFzb`}yW1h`?0nn6 z@IE~JgNTU8)6)}B9LmUydA~k|+~NfFgoKB;{@VKifYpHMJtuwuS18a^15I@YHZ72> z0r15IPLO{!X`7hr*`)$8^Fu{S{}{9zeTfI-DCGb+KIQ+k9@*L1LcifcHu7E^oRgcH z9#dG&yjS6f(GVzPQg3A9s2CW^%gQ1mB49zlpaNxYZe?W#Jb3W%(o#}7Z5}E@LVkz3 z09_p*tlv2^A+1yze2Cl;xaae32@^p85ZB%_Ehvz55<{EQ5e7&f@NNPsPM{VAllB(a zQ+z)h`v8#mG|_>b0v)mV%*?ank00?M2R5w$ zhZlbbpaMGiCrRe<^59@@ZVrg|eVhpHSlOb0GXZ4ltoPBu!QiMU0muFD`g-}0 zCE{&_{Q)FTg@ue9(cLY4X_WvYz%e&Br=p_L@v#&Le{OQ5Jl~m@0-!S(7#|EnDflkE zz@Dw|92{XCKm!QW%i_Sm0H9*h)O^Y#mFZ@xB+q}WqXPyp*9@I(V2 zp;Qe4dfNZ3wP{LvdQm%#?d|PBK?8t`Tts+yZ{%#>OOkW4+tO-MO@ja?g8yopCvFdu zk&zKCZHaE1M^Ry+JXJg}y1To(S^Mn3UdSl~A|Id30bD%s-^B@G2Zu`l@Ag5FGX*Nx zi$6>B8@cP%&N@QC=|@8 z>;wh`z)ZRR_g^YPD1iY4uFC@${ckbBR1vnq3JOyI{Qjn4LrF^N2wAL}7z=oc8Jun2;I%;kx%`+6Ha{eYZSYODqn6xyXm5{jKOWMicd{M5ri{&4=Y z#h91Z#B%?E>fhFg2wHbRajTI6?h1^a-d=w(qX78IT;^oK^%Dj=4ssn)<>Li7J^A9l z%KC43)f-^uRk78Sl?EC;gYnL}e3W#jv2A7e(^}BEv`$I1AN85F_$~=icP43}^0M}!hgA(SUyCPR z;l8ya&`>LO;ojXSFR!Na*k0e%R!2fh+mJyCkq;F1mT@+*&~R6xMHD91Z-D6X7|i)0 znk1b6;q3hL(tKPDtP%Z*E(m^-lQ?yjUE4BSf3W9xNl=J)t2JpyMl6rhL^HM#L*3k) zxKx~NK%E84#nr=>?Fi5a8f7xT91=lKcbWT@q@pc1H@#wl0F zq+2;>unecRtK+7UysHu0wTS=;$M#6RXTyGg>LfD%bwxcjNp(r2p=_lGE#0_asmWpvUn39_S?@8yMy?$k3e?@Pt62~Vnzhs4Q ztwlgEHf>v@# zDd-*tbiqo7lj(yQZ+E*aHTzk$GM%Gs7MHzmM2jSE#7Z+yoo~_eH=Zl5rzP7LmZ@pv z3E%5f$Ol4+e}}DHu;#t=-BTs{ z**ppM1p1k(A-(AuMhp!GTZgNCPx04Oqec5MOZT!O0E;B{a77(o~`jE|UB?cFWsKcQfY zLp*tbLwpi4sqqaoubr-oGC%x4lvc~XRy=+Aa=RgA;BXUb=aeK=JMMQT@S-9GRyC@P zw*9V@^Wod;({$@iEgg6#6PVly*4!D-WPk1aR*%gMtt;YwD0IG|w`L;~CXGthmp%6R ze(b-vX0f#*;cj!--WN93G?69>t$0A_rQD2Bkqc4rz=^%(&HH4X*)bcKI&J`^4E+I= zLmjiSlB(D4ePV8GXeTLvjc%I9-vPP&voMFT^7UyGP57&0MyuBdjKu&+9IBoN#_rTi zuV~Syq%W*pZM>)Cxt7aHe>ARjOYgjGMH_nVrBH6`IaD#;89Y5*r5Eu;f0&6}cp&2) zpJxOjHlFM9sW1`#rFcEy9T0xFdMetvpPmnbD93fjmS@?j;&IkjtW$=B)kN6=!HDHJ zLGpXb;^CQ0!$qjb&!L}esod&m9%}Ea1u4S_H(o+uaMw87SnmuH7q1x-y1s7mjvLkH zk->U;@_6Xo5GWiFi7F~s-MFD1yzR#ew57{W>ed-8dHezPxTB6FZrFk6Z|zez&Ag1@ z@kj;Nvbq*ne{yd3Y65k{{C)|e);HnVUTarHGUnqVF58$acxE+({S{7(T)A`!oy*o& z*J!Hdx7oHv9V{YcL~VU_^{K#}iN*7z1?|5Zh0K%v#!IK+RyGox<5+oKH=)U%RW9?r zQHg=yaH#ltGKz5@(1i8*&HeMfG|zfMT048ba}AaH{~{4AEelezQlgN#GfL$|Wi~6l z$Y7$}B#t0aN=xX0?d$cdz0dr-Y_OrVr8+It)-Oi_}G zs=+;Xq`nx*(*CkfpJuR*{Ony{qiWZ5{r$9q376WuguhzgMR&NZ*K=W9*JHK`1*OBC z2J#a!7bkH)ATaSxs^h$O!HL>&tlE{8^xfn?EKUZuPbwS^+yb8P2O!^x0BH@Ov_MRG)gjAcMT_A#ab#D~}mm(mt8B z`qf&8e~f*7hf9H1t^?NV(9p0jLTz4_b?4Qxg*_i3*lW!*(Jbk4Dw3x!0Kvx={-uf2 z`-KzaEBY<}?_Z~q@HV$gLqNT+#}}}ZTRi>3VJC38Ki1NWQy#sN8I!52u`qwcg7m5B zbm_<3%SeDSy5027fZpxGG;vATo;KpCUxM>+V zi+hO6C~4`qdyDJl2nOtY6Vfn{6}N>7TZsAEQb+QvkBi+%2(}-zqp4hoBjWJ9KGYp{;n#8}vTLZ{ zybXL*D)U%z`>FRt_Y8J?tbyvUrV2gMvr|ek*u|MlbciJ~y7Cz0+V0aC-}T zo}r97U8txyxXEWkv?9UMS!a<@RUj=XK2>-*f=WDYgKzBpxBIE(7pY~Yt&u*@eAdQe zNfVQXNG3BQ8DUUm)pzhIZW zEYxxnfp|AyEOYm)joxcz`fdI-(Uxy|6h|<4A;H*MlXtAYxS?gDn-VXdGoZ9T6pW91 z-%x#(+HfbMKoD?oTK4*X8cBOV7_9dxjoNrD(?lX)w2mgn zs_@bu;$Q;*X2Z? z6AX-PFOTTrb93@4E>rmYXsFHRrO!r6^p&MVFt6n<`STG$!qbz_mGlK6`QZz=WVy|yNiR|;B%%#ej|Q<%xJ)N+f`!Xrvaenw0AnBT#U9pvr zfP_^YRi9eKafqs|{5eWSydpbp(pXF4Df6{80U7TO<$Qu13FtIYH7$<@3?R~$!O1>IE>zS)M zv5KR|=^Se%-u)QTjxBedVcamwEB(_PgLzFna#qFAw>-qrx0d7IISPttwxpG_H@lkW zLSqh5fr`V_^A(E)1NG|~j~_yuA=95zHtBy&YZdxGe>soKG_kMKlfS*$uok7_ot0ZO zmIsCPgsqrq$IW1#=}wa25Cd=EPHKQ4UGM^o#j(HLfCNvq%?%P#0KstN85MfWyXBr&dg8tk1bXWT;i!=B32%IUvY>9ULkiKr>6s%C6LocODZFRK&873=hxm~@yS z%GzQo&dVdarX(o3D!*D_IAFlyGQQY%1&au^Lb`*$aZ}zg);#>*Ec}WQd>y-nsq>mn=;6ROUY5S3%NKm2J z<-J{GQH7m39YgC?uG8Zb{0YU9>S*dRj4@t%b#e=;CtwD;b)H%R+p3l+JyxUw5)@3- zAZ#5NkcIc6=mmkaRgdNn513)le`#=P6tpFfuMhdHDe~AxlZS#}NbkS!FS(}cm^_W~ z$RW=6^J^Vj>Li`6uGm`Nj3x0e+nt&IilP*C=Q+e~zB@bLbiH-hSEPiSg8L6N`EN`& zaEz$tEs~BOHs`Rl-Ct4{iZ?k7U^W|Spw6Ej5uubaI7>}YWRsFiph2}Vo_5*WEhB823og)OG<=^hyziM2{FBzg&mrnQQ78dxgA}GlZyeglt;nADp{wd ztmb2pBEQFNxW80G-XGt|wbGZH+RhOBm$D7xR`9zHUY%ilh@moqF zz__@PW2^e)5g}SF9u8E9uU`0JQuon+WG_j8w}a{cC7@D{NQ8Ko1i?4fiJZJZ{SP?N ztT3CKWoyoYoMqS!EMW5z-C2h(!PN%^GDlj{k(f9fjKTZ$gF?KYC3bdn7A_NQPE`dO zBsp}Gtt3@;yGn6n*d9>Zoca|cD68=2<3kx83J7>%ASOO6KpVLONQto3O1AkbLL>b9 zfGY^gr(#tcipQdRU98!WlA{vVRE*fn%Ei-#s6V!=;Mz=jG6OR0fQH(-k5bBfG`C=9 zu#uJLF{2#50v6~m@6J?J;{qZF!CLjGR%B?*cf4JJdm5Sm!0rMK0Tz&sixEo?8qMt! z2!O|}H3dZnzaWcA(R|E{6|iV-NpkJjGbiNn9Coy~!vbM{{CH6pU>qM2FLiPGJAU3} zzRhv#r2f=SYLG&9sG!uG-On|HC zHwE)ocw{`l`z=F;QA3IbS_l;^!bQ>O{cPaKbFw$1>2 zti*CRwvH_!T7XTzCw@hO=pUPlafImnnZ=f|fS^?3B_%73;apaz+$A6k4E2AF;z+pO zHqb3OPA2IWc&R2z_oTmT4hXzG3R`eaCU8|sBD7ob8Esk={pV~nKb}?Vurci^u~4mH zZIuKoEtwqZ=La*r&un~nY2`4^08W(1tg32dq$DNjIxHj-b0)>-E1C%s-k_YSDUpv? zo{xMl(ryL2Ep;<}6!MkqG};;MELvx|vaC-Om%@#*-fwM=(^wrDqXJ3K#>0g)2;hBXwyUc;&RucM%tM&la6=Fq zpCWauC|%yY+oPXC@n2<-m|?oa{9WqxpZ22(G4vu3_B@wi8Sar6JFdE>1o@N9&fB_O zD?{j{c6utsTiJ41955eAHwm&fyO=z%W6-E`Q%#=D)=vv`rSc3WY z+`_7`A635UA6+5{u&t?R5JJBTLFFf%*toV!ND58CC`qw&2zZURthu_HC9S!dxtMKt z?9pJ+ba3gRo=gRnk93=TLF%!m2?SFuO?_Q&*55JUW_G4LKpkcw)D2Pp8s;Sd|6QhU zcaO^m+|LPbqsPBim~!I!*qiuF=VJ$t=zBPjbT4rl5f!|?JRZG}o{*o9o#sk}$LVx& zF4sp$nZ@_k?Yt-;fSqTtJm(Yps?HPk#EV3%KiPgC*~Tom5D%A5UGhy^eAWG-ba1w~ ztt2dt0sqqz3?WZ>nvxKY20s3uv#K-C{M7lQBkQ{CuBNFsZi%mWdX<6s6F#&TY6c@7yKo%ew48Uc?c>&Hf}eaN2GLbmP7lpkrF z;x9L{e6u;QL@&jHY@iFp^~4v~F)AD`czD=IDZc_!1m@R$`qP4Kdj#K~Jf&gb)vonW zFrKU1^pPLL^ZDt&ThFbpjY&m~+#qRY9&$dM{ie%wz(++@!=#6EB1CU$0!!pIEF+_n z1%{{DEuO0M(0?>`SYG03=5!&3I)q?1_6;s+Pd1vdAxNDC^lg=kP^^v&GS?nYkK~83 zr@{CNnDy{aI8aBi=xHwUG;=#|vw-qVs+qiSJ4#sjH}pTxUrmEnQ~Ea6Qp9w(6+B7# z)2z<;99)W$X&8U%G5ZWxq8qsov{5NoqR~fbes}DD32xge@d}Cx=XWk)x*mr}`DKlv zj?rV1rt%Y_v;2}$_nPIlBg(R?Cn_pB?=*Z5yf9158&yTnM zBGmx@$Rs&EJ#X-Rk{po$oxyua27YxORajYFamY23hMb< z+xuaWXil!hlZmdWfxAu*3r*WgQE#0-iMw-^tfh!3wTEd`7Tad znXk8td`!)7BBZg}=5hw%+b!9j@(u)V;Gw}U-5Z$I7U2bc0xn!P=WBvbd7+4|rhW#W z&qlX9U}KTseg{PF+Aj__cf0$oQ>zF|;AiA3iML}BXkkJ!GdwuBAMGvWDAi;5JWE~8 zR$SoVT36r`RUBm^gS_v)Jx{sv*zums)+G?4*Xt`5g|6}oWRtK!9qp{(lyRxx)wwTC z)n&oM?iKKJjvH4I2mHhd>eJ_a;O};|4vuhSjP~q(9v&-MXg{}pqLt&o{AqLUE0ou; z5fA2XW!O1xjh6AcW>?n1tLW)OCYkvahYEMzdNipiS!_c7tL?OIRm%M4WSxfgq)jY4Drv_sUT!UBWT>oGfxt*B(ex6JKs zCZuPjt%1AuH;b?oVUzqUX!RQUX~IjfRf}!QiTAN{@Ojw+q3HP&m-%MXq#C zS1!vn-a66mPU8&+6NLENqZ8w_xyKdEU&~M1<8a4yTA8d0WxRe0CmjEyk>k|ADz1TV zNIiP7`anV3#W;f2{kK*vS3vBXU+i?}O;z0^u!mTk|&~#Z^>j^m;(=hUzR8}EV z`54xbj=lX+yO)6pW&KU^Fb z(|hby@OR>8k$5u`IGbh_%t$?zKDgSn^U%kV-qtKrlZDN-iX=%v70Co66e^$0>5NBa zv0wz%06~#IHx44G{7(_OV07P`#RFfjsn+KsM>H}mt$IcBAuIvDx`@K~FnEy$@?@7^ zhGDz6c|V0UMdna#q@W^hRI2{wLR==z1%jz`5Vd3y{&M|xScu229(AWn;G`|PQ5oy^ z9KZv0YU0(Fl-1>19C)8Kk8%Vh)}$Fh)}W#5-Qz+nj5)GsBxH`Y-^U47%A$6vN58%W z$UWC4>VV}ZDc+4+bo0X1i*I6a^DnisGB<8bspr@-N@%aM4)D|)9VC50N2_D>*H95r zpOJc)kp3Ai5@kdR#TJ-+L1wYG>6+Odf1|i!m0Q`yC2uy}f6_dkhhZ!F?2jR(xm=^T zbC*t;!Uc`*T1IqVtf|=y?)g&pT%E^r(8rK!za^D`lLnPQ29nHIC5Ef8@dW2|UJVv; z@=+C|&EVirbfgB6L_oGv{(9?nX~RiVeZSE|KigPCB5CFn2(z+O@<7IFE4Lgx(8b15 zKk;M_zl@MftmCIDD~0Ps0?8}Nn_Fz7fELUG%odAwx?{r?3=lzNkIUjc`*wuqwy2U+hHFQ`y2?De^X!^p+3U5C?mc7-$hlrCX5i6#RyxG*y?qP)LUoMsw2uPLuAT-0C zjgtT94$TKhC7`0_Af1Jr92pkIW~Du^8Tf^X3#NP6u9fG5WDfY>0uA0t8vUxtAu!c- zDPqo-T#V;(7Fu$4lq30Z;x|r?Cu=P}=DXAZ-mlf7Lw$%8NWgwtuylDUuTANCRMF?5 zS=+T?$ZbY1DZJ4=IEyU5@Jmtp*n(Zzz+#Kb)$A!Q^uLMREbTkU&hh@)7Ms^i+l!@& zO;>LYAAeNS%RIFC)6&`rpi$#?-|lUW=AyiEXXU>Q_&a`R@jI_aRlCvU#8CL>5jWk$;R?>m4WBTgqA9$ZHY`(X0k{gP3WmUt6Nx82GBqL#*VR)bYU;WCAfAct?8~QH2uH!T>Udw+5?R6w#CqiJhkyYJ6E!h9K&BrwP!w*O3p6z^^8@02$CA4$t2>oFB;IF z=$4S$`?4k^0+;&n@FBt~S57BB`P{;YlOS=`M|-5+bRK6ACeN$wSeLiy*G_??6le3D z>yhCIS&lflOh=j*2fbE<%zz(w%^7bxxUwQr$HV+Hz6q~UVB4Sd7InKOA~E+@eIk~t;;(1uLw{=(a2HV zGx6eN#Y#%@*`)f+c=3u1F;-4a4`|Ro0E2TZfNX+hA?oZ*^XUo}nmrDRL@+o}N>q_t z#=_hmNdAbPE(CsvW&8;S8s~R5b%JE+?k~wI_3rJ06JliF8qLsI|Mn@CW zhK|z?UK-}#Bdn;%peBY854#r%D2qRhG_QAD0$C2QY@vbFM+IQQ)&{G9|GJeXDG8o> zc3TsZwf@n;-uir!N-p9j{#YKn!BDGSHW+VjP^_3_jJgFB*@ zQrVZMn(}&3bpO8UmYI^;*jL%Z&$TsmZ)D~Q-up5Kvh_;1K@13YQ><0|8LHt_d+l}< zfUa+Oaq;uv;SGMvgY(pkUwwhEzIv^V>$m*uqfkEnD(8z}>`)@txLlTznf8I#B*P!% zkt;6=9a(mpR2?Z{9IeGl)Wum5j$i8RyGngQL>mfOArz(@+aL_1}v4 zwe!E_Nyw#t-ke-1(Z0J5r9Rdz)8nQj?%ZJPbUjnkqUkMePIC2vd!T>#b(So6?nm0c z2G;chW^EUvr^cx_s5gEnzbafMYEAIo#oZKCJ5-){WLER0g~HgtnZ#-eY@mS;`KsU& zhGn1kQ6fS6y%A|aB0+ivB>CdNyz>8l<20X4GqmtKIK1P0E1Q{a({5Wn957htjo2n% ztyvJieBc%~C!umTen|Y%J~9_ytCbWPiTb%<;G5D!A7QgXEy>yT&W!}EzsIRY3(ILf z0<W}p9?xeI5iN6D zx?(hH$8v&5SuDE^SAbVDo{~`Ku|W$hhMbJm|TJ{$d$*&iu!>9=1%V@m-_e1RxF&H@HjhL`(%RY54HM`o&kaUotr zt+k4|=;pSJ#J1t@Cs##k`5n#Pk>`f|V7fd*RKnE;EqNz$-Yt}f!`9eQC?Ujc6teL1 zZyUep@Z@7%cp&Z zw0Jw~fdoZ&Rc42)Dx`T(qS&&1-c7V*apOZuIqeEu9ZqukwzQ58Nr+)V(MY*(dT?aK zAW5}~-(W2xxQ}>0&t~uk<^#(NNsE3$v3=6i)>PIia5*{}HF9k2XS^uZuJ&~lMoR_nN4jT?oiAbIhqkJJLq!I$dGCFmZe z^iTs}kwf#&hK3|jyde{~yo)%TF^qFkWFMGf; zW|n9)3-iMlu45sDk)6aT-x#5z-+rJ_$Zp5^B#c4^61+(%oHW^5=xBLrBLH`J0xseO z+VznrX{gtqq|xlD#-v9|47hn*0(@bz7~1`Z_7olRh02@8(Ql!`G@*gff7vWkJ*;FFkurajTR+ex0pShw2q37C zta{LV2lyw8@((s-(ClDw`T8IRad&Cj!h)V0DS9p&4SC$;X#a2hE2eEM%q8pSySmd z>zCt;F^D*}Rw2J@ju;#Eft)uZ272|E6kA%#EU0mbg^4V7$9?m6bR+)*Y~>+X4;zi? z;<6DOU8xbCS|f$ScE{9)osnK_t|hLC>dZCi=E}noW@M&GQlDYKmx2#5v{8=~1kcGVc_nmC z%rf+Bb`J@bgG1xxbv^7n!vB8u?Q>6MBK$(A!J^)WyDtr!Xah{#3~y{Kx-E`!lfDeg zbZ)z|Rl$RYEpnma-c2t3yAIrR>UsGmhto4Z5d+cUHdld}3Y+$a)@ zM#~`SU#TfzK(XsHI0uQexeI|{7DIdcPOG}oua!>iC<5kHMk`0X@cn#VNfXI7X1yvr zob(DROm)pl<;1`ZsrqW)35SH;3cJsx>)9Ct zcnu~Z%LBr0J&kdE5m`sVGDyU3WRm@_t(hec4F4P`G+u{H2ib!IRsN&j_}t=okPG|o zr%eV&S-Pz;&0-;$;U^FX=3PouNV$pLN$qA_sU@FX7K{Vt5B+$Q8tV^@T>iC(sZ>mt z5ba5AjS@)4as^^Fk>E(FsfXs~>h?<2EiEmboSck}$@up*BTGw50WNQEU*D?&RKB8x zpkQYRCMDpeH=~!vE3CHh@-WV^c>uT4ZxeFp`hBMzyLM{%1??3qlPKT~STvzS52uz^ zfrZ&Oq|D1?T5Duv8c?Qu3zRo(G#^&!^p7}E!ie*B9TNq%h zqC0ODQsenPZX<)>+lwu>5ND?%nO!4c_gr59lNl@MieTm!T(LbciUHe&wRoiEnSB1RqoZ+Ej|OVB>od?aqIj!9&LymN6-wF{-N-_GdlMFK-?a$x1c^^nyKhqT z*2k!4;!WgIc-b0$FwlG6J@#7MXR47ro{-o0+a0Kx=!T?K>Bp(}P>r>6dya=HGJBg5 zJv&x8l{RF2c4)djV(;9@?4m*MWVvO(9ao_)dJvD`Q zFO2tBYp5T)vT6tRLSEg8yU-3lrt&b8J#aTSP67+HJCJ)_@bc$D4p`DevG9H=ld*ZEoo~@q0NzX)=h@i^U?Oe{*ain9X6& z5R6ZdNa!jfs%&}u+Y+19Tosiy2Z!ZugXr{P^HM4Gl;6sM;{z0`{BC>`t<1{dmSW%k zjl(N}h0JT(DV7+$M)hBS#tqPT;cg$iynE!3;Cgy`eh*n|Wbk1iCF&$)y6AYn^%vUU z<`J=nY)!7TZIPxiI-MWPxfvmAE}>YPJYQRrwV0jzJyiDpzjO0(J0Fu_eF75OZD*~x z{Sp)B!*Ce`gh|%#7qdij zGrj6BuUzg>=k1Rnx^hYt^_l8)i9hm@xzK)hZC*e6yfz=5oQNQZ2n$~@FZ`0n+S}T? zgoguSRe^Na{yM{VXkNmoG1Hx2olKC5LESeKBYDHc0ZSG)09pZX0B3vFPj^`z1YPd` r@6P{+P5rN^{`b9sPsTeu2=xArA%|~s;ydaA0uCuLSjMK From e3d3bcb2836aae2386728ef56c839579a92830a0 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 11 Oct 2021 21:06:03 +0200 Subject: [PATCH 019/186] Issue-#701: WIP Architecture diagram --- content/concepts/images/architecture.PNG | Bin 23963 -> 24047 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG index 757eebd82f9ddc150a85112aba4fbf59403a4dcc..d5a5d0850935778eb6de7adef13d335e3bb847d4 100644 GIT binary patch literal 24047 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 IozAEK6KbVm;s5{u From f58e919bc723c6c4a504ef52107529933dd3418f Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Fri, 22 Oct 2021 11:37:44 +0300 Subject: [PATCH 020/186] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1ec28db6..94d24e69 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -418,7 +418,7 @@ event MetadataUpdated( ); ``` -Aquarius should always chech the hash after data is decrypted(provider api called), in order to ensure ddo integrity. +_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. ## Full DDO Example: From 66c20850a993152e9ebff1663202dfa07ed89b62 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:11:24 +0100 Subject: [PATCH 021/186] rewrite & reorder --- content/concepts/did-ddo.md | 419 ++++++++++++++++++------------------ 1 file changed, 211 insertions(+), 208 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 94d24e69..93d81eca 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,13 +1,13 @@ --- title: DIDs & DDOs - Asset Identifiers & Objects -description: Specification of Ocean asset identifiers and objects using DIDs & DDOs +description: Specification of Ocean asset identifiers and objects using DIDs & DDOs slug: /concepts/did-ddo/ section: concepts --- ## Overview -This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. +This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. Decentralized identifiers (DIDs) are a new type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. @@ -16,29 +16,28 @@ A DID Document (DDO) is JSON blob that holds information about the DID. Given a If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. -DIDs and DDOs follow [this specification](https://w3c-ccg.github.io/did-spec/) defined by the World Wide Web Consurtium (W3C). +DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). ## Rules for DIDs & DDOs in Ocean -- An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -- An asset should have a DID and DDO. The DDO should include metadata about the asset. -- The DDO can only can be modified by _owners_ or _delegated users_. -- There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. -- A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. +An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). + +An _asset_ should have a DID and DDO. and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. + +There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. ## State -- Each asset has a state, which is held by the NFT Contract (and is also stored in the DDO.status.status). The possible states are: - - 0 = active - - 1 = end-of-life - - 2 = deprecated (by another asset) - - 3 = revoked by publisher +Each asset has a state, which is held by the NFT contract. The possible states are: +- `0` = active +- `1` = end-of-life +- `2` = deprecated (by another asset) +- `3` = revoked by publisher -## Flow for publishing / retrieving DDOs +## Publishing an Retrieving DDOs -- The DDO is stored on-chain. -- It's stored encrypted (using the private key of the provider). To resolve it, you must query the provider. +The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. Here is the complete flow: @@ -57,11 +56,11 @@ Provider -> Provider: depending on metadataState (expired,retired) and aquarius Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO +Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` ![DDO_flow](images/DDO_flow.png) - ## DID Structure In Ocean, a DID is a string that looks like: @@ -70,22 +69,22 @@ In Ocean, a DID is a string that looks like: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -where "0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea" = sha256(ERC721 contract addres + chainId) +where + +```text +0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea` = sha256(ERC721 contract address + chainId) +``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). - ## DDO Attributes +A DDO has these required attributes: -A DDO has these standard attributes (required): - -- `@context` = array, contexts used for validation -- `id` = string, computed as sha256(address of ERC721 contract + chainId) +- `@context` = array, contexts used for validation +- `id` = string, computed as sha256(address of ERC721 contract + chainId) - `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 -- `updated` = contains the date of last update, ISO Date Time Format -- `proof` = proof of ownership, optional - +- `updated` = contains the date of last update, ISO Date Time Format In Ocean, the DDO also has: @@ -94,33 +93,31 @@ In Ocean, the DDO also has: - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) - `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) -- `status` - stores status related fields [Status](#status) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) - In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: +- `status` - stores status related fields [Status](#status) - `event` - stores the last event information [Event](#event) - `stats` - stores several fields for statistics [Stats](#stats) - ## Metadata -The object has the following attributes. +The object has the following attributes. -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for.| -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. -| **`name`** | Text |**Yes** | Descriptive name or title of the asset. | -| **`type`** | Text |**Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text |**Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text |**Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47)| -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | +| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | +| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: @@ -128,37 +125,32 @@ Depending on the asset type (dataset, algorithm), there are different metadata a An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -| Attribute | Type | Required | Description | -| ------------------- | ----------------------| ----------- |--------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | +| Attribute | Type | Required | Description | +| --------------- | ------------------ | -------- | -------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | The `container` object has the following attributes: -| Attribute | Type | Required | Description | -| ------------------- | -------- | --------- | --------------------------------------------------- | -| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` | yes | Name of the Docker image. | -| **`tag`** | `string` | yes | Tag of the Docker image. | -| **`checksum`** | `string` | yes | Checksum of the Docker image. | - - - - +| Attribute | Type | Required | Description | +| ---------------- | -------- | -------- | ----------------------------------------------------------------- | +| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | yes | Name of the Docker image. | +| **`tag`** | `string` | yes | Tag of the Docker image. | +| **`checksum`** | `string` | yes | Checksum of the Docker image. | ## Services -| Attribute | Type | Required | Description | -| ------------------- | --------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds.| -| **`files`** | Array of files object |**No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | - +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | Depending on the service type, the following attributes are applied: @@ -166,31 +158,38 @@ Depending on the service type, the following attributes are applied: An asset with a service of type `compute` has the following additional attributes under `privacy` object : -| Attribute | Type | Required | Description | -| ---------------------------- | ----------------------| ----------- |---------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | +| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | +| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | +| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) | +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | -To produce filesChecksum: +To produce filesChecksum: ```js -sha256(algorithm_ddo.service['metadata'].attributes.encryptedFiles + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) ) +sha256( + algorithm_ddo.service['metadata'].attributes.encryptedFiles + + JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) +) ``` -To produce containerSectionChecksum: +To produce containerSectionChecksum: ```js -sha256(JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.algorithm.container)) +sha256( + JSON.Stringify( + algorithm_ddo.service['metadata'].attributes.main.algorithm.container + ) +) ``` Example: @@ -269,19 +268,18 @@ Here's an example object with both `"allow"` and `"deny"` entries. } ], "deny":[ - { + { "type":"address", "values":[ "0x2222", "0x333" ] - } + } ] } } ``` - For future usage, we can extend that with different credentials types. Example: ```json @@ -291,29 +289,6 @@ For future usage, we can extend that with different credentials types. Example: } ``` - - - -## Status - -The `status` object contains the following attributes: - -| Attribute | Type | Required | Description | -| ---------------------------------------- | -------- | --------- | --------------------------------------------------- | -| **`state`** | `number` | yes | State of the asset (see [State](#state) ) | -| **`isListed`** | `boolean` | no | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | - -```json -{ - {...}, - "status": { - "status": 0, - "isListed": true, - "isOrderDisabled": false - } -``` - ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -322,7 +297,7 @@ Each `file` object has the following attributes, with the details necessary to c | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** |**Yes** | File format. | +| **`contentType`** | **Yes** | File format. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | | **`name`** | No | File name. | | **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | @@ -333,9 +308,9 @@ Each `file` object has the following attributes, with the details necessary to c | **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | | **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | | **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. +| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | -Exanple: +Example: ```json { @@ -352,28 +327,86 @@ Exanple: } ``` -## Event +## DDO Hash -The `event` section contains informations about the latest transaction that created or update the ddo -This section is auto-completed by aquarius. +In order to ensure the integrity, a hash is computed for each DDO: + +```js +const hash = sha256(JSON.stringify(DDO)) +``` + +The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: + +```solidity +event MetadataCreated( + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber + ); + +event MetadataUpdated( + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber + ); +``` + +_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. + +## Aquarius Enhanced DDO Response + +The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). + +### Status + +The `status` object contains the following attributes: + +| Attribute | Type | Required | Description | +| --------------------- | --------- | -------- | ------------------------------------------------------------------------- | +| **`state`** | `number` | yes | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`isListed`** | `boolean` | no | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | ```json { {...}, - "event": { + "status": { + "state": 0, + "isListed": true, + "isOrderDisabled": false + } +``` + +### Events + +The `events` section contains informations about the transactions that created or updated the DDO + +```json +{ + {...}, + "events": [{ "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "blockNo": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", "update": false, "chainId": 1, - } + }] ``` -## Stats +### Stats -The `stats` section contains different statics fields -This section is auto-completed by aquarius. +The `stats` section contains different statics fields. ```json { @@ -383,45 +416,7 @@ This section is auto-completed by aquarius. } ``` - -## DDO Hash - -In order to ensure the integrity, a hash is computed for each DDO, following the next steps: - - - remove `event` object from root (if exists) - - remove `stats` object from root (if exists) - - hash = sha256(JSON.stringify(DDO)) - - The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: - - ```solidity - event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); - -event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); -``` - -_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. - - -## Full DDO Example: +## Full Enhanced DDO Example: ```json { @@ -431,56 +426,64 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ "updated": "2021-05-17T21:58:02Z", "version": "v4.0.0", "chainId": 1, - "metadata":{ - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms", - }, - files:{ - "files": [ - { - "contentLength": "3975", - "contentType": "text/csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - }, - "services":[ + "metadata": { + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + }, + "files": { + "files": [ { - "type":"access", - "name":"Download service", - "description":"Download service", - "datatokenAddress":"0x123", - "providerEndpoint":"https://myprovider", - "timeout":0 + "url": "https://demo.com/file.csv" } - ], - "credentials":{ - "allow":[ - { - "type":"address", - "values":[ - "0x123", - "0x456" - ] - } - ], - "deny":[ - { - "type":"address", - "values":[ - "0x2222", - "0x333" - ] - } - ] - }, - "status": { - "status": 0, - "isListed": true, - "isOrderDisabled": false - } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + }, + "services": [ + { + "type": "access", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "providerEndpoint": "https://myprovider", + "timeout": 0 + } + ], + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] + }, + + // Enhanced Aquarius response begins here + "status": { + "state": 0, + "isListed": true, + "isOrderDisabled": false + }, + "events": [ + { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1 + } + ], + "stats": { + "consumes": 4 + } } ``` From acb3e2c9f00e56051e6302097b5ddf61fdc39deb Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:23:18 +0100 Subject: [PATCH 022/186] metadata.links changes --- content/concepts/did-ddo.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 93d81eca..204bcf68 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -9,7 +9,7 @@ section: concepts This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. -Decentralized identifiers (DIDs) are a new type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. +Decentralized identifiers (DIDs) are a type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. @@ -18,11 +18,11 @@ The combination of a DID and its associated DID Document forms the root record f DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). -## Rules for DIDs & DDOs in Ocean +## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. @@ -105,19 +105,19 @@ In addition, Aquarius will add the following objects, which are not taken into a The object has the following attributes. -| Attribute | Type | Required | Description | -| --------------------------- | ------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | -| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of Link | No | Mapping of links for data samples, or links to find out more information. Links may be to either a URL or another Asset. We expect marketplaces to converge on agreements of typical formats for linked data: The Ocean Protocol itself does not mandate any specific formats as these requirements are likely to be domain-specific. The links array can be an empty array, but if there is a link object in it, then an "url" is required in that link object. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | +| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | +| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of string | No | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: From cd47fd60c34bc3329e550b8c3204ed3897ee93c6 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:33:01 +0100 Subject: [PATCH 023/186] json formatting --- content/concepts/did-ddo.md | 174 +++++++++++++++++------------------- 1 file changed, 81 insertions(+), 93 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 204bcf68..615e5ddc 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -89,17 +89,11 @@ A DDO has these required attributes: In Ocean, the DDO also has: - `version` - string, stores version information (example: `v4.0.0`) -- `chainId` - integer, stores chainId of the network used +- `chainId` - integer, stores chainId of the network the DDO was published to - `metadata` - stores metadata information [Metadata](#metadata) - `services` - stores an array of services [Services](#services) -- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) - `files` and `encryptedFiles` - stores file(s) informations [Files](#files) - -In addition, Aquarius will add the following objects, which are not taken into account when [DDO hash](#ddo-hash) is calculated: - -- `status` - stores status related fields [Status](#status) -- `event` - stores the last event information [Event](#event) -- `stats` - stores several fields for statistics [Stats](#stats) +- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) ## Metadata @@ -195,49 +189,43 @@ sha256( Example: ```json - { - {...}, - "services":[ - { - "type":"access", - "name":"Download service", - "description":"Download service", - "datatokenAddress":"0x123", - "providerEndpoint":"https://myprovider", - "timeout":0 - }, - { - "type":"compute", - "name":"Compute service", - "description":"Compute service", - "datatokenAddress":"0x124", - "providerEndpoint":"https://myprovider", - "timeout":0, - "privacy":{ - "allowRawAlgorithm":false, - "allowNetworkAccess":true, - "publisherTrustedAlgorithmPublishers":[ - "0x234", - "0x235" - ], - "publisherTrustedAlgorithms":[ - { - "did":"did:op:123", - "filesChecksum":"100", - "containerSectionChecksum":"200" - }, - { - "did":"did:op:124", - "filesChecksum":"110", - "containerSectionChecksum":"210" - } - ] - } + "services": [ + { + "type": "access", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "providerEndpoint": "https://myprovider", + "timeout": 0 + }, + { + "type": "compute", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "providerEndpoint": "https://myprovider", + "timeout": 0, + "privacy": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ + { + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] } - ] + } + ] } - ``` ## Credentials @@ -248,39 +236,34 @@ Consider a medical data use case, where only a credentialed EU researcher can le This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) W3C Verifiable Credentials and more. +Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials]() and more. Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they cannot access the resource. -Here's an example object with both `"allow"` and `"deny"` entries. +Here's an example object with both `"allow"` and `"deny"` entries: ```json { - {...}, - "credentials":{ - "allow":[ - { - "type":"address", - "values":[ - "0x123", - "0x456" - ] - } - ], - "deny":[ - { - "type":"address", - "values":[ - "0x2222", - "0x333" - ] - } - ] + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] } } ``` -For future usage, we can extend that with different credentials types. Example: +For future usage, we can extend that with different credentials types. + +Example: ```json { @@ -314,15 +297,14 @@ Example: ```json { - {..}, - files:{ + "files": { "files": [ - { - "contentLength": "3975", - "contentType": "text/csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + { + "contentLength": "3975", + "contentType": "text/csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } } ``` @@ -379,41 +361,47 @@ The `status` object contains the following attributes: ```json { - {...}, "status": { "state": 0, "isListed": true, "isOrderDisabled": false } +} ``` ### Events -The `events` section contains informations about the transactions that created or updated the DDO +The `events` section contains informations about the transactions that created or updated the DDO. + +Example: ```json { - {...}, - "events": [{ - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1, - }] + "events": [ + { + "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "blockNo": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "update": false, + "chainId": 1 + } + ] +} ``` ### Stats The `stats` section contains different statics fields. +Example: + ```json { - {...}, "stats": { - "consumes":4 + "consumes": 4 } +} ``` ## Full Enhanced DDO Example: @@ -447,7 +435,7 @@ The `stats` section contains different statics fields. "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider", + "providerEndpoint": "https://myprovider.com", "timeout": 0 } ], From 691bf708818efe089e0d7e97006cd6956d8f6ec8 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:55:05 +0100 Subject: [PATCH 024/186] add nft to enhanced DDO section --- content/concepts/did-ddo.md | 110 ++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 615e5ddc..c35dd92b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,5 +1,5 @@ --- -title: DIDs & DDOs - Asset Identifiers & Objects +title: DIDs & DDOs description: Specification of Ocean asset identifiers and objects using DIDs & DDOs slug: /concepts/did-ddo/ section: concepts @@ -13,8 +13,7 @@ Decentralized identifiers (DIDs) are a type of identifier that enables verifiabl A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. -If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. -The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. +If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). @@ -113,17 +112,15 @@ The object has the following attributes. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -Depending on the asset type (dataset, algorithm), there are different metadata attributes supported: - ### Algorithm attributes An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: -| Attribute | Type | Required | Description | -| --------------- | ------------------ | -------- | -------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image.(see below) | +| Attribute | Type | Required | Description | +| --------------- | ------------------ | -------- | ------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `Container Object` | yes | Object describing the Docker container image. See below | The `container` object has the following attributes: @@ -136,38 +133,37 @@ The `container` object has the following attributes: ## Services -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **No ** | Array of `File` objects including the encrypted file urls that overwrites the root files object for this service [Files](#files) | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-ralyted privacy settings. | -Depending on the service type, the following attributes are applied: +### Compute Privacy Attributes -### Compute datasets attributes - -An asset with a service of type `compute` has the following additional attributes under `privacy` object : +An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | yes | If True, a drag & drop algo can be runned | -| **`allowNetworkAccess`** | `boolean` | yes | If True, the algo job will have network access (stil WIP) | +| **`allowRawAlgorithm`** | `boolean` | yes | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | yes | If `true`, the algorithm job will have network access (still WIP) | | **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` | yes | The did of the algo which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of ( algorithm's encryptedFiles + files section (as string) ) | -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | -------------------------------------------------------------- | +| **`did`** | `string` | yes | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | yes | Hash of algorithm's encryptedFiles + files section (as string) | +| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | -To produce filesChecksum: +To produce `filesChecksum`: ```js sha256( @@ -176,7 +172,7 @@ sha256( ) ``` -To produce containerSectionChecksum: +To produce `containerSectionChecksum`: ```js sha256( @@ -349,15 +345,41 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). +### NFT + +The `nft` object contains information on the NFT contract. + +| Attribute | Type | Description | +| ------------- | -------- | --------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed NFT contract | +| **`name`** | `string` | Name of NFT set in contract | +| **`symbol`** | `string` | Symbol of NFT set in contract | +| **`owner`** | `string` | ETH account address of the NFT owner | + +Example: + +```json +{ + "nft": { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000" + } +} +``` + ### Status -The `status` object contains the following attributes: +The `status` object contains attributes for marketplaces to implement various visibility states for an asset. -| Attribute | Type | Required | Description | -| --------------------- | --------- | -------- | ------------------------------------------------------------------------- | -| **`state`** | `number` | yes | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`isListed`** | `boolean` | no | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | no | If this asset has ordering disabled | +| Attribute | Type | Description | +| --------------------- | --------- | ------------------------------------------------------------------------- | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`isListed`** | `boolean` | If this asset should be displayed | +| **`isOrderDisabled`** | `boolean` | If this asset has ordering disabled | + +Example: ```json { @@ -371,7 +393,7 @@ The `status` object contains the following attributes: ### Events -The `events` section contains informations about the transactions that created or updated the DDO. +The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. Example: @@ -390,9 +412,9 @@ Example: } ``` -### Stats +### Statistics -The `stats` section contains different statics fields. +The `stats` section contains different statistics fields. Example: @@ -455,6 +477,12 @@ Example: }, // Enhanced Aquarius response begins here + "nft": { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000" + }, "status": { "state": 0, "isListed": true, From f505002fbabd11185eed3a29e0bfa37af2dc646e Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 12:59:20 +0100 Subject: [PATCH 025/186] fixes --- content/concepts/did-ddo.md | 102 +++++++++++++++++------------------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c35dd92b..b9f96cec 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -167,19 +167,15 @@ To produce `filesChecksum`: ```js sha256( - algorithm_ddo.service['metadata'].attributes.encryptedFiles + - JSON.Stringify(algorithm_ddo.service['metadata'].attributes.main.files) + algorithm_ddo.metadata.encryptedFiles + + JSON.Stringify(algorithm_ddo.metadata.files) ) ``` To produce `containerSectionChecksum`: ```js -sha256( - JSON.Stringify( - algorithm_ddo.service['metadata'].attributes.main.algorithm.container - ) -) +sha256(JSON.Stringify(algorithm_ddo.metadata.algorithm.container)) ``` Example: @@ -224,50 +220,6 @@ Example: } ``` -## Credentials - -By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. - -Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. - -This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). - -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials]() and more. - -Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they cannot access the resource. - -Here's an example object with both `"allow"` and `"deny"` entries: - -```json -{ - "credentials": { - "allow": [ - { - "type": "address", - "values": ["0x123", "0x456"] - } - ], - "deny": [ - { - "type": "address", - "values": ["0x2222", "0x333"] - } - ] - } -} -``` - -For future usage, we can extend that with different credentials types. - -Example: - -```json -{ - "type": "credential3Box", - "values": ["profile1", "profile2"] -} -``` - ## Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -305,9 +257,53 @@ Example: } ``` +## Credentials + +By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. + +Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. + +This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). + +Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. + +Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they can not access the resource. + +Here's an example object with both `"allow"` and `"deny"` entries: + +```json +{ + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] + } +} +``` + +For future usage, we can extend that with different credentials types. + +Example: + +```json +{ + "type": "credential3Box", + "values": ["profile1", "profile2"] +} +``` + ## DDO Hash -In order to ensure the integrity, a hash is computed for each DDO: +In order to ensure the integrity of the DDO, a hash is computed for each DDO: ```js const hash = sha256(JSON.stringify(DDO)) @@ -343,7 +339,7 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ ## Aquarius Enhanced DDO Response -The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and not taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and are not taken into consideration when [hashing the DDO](#ddo-hash). ### NFT From ae70ca79ca25021c878f250def79dd6ec5662560 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:20:15 +0100 Subject: [PATCH 026/186] consistent attributes formatting --- content/concepts/did-ddo.md | 57 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b9f96cec..303af609 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -21,7 +21,7 @@ DIDs and DDOs follow the [specification defined by the World Wide Web Consortium An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO and the DDO should include metadata about the asset. The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. @@ -80,23 +80,32 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO has these required attributes: -- `@context` = array, contexts used for validation -- `id` = string, computed as sha256(address of ERC721 contract + chainId) -- `created` = contains the date of publishing, ISO Date Time Format yyyy-MM-dd'T'HH:mm:ss. SSSXXX — for example, "2000-10-31T01:30:00.000-05:00 -- `updated` = contains the date of last update, ISO Date Time Format +| Attribute | Type | Description | +| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Stores information about the asset's files. | +| **`encryptedFiles`** | [Files](#files) | Added after publishing. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | -In Ocean, the DDO also has: +In Ocean, the DDO at its root has: -- `version` - string, stores version information (example: `v4.0.0`) -- `chainId` - integer, stores chainId of the network the DDO was published to -- `metadata` - stores metadata information [Metadata](#metadata) -- `services` - stores an array of services [Services](#services) -- `files` and `encryptedFiles` - stores file(s) informations [Files](#files) -- `credentials` - optional flag, which describes the credentials needed to access a dataset [Credentials](#credentials) +| Attribute | Type | Description | +| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`metadata`** | [Metadata](#metadata) | Stores metadata information about the asset. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Stores information about the asset's files. | +| **`encryptedFiles`** | [Files](#files) | Added after publishing. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ## Metadata -The object has the following attributes. +This object holds information describing the actual actual asset. | Attribute | Type | Required | Description | | --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -112,7 +121,7 @@ The object has the following attributes. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -### Algorithm attributes +### Metadata: Algorithm An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: @@ -133,6 +142,8 @@ The `container` object has the following attributes: ## Services +Services define the access to the asset. + | Attribute | Type | Required | Description | | ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | @@ -142,11 +153,11 @@ The `container` object has the following attributes: | **`providerEndpoint`** | Text | **Yes** | Provider URI | | **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | | **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-ralyted privacy settings. | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | -### Compute Privacy Attributes +### Compute Privacy -An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`. +An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | @@ -309,7 +320,7 @@ In order to ensure the integrity of the DDO, a hash is computed for each DDO: const hash = sha256(JSON.stringify(DDO)) ``` -The hash is used when publishing/update metadata using setMetaData function in ERC721 contract and it is stored in the event generated by the ERC721 contract: +The hash is used when publishing/update metadata using `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -339,11 +350,11 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ ## Aquarius Enhanced DDO Response -The following fields are added by Aquarius in its DDO response for convenience reasons. These are never stored on chain, and are not taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). ### NFT -The `nft` object contains information on the NFT contract. +The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. | Attribute | Type | Description | | ------------- | -------- | --------------------------------------------- | @@ -412,6 +423,10 @@ Example: The `stats` section contains different statistics fields. +| Attribute | Type | Description | +| -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | +| **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | + Example: ```json @@ -430,7 +445,7 @@ Example: "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", "created": "2020-11-15T12:27:48Z", "updated": "2021-05-17T21:58:02Z", - "version": "v4.0.0", + "version": "4.0.0", "chainId": 1, "metadata": { "description": "Sample description", From 3f80e563a14c2da12c2a4e1496254c6d42cb041d Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:29:30 +0100 Subject: [PATCH 027/186] more examples --- content/concepts/did-ddo.md | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 303af609..0e428ba6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -5,6 +5,8 @@ slug: /concepts/did-ddo/ section: concepts --- +**v4.0.0** + ## Overview This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. @@ -40,6 +42,8 @@ The DDO is stored on-chain as part of the NFT contract and it is stored encrypte Here is the complete flow: +![DDO_flow](images/DDO_flow.png) + ```text title DDO flow @@ -58,8 +62,6 @@ Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` -![DDO_flow](images/DDO_flow.png) - ## DID Structure In Ocean, a DID is a string that looks like: @@ -78,26 +80,16 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene ## DDO Attributes -A DDO has these required attributes: +A DDO in Ocean has these required attributes: | Attribute | Type | Description | | -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | | **`@context`** | Array of `string` | Contexts used for validation. | | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Stores information about the asset's files. | -| **`encryptedFiles`** | [Files](#files) | Added after publishing. | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | - -In Ocean, the DDO at its root has: - -| Attribute | Type | Description | -| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | | **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`metadata`** | [Metadata](#metadata) | Stores metadata information about the asset. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`files`** | [Files](#files) | Stores information about the asset's files. | | **`encryptedFiles`** | [Files](#files) | Added after publishing. | @@ -121,17 +113,31 @@ This object holds information describing the actual actual asset. | **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | -### Metadata: Algorithm +Example: -An asset of type `algorithm` has the following additional attributes under `algorithm` in metadata object: +```json +{ + "metadata": { + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + } +} +``` -| Attribute | Type | Required | Description | -| --------------- | ------------------ | -------- | ------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `Container Object` | yes | Object describing the Docker container image. See below | +### Algorithm Metadata -The `container` object has the following attributes: +An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: + +| Attribute | Type | Required | Description | +| --------------- | ----------- | -------- | ------------------------------------------------------- | +| **`language`** | `string` | no | Language used to implement the software | +| **`version`** | `string` | no | Version of the software. | +| **`container`** | `container` | yes | Object describing the Docker container image. See below | + +The `container` object has the following attributes defining the Docker image the algorithm needs to run: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | @@ -144,16 +150,16 @@ The `container` object has the following attributes: Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the sevice can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | +| **`name`** | Text | No | Service friendly name | +| **`description`** | Text | No | Service description | +| **`datatokenAddress`** | Text | Yes | Datatoken address | +| **`providerEndpoint`** | Text | **Yes** | Provider URI | +| **`timeout`** | Number | **Yes** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | ### Compute Privacy @@ -259,8 +265,7 @@ Example: "files": { "files": [ { - "contentLength": "3975", - "contentType": "text/csv" + "url": "https://demo.com/file.csv" } ], "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" From beca473cbdb5923c2e04bc4485ab5f7d2995601b Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:42:52 +0100 Subject: [PATCH 028/186] fix --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0e428ba6..2fb29ef3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -36,7 +36,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `2` = deprecated (by another asset) - `3` = revoked by publisher -## Publishing an Retrieving DDOs +## Publishing & Retrieving DDOs The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. From 96ed5e15fe867e32c101e54874011dd837d3ccdd Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:50:33 +0100 Subject: [PATCH 029/186] consistent table value formatting --- content/concepts/did-ddo.md | 102 ++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 2fb29ef3..928ae37b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -73,7 +73,7 @@ did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea where ```text -0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea` = sha256(ERC721 contract address + chainId) +0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea = sha256(ERC721 contract address + chainId) ``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -99,19 +99,19 @@ A DDO in Ocean has these required attributes: This object holds information describing the actual actual asset. -| Attribute | Type | Required | Description | -| --------------------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | Text | **Yes** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | Text | No | The party holding the legal copyright. Empty by default. | -| **`name`** | Text | **Yes** | Descriptive name or title of the asset. | -| **`type`** | Text | **Yes** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | Text | **Yes** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | Text | **Yes** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of string | No | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | Text | No | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of Text | No | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of Text | No | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | No | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | +| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | +| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | Example: @@ -133,33 +133,33 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | no | Language used to implement the software | -| **`version`** | `string` | no | Version of the software. | -| **`container`** | `container` | yes | Object describing the Docker container image. See below | +| **`language`** | `string` | | Language used to implement the software | +| **`version`** | `string` | | Version of the software. | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image the algorithm needs to run: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | -| **`entrypoint`** | `string` | yes | The command to execute, or script to run inside the Docker image. | -| **`image`** | `string` | yes | Name of the Docker image. | -| **`tag`** | `string` | yes | Tag of the Docker image. | -| **`checksum`** | `string` | yes | Checksum of the Docker image. | +| **`entrypoint`** | `string` | **✓** | The command to execute, or script to run inside the Docker image. | +| **`image`** | `string` | **✓** | Name of the Docker image. | +| **`tag`** | `string` | **✓** | Tag of the Docker image. | +| **`checksum`** | `string` | **✓** | Checksum of the Docker image. | ## Services Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | Text | **Yes** | Type of service (access, compute, wss, etc | -| **`name`** | Text | No | Service friendly name | -| **`description`** | Text | No | Service description | -| **`datatokenAddress`** | Text | Yes | Datatoken address | -| **`providerEndpoint`** | Text | **Yes** | Provider URI | -| **`timeout`** | Number | **Yes** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **Yes** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **Yes for compute assets** | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | Text | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | Text | | Service friendly name | +| **`description`** | Text | | Service description | +| **`datatokenAddress`** | Text | **✓** | Datatoken address | +| **`providerEndpoint`** | Text | **✓** | Provider URI | +| **`timeout`** | Number | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | +| **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | ### Compute Privacy @@ -167,18 +167,18 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | yes | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | yes | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | yes | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | yes | If Empty , then any published algo is allowed. (see below) | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If Empty , then any published algo is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | -------------------------------------------------------------- | -| **`did`** | `string` | yes | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | yes | Hash of algorithm's encryptedFiles + files section (as string) | -| **`containerSectionChecksum`** | `string` | yes | Hash of the algorithm container section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `encryptedFiles` + `files` section (as string) | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | To produce `filesChecksum`: @@ -245,18 +245,18 @@ Each `file` object has the following attributes, with the details necessary to c | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **Yes** | File format. | +| **`contentType`** | **✓** | File format. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | No | File name. | -| **`checksum`** | No | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | No | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | No | Size of the file in bytes. | -| **`encoding`** | No | File encoding (e.g. UTF-8). | -| **`compression`** | No | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | No | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | No | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | No | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | No | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | +| **`name`** | | File name. | +| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | | Size of the file in bytes. | +| **`encoding`** | | File encoding (e.g. UTF-8). | +| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | Example: From 3fe13e7b8c6429620aa0ce7fb7055c2602f019e0 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 13:53:49 +0100 Subject: [PATCH 030/186] move state section to end until we figure out what to do with it --- content/concepts/did-ddo.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 928ae37b..c118b305 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -25,16 +25,7 @@ An _asset_ in Ocean represents a downloadable file, compute service, or similar. An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. -There _must_ be at least one client library acting as _resolver_, to get a DDO from a DID. A metadata cache like Aquarius can help in reading and searching through DDO data from the chain. - -## State - -Each asset has a state, which is held by the NFT contract. The possible states are: - -- `0` = active -- `1` = end-of-life -- `2` = deprecated (by another asset) -- `3` = revoked by publisher +A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. ## Publishing & Retrieving DDOs @@ -353,6 +344,15 @@ event MetadataUpdated( _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. +## State + +Each asset has a state, which is held by the NFT contract. The possible states are: + +- `0` = active +- `1` = end-of-life +- `2` = deprecated (by another asset) +- `3` = revoked by publisher + ## Aquarius Enhanced DDO Response The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). From c73a312f2451fc1803a01c38779001f056d7aff1 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:13:32 +0100 Subject: [PATCH 031/186] hierarchy formatting --- content/concepts/did-ddo.md | 38 ++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c118b305..faac4dac 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -1,6 +1,6 @@ --- -title: DIDs & DDOs -description: Specification of Ocean asset identifiers and objects using DIDs & DDOs +title: DID & DDO +description: Specification of decentralized identifiers for assets in Ocean Protocol using the DID & DDO standards. slug: /concepts/did-ddo/ section: concepts --- @@ -9,21 +9,19 @@ section: concepts ## Overview -This document describes how Ocean assets follow the DID/DDO spec, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. +This document describes how Ocean assets follow the DID/DDO specification, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). -Decentralized identifiers (DIDs) are a type of identifier that enables verifiable, decentralized digital identity. Each DID is associated with a unique entity. DIDs may represent humans, objects, and more. +Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity and DIDs may represent humans, objects, and more. A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. -DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). - ## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only can be modified by _owners_ or _delegated users_. +An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. @@ -53,7 +51,7 @@ Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` ``` -## DID Structure +## DID In Ocean, a DID is a string that looks like: @@ -69,7 +67,7 @@ where It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). -## DDO Attributes +## DDO A DDO in Ocean has these required attributes: @@ -86,7 +84,7 @@ A DDO in Ocean has these required attributes: | **`encryptedFiles`** | [Files](#files) | Added after publishing. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | -## Metadata +### Metadata This object holds information describing the actual actual asset. @@ -118,7 +116,7 @@ Example: } ``` -### Algorithm Metadata +#### Algorithm Metadata An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: @@ -137,7 +135,7 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | -## Services +### Services Services define the access to the asset. @@ -152,7 +150,7 @@ Services define the access to the asset. | **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | | **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | -### Compute Privacy +#### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -228,7 +226,7 @@ Example: } ``` -## Files +### Files The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls @@ -264,7 +262,7 @@ Example: } ``` -## Credentials +### Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -308,7 +306,7 @@ Example: } ``` -## DDO Hash +### DDO Hash In order to ensure the integrity of the DDO, a hash is computed for each DDO: @@ -344,7 +342,7 @@ event MetadataUpdated( _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. -## State +### State Each asset has a state, which is held by the NFT contract. The possible states are: @@ -355,7 +353,9 @@ Each asset has a state, which is held by the NFT contract. The possible states a ## Aquarius Enhanced DDO Response -The following fields are added by _Aquarius_ in its DDO response for convenience reasons. These are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). +The following fields are added by _Aquarius_ in its DDO response for convenience reasons where an `Asset` returned by _Aquarius_ inherits the DDO fields from the chain. + +These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). ### NFT @@ -442,7 +442,7 @@ Example: } ``` -## Full Enhanced DDO Example: +## Full Enhanced DDO Example ```json { From b0957f997215fa28633054447dfa4454a0fdd096 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:22:19 +0100 Subject: [PATCH 032/186] moving things around --- content/concepts/did-ddo.md | 155 ++++++++++++++++++------------------ 1 file changed, 78 insertions(+), 77 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index faac4dac..f63208d7 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -88,19 +88,20 @@ A DDO in Ocean has these required attributes: This object holds information describing the actual actual asset. -| Attribute | Type | Required | Description | -| --------------------------- | ----------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | -| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | -| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | -| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | -| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | -| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | -| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | -| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | -| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | +| Attribute | Type | Required | Description | +| --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | +| **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | +| **`name`** | `string` | **✓** | Descriptive name or title of the asset. | +| **`type`** | `string` | **✓** | Asset type. Includes `"dataset"` (e.g. csv file), `"algorithm"` (e.g. Python script). Each type needs a different subset of metadata attributes. | +| **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | +| **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | +| **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | +| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | +| **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | Example: @@ -135,20 +136,56 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | +### Files + +The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls + +Each `file` object has the following attributes, with the details necessary to consume and validate the data. + +| Attribute | Required | Description | +| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`contentType`** | **✓** | File format. | +| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | +| **`name`** | | File name. | +| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | +| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | +| **`contentLength`** | | Size of the file in bytes. | +| **`encoding`** | | File encoding (e.g. UTF-8). | +| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | +| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | +| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | +| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | +| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | + +Example: + +```json +{ + "files": { + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + } +} +``` + ### Services Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | Text | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | Text | | Service friendly name | -| **`description`** | Text | | Service description | -| **`datatokenAddress`** | Text | **✓** | Datatoken address | -| **`providerEndpoint`** | Text | **✓** | Provider URI | -| **`timeout`** | Number | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of files object | **✓** | Array of `File` objects for publishing. These will be transformed to `encryptedFiles` during publish process. See [Files](#files) | -| **`privacy`** | Object | **✓** (for compute assets only) | If asset is of compute `type`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | Array of [Files](#files) | **✓** | Array of [Files](#files) objects for publishing. These will be transformed to `encryptedFiles` during publish process. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -226,42 +263,6 @@ Example: } ``` -### Files - -The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File format. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | | File name. | -| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | | Size of the file in bytes. | -| **`encoding`** | | File encoding (e.g. UTF-8). | -| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | - -Example: - -```json -{ - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - } -} -``` - ### Credentials By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. @@ -318,26 +319,26 @@ The hash is used when publishing/update metadata using `setMetaData` function in ```solidity event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber +); event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber - ); + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber +); ``` _Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. From 34c3bcb4aa9460f42cd3d30caaf4b0ffa65f876d Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:40:12 +0100 Subject: [PATCH 033/186] sidebar reordering --- data/sidebars/concepts.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 0bb7fecc..15839c67 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,27 +6,20 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ + - title: DIDs & DDOs + link: /concepts/did-ddo/ - title: Supported Networks link: /concepts/networks/ - - title: Deployments - link: /concepts/deployments/ - - title: Projects using Ocean - link: /concepts/projects-using-ocean/ - group: Compute-to-Data items: - - title: Compute-to-Data Overview + - title: Overview link: /concepts/compute-to-data/ -- group: Specifying Assets - items: - - title: DIDs & DDOs - link: /concepts/did-ddo/ - - title: DDO Metadata - link: /concepts/ddo-metadata/ - - group: Contribute items: + - title: Projects using Ocean + link: /concepts/projects-using-ocean/ - title: Ways to Contribute link: /concepts/contributing/ - title: Get Funding From cc150422c2076b732ab1040255c6e4e8c290507a Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:41:24 +0100 Subject: [PATCH 034/186] remove `event.chainId` --- content/concepts/did-ddo.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index f63208d7..fd5e1677 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -418,8 +418,7 @@ Example: "blockNo": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1 + "update": false } ] } From c949a70ee9e336612c5e7db6a3ece94ecb9cb075 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 14:52:44 +0100 Subject: [PATCH 035/186] suggest `ddo.files` & `ddo.encryptedFiles` --- content/concepts/did-ddo.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fd5e1677..40484d38 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -459,14 +459,12 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - }, + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", From 37bba3244dfc040ff3b3d87445dcf44edb275d42 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 15:02:31 +0100 Subject: [PATCH 036/186] files example updates --- content/concepts/did-ddo.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 40484d38..7daf6320 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -138,13 +138,13 @@ The `container` object has the following attributes defining the Docker image th ### Files -The `files` section contains a `file` object (that contains a list of `file` objects) and a `encryptedFiles` string which contains the encrypted urls +The `ddo.files` array contains a `file` object which needs to be present when publishing a new asset. This then gets removed and transformed into an `ddo.encryptedFiles` string which contains the encrypted urls. Each `file` object has the following attributes, with the details necessary to consume and validate the data. | Attribute | Required | Description | | -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File format. | +| **`contentType`** | **✓** | File MIME type. | | **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | | **`name`** | | File name. | | **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | @@ -161,14 +161,12 @@ Example: ```json { - "files": { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" - } + "files": [ + { + "url": "https://demo.com/file.csv" + } + ], + "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } ``` @@ -459,11 +457,15 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, + + // Never in response, only for publishing "files": [ { "url": "https://demo.com/file.csv" } ], + + // Created automatically after publishing, and `files` gets removed. "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { From cb831cb439d7a6b132538f3f08487e0a4cbf2361 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 17:22:18 +0100 Subject: [PATCH 037/186] remove all the file things --- content/concepts/did-ddo.md | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7daf6320..fee399d4 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -97,8 +97,8 @@ This object holds information describing the actual actual asset. | **`author`** | `string` | **✓** | Name of the entity generating this data (e.g. Tfl, Disney Corp, etc.). | | **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | -| **`contentLanguage`** | `string` | | The language of the content. Please use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `"tags"` instead of this. | +| **`contentLanguage`** | `string` | | The language of the content. Use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | +| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | | **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | | **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | @@ -136,37 +136,37 @@ The `container` object has the following attributes defining the Docker image th | **`tag`** | `string` | **✓** | Tag of the Docker image. | | **`checksum`** | `string` | **✓** | Checksum of the Docker image. | +```json +{ + "metadata": { + "description": "Sample description", + "name": "Sample algorithm asset", + "type": "algorithm", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms", + "algorithm": { + "language": "", + "version": "", + "container": { + "entrypoint": "", + "image": "", + "tag": "", + "checksum": "" + } + } + } +} +``` + ### Files -The `ddo.files` array contains a `file` object which needs to be present when publishing a new asset. This then gets removed and transformed into an `ddo.encryptedFiles` string which contains the encrypted urls. - -Each `file` object has the following attributes, with the details necessary to consume and validate the data. - -| Attribute | Required | Description | -| -------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`contentType`** | **✓** | File MIME type. | -| **`url`** | Local | Content URL. Omitted from the remote metadata. Supports `http(s)://` and `ipfs://` URLs. | -| **`name`** | | File name. | -| **`checksum`** | | Checksum of the file using your preferred format (i.e. MD5). Format specified in `checksumType`. If it's not provided can't be validated if the file was not modified after registering. | -| **`checksumType`** | | Format of the provided checksum. Can vary according to server (i.e Amazon vs. Azure) | -| **`contentLength`** | | Size of the file in bytes. | -| **`encoding`** | | File encoding (e.g. UTF-8). | -| **`compression`** | | File compression (e.g. no, gzip, bzip2, etc). | -| **`encrypted`** | | Boolean. Is the file encrypted? If is not set is assumed the file is not encrypted | -| **`encryptionMode`** | | Encryption mode used. Just valid if `encrypted=true` | -| **`resourceId`** | | Remote identifier of the file in the external provider. It is typically the remote id in the cloud provider. | -| **`attributes`** | | Key-Value hash map with additional attributes describing the asset file. It could include details like the Amazon S3 bucket, region, etc. | +The `ddo.files` field is returned as a string which holds the encrypted file URLs. During the publish process this needs to be encrypted with a respective _Provider_ API call. Example: ```json { - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735" } ``` @@ -174,27 +174,27 @@ Example: Services define the access to the asset. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | Array of [Files](#files) | **✓** | Array of [Files](#files) objects for publishing. These will be transformed to `encryptedFiles` during publish process. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If Empty , then any published algo is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If Empty , then any published algo is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: From aac4823bc7d5886038323294875596955b3da345 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 17:52:56 +0100 Subject: [PATCH 038/186] example updates --- content/concepts/did-ddo.md | 72 +++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fee399d4..a8661060 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -71,22 +71,21 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO in Ocean has these required attributes: -| Attribute | Type | Description | -| -------------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | -| **`@context`** | Array of `string` | Contexts used for validation. | -| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | -| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Stores information about the asset's files. | -| **`encryptedFiles`** | [Files](#files) | Added after publishing. | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | +| Attribute | Type | Description | +| ----------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Encrypted file URLs | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata -This object holds information describing the actual actual asset. +This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -123,7 +122,7 @@ An asset of type `algorithm` has the following additional attributes under `algo | Attribute | Type | Required | Description | | --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | | Language used to implement the software | +| **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software. | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | @@ -145,13 +144,13 @@ The `container` object has the following attributes defining the Docker image th "author": "OPF", "license": "https://market.oceanprotocol.com/terms", "algorithm": { - "language": "", - "version": "", + "language": "Node.js", + "version": "v1", "container": { - "entrypoint": "", - "image": "", - "tag": "", - "checksum": "" + "entrypoint": "node $ALGO", + "image": "ubuntu", + "tag": "latest", + "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" } } } @@ -172,7 +171,9 @@ Example: ### Services -Services define the access to the asset. +Services define the access to the asset, and each service is represented by its respective datatoken. + +An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. | Attribute | Type | Required | Description | | ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | @@ -181,20 +182,20 @@ Services define the access to the asset. | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If asset service is of `type` `compute`, holds information about the compute-related privacy settings. | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, a drag & drop algorithm can be run | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | -| **`publisherTrustedAlgorithmPublishers `** | Array of `String` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -457,16 +458,7 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - - // Never in response, only for publishing - "files": [ - { - "url": "https://demo.com/file.csv" - } - ], - - // Created automatically after publishing, and `files` gets removed. - "encryptedFiles": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", From a68f1dcee37f82a248c046eb0ab0bb2f52481d15 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 18:15:49 +0100 Subject: [PATCH 039/186] typos, more examples --- content/concepts/did-ddo.md | 57 ++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a8661060..6f0d2821 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -71,17 +71,17 @@ It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-gene A DDO in Ocean has these required attributes: -| Attribute | Type | Description | -| ----------------- | --------------------------- | ---------------------------------------------------------------------------------------------- | -| **`@context`** | Array of `string` | Contexts used for validation. | -| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | -| **`version`** | `string` | Version information referring to this DDO spec version, like `4.0.0`. | -| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Encrypted file URLs | -| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | +| Attribute | Type | Description | +| ----------------- | --------------------------- | -------------------------------------------------------------------------------------------------------------- | +| **`@context`** | Array of `string` | Contexts used for validation. | +| **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | +| **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | +| **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | +| **`files`** | [Files](#files) | Encrypted file URLs. | +| **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata @@ -268,9 +268,9 @@ By default, a consumer can access a resource if they have 1.0 datatokens. _Crede Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. -This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some some id showing you're old enough (credential). +This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some identification showing you're old enough (credential). -Only credentials that can be proven are supported. This includes Ethereum public addresses, and (in the future) [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. +Only credentials that can be proven are supported. This includes Ethereum public addresses, and in the future [W3C Verifiable Credentials](https://www.w3.org/TR/vc-data-model/) and more. Ocean also supports `"deny"` credentials: if a consumer has any of these credentials, they can not access the resource. @@ -314,7 +314,7 @@ In order to ensure the integrity of the DDO, a hash is computed for each DDO: const hash = sha256(JSON.stringify(DDO)) ``` -The hash is used when publishing/update metadata using `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: +The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -361,12 +361,12 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | --------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed NFT contract | -| **`name`** | `string` | Name of NFT set in contract | -| **`symbol`** | `string` | Symbol of NFT set in contract | -| **`owner`** | `string` | ETH account address of the NFT owner | +| Attribute | Type | Description | +| ------------- | -------- | ---------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | Example: @@ -407,17 +407,18 @@ Example: The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. +They are ordered in descending order based on the `block` number, where the very last item in the `events` array is the event for the asset creation, and the first item is the latest update event if there has been one. + Example: ```json { "events": [ { - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" } ] } @@ -498,12 +499,10 @@ Example: }, "events": [ { - "txid": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "blockNo": 12831214, + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "update": false, - "chainId": 1 + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" } ], "stats": { From a505f35add76fc6cc62fc5a0a6d239fb1cfc3a35 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 4 Nov 2021 20:10:21 +0100 Subject: [PATCH 040/186] clarifications, update DDO flow image --- content/concepts/did-ddo.md | 34 ++++++++++++------------ content/concepts/images/DDO_flow.png | Bin 69347 -> 0 bytes content/concepts/images/ddo-content.png | Bin 30654 -> 0 bytes content/concepts/images/ddo-flow.png | Bin 0 -> 104794 bytes 4 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 content/concepts/images/DDO_flow.png delete mode 100644 content/concepts/images/ddo-content.png create mode 100644 content/concepts/images/ddo-flow.png diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 6f0d2821..104ee774 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -31,7 +31,7 @@ The DDO is stored on-chain as part of the NFT contract and it is stored encrypte Here is the complete flow: -![DDO_flow](images/DDO_flow.png) +![DDO_flow](images/ddo-flow.png) ```text title DDO flow @@ -118,15 +118,15 @@ Example: #### Algorithm Metadata -An asset of type `algorithm` has the following additional attributes under `algorithm` within the `metadata` object: +An asset of type `algorithm` has additional attributes under `metadata.algorithm`, describing the algorithm and the Docker environment it is supposed to be run under. -| Attribute | Type | Required | Description | -| --------------- | ----------- | -------- | ------------------------------------------------------- | -| **`language`** | `string` | | Language used to implement the software. | -| **`version`** | `string` | | Version of the software. | -| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | +| Attribute | Type | Required | Description | +| --------------- | ----------- | -------- | ------------------------------------------------------------------------------------------ | +| **`language`** | `string` | | Language used to implement the software. | +| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | -The `container` object has the following attributes defining the Docker image the algorithm needs to run: +The `container` object has the following attributes defining the Docker image for running the algorithm: | Attribute | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------- | @@ -145,7 +145,7 @@ The `container` object has the following attributes defining the Docker image th "license": "https://market.oceanprotocol.com/terms", "algorithm": { "language": "Node.js", - "version": "v1", + "version": "1.0.0", "container": { "entrypoint": "node $ALGO", "image": "ubuntu", @@ -171,7 +171,7 @@ Example: ### Services -Services define the access to the asset, and each service is represented by its respective datatoken. +Services define the access for an asset, and each service is represented by its respective datatoken. An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. @@ -359,14 +359,14 @@ These additional fields are never stored on-chain, and are never taken into cons ### NFT -The `nft` object contains information about the NFT contract which represents the intellectual property of the publisher. +The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ---------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | +| Attribute | Type | Description | +| ------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | Example: diff --git a/content/concepts/images/DDO_flow.png b/content/concepts/images/DDO_flow.png deleted file mode 100644 index f2fe3790f8919567b954fa50c8f0b91b1f3fab42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69347 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

aO6m_%5z9=l25u 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 OAn Date: Fri, 5 Nov 2021 09:44:22 +0100 Subject: [PATCH 041/186] copy fixes --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 104ee774..7f868712 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -13,7 +13,7 @@ This document describes how Ocean assets follow the DID/DDO specification, such Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity and DIDs may represent humans, objects, and more. -A DID Document (DDO) is JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. +A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. @@ -79,6 +79,7 @@ A DDO in Ocean has these required attributes: | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | | **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`files`** | [Files](#files) | Encrypted file URLs. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -173,18 +174,17 @@ Example: Services define the access for an asset, and each service is represented by its respective datatoken. -An asset should have at least one service to be actually accessible, but can have as many services which make sense for a specific use case. +An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. -| Attribute | Type | Required | Description | -| ---------------------- | ----------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`files`** | `string`, see [Files](#files) | **✓** | Encrypted file URLs. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -353,7 +353,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a ## Aquarius Enhanced DDO Response -The following fields are added by _Aquarius_ in its DDO response for convenience reasons where an `Asset` returned by _Aquarius_ inherits the DDO fields from the chain. +The following fields are added by _Aquarius_ in its DDO response for convenience reasons, where an asset returned by _Aquarius_ inherits the DDO fields stored on-chain. These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). From 3cb0b63aa9cfe13e6d9b786f7ef2ef8e4d92e9b7 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 5 Nov 2021 09:01:11 +0000 Subject: [PATCH 042/186] fixes, providerEndpoint -> providerUrl --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7f868712..b4577fa5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -176,15 +176,15 @@ Services define the access for an asset, and each service is represented by its An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerEndpoint`** | `string` | **✓** | Provider endpoint URI (URI + path) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of 0 represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`providerUrl`** | `string` | **✓** | Provider URL (schema + host) | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -193,7 +193,7 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access (still WIP) | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | @@ -230,7 +230,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider", + "providerUrl": "https://myprovider.com", "timeout": 0 }, { @@ -238,7 +238,7 @@ Example: "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", - "providerEndpoint": "https://myprovider", + "providerUrl": "https://myprovider.com", "timeout": 0, "privacy": { "allowRawAlgorithm": false, @@ -466,7 +466,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerEndpoint": "https://myprovider.com", + "providerUrl": "https://myprovider.com", "timeout": 0 } ], From 37125600a511c2b41893e8a16da920a0eb4fc9b6 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Tue, 9 Nov 2021 09:41:05 +0000 Subject: [PATCH 043/186] consolidate & rewrite NFT docs --- content/concepts/nft.md | 37 +++++++++++++++++++++++-------------- content/concepts/roles.md | 25 ------------------------- data/sidebars/concepts.yml | 4 +--- 3 files changed, 24 insertions(+), 42 deletions(-) delete mode 100644 content/concepts/roles.md diff --git a/content/concepts/nft.md b/content/concepts/nft.md index 56afa38a..0cea874a 100644 --- a/content/concepts/nft.md +++ b/content/concepts/nft.md @@ -1,40 +1,49 @@ --- -title: v4 NFT introduction -description: The page describes NFT, IP and sub-licensing using Ocean Protocol's contracts, and use case. +title: Data NFTs +description: Ocean Protocol uses ERC721 NFTs to represent the intellectual property (IP) of published datasets or algorithms, and to further sub-license access to it with user roles or ERC20 data tokens. --- -## NFTS - -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through the transaction(s). +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through transfer transactions. ## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. - - **Base IP holder** means the holder of the Base IP. Represented as the the actor that did the initial "publish" action. - - **Sub-licensee** is the holder of the sub-license. Represented as the entity that controls address ERC721.\_owners[tokenId=x]. - - **To Publish**: Claim copyright or exclusive base license - - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -## Supporting NFT using Ocean Protocol +## Supporting NFTs using Ocean Protocol -Ocean Protocol defines [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. +Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -## Sub licensing the Base IP +## Sub-licensing the Base IP ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. +## Roles + +[ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: + +### NFT Owner + +- NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. +- NFT Owner can assign managers while deploying the contract. +- NFT Owner is also added to the Managers. +- NFT Owner can add/remove Managers. +- Clean all permissions + +### Manager + +- A public address with a `Magner` role can update the metadata +- Can deploy new ERC20 contract which is associtated with the `ERC721` contract. ## Use case 1 - + Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. ![Image 1](images/use-case-1.PNG) - ## Use case 2 Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. diff --git a/content/concepts/roles.md b/content/concepts/roles.md deleted file mode 100644 index dfe547cb..00000000 --- a/content/concepts/roles.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: v4 roles and permissions -description: The page describes the roles and permissions present in ERC721Template contract. ---- - -## Roles - -[ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: - -- NFT Owner -- Manager - -## NFT Owner - -- NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. - -- NFT Owner can assign managers while deploying the contract. -- NFT Owner is also added to the Managers. -- NFT Owner can add/remove Managers. -- Clean all permissions - -## Manager - -- A public address with a `Magner` role can update the metadata -- Can deploy new ERC20 contract which is associtated with the `ERC721` contract. diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 0edff29b..c90edef4 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,10 +6,8 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: NFTs + - title: Data NFTs link: /concepts/nft/ - - title: Roles - link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From 8ca8ead4307a3ccbadd03fbd7cacb042c68c6a38 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Tue, 9 Nov 2021 09:47:13 +0000 Subject: [PATCH 044/186] update architecture image --- content/concepts/images/architecture.png | Bin 132456 -> 24047 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/architecture.png b/content/concepts/images/architecture.png index f479632ee22048899aa64d2f758baef49eef0f9f..d5a5d0850935778eb6de7adef13d335e3bb847d4 100644 GIT binary patch literal 24047 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


o_FW?X?eaW6+6;$LW>xsCKI$W0O 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�Q(^nlRXg~SZfTaaadItUv8TtP} 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 From a87ec6fb34c1ce45f54290a95fc26a9c7fcca6eb Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 05:41:45 -0800 Subject: [PATCH 045/186] more refactor --- content/concepts/did-ddo.md | 56 ++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b4577fa5..fee6670e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -15,8 +15,6 @@ Decentralized identifiers (DIDs) are a type of identifier that enable verifiable A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. -If a DID is the index key in a key-value pair, then the DID Document is the value to which the index key points. The combination of a DID and its associated DID Document forms the root record for a decentralized identifier. - ## Rules for DIDs & DDOs An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). @@ -81,7 +79,6 @@ A DDO in Ocean has these required attributes: | **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | -| **`files`** | [Files](#files) | Encrypted file URLs. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | ### Metadata @@ -158,9 +155,27 @@ The `container` object has the following attributes defining the Docker image fo } ``` +### Services + +Services define the access for an asset, and each service is represented by its respective datatoken. + +An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. + +| Attribute | Type | Required | Description | +| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **`id`** | `string` | **✓** | Unique ID | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | +| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | +| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | + ### Files -The `ddo.files` field is returned as a string which holds the encrypted file URLs. During the publish process this needs to be encrypted with a respective _Provider_ API call. +The `files` field is returned as a string which holds the encrypted file URLs. Example: @@ -170,21 +185,28 @@ Example: } ``` -### Services +During the publish process this needs to be encrypted with a respective _Provider_ API call. (Sending an array of strings) -Services define the access for an asset, and each service is represented by its respective datatoken. +```json +[ + "url1", + "url2" +] +``` -An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. +In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: +```json +[{ + "contentLength":100, + "contentType":"application/json" +}, +{ + "contentLength":130, + "contentType":"application/text" +} +] +``` -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`providerUrl`** | `string` | **✓** | Provider URL (schema + host) | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | #### Compute Privacy @@ -202,7 +224,7 @@ The `publisherTrustedAlgorithms ` is an array of objects with the following stru | Attribute | Type | Required | Description | | ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | | **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `encryptedFiles` + `files` section (as string) | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as string) | | **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | To produce `filesChecksum`: From a0136db86ce17c7a4cc45b5262b867cddad135e5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 05:49:12 -0800 Subject: [PATCH 046/186] add state 4 --- content/concepts/did-ddo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fee6670e..a174e383 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -372,6 +372,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `1` = end-of-life - `2` = deprecated (by another asset) - `3` = revoked by publisher +- `4` = temporary disabled ## Aquarius Enhanced DDO Response From 813bd454b964fa8764eb6bf71c7306e2850a9fb0 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 06:26:43 -0800 Subject: [PATCH 047/186] update with market typings --- content/concepts/did-ddo.md | 75 ++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a174e383..1dd46c62 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -195,6 +195,7 @@ During the publish process this needs to be encrypted with a respective _Provide ``` In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: + ```json [{ "contentLength":100, @@ -390,6 +391,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`name`** | `string` | Name of NFT set in contract. | | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | Example: @@ -399,44 +401,52 @@ Example: "adddress": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", - "owner": "0x0000000" + "owner": "0x0000000", + "state": 0 } } ``` -### Status +### DataTokens -The `status` object contains attributes for marketplaces to implement various visibility states for an asset. +The `datatokens` object contains information about the ERC20 datatokens. -| Attribute | Type | Description | -| --------------------- | --------- | ------------------------------------------------------------------------- | -| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`isListed`** | `boolean` | If this asset should be displayed | -| **`isOrderDisabled`** | `boolean` | If this asset has ordering disabled | +| Attribute | Type | Description | +| ------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ServiceID | +Example: + +```json +{ + "datatokens": [ + { + "adddress": "0x000000", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "serviceId": "1" + }, + { + "adddress": "0x000001", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "serviceId": "2" + }, + ] +} +``` + +### Event + +The `event` section contains information about the last transaction that created or updated the DDO. Example: ```json { - "status": { - "state": 0, - "isListed": true, - "isOrderDisabled": false - } -} -``` - -### Events - -The `events` section contains information about the transactions that created or updated the DDO which can be useful for displaying a metadata history for provenance reasons. - -They are ordered in descending order based on the `block` number, where the very last item in the `events` array is the event for the asset creation, and the first item is the latest update event if there has been one. - -Example: - -```json -{ - "events": [ + "event": [ { "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, @@ -513,21 +523,16 @@ Example: "adddress": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", - "owner": "0x0000000" - }, - "status": { + "owner": "0x0000000", "state": 0, - "isListed": true, - "isOrderDisabled": false }, - "events": [ + "event": { "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" - } - ], + }, "stats": { "consumes": 4 } From 6f02648d58b2c4df3002cd22a9ba1d11039c160f Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 06:37:50 -0800 Subject: [PATCH 048/186] make state 4 clearer --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1dd46c62..aed72588 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -373,7 +373,7 @@ Each asset has a state, which is held by the NFT contract. The possible states a - `1` = end-of-life - `2` = deprecated (by another asset) - `3` = revoked by publisher -- `4` = temporary disabled +- `4` = ordering is temporary disabled ## Aquarius Enhanced DDO Response From 93ecc527fb0dffee0b1095d2cd386261f969b6fe Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 10 Nov 2021 16:33:59 +0000 Subject: [PATCH 049/186] copywriting, update examples --- content/concepts/did-ddo.md | 165 +++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 77 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aed72588..26076422 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -163,19 +163,19 @@ An asset should have at least one service to be actually accessible, and can hav | Attribute | Type | Required | Description | | ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **`id`** | `string` | **✓** | Unique ID | +| **`id`** | `string` | **✓** | Unique ID | | **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | | **`name`** | `string` | | Service friendly name | | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | +| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | -### Files +#### Files -The `files` field is returned as a string which holds the encrypted file URLs. +The `files` field is returned as a string which holds the encrypted file URLs. Example: @@ -185,30 +185,27 @@ Example: } ``` -During the publish process this needs to be encrypted with a respective _Provider_ API call. (Sending an array of strings) +During the publish process file URLs need to be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted: + +```json +["https://url.com/file1.csv", "https://url.com/file2.csv"] +``` + +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ must return based on passed DID: ```json [ - "url1", - "url2" + { + "contentLength": 100, + "contentType": "application/json" + }, + { + "contentLength": 130, + "contentType": "application/text" + } ] ``` -In order to get the files information, you should call the fileinfo endpoint of __Provider__ , provide the DID/or DDO/or encrypted string, and you will get an array of file informations: - -```json -[{ - "contentLength":100, - "contentType":"application/json" -}, -{ - "contentLength":130, - "contentType":"application/text" -} -] -``` - - #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -222,19 +219,16 @@ An asset with a service of `type` `compute` has the following additional attribu The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------ | -| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as string) | -| **`containerSectionChecksum`** | `string` | **✓** | Hash of the algorithm `container` section (as string) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------ | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`) | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`) | To produce `filesChecksum`: ```js -sha256( - algorithm_ddo.metadata.encryptedFiles + - JSON.Stringify(algorithm_ddo.metadata.files) -) +sha256(JSON.Stringify(algorithm_ddo.services[0].files)) ``` To produce `containerSectionChecksum`: @@ -253,7 +247,7 @@ Example: "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0 }, { @@ -261,7 +255,7 @@ Example: "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0, "privacy": { "allowRawAlgorithm": false, @@ -334,7 +328,7 @@ Example: In order to ensure the integrity of the DDO, a hash is computed for each DDO: ```js -const hash = sha256(JSON.stringify(DDO)) +const hash = sha256(JSON.stringify(ddo)) ``` The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: @@ -369,11 +363,13 @@ _Aquarius_ should always check the hash after data is decrypted via a _Provider_ Each asset has a state, which is held by the NFT contract. The possible states are: -- `0` = active -- `1` = end-of-life -- `2` = deprecated (by another asset) -- `3` = revoked by publisher -- `4` = ordering is temporary disabled +| State | Description | +| ------- | ------------------------------- | +| **`0`** | Active. | +| **`1`** | End-of-life. | +| **`2`** | Deprecated (by another asset). | +| **`3`** | Revoked by publisher. | +| **`4`** | Ordering is temporary disabled. | ## Aquarius Enhanced DDO Response @@ -385,12 +381,12 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | +| Attribute | Type | Description | +| ------------- | -------- | ------------------------------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | Example: @@ -409,31 +405,32 @@ Example: ### DataTokens -The `datatokens` object contains information about the ERC20 datatokens. +The `datatokens` array contains information about the ERC20 datatokens attached to [services](#services). + +| Attribute | Type | Description | +| --------------- | -------- | ----------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | -| Attribute | Type | Description | -| ------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`serviceId`** | `string` | ServiceID | Example: ```json { "datatokens": [ - { + { "adddress": "0x000000", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", + "name": "Datatoken 1", + "symbol": "DT-1", "serviceId": "1" - }, - { + }, + { "adddress": "0x000001", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", + "name": "Datatoken 2", + "symbol": "DT-2", "serviceId": "2" - }, + } ] } ``` @@ -446,14 +443,12 @@ Example: ```json { - "event": [ - { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" - } - ] + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + } } ``` @@ -492,14 +487,14 @@ Example: "author": "OPF", "license": "https://market.oceanprotocol.com/terms" }, - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "services": [ { "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", - "providerUrl": "https://myprovider.com", + "serviceEndpoint": "https://myprovider.com", "timeout": 0 } ], @@ -524,15 +519,31 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0, + "state": 0 }, - "event": + + "datatokens": [ { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "adddress": "0x000000", + "name": "Datatoken 1", + "symbol": "DT-1", + "serviceId": "1" }, + { + "adddress": "0x000001", + "name": "Datatoken 2", + "symbol": "DT-2", + "serviceId": "2" + } + ], + + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + }, + "stats": { "consumes": 4 } From d17b5831278a80659b632354916e0e0d4d705695 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 10 Nov 2021 17:25:31 +0000 Subject: [PATCH 050/186] more copywriting, example updates --- content/concepts/did-ddo.md | 69 +++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 26076422..ad2b0690 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -19,9 +19,9 @@ A DID Document (DDO) is a JSON blob that holds information about the DID. Given An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ should have a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. +An _asset_ has a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. -A metadata cache like _Aquarius_ can help in reading and searching through encrypted DDO data from the chain. +All DDOs are stored on-chain in encrypted form to be fully GDPR-compatible. A metadata cache like _Aquarius_ can help in reading, decrypting, and searching through encrypted DDO data from the chain. Because the file URLs are encrypted on top of the full DDO encryption, returning unencrypted DDOs e.g. via an API is safe to do as the file URLs will still stay encrypted. ## Publishing & Retrieving DDOs @@ -31,6 +31,9 @@ Here is the complete flow: ![DDO_flow](images/ddo-flow.png) +
+ UML source + ```text title DDO flow @@ -47,20 +50,25 @@ Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` -``` + +```` + +
## DID -In Ocean, a DID is a string that looks like: +In Ocean, a DID is a string that looks like this: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea -``` +```` -where +The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: -```text -0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea = sha256(ERC721 contract address + chainId) +```js +const checksum = sha256(ERC721 contract address + chainId) +console.log(checksum) +// 0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` It follows [the generic DID scheme](https://w3c-ccg.github.io/did-spec/#the-generic-did-scheme). @@ -185,13 +193,13 @@ Example: } ``` -During the publish process file URLs need to be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted: +During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted and send to _Provider_: ```json ["https://url.com/file1.csv", "https://url.com/file2.csv"] ``` -To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ must return based on passed DID: +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: ```json [ @@ -206,6 +214,8 @@ To get information about the files after encryption, the `/fileinfo` endpoint of ] ``` +This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. + #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -244,6 +254,7 @@ Example: "services": [ { "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f...", "name": "Download service", "description": "Download service", "datatokenAddress": "0x123", @@ -252,6 +263,7 @@ Example: }, { "type": "compute", + "files": "0x6dd05e0edb460623c843a263291ebe757c1eb3...", "name": "Compute service", "description": "Compute service", "datatokenAddress": "0x124", @@ -312,26 +324,15 @@ Here's an example object with both `"allow"` and `"deny"` entries: } ``` -For future usage, we can extend that with different credentials types. +### DDO Checksum -Example: - -```json -{ - "type": "credential3Box", - "values": ["profile1", "profile2"] -} -``` - -### DDO Hash - -In order to ensure the integrity of the DDO, a hash is computed for each DDO: +In order to ensure the integrity of the DDO, a checksum is computed for each DDO: ```js -const hash = sha256(JSON.stringify(ddo)) +const checksum = sha256(JSON.stringify(ddo)) ``` -The hash is used when publishing/update metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: +The checksum hash is used when publishing/updating metadata using the `setMetaData` function in the ERC721 contract, and is stored in the event generated by the ERC721 contract: ```solidity event MetadataCreated( @@ -357,7 +358,7 @@ event MetadataUpdated( ); ``` -_Aquarius_ should always check the hash after data is decrypted via a _Provider_ API call, in order to ensure DDO integrity. +_Aquarius_ should always verify the checksum after data is decrypted via a _Provider_ API call. ### State @@ -403,16 +404,16 @@ Example: } ``` -### DataTokens +### Datatokens -The `datatokens` array contains information about the ERC20 datatokens attached to [services](#services). +The `datatokens` array contains information about the ERC20 datatokens attached to [asset services](#services). -| Attribute | Type | Description | -| --------------- | -------- | ----------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | +| Attribute | Type | Description | +| --------------- | -------- | ------------------------------------------------ | +| **`address`** | `string` | Contract address of the deployed ERC20 contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`serviceId`** | `string` | ID of the service the datatoken is attached to. | Example: From e52ebbd15488f0cb2d98895c99c8c19a14e5441b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:02:12 -0800 Subject: [PATCH 051/186] add compute resources --- content/concepts/did-ddo.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ad2b0690..c3473571 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -180,6 +180,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | +| **`resources`** | [Resources](#compute-resources) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related resources. | #### Files @@ -216,6 +217,21 @@ To get information about the files after encryption, the `/fileinfo` endpoint of This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. +#### Compute Resources + +An asset with a service of `type` `compute` has the following additional attributes under the `resources` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. + +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| +| **`gpuType`** | `string` | | Type of GPU (if any) +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: + +128974848, 129e6, 129M, 123Mi| +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | + #### Compute Privacy An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. @@ -269,6 +285,14 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, + "resources":{ + "namespace":"ocean-compute", + "cpus":2, + "gpus":4, + "gpuType":"NVIDIA Tesla V100 GPU", + "memory":"128M", + "volumeSize":"2G" + }, "privacy": { "allowRawAlgorithm": false, "allowNetworkAccess": true, From 575b2ee9750ad092696e30d7daa93907f50ec0ba Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:03:39 -0800 Subject: [PATCH 052/186] fix typo --- content/concepts/did-ddo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c3473571..0524bd14 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -228,7 +228,6 @@ An asset with a service of `type` `compute` has the following additional attribu | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| | **`gpuType`** | `string` | | Type of GPU (if any) | **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: - 128974848, 129e6, 129M, 123Mi| | **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | From 87e7b084c16cfcd2eb1aabb9f572f9a235bd6270 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Wed, 10 Nov 2021 23:04:14 -0800 Subject: [PATCH 053/186] fix typo --- content/concepts/did-ddo.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0524bd14..b750b090 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -227,8 +227,7 @@ An asset with a service of `type` `compute` has the following additional attribu | **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| | **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: -128974848, 129e6, 129M, 123Mi| +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| | **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | #### Compute Privacy From 45ad47ce830501ccb03196ab8e75d7175d7ee459 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 00:59:50 -0800 Subject: [PATCH 054/186] mv created&updated to metadata, add datetime to ev --- content/concepts/did-ddo.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b750b090..650503c5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -83,8 +83,6 @@ A DDO in Ocean has these required attributes: | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | | **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | -| **`created`** | `ISO Date Time string` | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -95,6 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`created`** | `ISO Date Time string` | **✓** | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | **✓** | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -470,7 +470,8 @@ Example: "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" } } ``` @@ -564,7 +565,8 @@ Example: "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", "block": 12831214, "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf" + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" }, "stats": { From f05989d0c523c2f9c02cddef62b17fc32411c07a Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:04:39 -0800 Subject: [PATCH 055/186] create compute object --- content/concepts/did-ddo.md | 83 +++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 30 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 650503c5..3148f43f 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -179,8 +179,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | | **`files`** | [Files](#files) | **/** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`privacy`** | [Privacy](#compute-privacy) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings. | -| **`resources`** | [Resources](#compute-resources) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related resources. | +| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files @@ -217,30 +216,24 @@ To get information about the files after encryption, the `/fileinfo` endpoint of This only concerns metadata about a file, but never the file URLs. The only way to decrypt them is to exchange at least 1 datatoken based on the respective service pricing scheme. -#### Compute Resources +#### Compute Options -An asset with a service of `type` `compute` has the following additional attributes under the `resources` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. +An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | | **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| | **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| -| **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | - -#### Compute Privacy - -An asset with a service of `type` `compute` has the following additional attributes under the `privacy` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. - -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`gpuType`** | `string` | | Type of GPU (if any) +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | | **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | + The `publisherTrustedAlgorithms ` is an array of objects with the following structure: | Attribute | Type | Required | Description | @@ -283,19 +276,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "resources":{ - "namespace":"ocean-compute", - "cpus":2, - "gpus":4, - "gpuType":"NVIDIA Tesla V100 GPU", - "memory":"128M", - "volumeSize":"2G" - }, - "privacy": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute":{ + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", @@ -520,6 +511,38 @@ Example: "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", "timeout": 0 + }, + { + "type": "compute", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "serviceEndpoint": "https://myprovider.com", + "timeout": 3600, + "compute":{ + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ + { + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] + } } ], "credentials": { From c3f4d5b2cedbf21f80f9d8606629e3a4cc2c8203 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:09:41 -0800 Subject: [PATCH 056/186] fix typo for files object --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 3148f43f..a4d1dcf5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -177,7 +177,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **/** | Encrypted file URLs. | +| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | From 541522ef095de74a0cdf842b8355b2e7e70a5c7f Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 01:54:46 -0800 Subject: [PATCH 057/186] more created&updated updates --- content/concepts/did-ddo.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a4d1dcf5..1d771e17 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | **✓** | Contains the date of publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | **✓** | Contains the the date of last update in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the date of dataset publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. It refers to dataset content. | +| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -144,6 +144,8 @@ The `container` object has the following attributes defining the Docker image fo ```json { "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", "description": "Sample description", "name": "Sample algorithm asset", "type": "algorithm", @@ -491,16 +493,16 @@ Example: { "@context": ["https://w3id.org/did/v1"], "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", "version": "4.0.0", "chainId": 1, "metadata": { - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" }, "services": [ { From 90f907e9ebe4ebac5c0cf4f0e140e52156056b38 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:07:13 -0800 Subject: [PATCH 058/186] added nft.created --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1d771e17..4589ccff 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -404,6 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`created`** | `ISO Date Time string` | Contains the date of nft creation | Example: @@ -414,7 +415,8 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0 + "state": 0, + "created": "2000-10-31T01:30:00" } } ``` @@ -568,7 +570,8 @@ Example: "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", - "state": 0 + "state": 0, + "created": "2000-10-31T01:30:00" }, "datatokens": [ From c79a0b8cb5a64864c71aa9bf65efa029b1ac6f34 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:11:19 -0800 Subject: [PATCH 059/186] more details --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4589ccff..51b9148a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of dataset publishing in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. It refers to dataset content. | -| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | From d4866147277e42c808f13cd9bcfd488c9b2eb3c5 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 02:12:01 -0800 Subject: [PATCH 060/186] fix typo --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 51b9148a..a509b1ef 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| -| **`updated`** | `ISO Date Time string` | | Contains the the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | From bd25862a77df21d32c2a53eae1a678c23f179450 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:17:27 +0000 Subject: [PATCH 061/186] formatting --- content/concepts/did-ddo.md | 105 ++++++++++++++++++------------------ 1 file changed, 52 insertions(+), 53 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a509b1ef..7f2a9268 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -93,8 +93,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`.| +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -181,7 +181,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | +| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files @@ -222,19 +222,18 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job| -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job| -| **`gpuType`** | `string` | | Type of GPU (if any) -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi| -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | - +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job | +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job | +| **`gpuType`** | `string` | | Type of GPU (if any) | +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi | +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: @@ -278,17 +277,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "compute":{ - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute": { + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", @@ -397,14 +396,14 @@ These additional fields are never stored on-chain, and are never taken into cons The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | -------- | ------------------------------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | -| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of nft creation | +| Attribute | Type | Description | +| ------------- | ---------------------- | ------------------------------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`created`** | `ISO Date Time string` | Contains the date of nft creation | Example: @@ -498,13 +497,13 @@ Example: "version": "4.0.0", "chainId": 1, "metadata": { - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" }, "services": [ { @@ -524,17 +523,17 @@ Example: "datatokenAddress": "0x124", "serviceEndpoint": "https://myprovider.com", "timeout": 3600, - "compute":{ - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ + "compute": { + "namespace": "ocean-compute", + "cpus": 2, + "gpus": 4, + "gpuType": "NVIDIA Tesla V100 GPU", + "memory": "128M", + "volumeSize": "2G", + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ { "did": "did:op:123", "filesChecksum": "100", From 5aef5dfb3572b2d7b4715e93462a90a8318c4f10 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:26:57 +0000 Subject: [PATCH 062/186] parser fix --- content/concepts/did-ddo.md | 45 ++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7f2a9268..e75e4ca5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -33,7 +33,7 @@ Here is the complete flow:
UML source - + ```text title DDO flow @@ -49,9 +49,8 @@ Provider -> Provider: depending on metadataState (expired,retired) and aquarius Provider -> Aquarius: DDO Aquarius -> Aquarius : validate DDO Aquarius -> Aquarius : cache DDO -Aquarius -> Aquarius : enhance cached DDO in response with additional infos like `events` & `stats` - -```` +Aquarius -> Aquarius : enhance cached DDO in response with additional infos like events & stats +```
@@ -61,7 +60,7 @@ In Ocean, a DID is a string that looks like this: ```text did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea -```` +``` The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: @@ -350,25 +349,25 @@ The checksum hash is used when publishing/updating metadata using the `setMetaDa ```solidity event MetadataCreated( - address indexed createdBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber +address indexed createdBy, +uint8 state, +string decryptorUrl, +bytes flags, +bytes data, +bytes metaDataHash, +uint256 timestamp, +uint256 blockNumber ); event MetadataUpdated( - address indexed updatedBy, - uint8 state, - string decryptorUrl, - bytes flags, - bytes data, - bytes metaDataHash, - uint256 timestamp, - uint256 blockNumber +address indexed updatedBy, +uint8 state, +string decryptorUrl, +bytes flags, +bytes data, +bytes metaDataHash, +uint256 timestamp, +uint256 blockNumber ); ``` @@ -601,3 +600,7 @@ Example: } } ``` + +``` + +``` From b8fe0e8b13847e62785d6aeca077f704901ab40c Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Thu, 11 Nov 2021 14:31:09 +0000 Subject: [PATCH 063/186] another markdown fix --- content/concepts/did-ddo.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index e75e4ca5..5a30334a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -600,7 +600,3 @@ Example: } } ``` - -``` - -``` From 38b8e7efa52d7d7de60ea6c44d80a39bab803cfd Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 11 Nov 2021 22:10:24 -0800 Subject: [PATCH 064/186] make files string --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a509b1ef..bbd3100e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -179,7 +179,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | From 9b6f2082dea416e2428ea88444f28c1ab8bcc6c5 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 12 Nov 2021 11:58:55 +0000 Subject: [PATCH 065/186] consistent date examples, mention timezone designators --- content/concepts/did-ddo.md | 44 +++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ed9ec92d..1818047b 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -92,8 +92,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO Date Time Format, e.g. `2000-10-31T01:30:00`. | +| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -112,6 +112,8 @@ Example: ```json { "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", "description": "Sample description", "name": "Sample asset", "type": "dataset", @@ -178,7 +180,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | @@ -349,25 +351,25 @@ The checksum hash is used when publishing/updating metadata using the `setMetaDa ```solidity event MetadataCreated( -address indexed createdBy, -uint8 state, -string decryptorUrl, -bytes flags, -bytes data, -bytes metaDataHash, -uint256 timestamp, -uint256 blockNumber + address indexed createdBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber ); event MetadataUpdated( -address indexed updatedBy, -uint8 state, -string decryptorUrl, -bytes flags, -bytes data, -bytes metaDataHash, -uint256 timestamp, -uint256 blockNumber + address indexed updatedBy, + uint8 state, + string decryptorUrl, + bytes flags, + bytes data, + bytes metaDataHash, + uint256 timestamp, + uint256 blockNumber ); ``` @@ -402,7 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of nft creation | +| **`created`** | `ISO Date Time string` | Contains the date of NFT creation | Example: @@ -414,7 +416,7 @@ Example: "symbol": "OCEAN-A-v4", "owner": "0x0000000", "state": 0, - "created": "2000-10-31T01:30:00" + "created": "2000-10-31T01:30:00Z" } } ``` From dfd67b2d25fc1f127a3c283ae13445afbf3f1011 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Fri, 12 Nov 2021 14:10:15 +0000 Subject: [PATCH 066/186] typos, increase TOC level --- content/concepts/did-ddo.md | 54 ++++++++++++++++++------------------- src/templates/Doc.jsx | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1818047b..fb72ca0a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -25,11 +25,11 @@ All DDOs are stored on-chain in encrypted form to be fully GDPR-compatible. A me ## Publishing & Retrieving DDOs -The DDO is stored on-chain as part of the NFT contract and it is stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. +The DDO is stored on-chain as part of the NFT contract, and stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. Here is the complete flow: -![DDO_flow](images/ddo-flow.png) +![DDO flow](images/ddo-flow.png)
UML source @@ -92,8 +92,8 @@ This object holds information describing the actual asset. | Attribute | Type | Required | Description | | --------------------------- | ----------------------------------------- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`created`** | `ISO Date Time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | -| **`updated`** | `ISO Date Time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`created`** | `ISO date/time string` | | Contains the date of the creation of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | +| **`updated`** | `ISO date/time string` | | Contains the date of last update of the dataset content in ISO 8601 format preferably with timezone designators, e.g. `2000-10-31T01:30:00Z`. | | **`description`** | `string` | **✓** | Details of what the resource is. For a dataset, this attribute explains what the data represents and what it can be used for. | | **`copyrightHolder`** | `string` | | The party holding the legal copyright. Empty by default. | | **`name`** | `string` | **✓** | Descriptive name or title of the asset. | @@ -102,8 +102,8 @@ This object holds information describing the actual asset. | **`license`** | `string` | **✓** | Short name referencing the license of the asset (e.g. Public Domain, CC-0, CC-BY, No License Specified, etc. ). If it's not specified, the following value will be added: "No License Specified". | | **`links`** | Array of `string` | | Mapping of URL strings for data samples, or links to find out more information. Links may be to either a URL or another asset. | | **`contentLanguage`** | `string` | | The language of the content. Use one of the language codes from the [IETF BCP 47 standard](https://tools.ietf.org/html/bcp47) | -| **`categories`** | Array of `string` | | Optional array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`tags`** | Array of `string` | | Array of keywords or tags used to describe this content. Empty by default. | +| **`categories`** | Array of `string` | | Array of categories associated to the asset. Note: recommended to use `tags` instead of this. | | **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | | **`algorithm`** | [Algorithm Metadata](#algorithm-metadata) | **✓** (for algorithm assets only) | Information about asset of `type` `algorithm` | @@ -180,13 +180,13 @@ An asset should have at least one service to be actually accessible, and can hav | **`description`** | `string` | | Service description | | **`datatokenAddress`** | `string` | **✓** | Datatoken address | | **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [string](#files) | **✓** | Encrypted file URLs. | +| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | #### Files -The `files` field is returned as a string which holds the encrypted file URLs. +The `files` field is returned as a `string` which holds the encrypted file URLs. Example: @@ -223,26 +223,26 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **`namespace`** | `string` | **✓** | Namespaced used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job | -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job | -| **`gpuType`** | `string` | | Type of GPU (if any) | -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi | -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below) | +| Attribute | Type | Required | Description | +| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **`namespace`** | `string` | **✓** | Namespace used for the compute job. Defaults to 'ocean-compute'. | +| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job. | +| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job. | +| **`gpuType`** | `string` | | Type of GPU (if any). | +| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi. | +| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | +| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | +| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | +| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | +| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below). | The `publisherTrustedAlgorithms ` is an array of objects with the following structure: -| Attribute | Type | Required | Description | -| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------ | -| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | -| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`) | -| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`) | +| Attribute | Type | Required | Description | +| ------------------------------ | -------- | -------- | ------------------------------------------------------------------------- | +| **`did`** | `string` | **✓** | The DID of the algorithm which is trusted by the publisher. | +| **`filesChecksum`** | `string` | **✓** | Hash of algorithm's `files` section (as `string`). | +| **`containerSectionChecksum`** | `string` | **✓** | Hash of algorithm's `metadata.algorithm.container` section (as `string`). | To produce `filesChecksum`: @@ -308,9 +308,9 @@ Example: ### Credentials -By default, a consumer can access a resource if they have 1.0 datatokens. _Credentials_ allow the publisher to optionally specify finer-grained permissions. +By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. -Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1.0 datatokens _and_ one of the specified `"allow"` credentials. +Consider a medical data use case, where only a credentialed EU researcher can legally access a given dataset. Ocean supports this as follows: a consumer can only access the resource if they have 1 datatoken _and_ one of the specified `"allow"` credentials. This is like going to an R-rated movie, where you can only get in if you show both your movie ticket (datatoken) _and_ some identification showing you're old enough (credential). @@ -404,7 +404,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`symbol`** | `string` | Symbol of NFT set in contract. | | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO Date Time string` | Contains the date of NFT creation | +| **`created`** | `ISO date/time string` | Contains the date of NFT creation. | Example: diff --git a/src/templates/Doc.jsx b/src/templates/Doc.jsx index 8332d655..fc10c403 100644 --- a/src/templates/Doc.jsx +++ b/src/templates/Doc.jsx @@ -118,7 +118,7 @@ export const pageQuery = graphql` query DocBySlug($slug: String!) { markdownRemark(fields: { slug: { eq: $slug } }) { id - tableOfContents(maxDepth: 2) + tableOfContents(maxDepth: 3) html htmlAst frontmatter { From 772bae1b358d4ca00d22076ae598611da113a6ad Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 12 Nov 2021 07:11:11 -0800 Subject: [PATCH 067/186] add isInPurgatory --- content/concepts/did-ddo.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fb72ca0a..ae59635d 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -478,13 +478,15 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | +| **`isInPurgatory`** | `string` | If asset is listed in purgatory and reason | Example: ```json { "stats": { - "consumes": 4 + "consumes": 4, + "isInPurgatory": "false" } } ``` @@ -598,7 +600,8 @@ Example: }, "stats": { - "consumes": 4 + "consumes": 4, + "isInPurgatory": "false" } } ``` From 9fbf94df4cfec5b3de123e4104332e2a9928e6b7 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 16 Nov 2021 18:47:02 +0200 Subject: [PATCH 068/186] fix typo --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index ae59635d..9a11bfae 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -411,7 +411,7 @@ Example: ```json { "nft": { - "adddress": "0x000000", + "address": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", From 68f0d2546bbd842f8286a4cea5de523870208df8 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 16 Nov 2021 18:47:29 +0200 Subject: [PATCH 069/186] fix typo --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 9a11bfae..a692ddde 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -438,7 +438,7 @@ Example: { "datatokens": [ { - "adddress": "0x000000", + "address": "0x000000", "name": "Datatoken 1", "symbol": "DT-1", "serviceId": "1" From ef87473b3b858339370bfc8ead502302a886d61d Mon Sep 17 00:00:00 2001 From: mariacarmina <50501033+mariacarmina@users.noreply.github.com> Date: Tue, 16 Nov 2021 23:07:47 +0200 Subject: [PATCH 070/186] fix typos (#823) Fix some typos for `address` key. --- content/concepts/did-ddo.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index a692ddde..8be9d125 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -444,7 +444,7 @@ Example: "serviceId": "1" }, { - "adddress": "0x000001", + "address": "0x000001", "name": "Datatoken 2", "symbol": "DT-2", "serviceId": "2" @@ -568,7 +568,7 @@ Example: // Enhanced Aquarius response begins here "nft": { - "adddress": "0x000000", + "address": "0x000000", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", @@ -578,13 +578,13 @@ Example: "datatokens": [ { - "adddress": "0x000000", + "address": "0x000000", "name": "Datatoken 1", "symbol": "DT-1", "serviceId": "1" }, { - "adddress": "0x000001", + "address": "0x000001", "name": "Datatoken 2", "symbol": "DT-2", "serviceId": "2" From e3f42163a72d96ac7451bdf21dccc8e65474dde6 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Wed, 17 Nov 2021 15:20:07 +0200 Subject: [PATCH 071/186] make sure that chainId is in decimal form --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8be9d125..e7a2ff76 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -62,7 +62,7 @@ In Ocean, a DID is a string that looks like this: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -The part after `did:op:` is the checksum of the ERC721 contract address and the chain the asset has been published to: +The part after `did:op:` is the checksum of the ERC721 contract address and the chainId (expressed as decimal) the asset has been published to: ```js const checksum = sha256(ERC721 contract address + chainId) From d171ef7f28ada9f3116b82a8668adb6038ad66ab Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 17:05:54 +0100 Subject: [PATCH 072/186] Issue-#701: V4 architecture diagram --- content/concepts/architecture.md | 22 ++++++++++++++++------ content/concepts/images/architecture.PNG | Bin 24047 -> 0 bytes content/concepts/images/architecture.png | Bin 0 -> 62956 bytes 3 files changed, 16 insertions(+), 6 deletions(-) delete mode 100644 content/concepts/images/architecture.PNG create mode 100644 content/concepts/images/architecture.png diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 56f250f7..7a3e3697 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,24 +1,34 @@ --- title: Architecture Overview -description: Simplicity and Interoperability via a Datatokens Core +description: Simplicity and Interoperability via a DataNFT Core --- ## Overview Here is the Ocean architecture. -![Ocean Protocol tools architecture](images/architecture.PNG) +![Ocean Protocol tools architecture](images/architecture.png) Here’s an overview of the figure. -- The top layer is **applications** like Ocean Market. With these apps, users can onboard data services into crypto (publish and mint datatokens), hold datatokens as assets (data wallets), discover data assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). -- Below that are **libraries** used by the applications: Ocean React hooks, JavaScript library, and Python library. This also includes middleware to assist discovery: Aquarius and (3rd party tool) TheGraph. -- The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet to start, and other networks later. +- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint DataNFTs and Datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). +- Below that are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: + - **Aquarius**: Provides metadata cache for faster serach by caching on-chain data into elasticsearch + - **Provider**: Facilitates downloading assets, DDO encryption and communicating with `operater-service` for Compute-to-Data jobs. + - **TheGraph**: 3rd party tool +Developers can utilize the libraries to built thier custom applications and marketplaces. +- The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet, and other compatible networks. To see the list of supported networks click [here](/concepts/networks/). -Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20 tools. +Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20, ERC721 tools. The rest of this page elaborates. +## DataNFT + +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Each DataNFT has a unique identifier. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. +Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. + + ## Datatokens & Access Control Tools The publisher actor holds the dataset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The dataset has a URL. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. diff --git a/content/concepts/images/architecture.PNG b/content/concepts/images/architecture.PNG deleted file mode 100644 index d5a5d0850935778eb6de7adef13d335e3bb847d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24047 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 KxLVCN{J#K Date: Sun, 28 Nov 2021 17:34:38 +0100 Subject: [PATCH 073/186] Issue-#701: Rename file --- .../images/{architechture.png => architecture.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename content/concepts/images/{architechture.png => architecture.png} (100%) diff --git a/content/concepts/images/architechture.png b/content/concepts/images/architecture.png similarity index 100% rename from content/concepts/images/architechture.png rename to content/concepts/images/architecture.png From c8716ce8ae75a2d84293253cfba43a2bed614fb1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 17:56:40 +0100 Subject: [PATCH 074/186] Issue-#701: Architecture --- content/concepts/architecture.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 7a3e3697..e5fb14bb 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -25,17 +25,17 @@ The rest of this page elaborates. ## DataNFT -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Each DataNFT has a unique identifier. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. ## Datatokens & Access Control Tools -The publisher actor holds the dataset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The dataset has a URL. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. +The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. In the **publish** step, the publisher invokes **Ocean Datatoken Factory** to deploy a new datatoken to the chain. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC20 datatoken template**. The publisher then mints datatokens. -The publisher runs **Ocean Provider**. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database; however this adds another dependency. To avoid this, it stores the URL on-chain. So that others don’t see that URL, it encrypts it. +The publisher runs their own **Ocean Provider** or can use one deployed by Ocean Protocol. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database; however this adds another dependency. To avoid this, Provider encrypts the URL and it URL on-chain. To initiate the **consume** step, the data consumer sends 1.0 datatokens to the Provider wallet. Then they make a service request to the Provider. The Provider loads the encrypted URL, decrypts it, and provisions the requested service (send static data, or enable a compute-to-data job). @@ -69,9 +69,9 @@ Complementary to Ocean Market, Ocean has reference code to ease building **third Metadata (name of dataset, date created etc.) is used by marketplaces for data asset discovery. Each data asset can have a [decentralized identifier](https://w3c-ccg.github.io/did-spec/) (DID) that resolves to a DID document (DDO) for associated metadata. The DDO is essentially [JSON](https://www.json.org/) filling in metadata fields. For more details on working with OCEAN DIDs check out the [DID concept documentation](https://docs.oceanprotocol.com/concepts/did-ddo/). The [DDO Metadata documentation](https://docs.oceanprotocol.com/concepts/ddo-metadata/) goes into more depth regarding metadata structure. -[OEP8](https://github.com/oceanprotocol/OEPs/tree/master/8) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). +[OEP8](/concepts/did-ddo/) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). -Ocean uses the Ethereum mainnet as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the write fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. +Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the write fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. Due to the permissionless, decentralized nature of data on Ethereum mainnet, any last-mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [TheGraph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. From 3669df9177c471b28a7e890bb6d863d75bf43719 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 28 Nov 2021 18:10:15 +0100 Subject: [PATCH 075/186] Issue-701: Update links --- content/concepts/architecture.md | 2 +- content/concepts/{nft.md => data-nft.md} | 9 ++++----- data/sidebars/concepts.yml | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) rename content/concepts/{nft.md => data-nft.md} (88%) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index e5fb14bb..c6914277 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -26,7 +26,7 @@ The rest of this page elaborates. ## DataNFT DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. -Click [here](/concepts/nft/) to further read about DataNFTs and Datatokens. +Click [here](/concepts/data-nft/) to further read about DataNFTs and Datatokens. ## Datatokens & Access Control Tools diff --git a/content/concepts/nft.md b/content/concepts/data-nft.md similarity index 88% rename from content/concepts/nft.md rename to content/concepts/data-nft.md index 0cea874a..394bf4d2 100644 --- a/content/concepts/nft.md +++ b/content/concepts/data-nft.md @@ -52,8 +52,7 @@ Alice is the author of a book. Alice wants to hold the copyright of her work but ## Other References -- https://en.wikipedia.org/wiki/Non-fungible_token -- https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d -- https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3 -- https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e -- https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70 +- [Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) +- [Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) +- [Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) +- [Fungibility sightings in NFTs](https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index c90edef4..b9d5a48d 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -7,7 +7,7 @@ - title: Architecture Overview link: /concepts/architecture/ - title: Data NFTs - link: /concepts/nft/ + link: /concepts/data-nft/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From e14ee28b05253ac86af9eea9d11d31f5a266fe6f Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Mon, 29 Nov 2021 16:13:42 +0000 Subject: [PATCH 076/186] move purgatory, add NFT tokenURI, service ID --- content/concepts/did-ddo.md | 46 ++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index e7a2ff76..b2ab357e 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -262,6 +262,7 @@ Example: { "services": [ { + "id": "1", "type": "access", "files": "0x044736da6dae39889ff570c34540f24e5e084f...", "name": "Download service", @@ -271,6 +272,7 @@ Example: "timeout": 0 }, { + "id": "2", "type": "compute", "files": "0x6dd05e0edb460623c843a263291ebe757c1eb3...", "name": "Compute service", @@ -471,6 +473,34 @@ Example: } ``` +### Purgatory + +Contains information about an asset's purgatory status defined in [`list-purgatory`](https://github.com/oceanprotocol/list-purgatory). Marketplace interfaces are encouraged to prevent certain user actions like adding liquidity on assets in purgatory. + +| Attribute | Type | Description | +| ------------ | --------- | --------------------------------------------------------------------------------------------- | +| **`state`** | `boolean` | If `true`, asset is in purgatory. | +| **`reason`** | `string` | If asset is in purgatory, contains the reason for being there as defined in `list-purgatory`. | + +Example: + +```json +{ + "purgatory": { + "state": true, + "reason": "Copyright violation" + } +} +``` + +```json +{ + "purgatory": { + "state": false + } +} +``` + ### Statistics The `stats` section contains different statistics fields. @@ -478,15 +508,13 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | | **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | -| **`isInPurgatory`** | `string` | If asset is listed in purgatory and reason | Example: ```json { "stats": { - "consumes": 4, - "isInPurgatory": "false" + "consumes": 4 } } ``` @@ -510,6 +538,7 @@ Example: }, "services": [ { + "id": "1", "type": "access", "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Download service", @@ -519,6 +548,7 @@ Example: "timeout": 0 }, { + "id": "2", "type": "compute", "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", "name": "Compute service", @@ -573,7 +603,8 @@ Example: "symbol": "OCEAN-A-v4", "owner": "0x0000000", "state": 0, - "created": "2000-10-31T01:30:00" + "created": "2000-10-31T01:30:00", + "tokenURI": "xxx" }, "datatokens": [ @@ -599,9 +630,12 @@ Example: "datetime": "2000-10-31T01:30:00" }, + "purgatory": { + "state": false + }, + "stats": { - "consumes": 4, - "isInPurgatory": "false" + "consumes": 4 } } ``` From e0111575df9e93e96b3b54362078ea14c7fed7a7 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:30:27 -0800 Subject: [PATCH 077/186] add multiple storage types --- content/concepts/did-ddo.md | 60 +++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index b2ab357e..d81294c6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -196,12 +196,68 @@ Example: } ``` -During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of strings with one or multiple URLs is what gets encrypted and send to _Provider_: +During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. +Type of objects supported : + + + + + + + + + + +
KeyDescriptionExample
'url'Static URL. Contains url and HTTP method ```json -["https://url.com/file1.csv", "https://url.com/file2.csv"] +[ + { + "url":{ + "url":"https://url.com/file1.csv", + "method":"GET" + } + }, + { + "url":{ + "url":"https://url.com/file2.csv", + "method":"POST" + } + } +] ``` +
+ +First class integrations supported in the future : + + + + + + + + + + + + + + + +
KeyDescriptionExample
"ipfs"IPFS files + + ```json +[ + { "ipfs": { "hash":"XXX"}} +] +``` +
"filecoin"Filecoin storage 
"arwave"Arwave 
"storj"Storj 
"sql"Sql connection, dataset is generated by a query 
+ + +A service can contain multiple files, using multiple storage types. + + To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: ```json From 523a2875dd36655e429a0aeb7d44b695427bb036 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:32:15 -0800 Subject: [PATCH 078/186] add multi type example --- content/concepts/did-ddo.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index d81294c6..1d59608f 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -257,6 +257,22 @@ First class integrations supported in the future : A service can contain multiple files, using multiple storage types. +Example: +```json +[ + { + "url":{ + "url":"https://url.com/file1.csv", + "method":"GET" + } + }, + { + "ipfs":{ + "hash":"XXXX" + } + } +] +``` To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: From 1e2c782e13dd836842d349c54ba52c82b28eda65 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:35:20 -0800 Subject: [PATCH 079/186] fix lint --- content/concepts/did-ddo.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1d59608f..74960eb8 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -246,6 +246,7 @@ First class integrations supported in the future : { "ipfs": { "hash":"XXX"}} ] ``` + "filecoin"Filecoin storage  @@ -258,6 +259,7 @@ First class integrations supported in the future : A service can contain multiple files, using multiple storage types. Example: + ```json [ { From 4cb2d017d3a309b287bb822a4f8fb1e483676bfe Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:37:28 -0800 Subject: [PATCH 080/186] formatting --- content/concepts/did-ddo.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 74960eb8..8ccee86a 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -197,6 +197,8 @@ Example: ``` During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. + + Type of objects supported : From 0bfb12c403334131e8c8037de59bc8f3cd42c2b8 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:39:46 -0800 Subject: [PATCH 081/186] add details to fileinfo --- content/concepts/did-ddo.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8ccee86a..aff47921 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -278,15 +278,17 @@ Example: ] ``` -To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata: +To get information about the files after encryption, the `/fileinfo` endpoint of _Provider_ returns based on a passed DID an array of file metadata (based on the file type): ```json [ { + "type":"url", "contentLength": 100, "contentType": "application/json" }, { + "type":"url", "contentLength": 130, "contentType": "application/text" } From 93abc7db1a7a4d9b8ad6ba69a5f0598ad990424b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Fri, 3 Dec 2021 00:41:06 -0800 Subject: [PATCH 082/186] formatting --- content/concepts/did-ddo.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aff47921..58d660c6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -214,15 +214,15 @@ Type of objects supported : ```json [ { - "url":{ - "url":"https://url.com/file1.csv", - "method":"GET" + "url": { + "url": "https://url.com/file1.csv", + "method": "GET" } }, { - "url":{ - "url":"https://url.com/file2.csv", - "method":"POST" + "url": { + "url": "https://url.com/file2.csv", + "method": "POST" } } ] @@ -245,7 +245,7 @@ First class integrations supported in the future : ```json [ - { "ipfs": { "hash":"XXX"}} + { "ipfs": { "hash": "XXX"}} ] ``` @@ -266,13 +266,13 @@ Example: [ { "url":{ - "url":"https://url.com/file1.csv", - "method":"GET" + "url": "https://url.com/file1.csv", + "method": "GET" } }, { - "ipfs":{ - "hash":"XXXX" + "ipfs": { + "hash": "XXXX" } } ] @@ -283,12 +283,12 @@ To get information about the files after encryption, the `/fileinfo` endpoint of ```json [ { - "type":"url", + "type": "url", "contentLength": 100, "contentType": "application/json" }, { - "type":"url", + "type": "url", "contentLength": 130, "contentType": "application/text" } From 9b9fc01192cc42682fa3415b447910abe7501517 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 3 Dec 2021 15:51:52 +0100 Subject: [PATCH 083/186] Issue-#701: Data NFT and datatoken --- content/concepts/architecture.md | 19 ++++++++----------- .../{data-nft.md => datanft-and-datatoken.md} | 0 data/sidebars/concepts.yml | 4 ++-- 3 files changed, 10 insertions(+), 13 deletions(-) rename content/concepts/{data-nft.md => datanft-and-datatoken.md} (100%) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index c6914277..8d483294 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,6 +1,6 @@ --- title: Architecture Overview -description: Simplicity and Interoperability via a DataNFT Core +description: Data NFTs and Datatokens architecture --- ## Overview @@ -11,27 +11,24 @@ Here is the Ocean architecture. Here’s an overview of the figure. -- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint DataNFTs and Datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). +- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint data NFTs and datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). - Below that are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: - - **Aquarius**: Provides metadata cache for faster serach by caching on-chain data into elasticsearch + - **Aquarius**: Provides metadata cache for faster search by caching on-chain data into elasticsearch - **Provider**: Facilitates downloading assets, DDO encryption and communicating with `operater-service` for Compute-to-Data jobs. - **TheGraph**: 3rd party tool Developers can utilize the libraries to built thier custom applications and marketplaces. - The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet, and other compatible networks. To see the list of supported networks click [here](/concepts/networks/). -Left to right are groupings of functionality: tools for datatokens, tools for markets (including pools), tools to consume data services and for metadata, and external ERC20, ERC721 tools. - The rest of this page elaborates. -## DataNFT +## Data NFTs, Datatokens and Access Control Tools -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new DataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new Datatoken contracts and even mint them. Each Datatoken contract is associated with one DataNFT contract. -Click [here](/concepts/data-nft/) to further read about DataNFTs and Datatokens. +Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one data NFT contract. +Click [here](/concepts/datanft-and-datatoken/) to further read about data NFTs and datatokens. +ERC721 data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. -## Datatokens & Access Control Tools - -The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. +Datatoken represents the asset which the publisher want to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. In the **publish** step, the publisher invokes **Ocean Datatoken Factory** to deploy a new datatoken to the chain. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC20 datatoken template**. The publisher then mints datatokens. diff --git a/content/concepts/data-nft.md b/content/concepts/datanft-and-datatoken.md similarity index 100% rename from content/concepts/data-nft.md rename to content/concepts/datanft-and-datatoken.md diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index b9d5a48d..ce6ecf98 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,8 +6,8 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: Data NFTs - link: /concepts/data-nft/ + - title: Data NFT and Datatoken + link: /concepts/datanft-and-datatoken/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From 0160fddb49c4c6d78918c2c3ff977593a754ec0b Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Tue, 7 Dec 2021 02:06:32 -0800 Subject: [PATCH 084/186] update --- content/concepts/did-ddo.md | 37 ++++++++++++++++--------------------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 58d660c6..d4c41f55 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -203,7 +203,7 @@ Type of objects supported :
- + @@ -214,16 +214,9 @@ Type of objects supported : ```json [ { - "url": { - "url": "https://url.com/file1.csv", - "method": "GET" - } - }, - { - "url": { - "url": "https://url.com/file2.csv", - "method": "POST" - } + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" } ] ``` @@ -235,7 +228,7 @@ First class integrations supported in the future :
KeyType Description Example
- + @@ -245,7 +238,10 @@ First class integrations supported in the future : ```json [ - { "ipfs": { "hash": "XXX"}} + { + "type":"ipfs", + "hash": "XXX" + } ] ``` @@ -265,15 +261,14 @@ Example: ```json [ { - "url":{ - "url": "https://url.com/file1.csv", - "method": "GET" - } + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" + }, { - "ipfs": { - "hash": "XXXX" - } + "type": "ipfs", + "hash": "XXXX" } ] ``` @@ -288,7 +283,7 @@ To get information about the files after encryption, the `/fileinfo` endpoint of "contentType": "application/json" }, { - "type": "url", + "type": "ipfs", "contentLength": 130, "contentType": "application/text" } From ad25e34aac20624cc83a404780d81a6cc4cc1c71 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 7 Dec 2021 11:26:05 +0100 Subject: [PATCH 085/186] ISsue-#701: Data NFT and datatoken docs --- content/concepts/datanft-and-datatoken.md | 44 ++++++++++-------- .../concepts/images/datanft-and-datatoken.png | Bin 0 -> 44985 bytes 2 files changed, 25 insertions(+), 19 deletions(-) create mode 100644 content/concepts/images/datanft-and-datatoken.png diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index 394bf4d2..fb53f149 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,9 +1,23 @@ --- -title: Data NFTs -description: Ocean Protocol uses ERC721 NFTs to represent the intellectual property (IP) of published datasets or algorithms, and to further sub-license access to it with user roles or ERC20 data tokens. +title: Data NFTs and Datatokens +description: In Ocean Protocol, ERC721 Data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. --- -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded and allow transfer of ownership and copyright. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on Ethereum blockchain. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership through transfer transactions. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright / base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright / base IP through transfer transactions. + +Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH, you and Alice could swap your ETH and your final holdings remain the same. They're apples-to-apples. Licenses (contracts) to consume a copyrighted asset are naturally fungible - they can be swapped with each other. + +![Data NFT and Datatoken](images/datanft-and-datatoken.png) + + +## High-Level Architecture + +The image above describes how ERC721 DataNFTs, ERC20 datatokens, and AMMs relate. + +- Bottom: The publisher deploys an ERC721 dataNFT contract representing base IP for the data asset. They are now the manager of the dataNFT. +- Middle: The manager then deploys an ERC20 datatoken contract against the dataNFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. +- Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity for receive pool tokens, i.e. become liquidity providers (LPs). + ## Terminology @@ -13,12 +27,10 @@ A non-fungible token stored on the blockchain represents a unique asset. NFTs ca - **To Publish**: Claim copyright or exclusive base license - **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) -## Supporting NFTs using Ocean Protocol +## Implementation in Ocean Protocol Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. -## Sub-licensing the Base IP - ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. ## Roles @@ -35,24 +47,18 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ### Manager -- A public address with a `Magner` role can update the metadata +- A public address with a `Maganer` role can update the metadata - Can deploy new ERC20 contract which is associtated with the `ERC721` contract. -## Use case 1 - -Alice is the creator of a painting and wants to make sure that the ownership of her artwork is uniquely determined. She performs the **Publish** action. She creates an ERC721 token which represents the ownership of the physical asset. Here, **Base IP** is Alice's artwork. **Base IP holder** is Alice. Now, Alice wants to transfer the ownership of her Artwork to Bob. So, Alice makes Bob's address as owner of the token in the discussion by sending a Blockchain transaction. - -![Image 1](images/use-case-1.PNG) - -## Use case 2 - -Alice is the author of a book. Alice wants to hold the copyright of her work but, allows others to read her book. So, She creates 2 versions of her book namely: digital copy, physical copy. She assigns Bob as one of the holder of digital edition of the book. Here, **Base IP** is the book. **Base IP holder** is Alice and Bob is **Sub-licensee** for a digital edition of the book. Alice tokenizes her work by performing **Publish** action i.e _ERC721.safeMint(to=aliceWalletAddress, tokenid=1)_. Alice also creates sub-licenses of her book by creating two ERC20 tokens and transfers the digital copy token to Bob's wallet. +## High-Level Behavior ![Image 2](images/use-case-2.PNG) +Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. + ## Other References -- [Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) -- [Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) -- [Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) +- [Data & NFTs 1: Practical Connections of ERC721 with Intellectual Property](https://blog.oceanprotocol.com/nfts-ip-1-practical-connections-of-erc721-with-intellectual-property-dc216aaf005d) +- [Data & NFTs 2: Leveraging ERC20 Fungibility](https://blog.oceanprotocol.com/nfts-ip-2-leveraging-erc20-fungibility-bcee162290e3) +- [Data & NFTs 3: Combining ERC721 & ERC20](https://blog.oceanprotocol.com/nfts-ip-3-combining-erc721-erc20-b69ea659115e) - [Fungibility sightings in NFTs](https://blog.oceanprotocol.com/on-difficult-to-explain-fungibility-sightings-in-nfts-26bc18620f70) diff --git a/content/concepts/images/datanft-and-datatoken.png b/content/concepts/images/datanft-and-datatoken.png new file mode 100644 index 0000000000000000000000000000000000000000..e6034d7c5d03f0bbb044f91250cbd550a477009f GIT binary patch literal 44985 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 a=aMM;BTi||Ktd1yTgp$LD^$u^y!$_52HW=l literal 0 HcmV?d00001 From 913d117a301f6b7ec49035ecee7e865cf7437552 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Tue, 28 Dec 2021 10:24:33 +0200 Subject: [PATCH 086/186] Add required nftAddress --- content/concepts/did-ddo.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index d4c41f55..aab0713c 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -62,7 +62,7 @@ In Ocean, a DID is a string that looks like this: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -The part after `did:op:` is the checksum of the ERC721 contract address and the chainId (expressed as decimal) the asset has been published to: +The part after `did:op:` is the the ERC721 contract address(in checksum format) and the chainId (expressed as decimal) the asset has been published to: ```js const checksum = sha256(ERC721 contract address + chainId) @@ -82,6 +82,7 @@ A DDO in Ocean has these required attributes: | **`id`** | `string` | Computed as `sha256(address of ERC721 contract + chainId)`. | | **`version`** | `string` | Version information in [SemVer](https://semver.org) notation referring to this DDO spec version, like `4.0.0`. | | **`chainId`** | `number` | Stores chainId of the network the DDO was published to. | +| **`nftAddress`** | `string` | NFT contract linked to this asset | | **`metadata`** | [Metadata](#metadata) | Stores an object describing the asset. | | **`services`** | [Services](#services) | Stores an array of services defining access to the asset. | | **`credentials`** | [Credentials](#credentials) | Describes the credentials needed to access a dataset in addition to the `services` definition. | @@ -600,6 +601,7 @@ Example: "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", "version": "4.0.0", "chainId": 1, + "nftAddress": "0x123", "metadata": { "created": "2020-11-15T12:27:48Z", "updated": "2021-05-17T21:58:02Z", @@ -671,7 +673,7 @@ Example: // Enhanced Aquarius response begins here "nft": { - "address": "0x000000", + "address": "0x123", "name": "Ocean Protocol Asset v4", "symbol": "OCEAN-A-v4", "owner": "0x0000000", From b137fa718d19ec5e64059aefb246959c9fa9808b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Dec 2021 11:09:16 +0100 Subject: [PATCH 087/186] ISsue-701-Create roles page --- content/concepts/roles.md | 21 +++++++++++++++++++++ data/sidebars/concepts.yml | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 content/concepts/roles.md diff --git a/content/concepts/roles.md b/content/concepts/roles.md new file mode 100644 index 00000000..166567c2 --- /dev/null +++ b/content/concepts/roles.md @@ -0,0 +1,21 @@ +--- +title: Data NFTs and datatoken roles +description: Access to the data NFT and datatoken smart contract functions is controlled by the permssions stored on chain in the contracts. +--- + +## Roles in data NFT smart contract + +| Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | +|-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| +| Set token URI |
| | | | | +| Add manager |
| | | | | +| Remove manager |
| | | | | +| Clean permissions |
| | | | | +| Set base URI |
| | | | | +| Set MetaData state | | | | |
| +| Set MetaData | | | | |
| +| Create new Datatoken | | |
| | | +| Executes any other smart contract | |
| | | | +| Set new key-value in store | | | |
| | + +## Roles in datatoken smart contract \ No newline at end of file diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index ce6ecf98..9bbd3f2e 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -8,6 +8,8 @@ link: /concepts/architecture/ - title: Data NFT and Datatoken link: /concepts/datanft-and-datatoken/ + - title: Roles + link: /concepts/roles/ - title: Supported Networks link: /concepts/networks/ - title: Deployments From d9e9164851b914a96c5ec736b117ea66d3013734 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 28 Dec 2021 12:27:34 +0100 Subject: [PATCH 088/186] Issue-#701: Fix lint issue --- content/concepts/roles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 166567c2..ad31379d 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -18,4 +18,4 @@ description: Access to the data NFT and datatoken smart contract functions is co | Executes any other smart contract | |
| | | | | Set new key-value in store | | | |
| | -## Roles in datatoken smart contract \ No newline at end of file +## Roles in datatoken smart contract From e4abe7ae3e0a5948edf5b808d7029654a099286b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 4 Jan 2022 08:29:16 +0100 Subject: [PATCH 089/186] Issue-#721: Create ERC20 roles table --- content/concepts/roles.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index ad31379d..317036a6 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -7,7 +7,7 @@ description: Access to the data NFT and datatoken smart contract functions is co | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| -| Set token URI |
| | | | | +| Set token URI | | | | | | | Add manager |
| | | | | | Remove manager |
| | | | | | Clean permissions |
| | | | | @@ -19,3 +19,17 @@ description: Access to the data NFT and datatoken smart contract functions is co | Set new key-value in store | | | |
| | ## Roles in datatoken smart contract + +| Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | +|--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| +| Deploy pool |
| | | | +| Create Fixed Rate exchange |
| | | | +| Create Dispenser |
| | | | +| Add minter |
| | | | +| Remove minter |
| | | | +| Add fee manager |
| | | | +| Remove fee manager |
| | | | +| Set data |
| | | | +| Clean permissions | | |
| | +| Mint | |
| | | +| Set fee collector | | | |
| From f219f2ac4fd2545a18b858dd820d3ea835a35c4f Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 6 Jan 2022 18:10:46 +0200 Subject: [PATCH 090/186] remove unnecessary compute service params --- content/concepts/did-ddo.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index aab0713c..0e7adfb6 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -299,12 +299,6 @@ An asset with a service of `type` `compute` has the following additional attribu | Attribute | Type | Required | Description | | ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`namespace`** | `string` | **✓** | Namespace used for the compute job. Defaults to 'ocean-compute'. | -| **`cpus`** | `number` | | Maximum number of CPUs allocated for a job. | -| **`gpus`** | `number` | | Maximum number of GPUs allocated for a job. | -| **`gpuType`** | `string` | | Type of GPU (if any). | -| **`memory`** | `string` | | Maximum amount of memory allocated for a job. You can express memory as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. For example, the following represent roughly the same value: 128974848, 129e6, 129M, 123Mi. | -| **`volumeSize`** | `string` | | Amount of disk space allocated. You can express it as a plain integer or as a fixed-point number using one of these suffixes: E, P, T, G, M, k. You can also use the power-of-two equivalents: Ei, Pi, Ti, Gi, Mi, Ki. | | **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | | **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | | **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | @@ -355,12 +349,6 @@ Example: "serviceEndpoint": "https://myprovider.com", "timeout": 0, "compute": { - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", "allowRawAlgorithm": false, "allowNetworkAccess": true, "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], @@ -632,12 +620,6 @@ Example: "serviceEndpoint": "https://myprovider.com", "timeout": 3600, "compute": { - "namespace": "ocean-compute", - "cpus": 2, - "gpus": 4, - "gpuType": "NVIDIA Tesla V100 GPU", - "memory": "128M", - "volumeSize": "2G", "allowRawAlgorithm": false, "allowNetworkAccess": true, "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], From e1f6649d4a407939efb365529c4650ce08566ad0 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 06:59:21 +0100 Subject: [PATCH 091/186] Issue-#781: Update roles page --- content/concepts/datanft-and-datatoken.md | 2 +- content/concepts/images/use-case-1.PNG | Bin 34049 -> 0 bytes .../images/{use-case-2.PNG => use-case.png} | Bin content/concepts/roles.md | 40 +++++++++--------- 4 files changed, 21 insertions(+), 21 deletions(-) delete mode 100644 content/concepts/images/use-case-1.PNG rename content/concepts/images/{use-case-2.PNG => use-case.png} (100%) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index fb53f149..e7827d72 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -52,7 +52,7 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ## High-Level Behavior -![Image 2](images/use-case-2.PNG) +![Image 2](images/use-case.png) Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. diff --git a/content/concepts/images/use-case-1.PNG b/content/concepts/images/use-case-1.PNG deleted file mode 100644 index 2703a81d5594eb76f93bab34a2868ace2b36bab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34049 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%0DUnx(jaRdx&GtYM@(c^pH~sT-cYXdW5RKiR9^G+ z!*KDsnx3@2bK$oEpu-eH3R_w0Y!jn zi*W+Za;hLCUU#bAY!bS<$Ij!`nH-!4`eF>M(Dml1d4uHriE^a*2#=Tc$w|@UH=Mr+ z9JxCkB;h<=lOdOcVwL=Pe26~l=p;}S(Carvd^92w2_=kDQ`5&Y^RmEt{$4GQ| z8p|u+&OWe(bEzTBNu-LiXwh)pyXggvIU@@GgsUU7@8%XOIoo;c1&w@tv%Z;A-O@W5 z(rUP`7*~Qk3Rvhul}xz5B>0X!pwJw(`vR~}St_AM%bUuMGD21Ehb(h3WZv7^b2!e&!b-S;@1gC+6$X^V!weH4`QaQbE46IH|fOonakAbXKEYqWcW&wFNu z?37OHr$5#K`B9D6CjV?@h)y!8d41(U6)934?YtH4J3w0ZLm4N17p(L<4qNII$GH+H z@%O-~@*C*i4X1>zP194P>Opa>5fMn1N8z2~f}5g&e|KG+Xu0}KgX^1Bdo*=`^EgMg zo|7^>++;7C|0An`?$t@F?)ao3@r(Kcd8e7S(YckFygIb~A8?XM6ynU%#okHa(+bcf?vF%f&SSwT}$piKeEyyk&Em6Q zLk(^kTu|4la2>nmRqc@{;U^PqksvvZ-t`)e2yMoRjUCzj5fP4LF=inrKksYtrg_j&4`_qVU&RA1!YH=0~4x@cs1!}Riz0c*M6LUnSL^?sBJl)I zMS@XRBapg0_bx2&hjU(9t~a`eplug8c7RT56B}wyz;`Y1ZMFt?C@7vrpWG#$uaCgE z^%Y-w@4Xbf-^kSuo5KOVE(MV&WS`YhvX3WfG<=MOC29Abdvq>SG-A&J^Wa0|pdZRR zjeAwW|Lx0>)<38Tok&4vCNLWMz3%kcDzlogFrNN0zGFJvE7|DIGu(wuzG(6;*LyS- z@&em@EF=6C{(36sQn5}$@ElQmrB#-slI$+e6#aD28|^1~Uu{?u#C%2q z0@9bVtPa?(nyc3%@0dFLDCnEI2ywJ}VPv_X?C5jUXkW_w!51(}%EKi>Y-4ycHpGvQ z+oKCpKCmjXD6&6gWC`fSf;DmQB(|Z+-{UP~UP4FuYjCPuh6uX9jke7HO|AFJN_yZkHHxy=D>&4Obc|Y zIfTTHBpac8c*HK=Gs9Y)1>{5;lsOZbO_LnC9_`~{JHBDD!)tv$FAPuj^c1VYPnAE%W5< z52ioCDNHiq;(&dVChNPAC9MXv&cFVsdZ#L{VEbSSC$6izZ`vs46c3rB%-O_+qb7o8 zxKX*5aSfJc=-mfqwNHCK@b|PMk^J@U?%<2IU=AV9=f4rcb%P@<20~rU8AnqNag+7) zHZuB)!sgy%OnuY5cGYGMwLX>FqqBQxZ9{;W^*roF0 zS3wHkwqR7N2iwzi64Dvs9pOgiIv>hEs}zcNsOlGZKFdaXXjFIb59F@s)#kb-4y6*< zFZ05txevDaiCW9OoiUe++&$oxOsM0CR*<(XP$(brLzajvPGC%Eme}%`yRc~nI1A>T zImS!pS>`COc%FFT8P`&ZhYaqgjxi3XDZT2uM63LY*fig44M(x9ZP$BL6UCC8*u>{F?+{P~rJ(xV%A@SLx9gl5Ib{4Q7&{e+8 zTulwltfqO$jri;(DRW`V;B@~j&M0%SI*rOJw|C4o7O=x#gY1i<3aS|T<3eYxe{I|) zBYjNjp4xU#8#-Pv9(U&LJjQcxAi&5Q*h+BJnz5oz7O~<+ z_QM-V-rQC@;pBo)@29sj1M%U7P~hT(4@3G_#IVL{YPgCJ!h4d zvJR-(d9?zM4;w#njEpnmNy>7w8^2 zsSRzYfgO*(n_kkFQ}jApqv{F6J9gx#C3tMt-NyBYmDr;DqboM9Dv7_OEN^_|Y~tyh z%c;?}uL>@}4s)*S58tzxqJO<#c?Y6DGVv^Iy~DlFZ_Y!xoC@w-e1ij88HSR1 ztL6WEDm^uYXc5|HyweNG{LC;neSW$dbJs5>KYVg0A0wV7=9j!mNZWF|+N+qDV3+NMqd>Zc0 zk_sjyY@>zRSf?|GfkYHn&p@?V8!a*K(urRZK3F8WN5Ntr#cS}$$ESz*Po7{uRuo-4f#D`ch3^&Y{~1syAI?n zfj$P{di89)*G*>cXPWJ9aePEG6j`m{qi*#K`$?Oz|B93dfm&)&s;d%)1JcO|phD<> z9XA&~*&d|5BK1c5a%VvTivgRJR4iN#%jDfp+3()6-F-6<@J8^>|JrYE#D(6~Cy`?` zBNNNuTs_c$?4ZPvIbEn}!G`YsYQ|LSuIT?>?dWfzoylCm5p#UMd>3d|W@ zt}JL(zQX!IC(!#tG;3q{qGjle@U>N-2K*2n|GECZ^q0907TVlJ&}!&LQh*H1{5T~f z;k!&WtpEnNO@3Z~mL%7yqF(`OWN!%OixN;a;#c(i>iMT>?KWq?LOvi`;o&VOq*4Fz zz&Z~<6=xpdS3Mz6wnc)Vir&$~b%UtYg?=>)mZUw(!T#dWvHpDXNH!__7ylV$N`O?s zx-2cA6WP%!_qjWX!kCu-Hf-}KS9TuHSZj^+BkqkzPSno6{I@4Ar0C8|b6Zoi*VbAq zBpx_B6X~@}I6=JUeXq`JpJzi>`{++y=Xb}E9m!Y}o9^xJ=URZeFGHaL-C10B;2rgo z6D*p5NBOA`wEY}GZ2%SykU2u_Tk(A${n#Sw0bcX(f>_UriJYpU+US=mZ(k!Nz{ce# zh%NFw436#3&mV{hSO?uE)sPkAHD3CrIatjF6tcSylq}HOk}Vk;Y>He{Z=D z8IXhNBe85C>&-t+Qpug#@*@UPZ9XrLdn#WbKl;?v=g+o`-&7O+fvui5TAsp&zaU?| z6EUA&JfE6vY$CQ(>jYHM9s~U5=f+B(g^2bfd1EPHS?A>`L0(0{ds{7r(HcnQ3qj2y z@yTLeMH*^aJY?WM@`I4-F=u>o_b=!k?bUwNo4-}R9fF6yB8UYKSo#_M5seOInuH)~ zd;Aa6()AH=nbeZ)cU7?G@n)4R9z`&mEG5FI>X_x)0VM{fb-% z3jRz6Xz%22M~vhajRLEfpEGzjQ(pV{U90fYTF+~B4?{}KiTv_)S8l6KC$YuQ`7V!i z(0#uDdfeWfO(}?b?Eg4Kvsy_IM;L~P5tyfMS1ws0M20qP2}+e0wuJv(C{PptT#YBg zmyFWQdTWw(UYhSCTnR)~tmEhvj>(ExRN9(I<3ef=&1i5y`+lwei~osaZMvoTAW(32 z16#O&qfV8#;f6j#x*#918xdDt2paE%E__i?lvuR?tnh^4&IvWjWf%eqRXK z^o=%VB!plBD4Y=nNvpvf>f_W=U@1j*O;P2Y>{gou^ALUtS&#!Ji7rL{Nh1+;j>W{bvyfK*f1<)pnju9lZ!W zPj?@z4)7}S7^(at_|B*OS$%+t<9|R&Dfq6G;I>;H| zC2o^ivY_9Iz3_SHrd`Zo4RNo&Zfv@$*tB`#J%Z6r)l@?`r`9>p?TlZ+PYw!!!N%Or z2`CvPs{|B#s)I*&I{bKeEuO1SnF(@Ky*l6J^PN9-z(c~jRTB4U^=gB%hOMRZyu?-_ zSv%?1#p?(x+<5vmGHdI1C#rm5X?N)FLf@sKKfH1qEKI}GN0Hz^Mgqp5@{%T^p;i@N zqONF0eX6^`J;A}K2{VN2)9&AcoMLf{9XO|Z)VoAZ-Th}`=`**9N4ielEkFZAesz{@ z4R1^>ZF-4rUhZ}cwV4Yul)8A*JK4vp`-C5$)&_)Ecc;$UK92IZ)M6|@mKn1rmX`mB zNf-}6_D#jZtafg^@^-*4V;qRThC^r-GpT>1<0yji*Cp)NiEEL4R*fAsVY5?TWHR#v zQgn`b*Hw*f7Kls))6*J5v~9&3f{Cwd@{_n3QxQn^-G#PS=sxh-o`+w5mn7q3es;0A zUdY8~f0%VJ57&7D1Id1KFYD8gKW1s5J$z{qWkAe^D%CV^D`Z2>(|oI<-|gna@M+0^ zhp8fmjw7&2-_=$#c^<-_M`0(rbjb(W$~1;O5plj(6&p7rk3HC#7XmlUsT44;}43OgU%O-f~r|4)poh?OQ6JkE6so#~{Y!y=T8D$vaoO!e?U0nSs~y zb=txp4^r?^3z3hU-|3VmE5evON;^|V0-tbN0l8|cSNq}LHc67MmvUlu)6IL|dg!}( zMZho3$;_P?`Sb}E;bA>LF?fzr>*Hp03?o;}Px$doeh-z7(nD`fh>pO$C4Abnu*`Aq z{0{XZ=bp?p)M3v!9Ec#X2lcze0>s;Wd2{i`qN2vGUCh#I>59L_#G?uSmb?CK*lN`% zoH9q*i|!VIrqhDNR<2Bcm#T$=-9QTnu1(k!5v%i4*T;Kgb2xbLA@p=CgtMg+K`nZo zcwH=xx2fC{oH9JI>gb`B_dG*oa>iSBDkd|ws>2p3y!^@}^@I7`=ldC?ng-lG{5iK2 zOEhzn5|*In2*%YKWkT6_%6^BNo_I zAF-^5C!Q9#QKYHidEODZgdPpBD+eK9e!54J$MF$N>`So3vxpyJlFJW>^DS>+2jG{7Y? zIq18Xf`cYRTN-7p#AIXpr=53bYf4lJHw@K?upJe&8|qvhI)4bj(A6Xh)ss3Gs^f6nAs$D;qQPKG+eytS!*+{$w zVwJ*st>vyw!K*!yB`7_~!|J-e^JG*&PSB2qmt~Kgli!VR^3KFrzh$z?Ighu)amqx4 zEdSI!l}I1GU8ANa-ky0{Vl(eQ5~<$?Om^8#@HHLar3s6aNsQpcpwJ!XNm`I?@CdA{ zyAp6vwPRfeu1uj0NuId_|LeU1x(7JGF$tRcGsYDvR?AitYQ=@#b3XlqUEdnKN($(E zk9plF-qG|Gm9ll$EoKccmy+i0;Yn9Hib!ggG5F#=rBtN~K_^C@AfdJB3=-C^tF)kC^1!wBg zxBrgfe!bQWKhUKg1Tx?Ip8>0E<;X=tZro~qk2Hv@<1$7YLZb!V*QuP8S&Ou**4g{v z-aRPZUauhGxD1Y-div>Bx&Bi0>ZGsWg_-#B8a{*aUFo-L9c4acio{cVFRlEu&MhxOz7YAGpp(&R`5l_i*t+v^SUdQYN#5?qrD^2Q}Ls28i6Xk zf;*(7lrVRh>yI~EOsn{;hO#`f>~o~9>+d9P2t}=jH~nDFS58yEHnoU*RIQ6@1Z4Sq zf@w{-wlTY#D`vt^R`u+EQ1(;3rV^L$rM|pD2Evh$*elEf{;usS0u*sVBfB8Pe^K~G zN7#hYOiC2dmY{=O4MAm1mqx_!$z6J{%T*BAtTMf^-8#Ybaebjwh+o&fqFTX&<6LK1 z)8v zAXTMG2_hww5EMi}1Pl;50Sih;U!+L~X#znM2mull3DKbRCfz^?5CQ2B2>d4K_kDX` z=eN(ku5+IMNOUqY&&-;&?)zSAlB5&eD!xF<_O^aW*ysck_U`KKtmp52x!-W%6{{7g z*GJ=|2q(QB!3=Vvvt^&jXxqrWTdbEu*Ov=4ifby?L?o9DjDbCs;I?kv7ljJ|@=GTq))T;Zlqt`O5j=by9iS z^5dzJjnMw|Zpp?{ji96Cx%#DuQ4Rd4BHX#%OSEebMFYG?rF8EMl7}dM^WFh^h7ITK zGo+v*+_?I3uRUoRH;lwrYd|B7#uraVKp(?YhI#MfBd^Sj4IiYaN3;r6pWxF;Kz=^b zRn+7Edcv-ql(W&PX5;Jp{Y|2bOvTl?Y^|}Fpu5Iqj@6R~R&bOh&ZgT$-)ZlyB;WVE z_cUr>gbhT)Q0=2f7)MaTRKs2#uFJd%B^t70eRezE$S0frWI|%rr8ryKCd)3Qr7DP* zsWOW^DP-+6{LozA&#?jhSgk%}u2F}!XKnRphKB7C%NlRjZTC0pd=2s`K}e;$tyh$~ zMMwS3yG7Os#(UabiqVQ9i;6(~rC!O%I|Wk9G8sq7QuX%X76Mt-it6OKRgJNBbl)N8 z6kaUKSg6J6Ymt(sI?FpHbUw=M$6QwbWSLbIo!L+;Y;>D2BLAA@=j{A+=?G8~q#Z7@o6p3r2Y4~u&b8!MZ|demlrpa@MWJs5AY@6#f_I45kJ>gE?{4&_e|31xdJ`CQ@rH$z&Rk&eOXQ62;}^<= z7X?y1pTvx4!l-qVcEOYzeR70wv`1fRSFQjtt0#F2|Cf!%{KZLiA;>dxFaKiElI9d4 z2@Tio%X|#_u#(%Hg^&Nt7vc2_(}zOEV>3;dQ%J0WPYa-7lt!N8>>-_?8Rv%WhtK+%pS3lfwIz6bF>-pP2_w+M!Qesf=j%7 z&ojfU5p#LRXygTg7%yA^=6@>O>(tLs zs?~_hzIefYXy8@L*F{5k`64dk8#Ed3;lq6u*U94Jxs`>osrj1+y3E`ll098N(B$@| zFoh9>O4rHmPl`dBa~^baE5|P5NzZY`%YifF?YU?p232v!r^cicqK0&SWe&{$*o|ZN z5}ONqTjouYnhSkdUj8%UF<8U6Wu3t?J>%LWcgckHa2T*-#;*bXytS^%^&Fh4ZUe7T z&+12y8cl5B8wFmtHHO!Z@`w5r+ey9ibcz~#U}?3280Zyo62C zO3PkSeWM(NdB}63B`!9$;)HqAr1sUS*J~9TOUA-xd5i=N2Qeg%b8(eB<>E^96@R`J zr9v-iWqtN(!fgxPMy7bo#?2i$aYoSF{#gg&OXE}te??J@t6;6>(6Yjsuz-_3o~TW? z9Cx`R!yI6`pb8Y{6xW_+Ru=}2ZUhz!wfL=BPP2*w#8WC)?cTXUOT+|-*q^+VA(}Q=JSZ6A=GAk* z{ZGWco~tMiF=G3d(^y`0t5+Eh(hG0!6i&E2+mrU>Ii^Up@UzF3SPaHmEPq;WPp)wg z=%2)=$+Yh2aOzjg1(rNEa$Spj#clMLm#7vxjAeIHqRs-__nc8@;h0#W(kZiqZ$6WZ zX_ECBsLmQRR9~)$iDTULpg&~f`A;c|sgxA4UczTAl3`%KsbMEC(MFSo4hE`Nrv+dm zTjCJGz&$s?tC`<(F@W;Qm{{drUx@iRfPe2hk@bv?L49z_HbMsfdJK`8X4r1|v%>>B zJG<-ys*vyi)oSx+oB7?}J;+9%9yRhG?=SdP(rEZVO-ZNIebS=zx}5m{L@lsN=)R9V zA#A-#rl#1yg#0BA8maM&%M9E6Vx;w9>BWr0{C{6IRSzYlM9W-T)0Yx62#(j05aTm? zq-U2kQ*S1W$Vi>6H$uG{;5-MN>N~k3$E)nC+-xs0R9|S)r?y~|N9+o)8e`o=MWsX;cLvsb0LzYuF$vcavc=CO{Tgwi~T zA4zKQ*3*#_id9>8@YR*d<}bip@rFubn=^Fp8|l?}wm1hx)0i3sKfR~nLo)j1Z`kvq zcnh`l@K9jpYU?vK)4JJn?}&@3F*DH{WNl?w`MW*)s3pW_I#NB^O-1QnRnMe3U{pOs=h?)A9!< z>tpXii+b$sXgO8-dZg{f&QHf3nZv)nxnn$~e(KvY+qqGYZy0`N#>N=5X>)RMEf5%s zx%KnamV{ZbwDFs;*5cd#_R)DISMh?}Pth(J>jU(NVbAiRzFNgt#)+r5 zkIGkj{|FVhyCra|_g+66Vx?C0yD`2jt`;}X0_kvFC4;e&n~1c!KTuV6oUkhj8ZEHG zG_Zjs$@UPJO5DxPl#hoBAjPm%)QF$o?pYWrPzE@8U7k88Skawi?spotv^Zbjba7=i zvWzhEarckPTevKVLP0?y+3H!VhIMz|MJwKL_l{vUm;_L+d4&&(7kJ%owuZinSfC|& z@A9e^-U^4Ni)pdb*?TKpt;_Cyd&Pz+&b_i2&{==4zW$!t=TiDj&9M&PE7}Ajec9eF zdvE^%*aSh(fA{;D(2s;{fhGAhRn>OeseN%E=RY><@QU4FHJTp2h%~6jw4|$=VW$Dc zdZoj6sxY6a26DXtOv%3jS??uBKv)wx-xbDm%&i92g)gIL^`{n#l$x~akvr=I+Dp}s z5&BO;KXmc0<=Z~Gr)8zxC)=tHDhC`a8DX69z1%hw?ktJH$+pH-)h%^f1Hk9Q)O&!u zQpZ!=v1~vrC%m$sahVB>yy`=tTqsAD71TDT;nfTmOnuFI+G7%wK&^5r1{=c`(ys z7)ddKG<yB5x-i>v&p(PI!|-jQ<|+)e6c0D zjXrgJS3tZ9G%u9mB%q_K>yl-F;)Od@1nj=zC+?={R~1yYdHG?Mnn{46*PqX{;!DG(%q9b?G^e>?4DdMj!46EE5cFn?mNbza6JLyHMS=u6eM(lpc zK3+H~^=!WM>33#NDN)(hlT!~iMFMJ6DYm1F1)K~UDPGU-4HN=DkNbt59%x#IJVskygDU{kRkfL_AC502TC-6XF}k3 z%e{@{_o+@XPG3_a76*LI?ckgI-6Af^=^Hc{xt7v1x>c=MIKdwy2tC$*!SnT!DMGe( z(nm^XDWauW5@{8?IA>$@S5kQ`tiK@8Or(4-O8rD&wss`6z)eDJ&4F1GDVBXu%rGa; z>ivWC^Crhz?%<;oU)TqP}$G4%HikY&AouYPA77_8evEKDFA|Dr@YC_IUxPhRik;5oLtv!H z*(xxRF}`NOD>rCct1Sn=|$?y(EPXJ6V{<<$?uNbj|dq*q>? zPK5P~`P2wE0y3ltVCNB+T)IuMGuMrrhI!kQp|&dg1Kten=RC{T{3afSVF1}&PgPDM z>B}Alq5p!165ZZ(-SRRxC$cDJMv_-8 z6)=1vvOShUaV}ql$ki~HMQi&ZbFmoBim8`YX%77|RElxZ zmiF{WsM4em%bPGpSLuX!kiGL*)KwVdo2!>F5a$D2f1ZtbL+{Iu!6v-AWvFr1zT*bL zp7ldeznMqT4if5k6FZ@-NU7$S+&J#DgcAW*X>S5s4&=R7Q0K6qfHTP!5inf=NGT2u zO;9|?zD+4|bUKVYbR3fJtTL2v;*y8X`Qo|vjcwXL^ir}_RJ36W1sZ7c>hhV%RU#Ko z()DpgRKEau=9Nm=^pSRj2)ehpEIudUALUAMH2r~EncMSyd%B*|!qx}&mmJKW5j8;^ zbhP312=Z|gny0+}fat&FBJHO+E!lrtHJtgYY!m z4lB=#p)#zG>W5QpB0VB(6}tIja^xcN&(V&Mr$ypi5XGz9q~lO}V>|bkdAJa%qSejJ zF~=(+1;+JPeB#0P=53GCC~vLDy(JCY;+7*PKu=BY#Zj-YciMy7K!`)b97T#Dc)KKH(;w$vuUO6iG*vcJpi6*yq6w zwsqp@o14gqcb z`v(xJWBKO}E>&-MR0Un0>XX5hM=;KubO(hno=>Hh+Zxo!PvPcoDjv_e6t=#DTh?PV zZm8aB;z`$j;n6&3Y5mKLvR0T@xf}NolPVZ4du}vYB}c_h1?0D3kJx@Fn;FcMA3G~A ziVy$85IJ#DF(DS3`me1Y=pS{_))R$aGtV2I*Vpn(9eh90WjmTIM=Px=Q^~6H$hSjG zQZ=tuJ7|j`FbCpReJq`8VJMrvaBssCuX#kb2h7oWyn)5>!Xoj8p;pO;bh-m~IsbCD z+me-^){i2-ttysw+-}sh6E;~2Ab>Nrxp`F>SLeI)s+%RQz?JeT_E_f+;a%yezncna zW>dr;9`5?ho!@%y+oh&vzl(#O6aKacTm6PjpNIHP<|an;*aj1}Suyb9a)lHIy-aA2 zt{US&#T+)P1~MkpRt7wc%21K8AXtbu><0mOW8kOs|)KX_|{J?ntZlEl``{NMP=?NP5UPfLB@p^iCZvXhkGOkX#dwVv3`T?*{?C1ZbI`6H|NvWw) z8F;!YyJsA?*la1@(-HOUQV%#ye@_Ihe;#`FtOTfT#nIZdxOh`F1hoguI%r)k8bny} z)XmO9lix$X=*tum`B3#QHvhjfwZG~Q%JRZ(gV5mRSOjrF)DRH?L9=WMyZKSoGt|C+ zwaEj8@iMwgByEe?GwpO#0>Jwf1&pmE`|WJYJ^rTwYcviF zAj;f_iFV%JmGf*RNC^A)o)Q99_zy8tw8g4!Obw zJ_q6 zo*ku1*-Q)Fs>UKmOT)mhoksV|_;SxG$|ko@lYMea6}ipF4j{&8xQasriJj1hOMN8D3X}tXuo${%+>>)g?0my3~nVZH6_|Qeutc zpAFtx-;lK3g-#b_Gr}CG*FX$$Oc+^-~_5~M(x9k%R z?sCD4p7X(IHKo~0Mo(pW>Q&y%hSO1f0@Zm_*c$Iugp0zloDH*P5B8pnPz_i%#cpPL z8ZP=!tW?L9nm$=l)dx zy|SH$ujB!X8M-cAsbIx(Ll}+KIa%mglEHeOU0GCWZ@VgFR9XX@xRVQNR5T&DUM&s) zOHP|QlzvXGu*T#iwx1zKV!d8B#;sOid8baL)lE+KF`WR@?ZZA`bJ!fPwJ758w9>*A?MIvJ!^*HOba${!v@093t~GZGwWVU%c6E~L z;1};sPA*m5t`CO3ABqA^q<-~t&d60oInXGTy5T!DCwbvP&>tO;hBkfIdQyOA|H{7Mmgl?eBL<=+f!d4u!;lO3~OAF#{1zY1I*WdC48b$E; z=MfD`v&w~?gT975w)}?V5H~CujWnC;D z)AVFrckOZshP=U;DphG`<`oR5n!6gay6D*VlyI^(rYtz9Hr3pr#`S9{kyBWSo+in6QSf-R0CN`6=%2gT5$uMdy+m9 z_^r;BMtWq+j+JNg@WJVrpe(h7jJ`zA$Rrt&QyJFtCV}~JHP)ROdilhcleqO>dSTz2 z3l8`4sam|`paO42n95$_T|T2VN{N?@K8;eM2)?3WgK!F!T`a1XTJ!mmg%- zGL@WnR=ImPj-uH*H-K>Ko4Q=-q?Ak8LWgFF>oXTJys4Yk!%XvIr7^UyfI~wnpNl^| z);M@HYe!!D7uzM?}@DNLTah__L!9f$BJB=%TBr}#QDZv*+yYK*X@O1f#k4Ph#O$a$se6P zmjq-K5?)Xhjm!U{A8YDzU%Os)G&h=c(rbvKKCN7FsuA6PGmxmQR1(WHqm6%Mjcmqc z7$ZIMHwPCrBt(M-$FTxy>r8pQjAaMSpxkOz)?x>n1Zi5GH$gT!Fs+PLJ5;1i4gF>E z+*T5?Jz?|Fe)JhfLZ%X#(aB1y{IsN}^?oW#NzBmSATY{aIIS+WX7u%RysgSzwU)HH zrdWFH1C^D0ig{{kZcmo+vB@PKW2<;joCvG(Z)TUHF}5*g=S=NFv&Xs4BEK7wFES3s zc1IKz7TOIHgW`*nRX#LZ3Z)hTiX4?GuJRy~T4~b0rxt^XH{CmiT?zWE^ zQR;=dHI0dI$`mBUU*Gc#MJ%&5gei7rRq=}`iQrWRy*r$3UsIdc=rJ}@IPB&W1V}GJ zwIvocXO13?x4(+)$#--27s;JANgY5ZH8RT8(%Pq(Q4U`Hhn#DxH;>H6?yTf7&Fg4j zSOrHju{Oj5J(umf+u9<@@vvrS^cd!{j zqT9`Oe{sxDa=ERcI+GM+v!b2}0TmMdz6do+mtt!MfqTQAh=fx!rFEOk3$fm^o$t}} z-5bbXR}35`eB>e}Za+NyDNQEZm%ugfvTiTFq&37CdRQLe>r}%?>3~ZrBzKsmV7@ z@533>a#wrbs4T&;kejA?vGJQzDhm~vN|bj030&;6`uoi~ugQ{VhERla4#}5t5t&aI zQHx|5`>5?Fp{)ZEHpAsc$^>_@x?c5q=g~6LG&>c1nvN#QG#`ojKDiYdMk!#N0!RJP zplU(R(h~$szZ%iNNK{<_S|MN?SQa(xF4x+At5_KSF>~+3$t!PdFvkyDKi5?0jegAH z1rk|}#~ufXN~W=H`(}^d(tlF$wXNW zX^{CITe?dby$bF3CgYBH3A4W5z#++Z!y|7rx2_C!WQ{&`#8{|Hoa*7(P}x;sOTHwn z;F__1b17C#c1_Z~!#OCmvN?*XgS*}|QweEjkjZ(lsv?!8$4vdX_R;6r9;SJWN#cTg zZtMzIe9<`@WoC&Y)_5i_(GDR#WoT-S#%73MAmQ#EO;7JE4PTbcR7-`r+3O%gpYbDmp)OhcJDoP+<&sTeE zO=TZpXCh$)6Ety;xk)4{|3-xGpIK0LhOs!)%VXR~TeS@db(B2G?DQu00JTJN2CqcwP? zU>A?tZ&;YOnl2yj7Uik-Zvb>vu_w{!i&UX=5NVI z*k@ItcllIYgids}P$a1r?5)l6=EG3&wyzxfjM5fEAJqCvO~usgW%577GY{gj;>8|p z&K>=0J>OY1`A6j#Qw}Pk)py7{e~ekw!Ss66lI9z9EOFYSdU9VHZmw6{05f@6;-x%6 zz2NV)^{Vj)Lf_%U`FP68Prrf%@sh{XTrwHGa(-oQ{>fXkY$@{SZ?)76qkSL#w2Z zWQ@)!76tY+iNT8F>h0F!wNX}s3Ij2VuO8GLTQWLsL@R_HAu}p$J^b=kYjqiabDV=s zY$X!2_ngC~s=smjiycH=PGWSbjC2emeA6a914<^$1_B-wT+QA4s?hIw{xEvi1_%X2ob!#M)wcGHCku-w6th1%3TayRezu*C$8S<} z6xB(_s$DX%a4!^jW^0m&+Hsfmmmj~sN6Z5nBPzH_HGxr z_DEyyCU4KujbZCMpQnG7Z`QNoloJ|J*-jVUlv2#LiV$5!sG!XQ_>N^zk=DNd3BxrI zVe+zWA)0OlU7Fktfh?u;xqD*fW4-zgMdVaPnN{WAxR*aFhNwag9&T~ZsKL8@CX-MI zovxNuL)41iwPlf45t zcF8l^2+7Yto8I)$1UkMW2^0ph{_c=yW1d%%14or!P1}11owp-Jmju&XGO^&jdt9?= z_^}pnawkv7VV(R&(x_MM)12QXQROa|70gpVz{S!-pBtd4AFQ2PUE7L(iHSz7i$0qg zTVyhbhQ>C$PyvyB%SUpJ(^7FUMO3`Z)CwYfCf^sKG#QD291#8_#@$|yUh?rPapEJ> zy1VdLBhP68=k>ticq2_(b%y=W^i+p9x+i~Lzh6{odS6=89Mg0-&o#0@Dx-#&U}i3f z=+4-j%-}atT{5Lv57Q|vWDAD^3^85mXj->JzFUrb(R8yU+?GB)T3mO}UZEg*CQW!g6V7pv04SxYe^>kcW<&D}%krs5h|bAJ`Y;?gNn1DaVTUeCU;v07BAOF>Fwc zx;PjsZ+%8V?yXmMbfH#&jE^Qmf@@bn@{uw7L}t6$)(cCV0p|f`$mPK>C|bZTg2M-u zOyrB^URhY^iWRYd^>t-By9(!R3ce%8{aTQa^@iySGDwX>Ih^DB|h~;bMb|2FkW$UaF*ZX$6EX2U}ipP%*KZg8oaqc zaWrmV{dz{z{P3eC2s>}dJI?44;EAM(Y%ZwFLXR~J09g8mQP3OSd1C_+dSAZaF5DK1aD3z$SMDKQg+E!U(P zEsJZ;UgJXg-Y&cGt+9D#$VOH z>Naaq-7Xz@)COvqS^xN(QmF2I5oXI4{^u@|!m}-^EQNS8BRLLkYtyYCZ z>_f57v_Hw;oGKpsA|^g2`7*O7*e2EQ*T?zQ6qCsM)vt}wBx}g(6`Bce2O#Z))|ow# z_Q4AZq{WLZro>3{;wgyu+1V=l*XuIR(qFi&AkK40X(=Nu%JzkzMq~xZSGZT$!iT0h z$kr-3l7X$k`m&aKijH!e0B?&lu2q)IGeLNjPIF&ctHGe|mkI6P!123ZLxyKmv6gR+ zBvR|FPNsdYDB@ks2RU#E&P&{}p6<2ALi=M6S&Tq7;?%|YVQCVq@;5RMWsRX9&y;&! z0iZ!nfpTD*7U?H7`o_-Y)YWIfVx){Gtbt8d?r`!m5ee7^Zp+)e7hbfmK#onkR+jcw zfq#`OLn!}h`;|DaCw}wHX(Q>Om(iM2KZgjU7hChT5*egQb5S#gH}_9I^s_5d<<94B zyLN5ySGI12;-&exk$A;RQwNvA8zz6+4Ifxaru?J01p8~LgxO2&oUkZxN8gW%Nsbw8 zE5%eK`TYoOH+p14w%8dcdjC+|hYTBoU@zld!Gjw(wT&Mh3ZX~4h#hz~1lY<6CeK1h z<9hGqqabx)#=582lIk<6Kr}A4HwXx+BVy$wWE66QQew~8>dJ{3JR>BV^+MowDs!{ z$uJS|uA#K3QYInyLgFf`%a+dti@zH_EUmtF9o2!WBQzMf64adQ41zq6)(oasn>w=) z(<9q`k@>}KgHb2bjX;sO)rD6C`SI6^DW*G)T|XH-5~oDDaa-QsiByCfGuzJ5CLR zR>zEl_gY)PcSQC`F6+dKNN;Y=ZV_uO13isZR!9jcaCJs|B-&(CuM&M2$P3boEWOh> z^@ne(e$NMZ|9mJK4}R<1--2g46p65bCc9oXvSK&d7~Q2Sa;p}kXUQ(I){9DsOqCx) zl*OBBB^xXC4|naO;Ak1x^k8s@!%m+8l+K)!FR=6+9}2i}H0!TT<@aP)=xQr?4;NzN zI_@rV=ildK!0kT@+-r=UQd#2q;OyN!1oPEP`!l;XY3vNTv+P{e5Y$Ji+JOxqR8p6O z7)Q4BG4!omF4#)%JSy_V!QCjHi_^%L&;HN` zgPQ5S)Ns2zrsgrw9Jt>j7BD>m%HF`da*Y1#hQG#FZ0OmStUP4w!n_vUT0?06Pogdr z&^HdLpZ`B3>w;Ne|71v+_W!?R-5ol|+3j#N9xr{0(|BY_Rnn?gJ%B2C*(3}fj0U&7 zja@!HU~h?kC%tM$EE`Gu(DOt?X_6xc+(EKn24Dn>e1Co1w+)+5 z@N~DRt>33j#lSS*Ru1N0>(lMj0hKp42h4-WU6cUfbg4fmC2xAS__$OC2Ns@`KdFL$ zmmZg{ig%ZF`X|e+OPzW>r22Yzbr}SUqs^`;vP9t8bdCbU2Y0@SKs;Etp<(= z_a-Ej#<)Epd^Xhn;PmH?)Q~bQyPEg{eza_U+(<(3z^hsJ7Dn<)*ls_!T-$=c@VRRG zVh!IiI_}81zU?Un5u{X^QxCtlx(?)<=W`sjUmOew+CpBdfW)#cq5iot zya6W=fh%sV#=6SN#h7drLf|~0XCDr~15~M957uUTwPgDIUlVPib3+kq0~OWtt>@|K z?)bcByNoY{KAz)jp^NmIe^&a?D^LfCmz|YP1?lOclMZ~E8iD+M#Rzg2aOWl3V*F?el@^4tfAl3XnkThDlCJBs#EP7b>me}To|>VGI|qsDH)?j7 z^8mtin~aoqA3_vcV604gE5vS8ET3Jnxr0s~4r z6HGSgziD%Jt4bBwP&){Jqrp2y_$Q^d^>o;V-MTrusK9n#MEu5H*iHBS7I6V6=?wL> z+8ORMR4HDX<3p%%VuW(!fS8qVOFhD_!%s5(>rB|FIKo+a#D)k$YH@?P)73UUU2sw4 zS=?8q_J0yYsf0MpVF}x_*>7XxIAly{4fE8Q9r*a>={a*>(j|%s=72(a@dKsg`Rg4N z8^j6Rom6|qeZTaO_M4kR%+xMmNq#L7N1Qfz*f(xrZy`^-ePNUQsrrIg;{ z^#RKPNrc<}+Xrp3R*kEaVPE^NwPCz|czZQ8_YFeXq;fPs;<7w)ptQ zkY4HA)VFYaM4a0id~-&Ud>uZ~S`9UXx=WIs;FSG>?}-r z38d?5nsfI-renfHlylTV1URVdzON;9mUdvmTq*klUceqC^}3Z319sLo$b?TmH5ihrHJHRQo#&+K$yO2337mMSa^_T)E|E>u`x zFP7f#3D=L$JxA)Y?K1My=1qW!d^YMIG0bO;$X~C`_dEKG_BDtv6r<^EuiSB+v$Pms z6y?){neV!uU4H3qI*X>t8h5N{i^J3*D}e|TsdJ_p49WU`H5BC zvz@8tD379bZONVkaKat_$#j()HU`aLP!Ck%Y4a+{w}sMOVi~y`ownl6g!b#v7Kyq_ z`!nZh&6Zz>t8CubM@%6S-E!H5EdD;}kI@aWc(-^Lsn zu;WyLZJVnB~~>N~mu_PchSWKQDxrCvIE9gLR_#$8k>{PEv&x+<)Ie(=Fm zXCY8EJ>wF7!}dlX;p_eEc%E$+4$9WvKm;vy#TNzZM(GVWFWHFpfZ}OcE-w-zbaNBy zNL61*-%56p18JpZ?p*~68!+#=xS;M zsD!v)_z*XZtCV4zQ|>_~dRTRtt-X<Ne=z(w6c!X|sTKf^>{Gb?4KxytzuOlo1Kts&Ivh zo;Z%ORBzUep0oMkt~ZrH&ov2D--^MwgU02NvfWUMt; ze3q{v2e7)};Ji5iQSp7dEyp-L<4#!W-d25pOOW>ym0Th$1m(D~-1)7_uXLUCAmCQw zZ9khWYelQ>;snqegIqz2SZa4;U?A6QX9PqRyrx0VmdB*q=j?zVC2)%9E z?J3Or{D+&Mi6o$v0>MPj!dGx>40!%d2eMkey3M6h$)1t9dp>TVNUG)SBjKhc$R^vo z;ljpW2XOP{z0IVH^NGJe$!*|$GUyEiZ-_7XszC-%FZX1GY;b%^gg2gVT&ahka{?wN zrv6MBQ(jI4)tcGzK@JXkeV9StX(h&k>VfyOdIBB(m#jt29$B8fEtsK^c+?vo0i9#G zGSO7?$@ti*%nP;lABx5=zl0a3?5TxHW?R59=dtY)F;lr0R4lVpqBcySIo0B@)Dt(< z(vRLCq?H0{dq~0>$W9+G|I53)|6=0h=dYH$CE^DXPefm{6777{v&lWp{jTr|+?Th} zJKuVQke!YlQpO;Ttn7X`Wv;_S)J@TvlgUGL<{dneuFj>g;a zzMqs|3fp~OBF{vsQToHF^jmLlH3Pw{CaP2p)laBLK-Tgl>3t5F4{~Gg9+~;_Nb$#E zQk~DP&g9X;5)ZP?{#Fs-eQXN>ZDl96-v+oFmaSA9U3PmBW~h}X4K0YSmws{z^K{Ue z4=P{;aPBf{!}T5Z=aINaGFMB&ci?ima(0V$%SM;JJKe~N2@%7pu4UHgNiJY_(tmil z1yt{xy%68*r@8Qc$r*CZ5t!O@s;bd{_K+e0SdSJZmoo)9PSLM-;$Y?ZJC(2xbY9A1 zu?M^K*YcN4EYUT)quL7*vtnU>Rj|njB79)f8+HwI3Bd#S0Z1cpBDDF>mpAgc(WO61zL30~rm=Ydu0l%eb%XwlW<1xpZR{l2Wk?-#C~S6%Yn!d2 zmi`(T(@Yim+-2=>8NtKRdhCB!Pwt!W`=e6@Q~4$NqNA@7e-sde%YSWdPLLh%t?_Z+ z7Ur_=Odfnx4a%D-1}yh1oza>iD60{biXpE5@5zn#?nBkyJZ zEeDD2x#ZTfDtt?5yS5hlv%fF@?|l~J=jW#gc-8`q^1qB}G|=0DWeh?=%D!8*KzGcJ stH9G5I0W>`9s_FI^5iHUt+}mTeEcUCt&*}nvcJEs1=GY{yY=Y*0PWg(4FCWD diff --git a/content/concepts/images/use-case-2.PNG b/content/concepts/images/use-case.png similarity index 100% rename from content/concepts/images/use-case-2.PNG rename to content/concepts/images/use-case.png diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 317036a6..35bc354c 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -8,28 +8,28 @@ description: Access to the data NFT and datatoken smart contract functions is co | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| | Set token URI | | | | | | -| Add manager |
| | | | | -| Remove manager |
| | | | | -| Clean permissions |
| | | | | -| Set base URI |
| | | | | -| Set MetaData state | | | | |
| -| Set MetaData | | | | |
| -| Create new Datatoken | | |
| | | -| Executes any other smart contract | |
| | | | -| Set new key-value in store | | | |
| | +| Add manager |
🗸
| | | | | +| Remove manager |
🗸
| | | | | +| Clean permissions |
🗸
| | | | | +| Set base URI |
🗸
| | | | | +| Set MetaData state | | | | |
🗸
| +| Set MetaData | | | | |
🗸
| +| Create new Datatoken | | |
🗸
| | | +| Executes any other smart contract | |
🗸
| | | | +| Set new key-value in store | | | |
🗸
| | ## Roles in datatoken smart contract | Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | |--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| -| Deploy pool |
| | | | -| Create Fixed Rate exchange |
| | | | -| Create Dispenser |
| | | | -| Add minter |
| | | | -| Remove minter |
| | | | -| Add fee manager |
| | | | -| Remove fee manager |
| | | | -| Set data |
| | | | -| Clean permissions | | |
| | -| Mint | |
| | | -| Set fee collector | | | |
| +| Deploy pool |
🗸
| | | | +| Create Fixed Rate exchange |
🗸
| | | | +| Create Dispenser |
🗸
| | | | +| Add minter |
🗸
| | | | +| Remove minter |
🗸
| | | | +| Add fee manager |
🗸
| | | | +| Remove fee manager |
🗸
| | | | +| Set data |
🗸
| | | | +| Clean permissions | | |
🗸
| | +| Mint | |
🗸
| | | +| Set fee collector | | | |
🗸
| From bff0c0055aea92bd43b96277ce2d53ee03241c51 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 07:11:28 +0100 Subject: [PATCH 092/186] Issue-#781: Roles page --- content/concepts/roles.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 35bc354c..00bad007 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -1,9 +1,11 @@ --- title: Data NFTs and datatoken roles -description: Access to the data NFT and datatoken smart contract functions is controlled by the permssions stored on chain in the contracts. +description: The permssions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. --- -## Roles in data NFT smart contract +The permissions are stored in the data NFT (ERC721) smart contract. The data NFT (ERC721) and datatoken (ERC20) smart contracts both use this information to restrict access to the smart contract functions. The tables below list restricted actions that are accessible only to the allowed users. + +## Roles in data NFT (ERC721) smart contract | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | |-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| @@ -18,7 +20,7 @@ description: Access to the data NFT and datatoken smart contract functions is co | Executes any other smart contract | |
🗸
| | | | | Set new key-value in store | | | |
🗸
| | -## Roles in datatoken smart contract +## Roles in datatoken (ERC20) smart contract | Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | |--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| From a5405106c2a5a0eee277e51f51ba33b9d419797e Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 11:26:02 +0100 Subject: [PATCH 093/186] Issue-#849: Update marketplace content --- content/tutorials/marketplace.md | 44 ++++++++------------------------ 1 file changed, 10 insertions(+), 34 deletions(-) diff --git a/content/tutorials/marketplace.md b/content/tutorials/marketplace.md index e40ea5a0..4f05b4df 100644 --- a/content/tutorials/marketplace.md +++ b/content/tutorials/marketplace.md @@ -3,43 +3,19 @@ title: Set Up a Marketplace description: --- -In Ocean, marketplaces and publishers are different roles. A common setup is for one organization to do both. We focus on that here. +## About marketplace -## The Steps +Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provider a web interface for accessing assets published on the chain. By default, the assets are pulled from Aquarius hosted by Ocean Protocol. To extend the existing features of the marketplace, developers can fork the marketplace. -1. Develop the first cut of the app. -1. Prepare some initial data assets. -1. Deploy to production. +By doing so, developers can: -## Develop a First Cut of the App +- Change the name of the marketplace. +- Implement their own branding, style. +- Change the source of asset information. +- Change fee address. -Here are some approaches: +## Forking marketplace -- Fork [Ocean Market](https://github.com/oceanprotocol/market) code. -- Build from [Ocean React hooks](https://github.com/oceanprotocol/react). -- Build up from [ocean.js](https://github.com/oceanprotocol/ocean.js) or [ocean.py](https://github.com/oceanprotocol/ocean.py) drivers. +To setup a marketplace follow the steps here: -## Prepare Some Initial Data Assets - -When you deploy, you'll want some initial data assets for your market to offer. - -Ocean supports several types, such as Azure and S3 storage. The [tutorials](/tutorials/) section provides more info. - -## Deploy to Production - -When developing your app, you'll likely use Barge to run all the Ocean Protocol components on your local machine. - -When it comes time to go to production, you will have to run these components: - -- Your marketplace/publisher app -- Aquarius (with Elasticsearch) -- Provider-py - -Of course, there are many other things that must be handled in production: - -- Security of the infrastructure where the software is running -- Monitoring -- Log aggregation, storage, and search -- Handling crashes or other faults - -Each of those is beyond the scope of these docs. +[Launch a blockchain-based data marketplace in under 1 hour](https://blog.oceanprotocol.com/launch-a-blockchain-based-data-marketplace-in-under-1-hour-9baa85a65ece) From 28cf10738fe6fac8fd7e9ce260739d06bc25516b Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 11 Jan 2022 11:28:09 +0100 Subject: [PATCH 094/186] Issue-#781: Fix spelling error --- content/concepts/roles.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 00bad007..69a58a33 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -1,6 +1,6 @@ --- title: Data NFTs and datatoken roles -description: The permssions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. +description: The permissions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. --- The permissions are stored in the data NFT (ERC721) smart contract. The data NFT (ERC721) and datatoken (ERC20) smart contracts both use this information to restrict access to the smart contract functions. The tables below list restricted actions that are accessible only to the allowed users. From 60c0c9a5eaabe0e441f0d1b7e11a78916573185f Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 18 Jan 2022 07:31:08 +0100 Subject: [PATCH 096/186] Issue-#849: Fees --- content/tutorials/marketplace-fees.md | 16 ++++++++++++++++ data/sidebars/tutorials.yml | 2 ++ 2 files changed, 18 insertions(+) create mode 100644 content/tutorials/marketplace-fees.md diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md new file mode 100644 index 00000000..175d8bd6 --- /dev/null +++ b/content/tutorials/marketplace-fees.md @@ -0,0 +1,16 @@ +--- +title: Fees +description: The Ocean Protocol defines various fees for creating a sustainability loop. +--- + +## Path to sustainability + +Ocean Protocol aims to be a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants need to be rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. + +### Community fee + +### Market fee + +## Further reading + +- [The Web3 Sustainability Loop](https://blog.oceanprotocol.com/the-web3-sustainability-loop-b2a4097a36e) diff --git a/data/sidebars/tutorials.yml b/data/sidebars/tutorials.yml index 75280355..8325e1e8 100644 --- a/data/sidebars/tutorials.yml +++ b/data/sidebars/tutorials.yml @@ -34,6 +34,8 @@ items: - title: Set Up a Marketplace link: /tutorials/marketplace/ + - title: Fees + link: /tutorials/marketplace-fees/ - group: Compute-to-Data items: From 3b556c550dfa6eeba86e96fae9fce9ab05ea2dec Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Mon, 31 Jan 2022 14:25:56 +0200 Subject: [PATCH 097/186] Add nft.tokenURI (#878) --- content/concepts/did-ddo.md | 1 + 1 file changed, 1 insertion(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 0e7adfb6..1274e580 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -469,6 +469,7 @@ The `nft` object contains information about the ERC721 NFT contract which repres | **`owner`** | `string` | ETH account address of the NFT owner. | | **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | | **`created`** | `ISO date/time string` | Contains the date of NFT creation. | +| **`tokenURI`** | `string` | tokenURI | Example: From 200feac918d4a7d142105a7ee47840687d84db81 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:25:19 +0200 Subject: [PATCH 098/186] use orders instead of consumes --- content/concepts/did-ddo.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 1274e580..8cd55022 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -570,14 +570,14 @@ The `stats` section contains different statistics fields. | Attribute | Type | Description | | -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | -| **`consumes`** | `number` | How often an asset was consumed, meaning how often it was either downloaded or used as part of a compute job. | +| **`orders`** | `number` | How often an asset was ordered, meaning how often it was either downloaded or used as part of a compute job. | Example: ```json { "stats": { - "consumes": 4 + "orders": 4 } } ``` @@ -693,7 +693,7 @@ Example: }, "stats": { - "consumes": 4 + "orders": 4 } } ``` From 48dbb90f03ccb4cfaccd6d2f465ed2abf499881b Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:40:33 +0200 Subject: [PATCH 099/186] add userInput Define userInput object and his definition for services & algos --- content/concepts/did-ddo.md | 87 ++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 8cd55022..4f96bbe5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -128,11 +128,12 @@ Example: An asset of type `algorithm` has additional attributes under `metadata.algorithm`, describing the algorithm and the Docker environment it is supposed to be run under. -| Attribute | Type | Required | Description | -| --------------- | ----------- | -------- | ------------------------------------------------------------------------------------------ | -| **`language`** | `string` | | Language used to implement the software. | -| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | +| Attribute | Type | Required | Description | +| --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | +| **`language`** | `string` | | Language used to implement the software. | +| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | +| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before running the algorithm | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -161,7 +162,8 @@ The `container` object has the following attributes defining the Docker image fo "image": "ubuntu", "tag": "latest", "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" - } + }, + "userInput":{}, } } } @@ -184,6 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | +| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before consuming the asset| #### Files @@ -369,7 +372,79 @@ Example: ] } ``` + [User Input](#userinput) +### User Input +Sometimes, you may need some input before consuming a dataset or running an algorithm. +Examples: +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset +- Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. +Object consists of an array , in which each element defines a user required field. +An element looks like: +```json + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "description":"Please fill your name", + "options": [] + } +``` +where: + - name = defines the parameter name + - type = defines the form type (text, number, select, boolean) + - label = defines the label which is displayed + - required = if this field is mandatory to have a user input. + - default = default value + - description = description of this element + - options = for select types, a list of options + + +Example: +``` +[ + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "default': "NoName" + "description":"Please fill your name" + }, + { + "name":"age", + "type": "number", + "label": "Age", + "required": false, + "default': 0 + "description":"Please fill your age" + }, + { + "name":"developer", + "type": "boolean", + "label": "Developer", + "required": false, + "default': false + "description":"Are you a developer?" + }, + { + "name":"interval", + "type": "select", + "label": "Date", + "required": false, + "default": "nodejs" + "options": [ + { + "nodejs" : "I love NodeJs" + }, + { + "python" : "I love Python" + } + ], + "description": "Do you like NodeJs or Python" + }, +] ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From e9c51da030ecea106ff85bd0029f536415e7415d Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:42:46 +0200 Subject: [PATCH 100/186] Update did-ddo.md --- content/concepts/did-ddo.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 4f96bbe5..c6444adf 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -372,11 +372,11 @@ Example: ] } ``` - [User Input](#userinput) + ### User Input Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: -- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. @@ -445,6 +445,7 @@ Example: "description": "Do you like NodeJs or Python" }, ] +``` ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From 5481e18760d4af1c14a7234a22f001b4ff12fe8a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:45:02 +0200 Subject: [PATCH 101/186] Update did-ddo.md --- content/concepts/did-ddo.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c6444adf..f2d0efcc 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -373,7 +373,7 @@ Example: } ``` -### User Input +#### User Input Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' @@ -685,7 +685,24 @@ Example: "description": "Download service", "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", - "timeout": 0 + "timeout": 0, + "userInput": [ + { + "name":"surname", + "type": "text", + "label": "Name", + "required": true, + "default': "NoName" + "description":"Please fill your name" + }, + { + "name":"age", + "type": "number", + "label": "Age", + "required": false, + "default': 0 + "description":"Please fill your age" + }] }, { "id": "2", From ddfbe48b79a9bb17159bb457bd4a3c78df69b306 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:46:23 +0200 Subject: [PATCH 102/186] Update did-ddo.md --- content/concepts/did-ddo.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index f2d0efcc..c1198297 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -388,6 +388,7 @@ An element looks like: "label": "Name", "required": true, "description":"Please fill your name", + "default": "NoName", "options": [] } ``` @@ -409,7 +410,7 @@ Example: "type": "text", "label": "Name", "required": true, - "default': "NoName" + "default": "NoName" "description":"Please fill your name" }, { @@ -417,7 +418,7 @@ Example: "type": "number", "label": "Age", "required": false, - "default': 0 + "default": 0 "description":"Please fill your age" }, { @@ -425,7 +426,7 @@ Example: "type": "boolean", "label": "Developer", "required": false, - "default': false + "default": false "description":"Are you a developer?" }, { @@ -692,7 +693,7 @@ Example: "type": "text", "label": "Name", "required": true, - "default': "NoName" + "default": "NoName" "description":"Please fill your name" }, { @@ -700,7 +701,7 @@ Example: "type": "number", "label": "Age", "required": false, - "default': 0 + "default": 0 "description":"Please fill your age" }] }, From abe7d7b5dabe7b19aadc02fa127128f34a91ff40 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 13:59:12 +0200 Subject: [PATCH 103/186] Update did-ddo.md --- content/concepts/did-ddo.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index c1198297..00c9f6a3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -374,13 +374,16 @@ Example: ``` #### User Input + Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: + - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. An element looks like: + ```json { "name":"surname", @@ -392,6 +395,7 @@ An element looks like: "options": [] } ``` + where: - name = defines the parameter name - type = defines the form type (text, number, select, boolean) @@ -403,6 +407,7 @@ where: Example: + ``` [ { @@ -447,6 +452,7 @@ Example: }, ] ``` + ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. @@ -748,7 +754,6 @@ Example: ] }, - // Enhanced Aquarius response begins here "nft": { "address": "0x123", "name": "Ocean Protocol Asset v4", From 25d17e6067fab82afabf43cc15a8c7c9c6b4ce80 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 14:00:22 +0200 Subject: [PATCH 104/186] Update did-ddo.md --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 00c9f6a3..fc1394c1 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -132,7 +132,7 @@ An asset of type `algorithm` has additional attributes under `metadata.algorithm | --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | | **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before running the algorithm | +| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before running the algorithm | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -186,7 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | -| **`userInput`** | [User Input](#userinput) | | An object the defines required user input before consuming the asset| +| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before consuming the asset| #### Files From 38e6bcad9af3c59ef59faf45824647dd788a2810 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:03:57 +0200 Subject: [PATCH 105/186] Update did-ddo.md --- content/concepts/did-ddo.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index fc1394c1..098ace33 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -397,7 +397,8 @@ An element looks like: ``` where: - - name = defines the parameter name + + - name = defines the parameter name (this is sent as HTTP param or key towards algo) - type = defines the form type (text, number, select, boolean) - label = defines the label which is displayed - required = if this field is mandatory to have a user input. @@ -435,7 +436,7 @@ Example: "description":"Are you a developer?" }, { - "name":"interval", + "name":"preference", "type": "select", "label": "Date", "required": false, @@ -453,6 +454,18 @@ Example: ] ``` +Algorithms will have access to a json file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: + +```json +{ + "surname": "John", + "age": 10, + "developer": false, + "preference': "nodejs" +} +``` + + ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. From 19069dec32e403e03c2d50f114800dff8c56bcca Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:05:08 +0200 Subject: [PATCH 106/186] Update did-ddo.md --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 098ace33..901ee5da 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -461,7 +461,7 @@ Algorithms will have access to a json file located at /data/inputs/algoCustomDat "surname": "John", "age": 10, "developer": false, - "preference': "nodejs" + "preference": "nodejs" } ``` From c31354e9270a77d57c6af370c92975ed5136aa4a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Thu, 10 Feb 2022 15:08:20 +0200 Subject: [PATCH 107/186] Update did-ddo.md --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 901ee5da..312e0981 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -409,7 +409,7 @@ where: Example: -``` +```json [ { "name":"surname", From b5203553240a556de17c01f66eb5bdcf2c49e548 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Fri, 11 Feb 2022 19:45:10 +0200 Subject: [PATCH 108/186] use hometown instead of surname --- content/concepts/did-ddo.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 312e0981..cce3ca29 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -386,12 +386,12 @@ An element looks like: ```json { - "name":"surname", + "name":"hometown", "type": "text", - "label": "Name", + "label": "Hometown", "required": true, - "description":"Please fill your name", - "default": "NoName", + "description":"What is your hometown?", + "default": "Nowhere", "options": [] } ``` @@ -412,12 +412,12 @@ Example: ```json [ { - "name":"surname", + "name":"hometown", "type": "text", - "label": "Name", + "label": "Hometown", "required": true, - "default": "NoName" - "description":"Please fill your name" + "default": "Nowhere" + "description":"What is your hometown?" }, { "name":"age", From 0f0993df8f400a66a2f09e64ec555543d6b12c6a Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 10:43:56 +0200 Subject: [PATCH 109/186] replace userInput with customParameters --- content/concepts/did-ddo.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index cce3ca29..6395a78d 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -132,7 +132,7 @@ An asset of type `algorithm` has additional attributes under `metadata.algorithm | --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | | **`language`** | `string` | | Language used to implement the software. | | **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before running the algorithm | +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before running the algorithm | | **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -163,7 +163,7 @@ The `container` object has the following attributes defining the Docker image fo "tag": "latest", "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" }, - "userInput":{}, + "consumerParameters":{}, } } } @@ -186,7 +186,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | -| **`userInput`** | [User Input](#user-input) | | An object the defines required user input before consuming the asset| +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset| #### Files @@ -373,7 +373,7 @@ Example: } ``` -#### User Input +#### Consumer Parameters Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: @@ -401,7 +401,7 @@ where: - name = defines the parameter name (this is sent as HTTP param or key towards algo) - type = defines the form type (text, number, select, boolean) - label = defines the label which is displayed - - required = if this field is mandatory to have a user input. + - required = if this field is mandatory to have a consumer input. - default = default value - description = description of this element - options = for select types, a list of options @@ -706,7 +706,7 @@ Example: "datatokenAddress": "0x123", "serviceEndpoint": "https://myprovider.com", "timeout": 0, - "userInput": [ + "consumerParameters": [ { "name":"surname", "type": "text", From c6d829346b3cc74f07fc8b6e49aa30c4bab0c6da Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 16:51:51 +0200 Subject: [PATCH 110/186] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 6395a78d..687539f5 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -378,7 +378,7 @@ Example: Sometimes, you may need some input before consuming a dataset or running an algorithm. Examples: -- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is 'www.example.com/mydata'. So you will define a field called "sampling", ask the user to enter a value and then this parameter is going to be added to the URL of your dataset (so the actual url will become 'www.example.com/mydata?sampling=10' +- You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` - Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. Object consists of an array , in which each element defines a user required field. From ae32de2aa320dcbc4d5b6201df05d2e256eeb494 Mon Sep 17 00:00:00 2001 From: Alex Coseru Date: Sun, 13 Feb 2022 16:52:13 +0200 Subject: [PATCH 111/186] Update content/concepts/did-ddo.md Co-authored-by: Matthias Kretschmann --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 687539f5..94086804 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -379,7 +379,7 @@ Sometimes, you may need some input before consuming a dataset or running an algo Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` -- Before running an algorithm, you need to know how many iterations should the algo perform. You are going to define a field called 'iterations', ask the user to enter a value and this parameter is stored in a specific location in your C2D pod, so algo can read it and use that value. +- Before running an algorithm, you need to know how many iterations should it perform. You define a field called `iterations`, ask the user to enter a value and this parameter is stored in a specific location in your Computer-to-Data pod for the algorithm to read and use that value. Object consists of an array , in which each element defines a user required field. An element looks like: From 1cfdae9bd72747aae34c48596326e8835d1ac725 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Sun, 13 Feb 2022 06:56:48 -0800 Subject: [PATCH 112/186] update --- content/concepts/did-ddo.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 94086804..7e7fa761 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -375,13 +375,13 @@ Example: #### Consumer Parameters -Sometimes, you may need some input before consuming a dataset or running an algorithm. +Sometimes, you may need some input before downloading a dataset or running an algorithm. Examples: - You want to know the desired sampling interval of data in your dataset, before the user is going to download it. Your dataset URL is `https://example.com/mydata`. So you will define a field called `sampling`, ask the user to enter a value and then this parameter is going to be added to the URL of your dataset as query parameters: `https://example.com/mydata?sampling=10` - Before running an algorithm, you need to know how many iterations should it perform. You define a field called `iterations`, ask the user to enter a value and this parameter is stored in a specific location in your Computer-to-Data pod for the algorithm to read and use that value. -Object consists of an array , in which each element defines a user required field. +It's an array of elements, each element object defines a field. An element looks like: ```json From fe576fa6d59eb979a78f9400f4bfa052984f04c2 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 16 Feb 2022 22:02:07 +0100 Subject: [PATCH 113/186] Issue-#888: Update ddo-flow.png --- content/concepts/images/ddo-flow.png | Bin 104794 -> 58564 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/ddo-flow.png b/content/concepts/images/ddo-flow.png index 9182c1357f6ef28461f989a5199965b34dd4d56e..fab9a027b0a25d4023f36dcef441e8fd76fdf6b6 100644 GIT binary patch literal 58564 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
Y{>Bc(NU_tzd6 zK|j%=lq^Vlmx&DjHrw2NdK5eM#~UtMf6fs93@WHe{}bCYD>WQ^pJ!wgD`yr!n=Y0(!d&T7N^v`gP}MtgckjMBcx`*$?3DlCmty_qe;)K`kVu zKh1IhZg`u`?C!hoJnn79Gfn}`=DR}$4m9yK=~T0*aGgv zrZwe|be*NLD6HFgnSrF75P{ZVJX=dc-w&@CrNMsc>&hcpLK;XdSiv@?i9bS${4C?! zkjXF$-3jlZcgv&7Bj$JGZpD097}K|BTzx)GfOrQs*>MdjT^*l-^tNNblOn46iZnPh zhC^LPO!D~}U&<5O=G2RvZ`WKvy}zFStdU=cpgsI~zak6qqVLUS+MTRs@w;bU_W5(Q zcg-oTcp%R+JvbwNSBT4D<7-9t=?7;nbW<;e^hGS~O^8hi#Ir&lDZpK`4dHqE1(?(5 zCYU@|q4RWZ&6&z#XC2Gm$(NJD6GvmhESpj6m)o5Ll54%#R!+gTF1ml|T4pW2-uG9=SXk z`XQvoa>lsj^4()0_#57|C~vr68gFXnqVv$44dQa>H2zT)@0$-_S_7*l&~DnV4Yi6) z?g-6AV}rW&;&87|q5IT!UP>UTn_ydpma%2lJ4!etkKk4lB;-yG?uy`Cz`!P=ZO#U| zBiJ)dFpvwn)w108D}a{)Eu}B}>HACOeF0&{l%6;#g(4QXc25P>)|+b`x~Dk(rJN>N zBbP+H>BS(@^pTIe)SS zxaDIx&KPg^bt@R(mJl30AlHc$8f4G=XzKC?lYzfs-#K3s(Lc1Td%m^dXF`o6q}
JM*gpqvAlLX05;^QTz6C891uarXU8xtkse7|a$m?bd7cuF5dJ@nwVmD$u2AK%xk z^g8FN8X0A#q8X{VH@b<+8jC-3ZAE--o0#x4K^D9Oz?*#(K_!pzCgNA#z3zoC+p=6> zy;HbQ3922)v*+R^XC2?Kg?WUhfxr+^~>$;LU?@P@)XTQ94NCgH|bIFG~HCAE(h;F|zIA z7pb=!&=*EayTy*FM%T?oP@TGmLD%n<7p0uL%aPVenH7|Bp=Kbjc&~#P()@&&gpd?x z#!trTz6+GNc9Frp3=JdKNL~)W1ud_Zx0w5?qgKC8KDW5Dbu6)1#DHcb>S@*`yb|pt zHbN>|8{`hA741yBI}5W1ntj=8PQnRnbFpvT<|VK+oE)U>oW_Mgrwwbrn%aq_WRXIdrw-iPI>&zy2i=nUUS!Ad zYOF*`NI9e&OYi0E>=I z-RLX_OUS^F5x~!16hZtAyP**I?p2SfyK#aYjQjD}7Xy<7M;f?LxSwSQwqR7gyPZ@k z0Cj#jks$B2^5e^>+lu_<)$n4}7I$r^3t~C@&#xiAnIe0VvF31J!i0$564UQ;@!X((l_{Ozq~MQyDD<0eI~4qTS*^z2D7PVz9EH&JTM z==cL)W1$ZBqRYCBe$~?mX`S`}iQY*HM>4w%4Cpj172rFA%Uwlr0G9jekx@`mJ=#j( zN@HOP@el}rURf2_{}q`AaPvX9Smli*%R$e9hZ z(#dY_;2j)>wK||mB>w5`#N<2Qn`E|u{*qZfp!Ed2vqtkPl%&sU#vzO<*XCNHdD}bF6goGO zj&j65=OB}Frm#Jwdmmy+dY$ay_9+P&5G``_Jed?R7vy+yD`k>Fkv76PH79K*n1LY@ z`|VD_ZGX*Pn>C5^A$R(40W$oa3G2aiI%J6cma878oovZ+-F=$K7Nwpa))!)L^V5-% z%O50Ch@j@hg_7mf_xAK`lf;Y_(F;XFb za;udxZm^q=UgCDucF3>kYm2+@lV{H`$PS&ZI;Gp9D2aQkS;dGmf2W>w)K}?;T-}yo zwiV;LDo42QdA}=xEh-|`w&PW2m3rTVOI{IJsr-33;)tXfyKQ%Aza5NB@sm1MHI+lj zTbYB`qs(zt=N_i3W!s}IG90`51fkSPQ4@3IndmA;pd_D>ww}UYSc~6b?a`%x2QfjG zoel3d5qyZ?aS5ZfR3q@ZkX(#=&s*rVlqo>Wv1+ws;-1T5xh^RgL6mbsLy)PTz8di^ zCtzQE`<}q2UAA&~L5H0V0MRMTroO44m6Lxko=lP7_2jwlF{y1rn{E#MND;N%(+A$H z-Lds7-CqchEN%piL_WVqR;1cOyzmGjTAP9Jz(wh`D78Fr=R(DyH48IpR;8Xf zJ9^nN?}W1%i5m33smjC}L(F@$zFXxSbhGm8NGCV3;aGEJh`in0*0gX|GF?so$0pe~AQ z@91_Is>-vKkTfGNF6@+ZvW~oxT;>&4shwNNF!>>$sfpCyf^@i=mG6PIwACz5-rc*; zl9gYl*QpA%J@*RM6aN%!`YUF~-FQV&n4Tmci8VVq5@rD zYfQOH&C-84Nm@W~^Y_%m3i3q`)Ukq3VEK2yyuSnd2=*83r2gwUKV(QUYNVD_A+zS| z4{s4se5bx@rFd=c_8-C^Z{@sFBST;_$$YAB2g}Ke@=Kvaa+Uk3;xk9 zRben&26nEfa^}^Dp}QB46;KkF$NR+20|**2Vbg!zMckZ{(*{`e<;S_yyL~`5XZP!w znhtYr#$yo+)g0>G>kVBn^(e*6$BwIWM6EbDwZtN*nE~cP)r~htIu9=xeCacgrrEwgej{4G}a1*87mP~(4TQv4q)Gk!Gy zB#8Fh{}!e7zl3Z4PY3@0rH}BRxuyS$MCDgr{r`(QcA&da|G$eP{jXY`UjV(o(r$?u z0|C&_0C5A4#1lIY(iV)nWe;CCqR$v;M?mm={s@L*6m*BYap`nB64s^gi5kQc;HzY5 zb!`7LT>~ukGf)M{(Cn`e4U9|U)g$>Kb}g37dga8-i^`fq=#V8Ofn{JG5Z?G zyRXbY7y&Q5)9CcSeH}mtW@xPp zXm+nns~<#uZgnTUEktQg$j6&9FuiY*oQmzivFtQmQfHK#OWa6iga zutMxtN20+-98T8f4=X8dmylfB5%1jH+x@IXlm~4fjeNfW z6^C`t7s(RgTr6&6WaMf*Be3jlZo1p2$?BZ%R^2P=1S*aV$VN)V_xeshJKSD#iKe(q zTh?1b(Y`bWAaoe2xf8tB@*{g+LKtDF1oX|}X7RbpX7eL8`OES}S~h?`Z|4Q>UV#X~ zv~20LUMIdz2P0m;$`;fYNhdIhkH@jdPqL+ZAX%UvlaL)6MJ4lOO|d*v_gx95x;L-Jm4B9a$VL6n~$pwZRRI z*~&;R@m2TK++qUD6NSfbD?qQS6cvd^El+7wo9ItW^(R*pFKx#tO+CmlN;VH{b_xaA ztkacUE`O@-;iS?k336IV+1|RwEkQe2{m)KUT@_7qp?R-dXEP)Z-j5NC#t=H4{75R8 zY3K$JGqIDBS)l~NA=uth@KhIGj6(Re63i=H|VL({@64SDy1eBZuT_UIKQKN<=??{PlZw~gEi2N-GWAQirBT5x zjb%YvB}%*b zD=E2_QZ57)>oqamWUMX{dMzyZmHQ?m_BSZ|ty^V6C za?|mr=7qUM4Lz-st*hEA=TWJiXI8GRKVvd0FPNdcQ)4c9#-;c1pC|pB$hd2s#BKPG zmO}k`e>t+V6k=e%1H^Po7WWG!Gs2hXs^(~mqp$^KM?VBk*4&YsdIUTT1O+ZqLC%`X zx*kUMq?wmzn8)IJY6xa5Lze7Ab400ATQf{h#o`4*weBJ*Z;=k^HCe`0CFq*`kM*1Z zlZjrnn8eB-c$QQ1mthm$tMZqG{iJZgV$pH%j5jqxTs$|jt9oHEnN({w|51OK;%1@e zT!ji{4U6T3DJLqFuRc)Us3OQHpm0A|EYvrXj|=pq;#)e4E_lV{s-qhN-Y#0zr^7T_ z@v$ivG3uWwc6b-NL{UY`<8Y%L!w2$g3(H`XE_T9efx+F%2IsuSa$86|Vkmz1Es=ap zG9t$xXu6x218>_?zl~u=RoME3bceNDrr0(0?^ilQ9ymLC=-D~{ zV<(9DYe@X)|6m-JeTyhPWc>0`D)7tncOSBsO!O$_@g&0|+LMR51R(8+|F`Vk^fc@S z2)0M2&D1Lkb7N{BX!9La?J52{ddZZIrxv3~5?uEcD1E7zK$Wz4LWF3<8Rx$z_y6af zWF7nXj%lO!-y@HM2vFpFNMGw7-emwp2o7fw4k_Mw3F252(;t5ihGI+F?RD^lQ)_?&!6ri@-bNO zI`F2vla>7e88bPYehvZFhfBkwz|XfsjLKr3q9C+AHYR&8!zn%mimhGbBcn?B{27&N z&-a0-uPguMc1H5o>a_0`L}370NhIXXKmA}sS+L#5Jd|}|hbTAz8C6Cpw|M5jR$*Pi zIu3k)kO2@G5R(t0-ifOuad%yJw5F)Pz=ojMFv&8|SxDL+P|*#%Mil`jEJ;U|x}dr? zU1WTQCNbHyf1Q|UvJXAAL>yaBDii;_ZQ%CU1W*)roecD)hD~)D^Lh+6>gHVgb|Em~ z%PApJrmxJzj8MDtnDOB6`roiYwCv@DUoEo>2dL{40fvwSE9^ycO?0X%d_qqf7ltbl z^y4KJn5v%_#nO)8?vcgtJsnaCLTs!%K4A7(@AAy`3X_G$KuMu*%_tT=3M#UNi+U)& z61K^i=VK_u!e2Hg-M0pG7_2&5ng;`Uqp9r;ENvHd|J>>tNj2R73mOnf-U#BIuKkmI z9RyZM$H#G;RD3xDX^6b!&AVA2;H$TG`iB*+l_F3UEPqlOkqgv~Zss*!=cv4OH>w=E zaaTuTcX%iomO=cJ4LrQ=6kKJtfGV?e9@TWQIXO&BULSdxX2tNmW=$)N#73$^6(d#L0CR2?BG(3(A67&fE4% z%bBvhf+3tXNCF7f+U*JYZVa|lR*8651mla<7!eN*4bDYxe*zIbIgnUsp1|a3_{#^M zOoSM!V_OkcR1Ke-S+px_4#yWU@76-#ERPC7D+k$KZ;mz2Pk}AMpl>uq z<4=#!YQ1bGF< zh3|s^(dC+!0EF;mh3MPj*>sBMHtGYAv3KeG5(f?1)KANO>KFy@?A-2&;al_s;pPBrcQuZn*%3N*CXUnYTGKCB$F5N&^Gg9kgh}a6FVQWJG0f?A_a36tAp65;I%D@QAAeT8VTT|4WetP!g z!=imYSe0r`5eN$L!SRcR3UwyNtgsY*km=QSJtWvbMw;LB+lyLOIqgL;a_DXt+-}cd z2p;EzMJ{Y^Zkouj2?(dff52jsd4PYlLy*;6$g-ACP@`wnWL&BidvRV7Il1n>2ogw^ zHVykz(=I7B!+|=}bGQ_`^^d@&i;!F`$lom;6BU!%L-S^v|6*c4#{S~T8|-9U3UMBAKrfo4rVw2xtSiFRjR9t%m%QSwnMyB;F>@BwH20Y zrzTV^>{90&7t3;N)t8_3hPmOeCddOW`!UVG=ANih&bGV;6B#o72lgx=h(A)1_AIZ_ zI89q#Bl4x03fU`)Ie0V&sGccUkS*l+kG#!21R(5>R^KtqSOB87#YhPcR#Aa=->(}S z(v8RmKWy2Kht8=*D3Cr^I(&csHH0ANh41Pyi(k+lFwQ@9<68W+`{x>ePd_k8p%hSbunxpMLELwc(MEq}OaIZ_dZ1->sWs z^htBkppDQNmt~klr1A2LbGMDP3qR8HmVQJd5^2**xqp*pwHxE@^|>QMSwYNX4OC9_ z{j4jAp4Oe$G}1`GF=QkzAH>4$wMf3tcu7K{84W&US$N-Un1wJHWfK#c`H;=#@X%j> zv4LGvczoR@y8q~2?Rg81o*afIv!it@WiXZ_3R3&#)W5#d?y+_z4($CV3~Fxq=46Dz zSrQT!o`ZuMs!Ac7Mbj;CU}z5ks~CZRnSQqB*V4y^Q0u5nMcHJuQ@NNJ&UYES^KcWH|3rVcxbYDwJBKzttgOYX0-phX>astFnr2od4^fO~yo3@NtrS zk!(HQ3!(LYo$hF&YKq8z9L$u^lf&I)_V+dIbM;VwkNch>{*Gs&3GtHTyT5P3fBykT zVdq^N2cP_P&^Pmk=Z}ETfBYv|H6>EyIJjf!?8D++-Ml1J56`>)^B)IWSZHU4|GKS* z2N6Ovxrvv57hD+weUk+k3u{WA$M0>E`TA*QY7-BZQBU#&?X4d`TM`1`jF7iJSQ#4E z6w?C7k(uMlnqx})m#2J(XZ!(pk&_nkyf!doBG{mB>xUZX69e60ykhVsi01y$8hbee z_&JU-Ho(oSkn&>eHwuDBy~aK{SsJBv2Xs>PC%#+ptz1`M3Pe+tg8xRWY%GpUuSXgbhtkX5Jbo+5$)$T& z-d+y%dngcZ5Angd*};$*T0F|dT=a%5)N5%zd&sJxT_BguC|;y?Ef&VTUr4#91BI4O zM|}`YHQ<}RjR7%X&W&U*43x-8YG;x z*_x~YPIqthO9@3UPU9CQcrL{w3@i5D8}~;~NX4cMFUPbOZ&k}h7}<}MSEPizW}XA0 zTC_6|mKw4Zx~1L5-*fAcbVGJDxwd%RD(E+uZ~j=`OZ006$vaetkHq(Oo?7W}J! z`f}~^1c~s3!{USld(23!lbLtw0H}<#{jr^^W^oP!1949(lAL#>TFIwzo?G*UwQKlyZC5+qHt$665=XR6PH+Qua?#~5y^(X|^z&eQy7kAUO zM*Bj;-yfIR_R30}laH|roBxa+z2QnDW}uzNqsj)Hq9WhBB*n6F=RT^ZghcHQ(Y_G$ zDPJB~25!N7du`s+1g(^k-0iUG;g+sqx8}S3(RKrpKS1~i+Ag&7>!u8PrFFY$hkl>1 z+W8=9m!rdZ{QZVU?tFSdd^1vGsF!oVEilWp)*FG%&R(pXxb18@onXax?{nJLXFFcY z8l^w8!b5vHb4QUhJG%n=Hz=v4+w`T))Qj#NvH6zq>fQ{58{g9V&mfU(g~B6)lCwYE z?XzM!+wq&bJ-1LcBULK%aav~~JvecOhYm6upBL~lcM1u~uN!ix?aTg* zq#TBI;ek5YjyLUL0Tf8}+VTd=1z5DHRR3h!2Qou?O~^|?i`rM~DFjE$Zt)-Sy=+jR z=^Zy&uCdW(Br}U_-n*#5iH6oEQ&d2^hQ~9A+L1FrQ4UW z8L8=arS7+ojhuBHE1wwAl#8|FuQUAXD)z3BVah(V_fc;NDZYyNpcccfW?wx2=u>%8 zdfmHhl|}v|nXW_UvNPro$#zo-A5OYosOzH9k)h?4W4xj)JfOn7U|m=}+$0q7p-?6? zDBm(Bt<@Q5XpWXF=`kfZpn;W|7*Z2}u&b^eR>6((xS{m_JIJhVBN^}vp>Y1yj z59Vs(q$VttFd(Fu`S4*c_ZQ>a=T2Rz(7EgrF`abM>5DB`g04JMovA(l52 zvCGbruQkJ8pTvOjbXltK%Bxl2-id=gW=kOK&V0>Of{MR#XkU+VeW$6`LLzq*y>X)Ox%)TC2}Z77W;U`5pYDfjOietu&1 zpUqbdbwk5t?bCYe@U^WUK5So8Q4N6U^_&)+gv+{*=Q-agXLB%%V4SGUkar(Nm>E6Y z$ys;%ytv&oJx4dSnA!cL7U#Y5ViT0M-TYcXsrAiO&{!0jAGwE5So3i4>?`Z9WuMus zQSUd1Ff24EAL{oRlbm;2O=4@1U%#>Gx^won>$scHdm-19UK|9!Skvd!;4j6iOC4 zu)=!c0KI8!b&~pu-%jM5%urOjlw=#+Cae!@U8wA6;Vkg$M5e= zC?2P8tN#Ui{$Mde;W5+y8Oseg4Vz%*AbGqIqJ_YTbFQ+B?$@j>0^q0GXkA@ZcsEAO zZykgToIUt@l|nJzueJL-wZcBjg3@um<`~0P%aMaWg@Aw`p}qOqz4`0w#6WB_0?LOF zwCr!`Jn9QD_yMv^E^5R88VKn{KL|f|8+d4KcLdT@@9MaFf>vC9?(PuAp?0^N>UDDL z!?RT&6gbIcxg0Shdbz=+ohEkqv zXqE3~TJ2xpi$OGt3bxqa+|VIagWZ&4lXd?nTakNILGt%6JS8!wY;WSbwJ?l{dLDHe z4-lb1$8E9DsEe!I8jhId+I{)cS?YB&;I!!U(NX>ezJ~tIqAi+ZL@-+~e6liGP6Z_x`+h&q|PeOKv@H9m;IvZMu7#XXm4OD>l~d5z;L+ePtVG<}WscAMONu zKnW_KPvysa@S*JJl<~fU7l^K1HR|s>?uPS(Ue;pG%S9x$cDH&g17PG1kaBUsn4DPCK*X8paDjp?fcMLHb1h@J~zEnHg->E9Bp;`aiUvNS?&5z?@IHNDu>0Isp{SI z){O0e?L6;S+XFHUI~3;uBa6m^db5LwmKg`XCO&WRo%~jnVEmKZ zEAnUWn48a&kRy^^A4+^t4O{K-LVs~9&xKU7Di8H6VFTze57Cdk*#4zC2lKb z<|6VC_5to?9Wr;z9EO&9Yr+Cl?|8HH+T5|Qne(dHF+gR1cseH{WKiF{vdv%D`1SWV z@!S8r@QnEwn6d1H>O&-(OBQ#@jyEa3Yn93MRfA%bj|nvG!>*pOHe{4Ik1ii}wv*%M z&L$P43@q*M%huO@m<%sla?c81T#>%nW&Ict3n`u5J<%Lmq32iP1pdd4C4?O!X?N=J z`&3u2VVLZlf`Z^8S8U88i`2o2^UpHF21Z0mQzp`h*qjveoQK}8SE4_OvEO1_Ozjj? z=oHeqhOWFVgl17GH-$}UwrBM8iLgT#wReZH@l;Z!PXgaN+u-NwT}|%JmeULYA^GVV8&tGdrsv z3n$7`re3Y1lY0OC)Oo>L)XOHzc#j{$Mr3jQPU>kO~BD5R5%Z)9- zoeQ%I*J{*p7-_3f3+QiwRi}ejD8Yu@&^ful1XDLNi*A1_&9|H6>;+PMc3djdWc%TT`C zY}nL&r*@GtFUhhoCyY)jbXSd4{%)ciJZraCX1@BKgPeSgAdKbQ@zI6 zwr_w9(ss1s{Kgd;fe(3Veel~HANt3RXS@?jb&Cxx$(_fRir0Db{B>iA9LwiY{y4_{1L0f=)X+X`j$G(ZchRj0ETDPd9Y8e;wpFKt(L8YRKYn-lUXU0`o&<;kS2U z?X1||=3jP2SC({a8w`Lyw(jd2An32XuZ({kVtxCO&cj-IUE)^h&T_X=nXz@9n@kHo zK+GYz(wD~*#X3U+?=3ejqhwH}7>-seAe4P=f)#>s^jQtX=NE1)emYXbQka}M98rZc z3qOgP{HxNepDxMG4lawhQE0G}fCqc8=gWS$oCZzw=tanV5YTCVJP>QQL@rBX=P;0+ zt&;ju(#)IEL{EVO8{r-us# z1LcH!DSNJaX=HQO#&w}0cX~c{(g;-;K3|}t6S4wnEov40Sw=%rXHyxoFR=Oj9N;6s z{BiNlqer9DcrCLqosc;eg7|~|ke;6K?)?99bKtTrPlbed_p7J>+0OE-V4mIM11e3uuUtlMs z=zn72g0IW#CdJGU9={ksF$nYeF6k}r;KhHV5+Wr-WLXBl(dRBEYVfY^hw^$Xnfmiv zZ7G+o#%zU)1?d*<;7bmV2Xv8mPWo4XsLp0zG}25=heW(8%=Q+I&`brEZZ*VpRuU4z z4I+2*34E*Gh{;|bPU5KQD}i@pLS&&B{Pza(Bbnicuhegj<}cP~Z!uWcL&^;yL+2>- zFZD&FnS9yr?JaUEeJQ8z0jdsTnprg27zs(8+i&K{pc9n5crY^vd!J5xD61nj!lRf8 zI36L3wtwjz;!gz!E`bR&1n3_KA`#J@$Qv8FJjW)chRdFyEe0cs&D&7FKj3ZD^;|ZQ zGC`-)&ffUvF^}Jai%8*hbOE(yT*I3vBtxPh?6G!A1iONeS(ST{KpOlh*l_ccJBW%A zyZR0@m)p5&^yG0ts%g0~?1)PF9ca@?i&gG~w5iW~`OizsP7yr-$i%JNMBFY8YD!c! z(&-J6bWC&;C73M zm^j|3V$AFAh~0E`OiO1z9^}GDk01ds!{-+MU)_CoSkveGE+B$floo20jS55%kpi-Z z6b0GJlqFaQC?hf&WP@N)s|1CF4UwWCGa3YBLs3S;P#KYgr6Hh%h=9xpocF^}w0_U| zo$FlJ@0{!OkM=4_KI0wFxbORU-kZJ^Ugbsel?)UBp3dWI8CuW4FLsZocj5=Vj!u>~ z=MAh1&7h0wD9D_ZAl$gaY+FU^q*b_M*m&sZ@~3n3))lk^49RWYoIeS$j#_`;%{d2V z^y#YennlSMzkWvg`UjFzgm86|Jk@V8REWFp*ab@(x!%%SnKeH^)Vw(Cl81T~M=b9j zh7|$Y(8z`!WyK<;7rJ`O6Fuol$aLrc!=QBD>J+t1DiuACM_Ds234Q`wvHJeG#SqZd z{I2o#0^Z}&)Vl1bvy2tL+KoiBzN<^^{KT;~&m^U!EF=D%J-co4_nRK$KHP|%W&$(? zMikcfR@TijjIk-D9O0L=!e&^;IK|Rb?#rgdxG*@;*5hf^M;FG^_McnSqP9>2p7QNHf? zGgm5T8+*PYj%yH5lo9+gL7>m`n|rfGR7IPI5)>u?(|Ky}jGa3rBGF+cz0Wa+Z4w)@ zCv@k^+eh<_3nt9u?*e5~l}y5oM-?ht^8SkRtdMgJ0pX;4%k8^5cpqMFe)pfPaykQF zy)tmE>g&j1WMbH@d1Z)Y3V$44rDoJoa^quZXLC?#W3x8K*I z+Ayz{opMy@mSLu1`w&s^B8P4K^2uUdpjI#mX`E8BW1pYKza1TWR8z{Y)Vum@JGlD;j*IU<=)JSzon}Z2*kWY+oyOgYlY5noB+PTFbkde}SjcWXj&66fP zGji=nfe|T5lc%AG??Pzq4?*clYhZ*(L#F=I+=BMQakde26MfV3Q!cOQKh4bM*HQFa zn`>5sghK7#gQgkRL?pCJ2ZCKgt7`LR^+ir%Y4)=hn8EOnpjcw;{6Pvr)ToZ=OPI78 z0xnw!O*}YGS;is9#samQW=(45q7|>9y1K&?y&^)nOFB&8JKLWG+E8l*l|zJ2J3#c3MPfcD3SJPux)TLh2@BCUW?nN+$AK7~JjTPR*7MIQpr zxJ}Cc6l4h+-UTjvc%5<%R?EDE)F8XeQYBrf?aw>$nNzHb+L$&Q>db zCUxDJNt$VK+q?$|U_vWu0;hgwZF8|tBWh@*L?22KY27K!^_Odfj1#{Ye|X|_MT1!% z$e+E!JdETc&C8ZWDKgmkl32S=wLIN2K`Dycy>7KN@U}vjykwn{>LP{ASQ4Euq3kQ5 z&UR|A3bnmP&z3dsXC@&L6htq^2Gi<$p|inq(My3QU6SAa&|}_ZKxrn(k;iKCQwDNn zg*i!_FEIn$#ZhEO&RnTxk}aZoAdh;6nL3Ym0uZv=s{mAuVAjR;x41i%A*+Is!+CqZ zhq6g|@V1&CSAaAmaT0J!L5uT%Q%Qfq`NR9q!fk5xl|jakVy^^K{%8}cmz=GUe4J}GesWpQ3YYcUf!Pm z6}~vZC2PbRdd<##w}_S>?oIG2=GQ+P92{&2v0YWUfJTl?vhN}LQG<=QEBqZL@BJaS z*Y-+r{-mWNZ(yHmwG%@Ls}Y39*OqyeX%8ZL;MJm(UQwhmB}^EHLv^XhL3xD>XDq(B zTKYPv7&k6&RX!DTVLrBf(~kqUDL29b0mks_&sTOa8|3m@e$3%kt^`s1^d$FQG7q=R z+@)!rBUPd*s?!d?0o}B1@gxX#I45b7Wb4)s_q|Gl4`BTI+;$mI$}$34tVYhdMkt_* zN<~koK8{^J-t)Wmt4Auu0eyu>ab+Dq8|Jk8g-4vuim9W;WOkwU^wYAbTDLG&>rxyt zT;ZaJIy)k?|FRY7)cDKYw1Tkw^L`d2{qfY?cisYtEs9?NuQdjl@p9B}CiA!+;-e=j zjh(HDH7!;20h`z{p7t}Yi;gR>ayG#fsw5cK{Rt8vnhT>VnQP4oT`CxTabssUI702C z^H8(@TzU+Y;ND%a!X>9N#~$cBDJ&S}6TltiLz2qI-38C8-B63+I%^gAz>1_ddd*O5 zqA6C8$YRwVjU+cOxWC?jyX9lm?g(-_Yk_31zaIAXbl;&?Q~sguu^jCN%udr0q#f&Z zDK0;874#D6X$wZ`v5DYagWGvwa7RWh?H!`Ew!)7_koO6o_ZHCtF1Na=p_C3OT9s2p zy1bcolmXfTqp}7`X;+G1GRkRVdAj(&{B9`(Edb?mV)HzR$V;@Ria9s!0I)R`zAU39 zo@vB~f3us!bHzs*#1vwJe?QyX<5pq}PxeZ<`%JbW%5~pKw%v>mxxo<$(%81dxp%+Q zEssm%aaU`wk84z%&ow>P!d98;+~_NRGTtD;xht@5YRH1p7Sd|nCrK1P6@UJW z1-)oq{tsz5MV>2C+-S5=KGqy3L}Aa(84u`YSO=J|lm>OxT06S~d2}B2i3k-*TFM!9 z_K3dGNAf+LH|lC=&8xrZV50OgKF~O3)C`{=!nyt&3)3&&Z_!$7a9oTv4qX)4aE48o zYo9pFo!5xc;?#LJ2Q0e48=U5r{G1s)O&QU(QNnR(YH;G1>EoIt`DfhV^Q?`Oz#acNZrH#KD zQz`T7_aB_L?Y%Qg!_4Q4+;K_wPne%Mhq(dpSrI#@Zl#pb&2;-+lm!=f>a+s=hVr=6 zM}yizL~xm%GlYX9Kn3~mlV;rIxZt)B=8oY!{jN2}&@t%g@{{7(g}LhKS4-Xd;WHu3 zR}0lnG_v>De1Li>s`p77!2XqoiX*xn*(t_lInBRXSRQWi6HG(toa-Ahp$vRHyEL_w zGk0w4STpX3MRScNLQ46ZO~y?!Dc*Yo9J&-fJk|myd!yp^Y}?p#Pu7xfn$!K|f*oyR zk173?Ssw1C#RM5cNkR??4f?w)J=E7+Keg98f$BAX4}|qr_~3Yc#Y~(B2^mX7s3lb; zsusDtIJj}i9~IdmEy|=Wu(Pme?}Tz`6RtL+wCM29nw8J_c$`wRB>(O?(8Tc>@B{&= zpVDUTuS+XCJ-txnFC&EkpNGC^wt5BwK{!8lUv zR9DL)tMxf8WB2(Bs7lKNp$rSe4aB;!x4*+7(F{1oZe4^FOX&wV$1f3|rkWw$HYe-B z;pX8lCLMa70>HZ*A)I~;5}%_Hq6rt-_hL6@<`e$z573aj9EH#ep}&;&$Vh`@*KAq# zrhT3}HkFur#h`twpYNTw9jq*oUE+{+zGBk5O%D6XXathS%NCK> z^TZUs`yJd@6a!}2b>f&D7U}&yPJ897n=s8u3g=i=wspYPClL&{t00$9!?O+U0j$~0 zY##=?403!KUl2Lh@BDYD{crWu7tz<&jR1arc0U-8f32%;#Z%wA;CkG?xl;dU+No#| zNH?s>p-2FEsyzZaAe2mpugoq&@pQMDfHoP}nbKdhX8M4gj7dv1Ws!G2v>_qvxv6Lh|F&$EE0} zP9KV>10c7=b4#N5lRv{y9xkVy0Y-C8swh?^SKY|WCv|H4!{;(RkQ<2x%nBxhcG_d zp$dQZ+-YcrIj+c8AY1Xaot3ZMA=-1LO`M#rxgjpx2p@oq(v)i&XyGp`GQr!HCz?6G z1pyXOCL1W=M5>)wb3>I9VL1|qXaZ?*F1yz0>7n@}3$Gn3|G4+PfJY%1VL89x4ynu}gaK9#-8W-yiyRKpK%!CC_{)8U96>yUcV-Je)K z!e)fvuTocW91BSs8`y@No?CESH2%z8&Bo621KLX??=bwSbHfeWZ1q@nt$8A|^U@bS zf~@BmlqX&}$g+Fp<73l>z2+Oj$=72an?)mJK!=BifdFX9io63M|G)%|Dn@~|2^ptw zk&BZl6KaiZe2R89dRUeZM_1>b`b$*ZK3Zqo&)KHC7NLM4I(~>XdvzvarIReb`Jx+Q z%KwTvJJIB}ZRW*R#parp^S7@?b3^p{pWNbB!RC6j^F2GcskYr>c>jGt5QF^}EP2t* zZdmBzG#pUpH=lv_pTE?tt}yQ;hJm#X`PZ9Zfy=OLU-f z=xx0pHifR0Z^QlpBFMc!`fHz#VYkDt01o-t#g?VPx`;aN5%FOR3DEmB-0Ttyv%s?I z()h%T7Nyf@ymE$ppc}6V;^3A0>@9v?BHH0=9`p@x#zY#Vd0;_7(vX#FdpFg-$QR73 zK&6--q+}VTMs@B0jRxnuY$vPnJfPIzE+8RH6LEOlxf;7rfKj9vppW;eBxC0JTnU}P z;fSD#Ks|Rf#VEJt=m&+LfOXoTwi)Hn?}hyq^QVN*ue&Y9sgjfBx;eax2B!~R$^X=^ z#D19fM}8g#p$z}tu{Qy3QA{YCy%;UO=Q=;n6k)9NQ{{fQs+O{ZJ?P5!_#r8K{*#PH z?TdzPmRgr2=!dT4p*4#Nr55W&#-jqETb-m?ln)&f0n;b((cTrupSpJsu%!lfr z8MnpxG8TQUOWW)LSR{)rRHqXT(_5G9tYjPii8uHNfFBv+NX<@eiNFL}b_~WUGAFU~ z$44?wx^2^gzE;*YY~EEZ4@i9D`V1UZwT5bHi zP}DABZ%3YCll7i6hCl5Gii5?=Q9@i3t_zlQfT`;5_7T4+Ne=-aO+(0HRhiYa;v+8w zZ3;M$UDk}B7=ZWMe&;~5G&3#om4T4*gM<6n-J#Vn>JqtOFfL^1VQ&u`vI!isF&kYm zh;$Qrn78=n_>1Xgem#samQdd(-jGo(FC#nq!25kXEy3G0g4ZE`@zyv7iMsYCV~@^( ziyYQ1T@1iJ7Z0byA0kz|k+caTC*vcS3Sw`w{K zcz*+R+zXW!^e`#s^?Azp&-}jypr=b~$k$97?zIh|!#Gg-U(Y~p56tz+E6ByzYEoNM zJ;SruACMWsFlTgRi!8rNtK460C%ZX<#+Oa{5H=ssBUz?sY|dQP(&hK9k*l`tc)nW%4Xa!HwV><0L_mY{;3yQ|ofe zQs(1tl$Z#nr`S#Uj%PTVN)C(gQ0!s4i}5$C5^m^^qlX>lBBY0{SsyjWi5`ulf}Qfz z0EXR$(pygo>5rGLrYan2xHEOH`&glLT%p;+?3hPA>3UVh#*Vx{8a$WO?euVLt>o{F zv(zahyG6-CTud#ABh2HFO(Kq~`k?KZ#bpo|b56nzB{1H{hoOVvX+ihHk6Fs5m|5g| z^=4G&4yq!kt&Jtc?04`-0cM%WC4V2)EUd*j!35f9b;@LY=mxWDT4MH!$0xM&2nobe zHd+)Ox6mOTHyLfvuefDu86afDp@Q9uDL{Oq#7Tr)vTYggnFSc+K!yJpb0Of8_5;7u zZraWzg}Q{%c@T|=3jBYihJ{}KYG|r~?4oK<~A;>^F&HElItt^2W0scsKd|`#5 z;LTw(VEJ4ov5oKi<=+R`{p$Okf7dn1&j}>Q{l`!{->jwcrk>OGHj}SCz((l?3ybVS zLa-m5V~nC|LH<37_szUt0wLvU3z%b`0pK}m( zGV^PF^~U0A3j1yJNbvMX>l*-+9%ellIrz;Zcw;|+_gvBPrhBZED!(RjuF@DD*nT^{cp+k|I=;-bza}!W^2g6|E%;1 zN-RK`*MG*izM7+NE3eizDX8-Lo(1?{O#0HDrK=EN0c0BZ!1?zBY{N2ZC2I?;VIT_k z1!4DEn$wV7B6rMTat){e)pWjK0qah}t|P}fGBDE-V88llQl}-DkIKu-A!*GUpqD*Y ztc{x>Rl*~KzD*haIS(o(+PB_Vhc##WFka4^LZ5w7olsNUK8pe1}aOzVN_JY z(#&A2pz<$Zn>ui$^B!7)%CR8)LpA})Hm3jeI#@mx_K#4Co~j7fz0$@x{D9ZdE1A_! zSIUsHt;{_vOCW2@n#e-O73PL%>%Pag1ybs(fsAOou+-)rf}&-%gRSv-g{kbC@jCth zgVCk&{%lau;%?Dcb3nIjnrtmgH>&W8aI6sED9dY;#T)k~+=7x1M0*4c3-Iufft)_T%#1(pS*j?+9{5-0g%AhFn40 zRDw*ZG`Lw4pIt80_KF9SCNPSrHzWW$>7wl%IIo3RXU}!0NA963Pmj{!NPkPNH{uTx z)ZFXJ4Nf0wR-zm&t+SXBE1k4?&Yg?}dY(@_M?b%wI7kLuB_iVsQ>%eOw^Rsa#jkaT zIm~oVegslot`lJkZ0piEHECbmckf4LEH{YIwUzSN|y$_lORkuyFc20Pf z1@#9-<7@3!Wg#}S-x|}|IWb=;^LKW!s7e?}qgt-|e>P&KFJaxT9eXCOf6Ba-wX;q9 zbV8&F{tv?_$&^nOyHMg6&=cv9nxHzVPQmFpppbS?Rzfl;_wBLLf`^D@tf__SvjXla z8JN5*pO}n>XKnyf*y4nd{aRUUT3jo)Bua8EZ;R_>v3p7|`L?L#%1{6_9`Q={XD%#*xPq}N`*h$@O*D(W73i74adHVok z&0l47yUETbgO{S!QdZqHUeEekJ(rj{km1H6nQ+lvl>9o7?uz9T^N9AdmDOFsV=Wpg z34ihSUz>pdlW$%w3dVKs7EKD?D*Kl}lhW?NTP2b5%H{-A^yw7QchDBfevo_HL{p0K zf7Q@T`m;sD%O!2_JTI!7H186$H#lTHT(TcK3Cz) zR7Gn|EXI%RpdwP7rX!FjzFDlS(9nvviO6Sz&z_m+N0P zF~DJPEGn{Ih7en z*+P8IB4DDQfclSr@~$p^QFm}i{_}q8cy7UIz(}6}1?$?E7H&mXIo?YsW?@_trvW;4y)J+nc=cj898FNxyuy4xo5? z&7*#qj?IvG0Sbw}P6z%|IJ#Lq_co3aG2aZb*VkX2>{$nBp2 z@gYx*b~6JF4FaUa-!f{k%&TqoAHiXV&w#75X47M-QP3#ji&$Nr|NQ#a6c{*a@psjq zy}PcGxDK&?Bz$;mD(=`@hX#1?dU^%2qtlNeQLQX*IikLw9f~X^#k&rfoiY-;m;t4{ zqX!DOlG7lmJZ^tlZChm5MnU?q_k8k-46vO&w<#fVBQpV{bHL2fNBTTqJ=ahb5Yn>8 z^Qs8&*mgy*XhMi5ghR2m>8~fwAgH~~eUIBFggI9f^gI$90~LNp9?V}vv1eXcOAsO$ zpTP_U88-6Hqg9RVZ3+mNwwSujIedI}6Q+R5^|wYhU-Gy0PyS29&Uyv@|DDJTz(f}x ze}=|NCirSY7x95m>H_f`D9C0JsS5x*d}iBPSrY5@L%18TGat08zx-ymfM(c|<@2{! zd0Se2HRyNGls%HVfSy?ZD05*oL~CCIDKRNK?+EL13nkRuHu*wup#^6xUEB z6-ng{j0HGv1aI(k&&;d%mu=^dWEX-l*k6Pn@p?di1Q3Zcg8q)rOm zKR=v8whuABtch?0#ql7PS`yy0c)d@|766<*573$L&Z4fBU2o=>1-ocKlD0(bd;=B@ z=OkmuOO{BpBBJv^Vf_8Wv^Ri_zE);S!=rpt3XfvT0gSWjTCeipH8hb99+DFd@e+kL z=a|a>c#@8liHg}K3LY&NeWe26s*z=B1*A}cgZ(u%)MAZmO%QJGd{=l}oXZgsVg^X% zIA_f&)U>H#`wC_%ij6aprhGj*&l`kI+kyk}up~9+l^mKpLsf`4+keiUaV)_mWWu}- zN%ky9ok!U-NZrU1(MZ*^;Yl-g%`jpdT}i7+wUbg@ah4?8OgippL7lT^?vrw24i$TL zsg6VCJdh53!~9USvJh>2r=^hF99jQb3K6=RC-^ZKcZ4+fu(#d4#zyBBz~!UmkzJa5 zSfI_-E`!(x_st#<~cmO!iKJ_%(7adr?z!E~1;_{LE7BFq1S`Px51g zyQ@=|i^Wb<4XMUahyTg(&J@33Ip*$w&AWR>yuOPgrAg=BBQ+cyv^~)1IHpkcUf@z^ zL_u*{{0z2^0;db)Es>`9v80{d-KA)xv2fbd((m~l$Ysllov%t+3&}VoG0Wy+#t-=& z6t)6wd4Pd!X`TV5IS{aSey@zw9i(*4=PorRVN2y*9|(86+&#dbbbB!_FW=8E^q11L%+e$u zX|=MG`iA0{J3Pn90)p5ywN=K_fo5C{B4<1m?q_oA8ryr$SWQB&r{#3^x&ONgj@te$*=tuGs>Z{&rMQg5(9}_zF2VJ&_;6b8I)X1t}DYY zq2^{~R&g3>scKX#e;zag`lIl;4x6&YOz~rXhNTZod4xgj_oUE)T3c{vfn;)-d3o;s zs5BvXX5^u@w~L2XR)Axb;Q)SMs+JT~Bu_63GPh{B?v3&bk1JV0hJ(uTj9%qpr|o}A z-?nHXnRMtx6{d_y>7=p8c!cM9kN1x(#if^YyL?)9oQ%cVm763Q+%6amH2m?hL%E&% zoO`Gyyh?vyH0}g|I;-?zu5@Ls8_{Duun`WGI1SMx^@6+pnqh}2?d@Izitc}pl$a|o za*f=IRy}s-Lk_KMyE?BWq!RIStdKHWlnLoorc`BCl?2L!nN(I6bkBf&&KYs(2fc1& z@GriagBztnL)-jRLo=IQqdO|2#YAquI26zWIYJ$L)8CFM03 zhm`BBlx7DWJH&8HTz~Gy4NqZ@Z$hfHa~FFlD6h~b>{hc0OT0pTv#oY}PF%e9OhOPw zKf5(K zKxhR2FbBL5C#k7Ftl=bR7PHm!_snr2bu-(deV^ZtIh*lk-b6+o_ccejDET}>Lb(Og zXRb_SJb#QwXk|Z0Tb}X*CGrdL6+c<%r1<_~0#}S3y9OwCQjR{+EN@waGmHHCqSb0D z^+Ebbzgr)>(C-?gPIUKud3*A(!JINZl^{o)>hR5<2{`A$w77y+tLwWqVV`yeT}KZ^ z;i9J=;XEHixs(iG9hI5U3F|GNBlNB-_s?a-Ea(1^$ z=c&0mE>1kq$)50>Q^gVP8lK)yHxiB)wm=#W;M==P$|?%lN-cCs3hSb7?YXtDptYPb z{cGkS4P>j9Z_1L&|Hl1qY zq1~K=8tAS?;RafQl7UhCHMvp`FUr(O0^TFkuc(}q`p{>wv}eN7*8AhjkO$fT}=H$N_o=c6FsUZgd%%{MHuC^R_+;6 z$pebR*!+Xh+7*;X65Y)r#g!pWf$`h4uBZ}9gYBAKNwbb0{e4pb3gJuUD`!nx*9QPn zemL}2w4MVulwBTG`YIX*Q4y#F`jXJ3$33pmUj0>toJ_!mgE(sslwpA5?Q>|~Kf!V#{0q>{mFfH6NZMr}P@hb`5h z9c6w5DxXq#u*&6hZ2*sd0%ZfBG1G>(&V2zJiCF=-g!*P|pf> z5%cDNiZjE=2OysI1!AOUz9cN%Uu0~_v~{Xot5hd@O6yjqaC3sE zO2df5JYefplEfy1KrFi@Uxpax>5sYnt}8R0+MJUTO!3L(x60{#*FdvtQJaj2?JyzIv$#z;WWjit2@PRN&G;A`d5kCvK^p?5w&6!yn2PBZ;p#A z4{(Wz-wqfYf@#}xw4w7nr^Kbjk|WRb1G!L8`ivUluDi^vrh(6FA#)EH#9IfM^?e&a zuLtvL|30?`GsJERH>!;Fn?c5e+L%)6prEDmn3D%)r3%7k#&m2)6qU0v8$Sl}Nv*ju6b zo{BFWK+=sqNX}|`u)vV*TBN1RdAhXf1-pgi)u3r(D#yR?uP5dko0=MdX~)f~iP z_&KX$f^n;oxg?P>bQSuM##vcxEYT{%bJ=*RHO zBX<9qoKLJ&8v@!3=deW?nnwiy)EIwolUpPbBLWIdjA%?+Bo%&cYCS;S-V@#EpRwCYM7!KAdE$;JaC`h&!R znxG=VTHikFp6sGa-q{0)0hw}o=Op#+8E=1(13iEA>SslPqw2e@8RkjkCd-FZaKMZp zkrB*o%Bx7WzLp24EO)kt7xdaUUy{C#N2nKNbHw&;zcn6OHl{h|F8!p346n$e|D9Oi z>6|p%{i^_J`E}#9!=yJVr+Y;T@;pOA!*eX1b2_@pob9UmRTivgJ?C9QS4fzG!Ek$5fw)xiZ0dI8j&2 z(wj0QQ(4DG8>L+t?a$H1NBVOX)lqqYR1*p8l)Kjph1hS!xq%_bNn?brI1KZIpirP82KtWD*(q69on@FV$IPNgNwet46a8^txr#fQ8W4wsc6{3f~=LF~vmbDTEA zuFEUl^7QqwOYOe6`%+x{?rU-Fdpw)xsn#?j)>B$*ikc5x$(i!&k@RpXsrfX>(HLOc zX>fnH>Rztf5-Jt+UlGyXTu<(awj^{(zXdfH$A`~Gx!I0F@>TphqX5lvq_?|pUh^3o zLnbNUjyEYFPJv_t;L4{LJAUNx%KaQfN#8c-bF@i3fp|(b&Mx780(S1D{wI&xe#~!8 zQ8tOJzNsog(khLmB9zCdkK-CH_Wk@}-_R2nQ&Q&!=yxSk;>r77{<9(o3Bgk`9{y0PYD{ zz0VGisKGxEw<&g=4 zZaG3HHTNH8y<#20-C@Lb6LVf6@p!#TcK)uNBWgyc4=OL^P6=Z?#mAKBZO826;&A@) zo|S`?lSh(WFmxVWJF0Sp5b6-t2HTnzX-g|Q{R_uk<_kri3Z3a z{GyY%Z?m&{WM&9tn%i#6P1*D4W%!r@URr;`p2O`y1&x#-+r?gur!&)qFbX#h^ z5h6cMp&Ey3Sg5%v#*BBdi3>bByD(dc@<3sg3LeP!nR+^Tpzg8@l+*;MSPh!7z^jYA z8yf>0WyfI5c&~@ma~M04MYn#Glu6PHoG%yZ^GZr8{-=i!cI9oloHI3 z87OV8%uw*6)b@m)Dsqg|N4b~vxb5kYYY8~@rWk})uOk9KtHVH(mx?}tA@NbSCoyqe zbfa+&Ia+R%f<8u#)}*NX)Yb`M>bZikHX&!oM5BqZuH)*pzHRM31o$aq46)KbyUv7R zpUBT?V8=gb!Ow%Kz<7^vRLke0ekZy3h{R*!JrAS^W8eu(67-ymM%dUJY{ZJHilizy z6GHdBsRb&cH$^6Kr+H6Mr>|!@w$1|4RSDh~)L#isTC`v4E{2iLz)uQWl{R+YFMj3# z=llbVt3>In0aV8Cp9=0sauyfjF zW~@mkn^J_*#%=IsNwSV==+~H8_p|4=$H$GRI|4*^6H>7V`%UCbhQ3vt=uO8swo9T{ z25Pm#U4t|aguc))4Ec5H2?GgG8p}9Z$KhGx!DlnCW|svUb>TCw7NpA;u+8;jQxvKn zBuK2a0qYOx8E2q*paw+dc6}cT)o`AQckzMe8faJ8ZGQ}^VizL?6 zD1F=aigBRB7egccnX1|kjDB4?-=v#l+}X=DILf?ZTx;dr z9|Fym&%d->jo1%q*SE@I@7yQ`-9Nq&I6+c;maloD|GHFn0j{%mz1i*BeSoB8_{GVC z$&f?}Vt%gQ{V7s4wsK3^O96oLFUS&p_?9gyy7>xb*_%+iGdb;huslG~zo?P6P*0o9 zV7Ew9{&%HBo4Eh~0e7>haM{Az{CAOATQZSNWy+S}Q8UDTfZ%;dM(hrza#d z!NEbO&SOnV1%~<63lMVt0%akgP%E=}p>m7w2+4Y9xqy(^7L*l0QJ zQ0?Vw?YGrSX#|bMa|M~#q41j}SmNuuo3vjIXC~EKmBW!XAv2*vn=P&PUv9_PMV%5{>?e+ Fe*o>q(*ghh literal 104794 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

aO6m_%5z9=l25u zX_24Oo)|h2L)np7sidu5g3yTE`AUbZtr2^^R5A^D!XpnMBFzq$0D0KO7pwUBC8tik zWIInT@yU4>9U>>5*%+v%SuJfFjKe*elnc)+jFV~-&HUKPbEAPX759c!vot0@h$_1v z^lW9=l0JLJOAF1|<1B$ON@E`pjzCzu+@G;F>cdrcbCfjK%2^kmYh27)CFtHU)0cGG z8jEM~j3zAIA{=21KPv9vJQ+5?TwyN6xb(hisJN*y@e6&?dg`G47qqRtSohm%AxkQ8 z?QW^;6P}T-JN65#6eck=htV<9jbmsaI;v=>N_zfq_`{-;nob$7ZO@3ko`31A zGbNnS)M)J(ZQs)<#mXXIKF^`)QBz~W9Ch1IiCS#-dRKIb-H5QbV7qip$p`hAVZ*zI zSLuC|;+od@JTUrv86lbB?s6rK3aJaNIOUG^`A2d!BB6%IW_59CNo2Rh_dN_g)0#dk zCb^k1<8K4FewFDU=`T5kH#jaYnOw_Z>rXo`;kup0(Blp<{hQsSivy0-XM$r{39pEr z59Z7ab;&Nxy|lQRb^ravGZ`_unm$&JyUAG6Rznt;`3p(!QMaW%VLOxVk+`0+`X(M* zZJ8YXS==};!EzaW)IW8vf`l~ke{-7>Q7u5~JPeJ&E?&F55L`4Ahoi$&%fZQ_^My3qS#nvRgi z&SLU}*v&Zbf$;>M<8PMb#D+4P1cq|qxF481%IIj2+*dcFJ74&mEt^s8kzUQE3&wbw zRzdPe%@x}oH^*^h!#zt}H#Np-8uShx4tl0jWAdJz$t6oQIV|*#qXQSM@Vy$H`43Z> z!#B=x1&y4Z##uv%zlRj&r9D{jF$okz#zH$a6~kx7Qq^yMS&#fuT^KBZn?MAEZ^qRO zV&C9W>CK&Y^GYv>o-nPfnYi>y`c2WKxl#1a9GV`^yU_6K|BIGX)(6uOt>fv2;@(|K|OCUuk--(79`eHt$g&UHX-p7Ipo zz2#s&@6H>7MXMgD6$dULvK5pce=W}3Q$+f@odWe(6B5MPwj}s*Yy15LU2^-}<>6^4 zH8E>)ckc=<%I7ywIBaZJC3t-H#n}%nX~{tdhIZn+wna>1=x>&bWMO z;3dhMbs>xl^)A#tNerDN^zDATFb1{8G>Dr7H_yd z#F&nkG))i09w?=->{8dkTs2@!i{%2UZHrr!7y*xok2ho1bV+;2dzI~0axi~d6c>o~ z!u{BVSH$k|PLACv?e3lVQHooN->IfXaXcabmGL(KQaXPaOKm=qmrb z^;8O?)LKpV_#OK==ssix({gm#ooO9!9Pk1p;cBB&oOS-Y`6PXu)%%<7jO42&S~x-6 zs)%0k>}twe3g+mtYd2f2DdeO~>*n0hSn=#rBMqIoOQ4-`SqD6H#r5_$`;yoj*5x3f zsvWdE73Jwy9VsA%vzD9R=QxFK<#}9Y{&9{HR9Y|Ej)Mb0$g6-7`+%H^l&yO=(ee~d zgi`%i7|F-=820?trvWlNoMWXjDb*w0G{ep?FGd0N&uIBVeXEsCJ;)Px>m^S_VaR=O z(vW6%4ZmdMGlkek4v2+CVhE}9lPMaBgFEf1%%3oFYp7@?=(l>c_?BK-9W)UkK3BPo zCQ+srWac6d;&BUvBF%&R?5i zRZ@SH_NaPK^vR$uXt7wldM^Cq!d>~}lhpGM_ew~31!ZetG%D4i{XtM)Yz9Wd)9-v; zY;>3y`6y z9@2}}ZX1!sIX$rM&Al>gpFEwGH;<;^cqv(MmjILV;utGVz+T7PIz4CKDeOiO+m1a-JOJRkl?<4F{qdm1Tp>HdwaE&t$JbNDFRFk%w(Vf|L-*H@n z!>eb=(XOe~2=^ILsV`u5P6+@ZNYt`s4?lh#Bzd_e!jH+7`g)Tp8Cr&!zci~aSvi*N zvHSe|OSUF967dz66=hm!{H&xm_wD)p#N=yE3kmMjGNQ}N#(Bxyt!0u+{cMkEf+dTF z*j6UR(bJc!qo#|PY45mZuo`QWa@&DCotk)$D%q4Y^8?*DrIkY@q@|g`qOBpp@<&Lv ztgP~s+m~43RoDH=eRA0X!xWB@(=)~MJj{L}AT_~x*OCnT7(em`Aoaa|*!l}~vxa1^ zwcg3(1TkAY;Yf|2j+=i;_NgsLL0NL*Fq*xqG_#BTb4{>=;m6%FRmIP`4qWH!Em%01 zszhcb3)Z1VAMtCnGB;(Io$u=IRg0Hpey|7O{NH+!Vl3{Tdh+Exs>^@A5NTGW^aCJzTr&5il@=NMHppQrKL zVnVG(SmuA&c;!Y#sjww|{uuDOCviodC&H;7-Y2V+tIUHA(Kl4b%eWjYZb@Rh z8?}eee9&4NeSM^Lh&Mw1xSK(`aa+c?`jGhJ;ouiDw5ir?u>=;=Hxu@|g{GXlYZ}8e_y>3dK&EpT$`YQ}6P-LzrZiWhTEKo7{GN;xMi-T`tPr zR(-kAEZQa^h9E}GsFzetbyzWDw~T;W56_XaRyr$(O*t;h_DJPNhb}VT&PreCjb15h zaxIee$E4XEYIWRWC+yjl?+Nh2Ywp!QNUpC6OV8ir3A!0uy%3`VaG%oyfcrco=dXT) z`)Y3<(Cqvp#dElA zaGu##erWbdZo`zDntR5L;4J|Lxy)_=im(7E5+iVj!>_Gf&KMuXMl#N6V}x^n%GthU zV1=6ZgnT3%%WvgU?gbS(n}b-Oq}E+7eqQe2b*+6ud8U~aYMc4kE#jSd85889iT6pu z9?IE^r{VHkx2jX6WO~b7X5)`l^Rfz~*gR`6SP>K-UORz_zw5Z*5^r}i+w3YL_IA~1 zF3Cd_EJLr>WY=xmY6OD}aqj(emD;wrj0*Bu-8FaP%={os@Bm7Hx(qpZ+>=R$%ZnezZwPtiR!re>qXgZ^2tCvtY zT^gJxZqQ9Pnc5r^o_JSFkDo)MI-QG}`N23#J^zx{a@*{IeP*srv#F}HlOiLNZmtUA znGefiKE*daSYwFeq8;go6pJX-zuIXXRqKf@tQeTS$JaEikMo!DsuLj@_s|r@t$R7v zzaElfuj0Qd=t8L?u*E=INV(|Q-l>xh^pQ9={X-!{8(oxT+tyS+Q@Yf$>IsC`Iz^2X zo$b&r@M*eIikIc1dQrN-~e*a0}mV<^%;p|EL{v)trNSW?0`bT2F59N%EPSvIU%8h;1Aa->C~} ztXQV<&%GTXG3rzp>>Nt6%TwK3fhC;3`nk+K&Iv@Ag!43c$3kp&=rWXw-a(ygNJpgh z@f)+Ax8S&08D@K$<^9W=?#zL`R(clI}sC#47$1v z+JKKP6kV;|F34^m=HH1kD00&SZ;U2xB68Tk|is>xf3Cp)O608 zrC$aQv+Ju^+zsM7bnnOhN?%*>%tB>Vqkp_AfSm7={z7bnEN~gf!9Ky=gljW{w>pEJ z=sRbX!fdm5gVFM>*jn)fT9P7s#;;^#Fv)nzc6;iAszD-6@(*f=hEYG*^5h>kC>qRX zR#blq6~0bH(g**~Ksd%O8M2$SMr;xB&h%oUj=%5-*)l7@l*2|@bT-TbYS?qo7c$Z% zIH0bsV`IAd#FMerfS7T)Tb9vdFq#kXq=~nQ2->`iMMQq9ecScN9m7wUW8_pbS!S1= zHZ>N5%$QJd%EM{j--pRSs>?JNoqm-gXc%~7z1qjl?b#R(w)i{p*o!!9W&j47t zy_ey@k8=4rUSg!WvlD`Lpc@H8nbkug2q_5WgG2-z#8jGGHGT+9Yq)qE@fyp}YQq+^ zdG-3tbuCbu?}Swc#)5kp_inI^t|06^+`Ww7Ayh$AlgE=;S1vgH7A5Ha@{@rV_~-%s z=0x~q0{qI!Q_)9wfwQL8|MHs6D{Om?@B&#gpZkKr>kAO?+d#oo@6}0XKMV~D7(pL! zZ6M9me03~)!`}$z8#@_7=LM?`F?VNnK7WB9SEV7*4+M;vzLD1I-Ah~8)8mr zY}lSD3S9AJ;7-^8U9`P-?*R;kIM=*!&e{s(yxu=PDC}tk_<4OP$BoPjZ%X>SF)nB@ zJ@PMa4y`#x{yo2mkso{_fQ(_hEOdo62k6$KYM>8|g3X#08 zvQinnR-R@u9IE!)`0_S#AE4hYk2``RW#%_)2~0al4A?*+UIJF1AbxlUN~&mAgQ%~5 zWuOWBO1(?%$;_$cND_cL6nqA3uWrsqk)WLy8ytV@!IX~v3|oj&wxE2GS3S=0GW zcsseuSQI)1d&;{gyE2^`4nu9CHL&w~g@|$chQQ-VdqMySrE1j?8Tnk_2+005V@NUS z-|rFo1R=RjjnIK&3u(~}rSFpO-W(9$&RAQ4l)-V9O7Qr`5Mm9<6ru#`y|R{}&_(#> z&7rbJj5g)Oih|WWnlxbxB865pjx+>o?_M!PO;z7RLwcf`<3{UC5vjhFAnmh-J1gV|QCh-TD^v{Z zCDFT}%1Z5(o_@mo-qvs73w8zthP6vWxAy)8I7ViN8A~=Iivo8`Q^anH->z4r{SvAH zk)AKlb=#@eSxvnG+do=jy?2#@;4hC^&xEY7~=n#|6NsnF(95T|4(p@YDc)72;*rCAUc}s zuT$mr$G8J0)d>hm-AFJbm)w`G&D~lu*;&h7zH$Ksercrr`LUps?gAE(2^ctNS%m|q zut#A&G;vV2QJ#gW-zUE> z10agdMY^#Ryg3@RP~(y>7^|_2SfqlrLMuX*iQ+N7{wyxXwg-kJ$v$C}7=IYs_MXFP z90-|~2m#F&=4tQ!$P?yEZc9TD5(_BSAM$@*g9jON9&{M04)}|#G3^*^*j+bl{$`i1 zQN~DIMFrCYGKx57Bij0Qsk;D3BHOQ>Us&r_U7Q# z>16{7ODEuwbU}v}#k!nuP_uWdcY~O0ks%K>e9w|gW5qm*vZg@(?^@vsG>rN4YZStx z=fRnE2I~RaBO*>Q90!$tf$g&%f&3_NtZy|td47T`p?b7lq|g0 z@`*FM49Fc_u>5z~2@n$WH9u;sh1<%{q2Fscm-j{-J4?fsN^nC{LxDE^i@?(15y!~RcDuTM-_30 zMYc=VI)kQMK@@4CA#kDUR+}}f{T~AW#$YsXG#W_!HH$z(gemF;AmJ$5cUhY{>m!Yr z7gFhAM}$YhR}A)FHlWf?3R_2Cs3uy_c(p^B`i7P{aS#{o%(cWGad6(^ZR6|9lu4`h z@zhk~5oZX3D7f5>l*Cb?Nq_oEbIQ7Eg3K%KTrsOY@GhBc*oJtZm~T}f^)^k#i-qO) zgWz?NojmN1^Y5~a%R1cyJy&P7v(lN$8zz?+d>%D5|c=N4kCYfv|em@osmWQZ*tn3Av)6`%D9_+m82RfqOI4M#}3(h0% zVxPbWV`@w3^|^-;hAbIjd+M3RNo8YO%H00~f?~?V(!lW3=H|IdjMcBZU&5Uo&CpXZ!a+k76RUl2(${yf;nZ}rK)EX|Rq&DjO z-`w36A9s?lUIWX%uY&B8L8lOb^%$(Ye8j(&T0u*-!UGQPH~9Ur>u~o@kn(=r57A2m zWDlC#wbte7>bi{3#KB^hDoY8)ksupV0M`FY)1ba<24~wZ({IxauDHOyE;@h#`u#^~ z9Y+56b!eC|H9`_5!Nj1*n57c#VUb3R8f_1Tymlc8VHbJ5Z9nRGoR;Ujw=L{LF%Qc* zy6-*}I$HwXBB{Z<9#SytgzfwQgrYOYr-qO^T52xIW|03idWEEsWjWx;8>e56kFV?A z=O8g;8S(7l{cYfYk<9%o5u3gE*qjF|hO4~=wVCOgyG=ZB;Or8iK>@A`kQ~!iWP-KJh%0ZmH zTF6UvxDMEX#!IR^Ylv|#=oed%$m5z?se3`L`cz$sR22PXCNx3h2 z`)PPl%k5g%SKpkdvfl_Skg1)L3866_owMPM_HDs~$vK~zW~FF7K~Z9hPs_gH&fH`J z@UCGn)y_6xnS>5B0||@mt{yS|JN91y$`pT)yIot#9i%7O^qnObG>1g6*I5G~nHLs$ zBYX0rk3MrCoCPCqzVHf=blV+(G&loHDZbiB!@)KJrVvceyW&5ArRGHQC?ecOj-%s+ zgS-0-)3q{0qRTqekNV8)PA=3=zG+jrCOO{>MwQRhmfZJShOGhaF{-nbuSI;ngLXG) z4c)ronCg*WUk)ET|0!I1F6nb_1`?#rvt%JU5+Q4FuWe`yYKZ0Ksc{G6Gbf;gFFOGt zdgv9firBE{*O8{84OP}Zj}-=6OT6>e7SA&qUI4%^jpxX!zl|biGkA|MBub|vp!?Ew zoH>f55Npwwzw?3tvL3^q_>v}^EH2`%?pUvmN-$}*XD{diA? z-m^ypRfr+wq%cGi!1Z|tnhQe0z`YE$3f=W;b-Y{sbY{Hj68e<&V|O#@`E5ZhvEp83 zed^RyjT(Hrjg}Fwc4cO&kn;e{B+eN@6L__BL{JlU-B6t>&#q4_U&NEw{uj zpSWZMwoEd@&0ouwCXdUrd>Ck+2(Wu2QW0(G!d!>$@xP9c!FZW8jx=S> z+S|&j(;VKqsw*4KcUM}6;$u9;{@NTYh0c|1Bl_I1SKb(}Csn`r@KQ@bLiz`F=eA$6 zB$b!MB#YLx59-&w=DuuIO2e;3b>=L>qqbXAAtt%|DL`6$8DilDx)~&ZviwrKUpkpjyLGki^2?pZAR<9_z={0~ z1AObzYD|$o$K;r2)aU8eg<|KF#TE}M#E5jdMG?H>&yqQ4VAREtD!16HLo6ghX>TSs zP74ffyG5<7qD1Mt3ju!54GXN)Ekk21SBk&9SLG$H=favdLN-Ou$7@ixZQ|MOu4qNn zV)#e&Ll=3TwoKEjl3RQ-sr&654N{dmzkQ;EIHa3B?F$x zBv~6@{UhAK%u~T-f4LH4dF1Ee=lc_r500i!AQC(d9^|5)gEX5F95#Riu>r^i2Zw8_ zBh(vyaXn{2mEJRA)2j9JYPPWOfv}8w$H7xPfd@`z;$0gc0RI5{ar)9JiXW&)N=5}3 z9n*rxhg!G7n;+8QLl9Gwp^bh;;S7%OfCb%U*l}(m&6SYWjx^dP5R}Bh`lcCg4E}MO z(Ja}}5!4T?uJY`8S+zH=jEM!T0ew}oo}ImW0~(gKrJt%D*+#6d-qU}$_4M}_4eurH z>?5S@ToMP;h4DQ_fswsRe4DL6EKGey#~p(7mGK)UhxOb|xrArBe&jsi|XryzuGlcOkVXr-i zbTwR2c(?V((95F`Ue9{;CCJ(hbScr_;Vhpo%rH=HkIZ#9L0065QRD!7(X+}2+kfDn zn?o*yz(A~9?}`5W*qKzwiLS5Zs~o1>7^xqd2o~u>@~olo@sS_bPsY@=lZ0&Pn(sY@ zJwJmB-`?eehIeRtR~`TP4c?f9?bO>=hv2N2Nk25ZiPHZRH4LBj=@k0IF6S>-J#6Yj zJ2O6bq2?FK_V@Q;D?yFkcb@eI{?}mom#^NO_Mxos{FQHw{rz8miN?wJ5R=bs!ps^! z^u<30<*z^ah`<_jk+k^@m=Ob)Og48CdJX+e8nk((o7XZ3`qaif7k&e@+d{k(@eHk0 zB5VJ<(cPQ@-$#x~8H>x}`ZQKG*R}mEcqVc|&tPK^W+J7hG=tZJZMG-}MF3*ljo~OT zhO>LDfP(Mf#+0;h@;Q9=1q4_O1<>@W>6u;MMLUYw&D$?Z^j_0Ke9GXz#~Q_gzCBXx z8nNgorQF%ofW(c}_SdWWbzm*BwzMuh(+(c^X_oxsJBAOzGcX`ge)>C4HxKbDb^COR zV&jJX@nfO1bsYLV^+```Zh8Oq1sFHLWS?ngMpq*(bPs|No-qXWV{d(4Qdw~FfFpc) z60qbm3Jxr6n2o?<(jZ2h|6o6Gof%F_I~o3?P0>PZ1xRrg^?KG%Id7DEq7jJro)390 zBXpE`zJyPI391vF=YKYm<;j1AC>!Of|sfmoR8{xP@tRR85EU<2T`uT5^pI{)tu^6N82209H%bu(y} ze+7Y~nRu!X+TTFjL_m%y5*;e6^Ycl&u{QD^R@h{8Fm?Uf_KGi|0(!tuK^>wmP&2vV z?;eo>6Ij|G$0VQmol6u#jvyA-gB!=(-+kc5zhU-4y=|P>;r6CL{@+H51pr^+`0CAR ziaELKftZKu0`yNUK5MO)4A4`<4zQz0xAui6vO5M)OaKuX+w$ML?(Lw-oV8&z`}JJ> zb{TyBuwQ*XrQEi8Rt>B9fI{~Fu=mzcQSNQqu%fe3P(cY51XKh`MJXB50s#r>E~P;f z7`hEa1r!M-N9i1DQ0Y`b=@>c`q(d5JfcL!I#@_qh_wzmLTkBox`{VoPUU=(<;ktft zp2vB_sa_b#>g)L1-wS3CAy24fQWWdw;_3&7gF3&0~U4>(yN7vnbqke7r=OE~XoWkw3BeyGtaA?jXh z6{9bCu&@I^r^u6$HyiI3TLi&2-M9rLvowZ7L%#!W^F7VM6Y)vTIxyW^6pq<~maP(2 z?GeQ5(W!&|E`nM`gYSfZMic5neVHcMM7-l`#5+0O(#|_RW=#LCR%|ZP-*g8}mMq;U{yMcAnf~pi4Gx5E)(kf|&wI;{H-% z-|YQ3((p-Rz&iFK39bt_XQRLoHLJwmUhg1f+hlKQRV^e+972N3=N=i7ju*oT(*G^t zQ51_+*XE(&U|dXJflfzB-lW{-&jtQ->p7kT=O)6M&17&KWaxh5JUFQ*P=inLNg8Mu zY=;$9F!VpBQ&refuY(i-8K1~BxQ!US>_Nr{-s^U$+ zq2+=#i6EhaVFUt;6{IUNl;Fe!bv8gvKfi$~{v<%AvF~=;jJ<7>FEFpm#NU(x(&G;+ z@-&idV!1Zb|KS!8-uEKe8E^YMbcaeKj}5{nrvetWF~eB!i%;NKIRv5e6mSGk!pGJp zp;y$WBf`RWDihmho-2xsgx-P|ULEW;BbZ(exY)$#DD1jjfXL?A5q8-z;Vf6cIdl+f zifZFLPmmL8@5awDXlf&;3RGWSTHspf7hcn(vh!Q;J$yu&Abz@Z#<>TyIC)%*0PR z-V|J@28^1q?eGW~_dckh^K8c#+`|Yo=P>kbB};BthHrrNN^Ul^t_Z!Cc$U6U@k{=k zJt6OO6ryO3D>?234a4j`8pU(RGQi!y7~-Ml-Ap6;I6T zbY#*1>8r3Y=)V;qpNCojk28;Ih$#+Ryc)QY96Jf#0h!*o^@+6-unZuI+k;hbV{ZO~ zS*_2K=+X5xKFHPWCCz(%4dw9rF$YZ1I=Y#uSVsBm=MMH&JeVzs4*B^<*zi|SJY&&3 zg=4P*P)i3Web|I9h~`MDvB8L=WcGS%-pOV1jB06zlWyJ}+U9KZ%JMviW_x(cqdx&8 z9e|>up`17gz1Yq9KsygsWTDUYOdss6_R9)DMLdIuGc-_*tq)A*hihe@%)Eo5qlqHx zm(=z7xWEXZ+9pg?Apn@vyiSdkgW=azo6OZ4;OHQWcsFci%}Kgq3Z$-?#GIv}>~nbVKp{P@gOm6b)=H|VE?-WXClU~U13VNO%>+NXQ?9Np zo&9+KxZ#-IC-IeDFLCWbbdC?!P*O;xXQki;*@38gs zeulX9Ba?8V+nt~? zz|(M?Fg>l3<6e%ikA^*Yqgf&D4Suh^?6$rIdplB1j(url*8O~;i%y~A{JU9kam~<- z)+;744&77MzUE~~UZgK9#0^s>&)$B&rqVb}_cwP=_a-Dedkp=s7QKVbja~cw(@TWZ zSjoaIX zWh-dh`~56FTkK2;l)k?B$Bm_8%hqS(gCdCoeXpN26odd4Jv zaKqj6WpVC%IF{ctrv&)kMn%~=TFs{$Zqx;9W*fdQ1~9_Xi{k1;5qRmfl&NArN*_w@ zp&S@)*Y=eeG3Td9@bCW6R&B;U*VtSm-JR4!r-fLnh-D`XK1Wkl`{X;R%r$l-Dz0df z|1piD-EmXMO|UQP=u0vKNNxT$YjeZ<)lpYC0iO{4C{I22fCl{=HPyp({jiMzeLY+<8@pFwK^nCPB$=QtYZ8L`qfK|<3nklLTs*Irh?G!0 z2SjzpL{afy*3wUO#u38BdWwl0r#s^!yq9~`-5LWKg%xRIX|*E!(N3Xqg?8<4uNcUA zuU4^;o_lXh8g8z^#9R^b_#$r1ibrj)yz{YrClO%M-mk94d44V;6Djd(Q!k#_dK+X* zN__c@NfVm|VDv;!*Tn(O)Mro8E7b}6xZJ#G<-^3>=O?nv@o47D*P|>eda~@pZbDGV zr5M&+*+wCZ(Y4&e*F3y2J}N5j&x%X7A3M&zv1bBYx&;tM~Z(JU&NCQ{Da^9%iI=9z&1ayj!NjEI9qf6awLVW>|`D!PolN5 zc}VjSWmi{nwppP)bCYOa58nKssGG_;lUFO9lgwhf(;~b4jZ&*!MUT;T65s95mkcjT z%-lGCEez!LqH!x_sOgTrT)pvIi0$VHv8jC4}4&a}h{GL@h>?w}mMn0dE5&YrO>R8mO93DG6VbsrU`^ucR) z%gFE78qDM?dKJg}W=7R#(qlMrs#Hhu16i~wRrAtI&Q@;Ovw4SEJOVKaTfFAHaYpe; z<|2BdHPSm8Tg({O`pgXVgU@Iiwc*U$Q~CAt2yal4p6eK1;in~bHqv(&8CoRZh&PQI zDHYIP2QTdd=?2UAkOH;qx&_$>7}M*^dc~6yr5p!(GMFqa3+d;>vvL)8O3-;kn;EQR zha}AtHWCws1;R>Vtq${XFNM%Ttzdkn#~V}36H z|H+cc_)!1wV>w+~#d~;nAG@wFZO63DuOSgN-I}P^tyV4Zq1o*1+{PCn{l;7maE0*; zoDVj9?b_~nGv=VjIITF*r0%1V{M}(#FRtJIW4**vF4`CcDz{`SUOw9}C={;j6pqGa4g#i%!lv{L@2Lsj#r z)jc|mE6zEbORXzz@!N_6*B7^WMD4vSp{8QalqAH}SeYQy^`O-#{%en;5l1gBTY=)! zxM-A4H{lQx;CIK*s7tN$6pE2<@$}WO{PUv?($%j;)G%2BmYMD-F>cu|Po%1(8m>*z zQhA~jBb@)$g-v#J6R?&<qnX%vBfMeOk>Fo{!8Sm@X{LG0$wQT)drX*6F+Hy@Fid5nS|08B1f%VA^2xk#E&gwezJc z(G=(FqW6|ybGRVkB9K(nniiB-a{SgPl6vep^KKaD#krj1!Q6iXC5qTwDR6!pat)Us z6`L!)Ell5WaZh;9)!hckETlnl%jJTreuO3P)1fTb^Vs=8lfx^umJ;5rsgjpLM+@>F zI7@M1qP;p&9Q=7l_ursaW&3_I{Og+rR!Vat_0lgdJ(wqLDiIe84x`NpTCP|it zQ3r~KC2n6FDutC|n9bRIC$mw1ku(uK8F{U#G$dg#Nnvd|@2Ca)PLyZ+i|V9(D}#nY zRQmq+Yzvm^^NK<}2fDIy<`CC3(Mk@fwC43QUHO~io=KB(1X&?d$@kVs`l^z1Z3Edg zS>3c81@ivdg}&XhJz*x#q=A2q>s|W8EZZ);dY#Igv9h zG+k_Wy2F@5oNs|0w+C+w5cT=#b?CHFv*$7{~9%!YFy zryR}7DltiIF;~jDzSMV~oM||Q={^+;bCO~V!{@8?1$*vEQmSd{zN(}mI78pX6&AMj zsfk~L$j|o2ye;RmkoT7FsMbZ zmWPkuaE^pg&S{Ig_IvJIa(OA>vN)sZ9^@{~+{tX8+TN@3kfA13j8;J7iOl(V8qw&eIz-EVm;X>k<2Di!eG>3d!bF*jRAztzvuAT>c(2ANJh8IDO6-GB&3$w+RkII zHQo;2jv8%$dHy3Ktvtm#=LeP@eG?YPVww^`huw%StE6! zIP~=~3FYKNF`B3gRDeGSJkQW(aXih*mwBShMpr=8cV0P}ye}fM6lvF7qf8dML(HR` zS;mi86uO}bmPE%8xM{^D%sYseE@Xt7KtF8bxuwu$V-QFY_dS2iVe;_kV`FgKjh z+p8GdMA!a^E@W_{9OD@HQDX%c8&+uWDzIR(D|I1lA!$-$^a9hJ{4(^DlPwJgZ+laCz=)0Xvem2`L*_TKqVtVE5gd|-kr%;e`)loH^hATO5|Uk*~Kw97|m zh^*2~@`))L^iX513!1Wer&%R!81v>xJ~+AjejzRBx;b)(`F0%4_PK7dJ-phlGXPZ| z0^WNkg>=s5_=E`e`xyqHzHW>LqsVC}BTvu|D)E#@ebyrPt(LA{|0aa@FsX>WBNdvMj2onZA|0r9K*c_iuVS=2vjRn5(iY1V%&Tg8py)1J+G&bkL+`sd~s<{M*+`yn zn}|8|e2O*+#iPli^?xwhJc)LjNDbiK|MaUZ({<8j4z@5(enau5yt>O_Axc@5?*%%W z=@D=Zx9q`)cYfLtfJu{^q#hV^c8e0Pn#_Zt@|vJY{Kl8BLb&gRIx~OUQkuhcCjZZx zn`x73gx9g|g&j*Ihy{99V(_gr``YS^_tzKZ>u1t%%j%+G$qm667t3dM%T<6weOY@q z>)4Mm)H)gYaDjV?|K!(N?mrLLX}au&sLcf%ut=M(_xm-U@qLJLvrr<&S*pbB6c9|4 zmb9q8aAZR{`4wlT8uR2@^L(D#*plLNbd zE%Jhns^!6~=_4XAE8%6)&uD&Elcb};tmCe)I{kkC^KYFdIEL}e)DMF5?jYw-aBj9} zlq3yNRgm>>I>@u${9!K1<2rK)f&tj zo;}1+bJKT3yCWqS)9%`Kb-z_nlE!I4I@cqd8L1tDAD=eV0(wJ}(Rx=Yhj}4=7|)!= zfXQ$ghZg2SQKw+S3tj>Fdn5tTJ6?^gS9eD)>&p_#q?bP?%((?j^B`TF+ze~rhYp7d zvXPt*i-M=O9N$L^1F9S$J#M|5IxMmIb4N~#vprokUe8@Vs8gv@Z(zj?(u@dfjw{^G14 z@t&Dvll{p;rwoTnL#H<1!mZqVCw*0AR8jI`MxONgk(S3hI*gCo-XY~z%R~oMpwm~+ ztZxmUvzDj3+>mQ+;Fak0^;5`x!#^81J?75#aftAI6p@iojiFEUi0j7{Te%u%6ki}=-? zR|NaU*oS91@}6bg0Tl_!3<V zfFTf_9V8lUc*Ho>=VQw=rK8jH9&}tkDfrq)I;n?tb_g^(`-Jp8njY_%u!-;5cV(C3 zC9JylSI6qR|8!uEL}sZAv7%N%Qrg@7NT#lx-{qN2Qe+hKl7KHuT*gcH(6j5lMt61( z-ZK;?jl$L5oQytQkm1vvQJyc&>HPY}q&*>{w$NY(KxFK-L54mYXO*s{>#NLy?mFBv z`@ExVd-AsPqrX1CUI{~m{Wi9kxOWDln%lP;t`u~*KVU5tW!;jl%@dV$|19!>_=0BT z%WvY!pYumwGisRP?lBKQA6LEyx;L)u&hP&Odu*pbpTpbKdO>mgrl2mDa9ByV-n8RD zeaEI-hoC8@CME6M7q?-QsBK zezhe(AYkmTX`jFoA3qYb!sh3ou&V@@Y_6;qL9LPp{#mU4Sw}ct^(o84d$n z)*k|b;=<2??s)Qop8?h`p72Az*Yn0Mm&t@t1`*CHrbFVkB5B78L! zf9JuF6OpDf8^&?Mb{A8A`MknR4iB1CKf&9S*N;*GVU1%}IgE0uScAn5 zFhlv64XjPUHMK(O?Y^-T&{JO zv5I6nHzs!~ocZ}z|A4K2{;};E><6YC^)?tSQQri89UtV%biBRs&|2LWapc9NLNQoq zL$iB5V#N5@)@~XhgBY8HEdv0v zOGrw#q_x~%VB`O!5&Ya^>@ZQcuGDg62cd$z7U++vV9;f-c77^A>aZ_R@7D#FKqnF2 z^+@6On+rTO2LpFdH3f^!Uy0WYTmL;%52bbia|e=hA*AU=bl&-;`SR_Cm4J&ey)2>- zD<%Rp0~&ZUd9OCQcKeF?0#s9tO9hwS(doM1LO9<)=$mF8*1hi`++<&C+4kShsBSl; zquZlxew-M-I*3#e&$0IVbNu_0M;=vEEy5u<{Cw)4lktCj?s$0aI*&sBEwt!Ap8F4O zN$tOJt^WA}{{N5s`)yLE{J(h0lzE0=j$4Tw6OehT{wIUS=;>wpZ`Ntfv;EWP*gL;} z0>eckAYnloCd4HmVP1c}YODwfL`5G5CL$NwuKnOsN2*|DOj0?m6%+qA%VR7F`=qCiCYf9)IN76MpAooo=&6o&xFPsMcU`{0puGTwZG`@mNoly}4go+;}qrO1_PzmGE zJi{6iZGG+|K)3$$D|VfUY_ftKbR&|^IX z&gawWWVqqJKX%6H#W|B>}uY|6Xcir&*lm^4xpL%^WXOM|J{u zdq^UK$RXfd?=5j(QFPECe+c}0!8YsVFpwO+R(S6RHO5(+;&1PUs%ez=0GY&D2d7ik zoU#d%JyAW-8(VfDy=T>F?=|^Z$0uI3j6XN$e;k;Ry8*p63%&7uuGPdt#$Z`eL$7-m zMXyzE2#ny*Pfp0{cq+tufN%Zkt_3^KN!=mjyA~?gA>j}#YsJ+EFbW4BirH+kTM#w{0!{XkbQv|6|ac6L}y!!r`+ z$kydS#16rpkOa_DPvON~1}=d@8(C_Mf}X|Fp_1RKX-a2hPsY%CtrQL11K!1JgHe!U zAG4@-FYv&B6CGF!B5$J-o#Hd}GX@Tg;zzFKuW&o>qiC3nBWu&tyM6f___MU?n`))i z*XUue;pWQb_dqkpT`yw?xf?=MPK|Ku)~~dOUz_R0*S;C70yP#RG`??c!9?{gkT`hz zxHQ{cL2*h26em@N1Oj@fc@|0|Dum#{5wcqG%vUDf{k#;`Ejj^d~D(6~i{PcT=$uH-fU>=vYOCF7aF zKuzn$)5~H_y)YZ^cuyxMVDre*?vPXM zg9K+P;D>mgL%N+~{zpDD?V+vKG$%t{d&D-q(sYq(O>N_#zT-7WOco|-O}kg`mvLdF zYto?BlihBUS>sj5nY>fsZI%Zpb%@xbM2I?=n2v+7-&+u0MZ_HkH!iQ8OE#ws2HYO+IN+;Z3exN9HDr@eR;WGkA==65RhQQsE* z7s+uvOtq@L~Ou;{}XO2(ZssE|iZ3SRJn0@zX>@+z7f6IK9^8;p+= z)bR%6q-CjO=}X+oxP(~&lXdXX+=HaKlh-WF6K(^UY}V5;KgpHw!7&jTwHpI(VzChv z#;?hZHMLE{=7#)P)_Hc8s(zJ3a!_JPaqKX4`?4TlZ# zai}XCtWN6Z|hZ248o-ASZda$_0 zs$krIEljMA&TVa(=-zq!f$V#Y16{lFpiX?>^(GYzsJgwU)e+ru8Q1FJXJk#FX4@6n zZP?S!DK%ipJO4bNSFy_Q)Yh9azj8!FE%t_4Mjyso)XFExPzr+hLi7O(wNkS8H6di# z6fWGWncIr}h8QvpxGWdTk~#@(TMQTplj>aqf<<@FFKbN~A^IGIFg8v&+q6ls2aGwb zRNo3oZ`s67Jb%K(n|1iGNs~?oLswkisXHnan*lT@*E6kvsbQ z`o7s{tdkXmH)b2h)oIT7Zifh7RsP)^sZ~B9;m2Lz1SAz(b^L+3am_zig-`)l9fMkF zcl-+qB#Of>zBCxXL39x<`}6{#Y!g3cE%9Hgv^FUpOOmzE75eWdS3N5h^G;BwSZ@NF z`{w${hX(Ogc%h=Cy@7m!7Ax3ASKSYn-=pb?0ZVB=$bYH7GcwUcEh-Xxp`>?I{YZnYo*Z`Wkb*u7JRKhHz{do&O&|g9LaKvD ze-L|ArSYSu3S@A|&)c2%9UV zD{w}t;PDR)$?qyP#TVqNe|<{V79#z`q8iS9*<%=IpjsRu zkND#%%WP8!^ac`ca*&j79yU1v1M^-3kt1qc`gfzt#gqQd5;WP+usz7 z_SVch?nOkh5%$W1`Z4MdqD;C47szT0O}Em3LZkpE^VyGJWr}&?0+cJyuVmB8V_99N z44}r;4r<>+UwB{kf4CUIBV}5l_PgjG>xtENr4+u_>+J0wOzRY{_OotiD1 z47`%A^EcuWrEJyxcVbkO_2HhU!=+2#M{HHSt}aV*U97OjC^ntlPO*rDi!{!Bjv?o= zy&kpWkw?=fa*8%XD8&1-zyad5wmo)^n%6&jGONh#YJg`X81Q&!#1xE9-qo(;&v#qt0( zI{+n0Luthh)Z+zWE!moFU0%7lNrlSRO|VU=h05UzQJY#I$8ws6a_(e7zlYmZU;*Dj z-6<)4lNT7S7+R+AG`3S`F(7bmrP$UDv$a_?u#rXJor&|rW35g2_qvDz$1`BmL)ARfw0 z+Tu;XL{cI-(9MY1(EI#RpHHo75Jjo~<#v0qhOTt~+w>%xuJO_P;S5cSn{ttdUxB-y z1i!CDx)`snaf}IQ&u6Tq{ej(FEolwjoRX0W7g)D2C05ml4fjkB{_0(`GfiWg&;9KN zC3iXQ*e))EcYF~3scGtPm$}v3uaj%I5lNm-mW=DFZ}q!=sy+dO!;*Cji6CK56@D9Z z8i+F$A z@x9lBuEHPE_te9;yB}-1K-Q(Gs>2Z9f|ab;q%YhB#yEeT)sDI_Jm_0)YrXYnXIgj( z0P2`7!G}tdY&~u7F3X5^yhYOz$jBJ#)0XgbV=cSXk+DRR{!RhP3Q))}QMFmqZ_hk~ z!+#Mx-Vx5sQHPc42Jf0t>$b_asn;Pctyn02{Sotrh__^DmU+$h()CzAm$|_?ILqdV zidjcQ^Iu5`b+Ytm$~GD1<##S_ozKe;bqlH?x%^hTSzO(&+rnAAwMhiv;fxX$UaZD% z-%l@qKVe|(2m(U%aweYt@q3;21^NE!n3sa=0Av|IWY_{Eh{$62$DTvfu-{@I1{o)N zY)9nNT-PGSeeX&+({j*H1@8;nx$&j6_}{c;5UUN3Mue&0Hxh*GICY9p%H{VNyVhlP z8~j`8+RfdRS3++8Q;Gj$lLBln0j=z<=F11~A!MBI;u4r|SsP0KM(}@c=%Y=xV9hmP zt0cbHj%|Bpum=o9@G8$ND1YMRP5ERxEs)(7o00~OoVbUNV*c&3Ts0D+o#37WV1s-k z3OL9Ux_pWFjB@bNE3tKG5HbH)@bvz#->&{dQ=a(}P0G?lJNFnQHQ!A3p0165@feKd ze_ZoTX=LmAGl1JrAUY=)4#=bnJ#+fG&hP93K%?R01=j3fXrSl7uID~5o?bU3s_Jo5 z^un;i7$*J{fKTiN8v!$Jp{GK>ezXD`A7o@^kG*=Np*9M+nf?f08u&^l#@>L#}~HENo3a<1N8tAeg~?HSpAd&@}2~uSGZ`Rz^-2aDPS-R`bQau zXIqnlH8m@|{(asS22dqV?cv66xD~$g-A6%7Iq%FTzwh4^kbs-+Bo>VaB>#}%|M?=7 zL5xpY%1b)&pBNCf2vG^1GLQUQ7=%AP z%esFN`4%GZ?2P-2<*y+cGU;*jD~C&o8i{Ub0w_Z9Lk!P<{xEo8t6OB^zP~Hw?_Z_F zlpk^UbRJvg6g~W#js1ImqY^o8zbl~c`G5OTKByQC&iDSRTwW7T&?14bI$gE^)$6n&)=14Hy&B~ zU;OJaUA z=F{DUm^{E^gtMoIw_Bd|=eqUPpgqKIw#Pf&x`swR>d)n1p$v-vBXI`7ACOqeD#XZi zG=wut9Ys4#5L^PcGQ1Uy<*y~u#Jdy3rq{PhZUV~L_p0PCCJ&c=S6>&xm>`=jO6JFR z|No9`A2wVpbh15qf{&$cVfp1Sbe0f`GRcvK3MwF z^>ti<#$hA^v23wO;KE3?M<;-RB|!+P3*cF4bJJ3$%t+hX5a5FQz;W-k|3gr5 zj8sC{t=etocY6HSGWTbBlskM6mqP2>wuMVKOll9(8#eG7B zXA5y`nF7T3rFmn+*6nU>g55GRXUDr`4^0KQTU!)j5V?jUt}UBD`VO`E??!SxqV?CUwVE-CHru znHQbcA8HJj+!$AS3AHv;ZLVq1v<)%b_tmk#y`CR{t2(8lm*cAmF8uO#il9?qp|?rC z+;NjLGd;q`k5HHd+PMNZx~}|@jOzQ6S8GR^1|9I6?K{CN3=Ys@<#ZnIy3x+- z!FwoKAS!O+k%=7J3M(=-m|Iy-rXs zpkz9P3&!ULy1WEUu#(Y-2WIbGz-D%soJL-bPKm~I4gdCDQ6@)RX31|n{IN28 z)qKW`)9Oo`R6BRCFQ~5_$ev2H*fN*y-kn0zUsJ$K2J7R~?-rxV@ z|B^CCj6eA?wT!;>2b7f;poPDw1v3%P?)l249K6#U^tvoSM~T5&KBs#e!)JVf>(=m7 z88@Txlagz)T9|hADtK-5UJFqJE_}i>0+uZ&SS$-cQR^;&;5BGB-PRr4ovD_O+KtT+ zg~q^o$LmUvTr*Iu5Wr)zH`(0~VQ?U>W|N}tnKnU0jS$xQB{d=kpfF_WfIYP34A7iE z;>g%@c!9@b14vmOcfXze$U{S~V{uH_9kzdKpCWoZVGch1Dbn)mvc1-sc#S3t+rYDg z?sqjU@Nf^p7_ErUe)tNm$Zs2kg%|XRL*$aH=aoeOpD|vA31Ks&%Oaxn+0%fGczNu( zvIQB~dl8-Wto!Pazds}ZbPQN~$M7q>z>UwVzk`?j+%0*zE+h&IL(x;-hVih=Jqp|@4%;N7R7(lJM2M5?W zi%Y3l!7lacx)H^b!n$4_-T*nQwS7yIxjK?%JY5DRr}^4-Qv5sM2}lefRl4iSmF0DH z*E;#p4H?Pxr*YPvnzEvGeXMoyeCoQ2IS#Mfzai6v3~nn&CRhz4(79HxD0T>CZj?)PgB8j4xSt-}mDqkhJ9 zR82G@@8&Fi5lklTK_W!kBpzlUM0~2d%s3*6N8DkZ4`~DNwz1iU*On~=I}1`NkKXai zwuHugfCh*1o^&4=BNoS1jl`zb%*c)~YG(nIS=!+J@O4^)Xv-ON1BSWF zq=y^kVA&(PwYkwZh*-43;rP1RZ!-Y3+rxR1?dU89;w&kx7^PyCRn3n(EF=}9E2d^FX; z8Kzw)gwPVMKqq(xGb8RCBllP69=GNI%z-OBQgL4`RkKebsQU3o@V^{6sbwVwh0LMz z^Vtm)0hqbD$qS|&wMOMW+XFD$uJCLFRb5OyByYdgRX&+B-bEAjZlGrqe$Ta)t}Uq(#|^L|GeHw3 zM^fYllHWTM>8!Yr(c{3Y%{Sm3t1T0CX(@Lf&F15RASHv-l%Gy^oH^diFE9BhgJ1pC zbm=1@R`3BJMm-; z>hefeUPr-^a=kU>q|o}gJ|$mK6dUc->!*{yKmHma;}fnO5@!IFKrJ!^jwASG&|~z8aXQ8HZ+Yq-ZtN?cWQvs zMekInA(v!(t2B+ZYHnq1eRt|=O)?9}Zyj65d%j!c0FqnXV6;)n+nt!JrSt&f*sKKO?)FrnyJ@>&VM5v{HG^AI?0wF*jHd5ICbK`5yb6 zjP*?F7hkjwhf%_OTk8231?gaBCTCd?j+?Ohw>GwSB!)~1*ORvT$J|u;I?T>p5gyU6 z>TXWjTq)?xpbH4JR|o>&WO23F{Sv{i?y)R$*FrQQNN(oobLVAzx4omykVx$xymT3= zv0bB=WA)hx*t(4>md!y|rRa0lSj=Tz3DUf={P*sC4NEP5i}nPsy;I_9OeQyI!9H8c z!{Bh;n>n#}1sV)fgasWYfi}y_vW+Ylk}FuWlN^S;+bk=j^Ios%z&vQ}3g>LJhJ8uF zsE!J?A^rN>{jC5OhxNjsX7gH1&mm}8=R8c*jwn^Z{*mplLypPsidX zxn)(}K3h<+?Oji{%)!q>PRX65x(&9*gk< zeG777vB@TfM>mdioCyYjcr~9iLi>^KX(SrP~Es-}o-0gr)ROXE?TGx6*fBbDYx|9+>79!*4*IG> z6UD9FSx4=S2YLQ@uAUP3ZlyeLGX;l#|3xzMa+Z(s)iXvclH6KpgJpg?R{jdRW0=#$ z7EAn2P~3liqxH)B*R}@gG9dC_kIqb%IGCieRwEeEZhR~%UjvhRf*gN_aVMcv2jY`! z&u`DN3aNK#N^*7X6jqV+v)ExKnm zwwFAW#Z6QgbK@4~AG|j;#D~A;br@t~>HzcoIdB9<7m0L+HZl(qBG6P6g~*^+^hBrH z)(~_%R(akeWm|o&60hr%IS<>QT%h-m`~zm@A)9VUx#%Baz#*(K zJN`{k9NKdGLhF8!%(lXAYgxkm`p^TkcL|N;sO5Iw3hBr0ePDTXWR@>6PQRd9TG<~5 z1-x*kb3Y@-q}ky-(=(eJ9>6%Es)T@uQGa!}*oR@qg6$>!F<1Nf@q7ct#8ZuFd}Sta z7^QdS22Mp@^dsVVxkU2;P4@=t+rjNsTm{W$eRBhoxhsaf?|wnwK2i?5##Y`pZ0hPe zTv3+)f$pXFON~^$o46KrQ~ADvER#+5S0n4F@FRN(dk_sg~QZbmOUh65ya^LH) zX{bSQw^QKF7O}D)5rL1JM}_y_`2a>pkAlwyGulMXWJ6>0KDeSoPibH>P~ppwaD69j zD#z44QTx!HYH!CSC_*{~$}5sAl*+i5%)pjlP9ZH>TIT%?)k)%q_0_j6gmZPOYnCTU zL;PrjrahvrJ?tW>kq1hvOI?kB6Gm%67^^vU@%|0x>HHOjE}T!SUS2o@U0O4qB7~Mb z%Btticwx9rq{~3G_<&V}pF3Len@5@g%w<9&WO`4RcI$LiBsDKLuYL3AI=j78q@y|M z#){$}LN!iepA6fD>dCHgL0=+=8?bR@2*^y>zj<50m5q>{6$hS7{G9@u5@}lp%T_N( zHE)c}JhfS?=^w?%Yph%`5UH66hkN4tWv0xh?z>>4ETZd#CrB@AmDnL?j#~$bU{=ty z=VZ>aO2nicyN~zGc&XYpK6cEZ{E<^F=K2PQzrC@?xtemEyV*KNoaI{=mu7m@7BB|$ zA0?Tr_oVirD|s46ZddO=AM+q|u`faP+2>O?Ase}c+1fPLnb-3E_KjkMm3xQx+vi41 zyXyH(Cg}pBgChj_9~o`2*0yE+Ipp_0i|_$D53|E3{`w-mngh5AkCGv1mT@ zKW;uX9VW{@xk;xreBO5i*zu#)z29g^X`W}%eRi%FhA$FmwY8MTfCTl(XmdTtkO~hX zj5QTEub~ZC8wLA{$g1mPAr*aOA9bD!V2RNx;mTT^*vyOvnP6Dx-9FO|)Vf-AI*7N*64fwn=_`+cDqo}Sv;%tL5$+fFk^Hx}Ke z%MgdaFu$a|!RNjDPBLsTA{X9_>VzPUDXf>Za0O=b9L{!jBIvBS=uqe!;>O1LE63o?|Yj~ySX%FHMkk)~A>#K^lT$yH zf4XH)>F-h5U+Z;GGWy5I+pi5m7u9ak7O*i?6qKl<#!abJ-iza8Ozljq&zE`~!H5&_0>-bSnUL^#J9rRSBWJ zjwY(T$wV!qzA}PS-^qego+j3PL?_D7b!Yl=MUY`fof63zeC%z$J*rwdz@3T5B^&~; zkLC=jnXqzu7EN4_*WB=ATkGOzt0r4DxUZlc*SYvLyHwNhFIh zL~w7Nkt1zoD9c=RfA4}AZ^~Cl2Gcp+N@nR*GNw}?W&6sS$KYUxaa9j)^1SV}E}={( zd${M^nb(6+$7mR*XQ%N`m+A1y*{56yb~;*L1NZPgiCANot<$eUo1-H-v@3&ig6L}z zJHi=yp9Kfy8Kgz6lVb0%1Pc(?=?_IRfD(x}63{aVYX!;Cl@6~a`_X8ZSo&=WJcpvc zvJ8agwMw`Wu*=OQrt!H;1r~KhirlWJh7Z%zM{6c6mw{gejqdRi%?{EllRy`H(YXgT zzG0eo?}U)j9y(l4u|uSJU%$0%sg?hyrGSme86NvU%N_z3GOtG^s;ZUIB)RZNOHL-(}K)V!KC{kqL z-kY^Qnn674TJ-JE8@)-XbAktSSu1&cSa_&a962c|)rhno8Q2K1sSS%)T0f`;^5_G& z+4EQ;7?ZlVgc!o(?+ebW#?#^VEdb4DcJg>cRJdXMFxW)7N;=`&HRO}u;qrTRrjxbz z3NXD%VmVbn>lZHD^uUDD%Jpevhyg!MHRg+;pVp{ayiS-vh*qniwcPNVV7m{by08qu;sX~{S$ zDKfG*aV1n_XLs6>H0)jWPPTB=Mas_1h!ReA=5eg^eLQha)4T8YcKiKqzu)I}`(A&Y zOXs}Cb3C4palhXmNfs$i@)42Hj7cVJ4QF>u(_xz-Q|~LFVsbLoXf=*k{q~@4{aL)K ztWT%h#gy6c@@i|rx$^2$!~&P;DJy!Om#s(YCnhxdvhyyUCM1P=1!fe92t|&+PYq1P zNJuBvKB{6m7eYOju{&h9X9EtvF<;bGadw@eU9;ONA*6Itvnz_%_(JcN$<(rYTDL82 z$4iSG!gsqD@9&a2@s+KXVP{~ER2k;s_sVdf0%pI_K2NvNkV9q*aR4R_RryB)xE4@3 zI$}3wSwG*$o=H+~<9l~f(@Ag!phv@)hYdQlO#Kl48$8!s85p&>E^WgK8!?j{ETV(_ z7bW~!>={hk`GV+uULm3)tAhW6zQ?dc_hNzVp_~ZKVh$R?q8kMYa))IVrw^- z(sAQM>h={|#@V<&v_JHt_n{c+co3G>XWn>}oO)lm!np6#@HSL}OHaJk;I6JH9iezx zr~8`*(UWG-&m@L6$HuuDLE_ z)rw2^Jf5X_2%l4q-S@{pn=btt)X!KB-xH<+nDz7V4=!50#<3R@BcekaUaSbTBBC7Z za$1HxM_lYgZ#NF^3^y&8ez2|SX&2`+K)rHh>NzLME9aX9tf|O*+9jd2)6~YoZfa7^ zR6Q-r2t@78CUz;3NE<$}eNp=1FrrimO;%vLXA)d_-`3L7Q*CGn$AT?)AxCYPuSat z)4DDOE5lK3iG?x&ClWVjt%@zS`T(Sf8x5+vDKM0uLPJWpSST^Z%%;lE(*o644(-!X6=imk-dPNIW=k zp$HEo2fa0VHaHnGB_z%f;RA zcP&OqCW2VDdr`Cr8|Jm>%{US8seJDH6{=4el?q z#*8-hI`@y{xBOoNVZwy4BL82zvaR?A=;Eua0V>BoPA8z zx~nJ?N5}GY z*!=6PO}WUEQo`GZe!vM=aHB@JFkw?;J-_i9#EOW;6{Z@3oxqTW4Kf_e=f`~s`6R`pk1ieH{D{5IITi+4|}(b+^5 z0t$f%h-tZ?m01)YF9bkN!A2cxRogRZ{i5efy^Z5|7D=JMT;%)zhV#G!s9M@O;~`?* z+YgnPbD2%yL)p8IoH773${$X%`MDO zTmCGG8R5p0_k`~I4tp`<2*=g;4B^1()?Z`AMNgip@H~W~BIMnz4( z``gTD6@JJDgaNg(uWyrEyw%rRU?K$`PVFm09Ko>)3)lUCw{>#SOnlL-@d;4ZRgHD9 z%xW&)>J29WlCQDv%fCCw&-qmXi^!vHDM0KinMzr|a|3#E^a^7Mh5kZD-P2jQu9qLa zUbXN>zAT$Q)a2J5p{8+Ux*Lu=@x$9vUYq;@GrG#ZsofcW#$(~fTBLX*((*Yl%B|Q?o{KX5>ifz9d1_BsxwxCK?K- zM{I3u>N3oIGNKEiOy&o@>OF-oeRwW>WurHQYd66iZ#%0=B4Ht#X~t22xr#A+C zmMuTeHvoi*>nj_*xo`TOt(S#7W@0p;@$eWmyNCuMqzvghKNfaYURjE=zXBhY*tc9~dZn%?^FyGwC5maan|f*oQN z^j`Bm2wTDi)OI7m3LmWqJa92oZS3F>_!r(#`0*0{_w7R)fHOvd&Q1&fpY|t#(_spr zM_CETf_8H^(*L#vKp1n=hbi5<<3IjOoq~bqfre8nw_U+Ry#~oy&HQT3Y!P#`0f1lB$gpKUG(zzPxNwS1&FS4y(8gPE4ZC=r zQs(a8O+gaBfw9}gF#Y@=Hc~hh4eB144mu8zkQ2%_z9@qCRHX(7(jRdvWx{bfZz0K7 z3w-H^07MOiGFX_;At%bILm4}h<;bocewTad`wA_5w($dyC~D#Kfh`u_?t{a{Fe2nBpWSw?SmP&}w$QN!y(Jz6=5 zikk7O7Zo*S$5WOuW*V$aBT=WMCI|rnwG8j=?A1x@)lvm5_JeO5>wwPR8n0U?usFpS zSvtf8F@=TFuc{9zFX&O!1GutN%F$wkW$z`(#DeE5=B50UY;OdhAXgQvsBDe5N zn3mNHms&#m4*zHmrX&sEK z0iY>&DfFrNPl;jD8JJBq5FLe*WE3OzZR|9Y?Bz~w>q z%Rc4O=uPrG8hl;>+8($l!1D2hK%*wpB(N5f)IMap_H`vJJXehBj-TH8IL8~alKXSe z>}ER>mQ4bWdiJd6KJrStEP%v0IwgZ(D_uo9cg1YWocpqcYi?17#V1tdq4who{jga$ z*Y8<5T~<#&<+oFGaZWsU2!=n}QoHtY4&)tbp^H}VP)5_*+4_>XjaLD}IeOp#te&}) zGtkZOhZVhWyJkg$hD6OC0D@X-0VcfGuV5@{4BSrpxNm?16(gw;pl6X?PWwsnLe*bQ zH$jLp7AOUHc}xumx0DGxP4w$^`rg7^#zMazZcqm*AQ}&pTm5z~xI3WoGOo`F;AUR5 z_p)d-Vi%sMa0V_~mEu41hX;foRX3m?UG|Is_&K^L<|7SlL((p0Mvm$fYLthV0z_Fu zitV0Y^0a*)FU(Ooo2)Z#_yWHh^NPD@xNA$qCsHdl^T@~8SP+~gxc5B%7?%}Dx@bx* z_D_BZKM!iRS)pE4DoH|GIHR_~<%Jze7*7%gMm2J3^KDToew!2w{V7PJ(a@5?nBlg|q5u}^?AE?vu;`26~iZ8F{B-wQcet^(KI zss6gvL$|uvv!;MV>;daKP;a@9ywax7r3ILLB)<>ej{|y{tNO^>_JgdAXBVy+{uIp3 z)?OPE2J%b%_-z_G;rMGDZV{oI2RP@K+5k8B=%IMs6!JFsd9uU(sISlD-+a7ipJEeW zPIPlrPyYE?DmXdbw)0((S+L$1Cs;pOc!$P|WAPnCkXn;AC zbBR3td|I%FrTS9r{`_M|@}XK_F+14>t$s^=dq)GYA9UXLp#Iay->5v001O;o=r!&v z#}67uNzGET3$IN>mwpT59OgmdEg~ExUjhS)X5bG8PiFt5AH|)<7L-}=h9E5E_Q)8y0 zKacMBXIr$2=@Bq@AyreLKIAp{A#^W76LN6_F_ZQz+JdEGT1L%m@t z+WR`DLnskubucxYeZzoC2^C3Nm?}9~LHhVwJ17msAfCHin0Wrezz^a`bIx+0m|*?$ zz!w6q;vuea7C@us9&^29D-8)Q|+p1eUZZcqaF0N|&+oGr0at3)0v=^0S4_%m<95w}Ni77x4XlJ6LF@e@YQkc(acHDy6e>4(o~gMiFs zKU(NML}HG|F8tKwB8*L@_^im^p0Hw%!Df=N=*8yWBesQo*2^Jyu^~|yqEV4Lm3E#t zo?HFY&$vL%tXDg=dEuaBM~C(H=w}Pd`?nc@FkA;{C_dWdmEfE~oF55tfT=CJ*pX8N zhs4Lhp*$}0BU59w3ifTSeT^t1Xs(=|FmnNg_~0tJ=^sU84w+D^c{lFHKjMdr`E6gy z0H?vM;Bo_UJb?=3;r#Lzs>Dd;FZjtO2Vn?|j~X@0QdafPAEqz{sl_a^sQY2^DBM(;`kqMtYm&36a^c+FAeug|S`zgdGEVNF=JDiGg0cDO8B$kzVRf z+(L8|zL|#h;Bl^uN94Kx`C;kSebvSm1LXr1&Rw)k*nKkLZ0`r68B^J8(imYHaSqlJ3>mX$wz$&E%A1Ibt z20@HVGc-9JooI)ai#{%)^XnaZa-(1xuJXd3lbhy42C$<^3kkI4_h(|vvD~PFPWDJGM2Okz%nF=_bDTmdwZG?hD z3I;RKu2BZu7Hutf&suQlLy+!@!-$_gYOL(iu_5dftO$Jv<;Ozv4x=b_$6A-a!Z9hA} z?}v^a94VOq>QjZ)+)!=m{MOr|2?n?0H-A;Gj5kjUU+b)Ed|&;oLCKBYGp4UK1EL4*)s zg8CdtGcy^WPuEGc9GHO`75_aWJt~zYl2EL*e5>Js8_6}WDIOm}qJ_ExnF|h(#s}4;(<-MyYPY4SLQ` z?A&TAHbJ7om2Ejar(3zVSJbf4tsCsKU!@&(&EdrfIl&j8ej<gA zIXuZ_xjWrZa%L*XJeQl*>h1O(z(>4GBb4o*HsYRz9#%W6qP=_~5JM0DYFR2LMxh64 zXJy!7*lPKY`Hf$Z%5XEXUE@$O@!tz7OEysJj0TdNV6hMqYIYycjq;acPgq%0Glyg% zc{L3m9SU9OY6bsAer0%Ae{du`@2;!*c?L8p-du(8NMEfVr1ynij+Q^vp6(lcPZGe6m zP4`yX{W9Z@6dy#*4DJG6>}h1#cTTgezaE07L*60b^&xqBwSN$l39(*b)vr0o(OEI`XM)3FhEim^OQ*i>l>oMt_4 zBG@9cf{%sBt{Fam1!BIVn0tp0HgBE&jT z07V2CHYm+3<0eN)bi!eU=$xB?V|om_xJJqyZ2I?+Er;=N$m($Pk2pCB~l1CW0 z?M#wGp-MLyAQAk;(C1pVn~St`$@B}<3FpWM_T|)^#idk2wGwJ8?=tNtMXX^w;l(uF zF>OAxw*Y3NyME=!1F5mbv7Xvma85!mjJlyyJar3p!FmRsH89wJP%CJOSzd-sUeQr7 z0bKVc(W6G0t`-YM>&lc2)p5fBa zU?YwIYg!(a&XrpCpXRLINDX`;nS$us44Z2<7IWVq-_C$>6$6{-VYd{IpNl=tpO&+q z0#>?$BX~l!H&<;4OxrN~p?9+KB^;0AMr+&`;@E+m)n|E>oNP5MmKaA2i4Ktndk_bi z#MIUq#RfueJpeGcIHCtNQDi|)wo%oVZN=-Dtor%bCWl4BIfW<@co5LeyN0CN50Ri! z&@+9^XCaOBm)aq=V8dMu&VV#6h8y;@$a9O}Uzmu(W2+c6Vk20Wib%fi`8r(~`N2+} z-&6JE2V9&0`rS||y5c(OG6sy%;7Ty`$chog8>nb<*CRc-kpl<7ZA!Llp=5%f)h^W0 zE8F`Z;%VH$-*AR}qF^hjQ9M5HgBBedPE5^GblE z>o?dh^cJx+fBT}MI`~StRtfhh_gLZsU*0tX((A1}i!tre?_Q@0>ma$6=Z9L-pZDtj zr-rdGj~WDa&LELVN5~W5KYnIj9F}mDs%N{>PfpAIWC7qkXLl;D9q|HHc2tNkg{1hb zs*lye2F0>4ZTfKCrDo?616ci>nz0k=V57A_et!%{O~~!bF}D{Nh$lbV?M8=EGqest zg?Bzu1t&Q2!Gi}4y}@mK>yfBSG?a6X@`D#=3W2Zoj?0SNY5rq6d*Vh?Xms=5}?Om?v{|i+!+Q^6U-M;9aRp)abN>@MC7Qau+_&c7_jtP z*8)I7r~=TAD(({Nu?6ezvR?;D^5Oy>`R|D@k5e49=2LoEcfYBU!}PCQD9+6*8?wo` zKI5X2Z@92Ru?JDsENw&b%ikA0`imkvmE_#i;e>_UNjggGz6^DkC8uA1o(HTeqee9c z2_3eEIn!!q0Q+KAY~Hg_tk;Nyh3w(24+?od|7u~d0M7~yO8#wz@vnt=VPE@4WXijz zH?3U!_5d%MifKDgsC5G;ssRC8h!Sc)MFP{_Cfa$1#prT28 zEpc(gw!nKFxHjcTK>X`~|nKENZzgXTP|xS1@gQ zey!xlk{kZ3q(L#W`WcWiH+F)cQlk7p>8nU8qE|VIRcwV^9=5SP?4ra-l?mIzBkdAt{Jo zN+fl0%AXxvf(i8Gh4?NTf3l4HCO-_*PcMmqGTyB2 zix1>-<&s0P1r4rcm8UPoj{bC=A9m7SaC2V%o4REBm3#}~WH?#Agl^^k>wM`#THOAf zA=eT{h$ zQz-<8fMibWj3xk4YJ9cL1LVcV>rk#pMi*uEcPbnqRX;smi_{X#p$m*mLGNzV1O_@d zdd`RFsF1)|CGnS6zYtM`_0fzp$5g-{8_D!fm{%VG;h)&g&hsM zNMIJFlXv4b&W}WRJq>N9)}1Z+5`d$D7P%p|HP@)#XbMl|nE6g1qeKjJfB&2U*1?Rf zE+XVi;*L4vK+1UW$pe)+jEhU`MR4``q#0D+?YXvmZEXMHj=Nm*Y1FmQ6xs$7j4=@Q zr@ycO)gig*A)H$mYWp6fUt&ZveCHqbP($YHDD83?l#fhNuZ_4U-%?^kXoy`iH<(U6 zhwwt|N;dyd_0@||lk|tz?plW^7&}{T2E@4D>bOePgk-4|cHm1o%OydUm%sV=NAe)2 z-@(l6*+x>IEZQypo{hCZcF`@x(62u6@JK-|0w2sazeEi?j)dm}*brZWdX&Ve@Tm6Q z4;Urq@JGvukZw$WArM+8G6ykGh2$h%u(aT;J#PA=Xh}ON2srhjJgeUaFU@iK$3G#! zO8#59cAGzn*S3AaK}O!XO=G7)N720=NF=7vOqJa_F$W5u98jVao9(|K!D}(GU=g(B zVcU1f$F2SIw#Ou_76m_=+qeMK|9X2Msd@?}#zz?@M%EL+N0kx*v3rD93M3%zbPumS zQO1>RSH=S`(UNV}XSASck`lufq!lunI0bF6ijze>#A(+jf>K@&WEM^5j~~AeIDo>9 z&JkyMn~%UoaiHb3Q9a4glz2eTGzQ2KSq zooj#Q>s|imZJvIs5b{JJAT{n|14?F5{;$|xP56JFL$Gjy8z5uPKt@|{s>ZLtTi+t5 z%eMz5yBwhtL2Zoqc$`Y#1r`fBx{MmSEip-X!_Rpa#q57K1cM7iSUyf#? zc0^UrN#z&BpJY{3>8FZd$_w452eK}*u{a=UIY{R5LyM_rB}Rsr6NyS3^TUl*gY(Ct zet&}gpAAQ~)%>Z_43lmZj%&>sg6>9LG2Fgy+<+ZcgSt?RK`9W=F^l911CF%U4nt$G zw_QccuvU;RV`XJMV!}3Uq$qi58ZcA3m5&KxQ(q%|8b?R}g$88~KG#8|ArkR6OO8W| z^P{si_AL|dT2TOKigkNoNYdgXkJv^(oSr|I12qfx%~d#0q*Ib(KOfi4G6o}^?@XbE z*vAPXV7lZ0$7ViN8#d?N0IVb%z$Qh5I5h4tu3`9*CB#iWGxZA4axzKSey}wiI{m~z zD|Gca=gI%r<)NX4&3TOExKKtYDoe#VUXipX>H`=`^vZTxkrVFX#T>Umf!oI6RDTde zS9+DWGKK{>9F_$Pamwgv$h~f?1w=vs^k7q7zzAEWBxXm$?hW}F=)hqtTujK-xc*aQ z;W(qV5jz7^W(&6PA!qziAm7QCVkcn(9%6+S*gbA@c()q2nG&~1s52dq3eO966e$Rf zd0B$c+5gaJfa+h3+iato>RdmRqfP%?bEuqmnT`D=^%iK3HD?1=?XH7%88}DnF-6))acZ{9L*1ObYOkc+|y=uLDzY55Q5J&Zmbl4F0@ zsL~oCL$*TeO!TmTX~hrO4&R8O6juPYfeJ)HxLSn9m~Fr!sA{p&OzIgozKar$V_$7h zK?r1n_pbqVJbzmGK7_t=c-@4`S*Rj52GLKq=H&a>&<8_u5#Z!}8w171U9(Vssj@{9 zn8+TV0gT&N@x!u;JXU$(ZNvfPTzt|&zL&H~VKiUEB_(c*zMx7V_2>89fs4wfi5SX3-* zZhv=6e%ku!&kF%p95gp7LE6s>z0e&Fy7Bd}zZ&qbVDEt)qo6<!39i*wWglwaBO}{X`Mwt2(^BVh>0H1L^v(YYOCVT=mXNlW_8A9>Kj%e zQW3ZBJNHKkfDW+SkfEbYiS^=F81AZj`-n@qT&Ec+hP1`qfGj{Hy!JfUyoW!dPAO-zC24BYrsq&q>~0ieZ4a`;fhKGZ z$lJerH35ydG7jAt(+;JxKB0{|V$6g%0)@6GE0<{@EZ%Y&YD*_Ywl*)k5#=nWd~n>p zu58=_%CfrM_nlfSpfAN}zem$xeO%0!gi%|9Gvcui$1o}-GOXJ_^TlgnH8-C&z#O$z z)2F;G<#IoN!0^I`$$G6>w{nT}5ZP%o;RSaxQ{-*ckEX=}KS|KbGUr29E<@k2qR!q8eEr(1AYd@C2CUh>P*< z-Fx9bKfZ}L7S*v$;RrAQB_mx8%75N|RR(dANQX9UDkB4AFG#{PSHXw_9go zLsd4}NMvy7RSuIuI;W`8(6@lThT6nw5CN74SyQ_NyR$g*2w&d*4Kzsv-BMZrW6|;q zC$ex1L84s>3ze5<3)`fthU1Gho>+`@+^IFq2P-JH@YiS6!Wh8O)C1@tIds<3kDc5& ze+WWJ|xk#44cNX-o@zuSS)9f6ZOI znLpMXCZPft+Mwq&Fa}{k!vcU0$>pWQA{EmHs~L3C>l2o`X}TYVhL{5NWE&`!N5M&* zrH&t8v=m?WgC!D=P+7OcR{E+3j9RCyi-iv?5mHoPZu_Nwdbl56AC~IK_oZqe4x@oz zF01xud%{tz4f)_UnRkmDp6@QCW3I;@S?X-H;X*Js8=&4trB#aXda_Ft1nCU5Ls%ma zlVgo9aFeFL6ae*V`mtl=J%%us4aDj#e|`WHD=ff;b^~}xcJ!kMKx@njyet>rrn&&u zhOIaOjkyS@F4YubzxJJJe^H;5+Z#^|L@*ewOfL~~KEPxp7JS;yA=`wcOs%6f>g?pR zf}dLv$XR!}9-KlI<=PbJmxxTJ9sy-|J|6R2 zDuE%l2bG^9k&n2T%-uZGbaS`Xllj{ga<1R>{BEx*{}PjGVu}TaNKhBBaXk>M$|4^S zzcs3au)T%REv7QNbLz{hutturMgtEhH~nmWcD;AnN9ig?;rl(E0QPukM`*Qx8o=x zBh`Dyin+-X^&*-F@1RnWw6ruL98^1DA?%ES#M&Xi6Yp8G$zVo)sH>A)Bp3EA1X5`& z0BWD0)E#2j{*omxw6M)Le7tywe&s?&{JP2#^o#F<6YF=)v~c{f+CP8ZsNcW%|Ky4W zZuyb*f5mrCoq_|-i^EB~9M#&OmxFSgO7Fn-5yr1)(UAz-7?5RN#D4M+tTVZU3T$K@ml7Z;- z5tND=SZ3=_FCGjS-qrWn#6;X;wgR#6{|FjD_$?aa%HRNShw6`sX=Nv)(lE$~8+~5g z)A3bsZJ$&Cq6~w(Rv_#!(ka!%U@H)ganlV72~zIU3OQ{f8yazW{S{OMLKWM{Y#TS9(#bJHGE$*KSYw}@cLMF<}yKB0WDU5Al%Z;7b+v( zqyMmq2oFF2-2?eyz6(M4VFcMmu%<0QTyBPb*dt#c^Xvm@zg&kATh~;SJ$9SUa_h@$ z>T_LxS8|u7d>P&n8r&RNrkR|KORlgYc9m!~n$bx4!9HS={HApo>4t~;>R7$AdT;B% z@L&7vpuKLx0bJu4f>l92JSQCr?Dm>%ugy`T^jegi^@z)agi+Q=#y2Rw?7hTHoZM6h z=cZF6!rZwi>FG1q5Vs7)wGw-dcZxxGq*??4MO{d2K&^wIVzWiqL~#ldVPfqh7I7dF z^g!dV!PNfVklFh7UJ;twMU4bT7`nim%yW*pX&q#*t8*XniB zJIjX-AO-h>C@bBAy01pC*yx{e(<(Ly%ML~Kx!YPk=UkJAi9P?pcJnQOEOZP4x?hF| z1FY~=jp&VNk+56EfS8{~(zrb+Lco9g2+eC20siI$`?mM`vq{Mp494lJ$SxIS(S85W z%e79j4Vr_5D`_TXKL>1NBtjU@J2((|CH1#Jx=6Wv_1+kNPu7$#Lf0o#MI_5}#erfv zlGq6fiZM~XT09rL91S!3AjJY=A6T9`}xC>x9tHdpX+)tj)AF!}>s_0K?`1S|h;(|w*T?k?>p%<1TSc=P71iKu9 zO`fMUYUL8AK9$-(fiUPX8SYUnMn`%pWsmsDMCEl3LpJ#{Qx^h|#ff}kOw%$tLioq^ z+l?M0_Gt|fXu-lma2dMHD)eRMIQx|1S{`;F{r14tihp}j7gS2j%}Ics4C!-(oF?z| zOUD{z2jC=XnH!aV)d3{9)k9H+cx8nW=>q@R0?4^WtEy@4oDCz5x+&Q@Io7uAkx1lJ zyb8_P^DK;AZM7X8UBA6r8H1WX>Oz)O?7Zyqm21myGg4{>9M^py0Ce41t-p82h(4ec z9DL__8zbEgY!M%!f}_^Pvj4nM*EQ4=QfiqQWNON?)?S?>;_*kKr-~6ra_r-f>mj5U zcSK{$tISiDV#N%7R-02hFt)iJ?z}b7u;rceOKi4l!Ua|2hwk=q8xz0~y>zg*NNyDLXxUvfeGZB}Rm%lCT-4;n^6{k(rCvf$ z?4hcb7);83@Jzwd#k)4jPcP8#AFs??We8yQn!|XPbojmzb-eJdi$VhP{=8FN{vO#g-vyJZ}+L2YhSKo|0UIs-D(qufn7R!;R_tYqsdxB5xrl^sv;^}5UEr|bv?iaw2mcrDFvjmJO~ zhIWc3y!OiNP9^D8U$EkdQ7M*v}?qdN3HL~)+d=AmZIPmZ8#^Kt)V z6-W2U$GuR~T;E%>)lJ;*EX@^JsVmWlpyP*n8r7h>%}j3Vo8Y+K6s<01LW%&hWVVt} z>{At*A}a@}Yq2V=MxuT-wZl@Mj!rX4cDA-%q5H!5P2W^9X@W)e3x1BJ%+Jq#GjX13 z7BmQ;9-n<85>0?jl9j@wj&{#XNz8qb7&)?s+B%9eJG9C)xG!0WaT`DL^8F*poEn-u zgNNEwGfOj3rc|ZeH7PIIb$#Q>)ObuA)869JWl@ITPQ+zrU7as9fy1Q6!;B^M9`AP0 zKY$ySc!qH4DkIeG%R?+deQc~7Sa70EM47**$-HJ_O;3%p@LPHUVa;VI^nZ6Z!c$2YGMJjh;>-980>GkwEIouOxk^B<8GuUHuLzIcVP+=s~P{w2)5ABK0*$inAU?P0LjLfc4Pc6E+?wC_6Ij(6mG_GP^6d#ZLs%!Q>0e|+XB zBT26~V_RGdLECL2E0-Pg&$ifJh1MY}I}aut12rJ|?7_v<8$Yk&oaCwJxbq6B4;Ir` zmpK%@3`nR@)V1sq&DpXZ1em7^q^tA3!H=-_4))yF&oeUcu1w*aRBgrOBVNBuD4o2t zqCgGAyRwYJdyRe7CN}P$mMt!Cn8{URExzB1zyTv1*R7~5&(OR_4w{lsLKf4j7l>rh z^)V-zZW+t|8s3&t1v8(G!~$Z4g)bX4s~*`NWp$0`IzQBHuW3)7c$gFntQa9#QCwnu zo8iHWYt7w;J@on5^?>Xls9O!aYJC;UpC@hZ7chS02WNVg4uQ?7|Itb@l`S>JPv~wB zKxss`pSx?Bz3p=eop@cN>Jv1^FJ&3u-lwAO!nkyLNN(yXbRcHa%}8U!Y8neBGDQ6& z{i#CrOP1X+Tyeby_FIs?^mCj>>h`dbyw71JOj*0$3IGT2t+TU(zUay7!_90@I?Z%b z9!b#d_D&&PWu+Q2^mP&CuXn8KIukPIPW6w_!<|YDf%mXnLf5u8uYV$G#Bqj!c28E) z45=`7Kdq6sa?-`L;FPJ<7{W1&*Ae-K}~+ zr?WAO`mPxdcXB)3)X8|;S+%uO_$OMg=IA&#Cg^y(tDcoX+O}Qa!1BwyVGFIB;`2Ce zbmb&XUK#fko2_*GxZWQ9DzVw=TB2isKF;c;h{T)l)J^x9@P|t8GllK!qS6l;wTI+N z)%C->XnUD>6;##^^~|yaOeKJkXHuYL3GpQx@$c^0Vj_Fjy1P50jdD6P-sA-vZYFdP z=9pvyHokh0mqYi}*FJ{x>Z1fq-$+1rLqrm%)ZPL{5VcKRy9ks<97k8Xcm(R(p-F`ukN177N4o7EE{_0Roh^l(%wvoIf^L z*ZrEg!zlDZ;&W-GKdPh?L;{rCND^awm93746o)vz3B?o&t|L$K`tA5O7J#SP*;QuL zGib#_OB-o;?G*7m4{c0mRQrE%{+C1CHAj71h9jLXv)qWc&Z%$daKIBzw2nNZtBlbo z5cduDvUUJqsC0v~?)X@!hqkVbyj0=g*ShKog_Z%4d!}gm05TsymwyH`Kx&S{zSL%w*~c>AJ`xo>B^H z3D%v62SFvW&6UlkEPh-g85f)qb5TV6sG%mIvat~W5+UxdWQb~O@^f6vY{$EWl8Zs8 zD$3B-Yetj3WUSkzF6hNY7hkE(siH1IAGRaHQ+pC_v+M1bDgi}i0b;2%s0-@ zlcS&$!6S+NU+fqlVzHjHkJWhhY(!I8*TTNaX^QV_uYYKpg>Ki7$DG|>0*UnQgM(M& zuS<=b-@qJSbz+&wppZ`a^`x15pHyj#I89XLi(kC$iqREUTd8#P!d;BAH#5P-OOl#2 zl|l-n#vwVIgyL7$H~>l6DN^D#5NJ-{ksfSB(`GgAJKcUNS z7O$oz77V9~DJ4yu2+h7=eb`Q3NF!X$iEENIu317)8e=c1EF^nCO2RBE+s!UD&u(Wn zD~ z<92vuZA7qP^rbBluFfJr;jwOU*WMlpm1L(-$+aO>E;R4BCfV_PZ5u)cB9c$lUmhBC z^mImEGn@CiM&JN03m_5IQ(qsOLJU3k`c)&J-1i7jzY$s%?mrN^ zl1b$sy;$+g(b3T4ib{tsw%`M{=_EYbP0OSbvm)R3Oa2D@-by!H_v!cQ1c|8+y1fJV zv-TzSZQ>G*HagmmMD+FF&z-V#8SkE|2yh~*Uk!1c>LKpuqdg(jTQMDbsJIdA&OUc- zkIqqBMDa6hnnGy`2tZbLbxilRhxKMo+-mo79g9#&6o2HdeJ9c|%4@7X#q|KLp#Mdg zRW&ZRKx<(&eE4BC%#y5ZD?i(Ytu8t}1MION-2HLWSF0~-V<(kZ8ddJ|c~eYNpgM=K zZxJEaFs`6`;HEDbo7=1tuF-JBEk^sikLr}%GYwaXmFqmZym@U;2u5oR9xd*lDLBP= z_@3qjVP5sa^nXs#8qkFa8+m_DC0XL&3B@c& zHRpd+%hPzLECIL?1)RixLkD#8_YCTXEpI!Irz@2T7tAaj|oa`G^a@kEOJ zS=Y$QgtIDmZV4|R#*RP%-Sg`#_wNcZB!rQrwtnGp7Jzu401o;ZmnC)A6&b! z;M*;g*2gC{jhuN`S9ijEy##c{XdnT%#D`KHuWfYDnukng1 z<1(27=4>QjJNQ@XAqhFr+I`ngBB1@+$v0N-7U9S}WYq*K zsp`Yts@I+Yg@{=%F50ZqH)$pIQS9WW%$SKcHAJC@pMgwSj^E|mDvl4f24GZvo$e!_ z0n3*+I@mrE6=+Pk!nchVKduuxo*^Pt_%isAZ_?hu*^nFW)OBrD&v#qS=xvj%i^XL( z+UXUDG;hGBbcomXK&h>2xe|*_v>n9w)1t{u*{-gT>%jN*Kzq@$Mrlid37r!(HC)x~ zvV+p@eInFzK&CczWp$HsGg>B{xL&a}NKA?&UDRNEa!~fi6Aa7lGRaO$KNm2rwE)-L zL0iGCczi>a)m_Q;U8)?0<2Mec2t_zawpj})i&Yx6hK4&Iy+b!qvhS-UTY?1 zh~=NApLVDV63H#w5XQCS1p5LpgYny9Pg@rh^ZosSMXi+a`Mw>;~O#M&~tjDGoBN}1xxrl;=`}uT;5cgZOK%q*e*ySF+NuNemrkJ5J zFKN>mMIPfwKX=X9D8qxMrjW7VV}4Ztf$<(@ss<&C-aXfSAeIbhQ7Sjv%S_lU0F`}P z9}y1@HB(Ti+rx}aYV|Xuy&9(x68-`=`UIj{>~L!vr@yBA3wMJnaT?4SDy^dhDttM* zy*-n$S#+x_l)DhZsYQ>bbaX;%zy;Sl?ai zO>VD`CZbehnhHaD?6wiWjaEGo7-4yWlaX4tFU(KoP5ka+j7KZMs%cn*CRtW$Sqe|% zbl97WvwU|#>}|T%;{{83UfS&4o*ZEqULqRg@runsd)vlFMWL;^HbsomDy4g_$3_|6 zO4Atx36V!@B3PviB>Xls8m6v3VeY0gYB^A1y9u8W?5@4c+kKg7oCbA1Q{xmUFrVcy z*L-MC=yv3%P4B!YRw*eIl*80`DX*#&;x3&d3iuMk^S4`L3~zaqCL21;I6o-cT6&q6 zc7Law6vuOw#On{eoFI8K>h!E3LvwG!j7A@_isO)Bs=9oapb(taQGh4f1{2!Sk8CT8 z+f?+pO4d6KirIed%N*lc+uzpK?i<}xdiP?&CYtpM?S7DTL|`h}VzEBn zuAAz40v^~?#OAxX?%4f4eJKs&+T35m6yl+|Hyf`uGp~53D^miS%35OgA)F?U`B6pp zi%%P-W33cDcV~!~b$o*jWV@;HBIBO0n4-`&`mT!+F>Y=m`d>!-4k;MT5jjiw+-?^+ zWohWfs4zT!OWOP90K)&}B>b1#s@9kG$(=X(?a)0#K_&5mhUp}Usg|72tf^141()K- zp_OcyIRjAdzzcgPj3-8}+a%Blc4_8xO-GfCd;vPL@k+u$X6y^mh^$eu!Y`A1c#Z8# z&J6k&>xS-ZQf?CS*(jS(BGzxzGvUv=wX1}o9Q--%7cpOW19Bad67m_%?=|%Z@n*H& zHg}IN>o%!^-ds=I!|mN$UQOT!b~@HR)#%}9-jJ}vrl9LYd7kIR?Unj`1igG6JHD_v z0Mzaih-2qvDk9$B{4zv2n6!t>_=|ejXeBY%i8WzW5z%8h^^Q8e-llIj)FZRlf&NbR zir3epwdQ>z)TCU`Rl+=O9U*6kyWY$?k!b{KA6@5%zS!-Sy7n@rBe%72W0{`lC?AK18U#589^(s3h?%~O`kxw z2u%1{8d_nQ&@Dq03Kc5SO-b~ zEnANbk+bu1dj)}iK9irEEusH}aAK7F_W|B-kc#gbvPr#^d*T|Vovsz|RXvb1>kE4A z4RAdy3y=p>Mpt=GOX&dQmZ-OOK@xWz;qJYQW&jQS1^C_?BV5o}EOvsj)Ue%5^X&yd zO)W+~VXKA#BiW-Io%n+Ws5~s4}Z*P@VKCMByOx4UdfH z4_(aJ&;!W^_x$>UrK&=z)G;A;TFw7Hk&Dl~irB5k7YpH28U`44znH^IF9mWUH4I@4 zHfs$3Z8XAD&=<8-9RB*n|8uUGZ9NRY8#x3B+#re9W^YNb;STW4I=fkS&A?$@ov+K=F`Jc(A zEAL2M?@^SYSaj_ko#C^Kc784)pP7%*?Gp-WavBn??et2su5zekIyBniGrtlec?1tk zxkPH^<&t;MuQPz1T=9Tif-PD1B@3{GHn^oOlI-u%O>n@rz4eUiCK^R!|6v!uDec8}>+=WmoF!^HZo5iT}ggWOdxeaLIPA~bhIT-^^>eq9DP3+>%oA&A#Y;&EP(OkH;t7}1CjQgR-hsjPoO%3zpSlx6ZAIkE80 zUl{iso3ne#n%8748k)QSMh@J=(QnaFH%=z-{xUin7}t#`-2C`#ewI08sm{6i8r3hM z$yBt1qtnZDi`jyCaez@D^^e#~d9j~9a2%uB?soI|*#)xGTQrsLI5NmD^2Zd~ zj$nWET~hDo7u<;*#aG>d=eQ#uv!QvwuB)2VT@m!O-YlvvUTb0VU{|f~5Bk*X`)8^- z6?M~UoxH0;qHc4dq7EZFm@JlEAO&{Sw z{`F4}3TF_Go^F;j_+=4EjtyBwH*MeDb!iE6{hXKTDJgj}Z?OTuq`raK*mU^Wu)>iM ztE+@T-Rvu$kNJm&CR?22JR+4e0?h;wKbphAHC0=0nEQm~=*vrxH<&0Sp4M;J1+AD6( zYD>*5v3n?Aqv71RZbDj|qicx?qpU@260GhdPN$jCd?&)|{{BlE`ugo(d~^!9sjaQ8 zyTmfm)9bu_$H_MDtx|Z)fbTSn)06XVffVB;`3Z1bU7_ZdmZ_@-dKa0g{?D&H$8}RB zCMDfc2ot~c-b7{I1cf*D`4Cia?Nu34F65`%vR!Z!L#c~yD$bg+W+J&iY3c@AD<7DD z)>EpmV|zR6$W1?fodNPRdNQw@IAk}rWhtLwafGlcFphEZ@*lsC82Ji6{iRw1Hm{L% zisce(lMI#qe;5f+scI9^OLYHuCVSafzkAGDS7$*a7XfdEG~~s#&7TD zE-TI~ZsVmE4GmopAM8H|k-t;hTi}$*k{ss!%X;8gmv-&BM0Zc@U)lGU!24*YJul#v z@%;HZFxwyCzq0c>FD0oh+6(xH;(UC3Xl;{J7w?C0rPeQS<|f$6%E}TC#Bh=Se4Hlt zWAX*tH31n1=S@9^0iFLbf)Wz!=5U$*lqNBJm-};EcFfJ$BMO=p3yU1HfksVTz04&9 zRH14c7U|y)6EKVu8>@Q7-R6S7J0P6v!JY^+L@hnm3;PGl12^W8sa(qCr|d39F#23u zZY%w9+x;+&7-rak%scUaz42X|o3o5-j&oD)u*8ROcQ8xtkFEcD;}h^EcW*ykRL1z# zYy7^J6s0g9^rhZ?mx@{9#vGjRCMW(=Tum{)OMHlh<1^)1=U*j~*FAzY_UzmqiU{vg z&!_^9rutc{zbYi(J%x_eyRo7DvYQ!bpSBO(0aZ8S_5|8K#!YMQoHH`w+IIK~M}G@` z_UL%5Hu<)KuGkKRG`*CK6GQFn(J?V4xNE#*!V6u0&b14+PV$!)U)A6V9Hbj=FD3Lv zag8vmsl{o7UwhXrb>dQH?;xzBL+2)!qI^-7O(X|Lzrr~gGYYcy`vm^5+Ta0#U>yYs z_DtFQEFM@pcEX%G=-3antw~bjWqOLcQFxf9ySuy8$;{Hya+{y^8nQ*fu3BaD@}rf0 zV~@=)73_IR*zm36=P3Q1uOslWu4s-+GOY`AAp8I2Y|FBP6~6vdG+ z;mKyfCScYunko#p6CTQ_30=h59}Wm9hx$6`_D24 OAn Date: Wed, 16 Feb 2022 23:18:55 +0100 Subject: [PATCH 114/186] Issue:#886: Refactor table structure --- content/concepts/did-ddo.md | 86 ++++++++++++++++++++++++++++++++++--- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 7e7fa761..86af871c 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -300,12 +300,86 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. -| Attribute | Type | Required | Description | -| ------------------------------------------ | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **`allowRawAlgorithm`** | `boolean` | **✓** | If `true`, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be `false` by default in all implementations. | -| **`allowNetworkAccess`** | `boolean` | **✓** | If `true`, the algorithm job will have network access. | -| **`publisherTrustedAlgorithmPublishers `** | Array of `string` | **✓** | If empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed. | -| **`publisherTrustedAlgorithms `** | Array of `publisherTrustedAlgorithms` | **✓** | If empty, then any published algorithm is allowed. (see below). | + + + +

KeyType Description Example
+ + + + + + + + + + + + + + +
allowRawAlgorithm + + + + + + + + + + + + + +
TypeRequiredDescription
booleanIf true, any passed raw text will be allowed to run. Useful for an algorithm drag & drop use case, but increases risk of data escape through malicious user input. Should be false by default in all implementations.
+
allowNetworkAccess + + + + + + + + + + + + + +
TypeRequiredDescription
booleanIf true, the algorithm job will have network access.
+
publisherTrustedAlgorithmPublishers + + + + + + + + + + + + + +
TypeRequiredDescription
Array of stringIf empty, then any published algorithm is allowed. Otherwise, only published algorithms by some publishers are allowed.
+
publisherTrustedAlgorithms + + + + + + + + + + + + + +
TypeRequiredDescription
Array of publisherTrustedAlgorithmsIf empty, then any published algorithm is allowed. (see below).
+
+ The `publisherTrustedAlgorithms ` is an array of objects with the following structure: From bffec235c1a28c1316ab0aaeca9c1447c9cea5f1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 16 Feb 2022 23:21:03 +0100 Subject: [PATCH 115/186] Issue:#886: Refactor table structure --- content/concepts/did-ddo.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 86af871c..338e2839 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -300,9 +300,6 @@ This only concerns metadata about a file, but never the file URLs. The only way An asset with a service of `type` `compute` has the following additional attributes under the `compute` object. This object is required if the asset is of `type` `compute`, but can be omitted for `type` of `access`. - - - From da8ed96189bef3d61f55facfeb809da6398c10d3 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 12:46:23 +0100 Subject: [PATCH 116/186] Issue-#887: Move DIDs & DDOs page --- data/sidebars/concepts.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 15839c67..8f1098b2 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -6,8 +6,6 @@ link: /concepts/quickstart/ - title: Architecture Overview link: /concepts/architecture/ - - title: DIDs & DDOs - link: /concepts/did-ddo/ - title: Supported Networks link: /concepts/networks/ @@ -16,6 +14,11 @@ - title: Overview link: /concepts/compute-to-data/ +- group: Specifying Assets + items: + - title: DIDs & DDOs + link: /concepts/did-ddo/ + - group: Contribute items: - title: Projects using Ocean From 1bcdc6eb04fba95432163339b62bf142e0de84f4 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 13:55:06 +0100 Subject: [PATCH 117/186] Merge branch 'v4' of github.com:oceanprotocol/docs into issue-701-create-v4-docs --- content/concepts/datanft-and-datatoken.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index e7827d72..e6a77b8d 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -52,7 +52,7 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover ## High-Level Behavior -![Image 2](images/use-case.png) +![Flow](images/use-case.png) Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. From d4a8039a364122a1dd499054d2f62e8f64b7c347 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 21 Feb 2022 19:21:12 +0100 Subject: [PATCH 118/186] Issue-#898: Fix invalid json ddo example --- content/concepts/did-ddo.md | 233 +++++++++++++++++------------------- 1 file changed, 113 insertions(+), 120 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 338e2839..435b4a53 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -753,130 +753,123 @@ Example: ```json { - "@context": ["https://w3id.org/did/v1"], - "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", - "version": "4.0.0", - "chainId": 1, - "nftAddress": "0x123", - "metadata": { - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" - }, - "services": [ - { - "id": "1", - "type": "access", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Download service", - "description": "Download service", - "datatokenAddress": "0x123", - "serviceEndpoint": "https://myprovider.com", - "timeout": 0, - "consumerParameters": [ - { - "name":"surname", - "type": "text", - "label": "Name", - "required": true, - "default": "NoName" - "description":"Please fill your name" - }, - { - "name":"age", - "type": "number", - "label": "Age", - "required": false, - "default": 0 - "description":"Please fill your age" - }] - }, - { - "id": "2", - "type": "compute", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Compute service", - "description": "Compute service", - "datatokenAddress": "0x124", - "serviceEndpoint": "https://myprovider.com", - "timeout": 3600, - "compute": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [ - { - "did": "did:op:123", - "filesChecksum": "100", - "containerSectionChecksum": "200" - }, - { - "did": "did:op:124", - "filesChecksum": "110", - "containerSectionChecksum": "210" - } - ] - } - } - ], - "credentials": { - "allow": [ - { - "type": "address", - "values": ["0x123", "0x456"] - } - ], - "deny": [ - { - "type": "address", - "values": ["0x2222", "0x333"] - } - ] - }, + "@context": ["https://w3id.org/did/v1"], + "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", + "version": "4.0.0", + "chainId": 1, + "nftAddress": "0x123", + "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + }, + "services": [{ + "id": "1", + "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "serviceEndpoint": "https://myprovider.com", + "timeout": 0, + "consumerParameters": [{ + "name": "surname", + "type": "text", + "label": "Name", + "required": true, + "default": "NoName", + "description": "Please fill your name" + }, + { + "name": "age", + "type": "number", + "label": "Age", + "required": false, + "default": 0, + "description": "Please fill your age" + } + ] + }, + { + "id": "2", + "type": "compute", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "serviceEndpoint": "https://myprovider.com", + "timeout": 3600, + "compute": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [{ + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] + } + } + ], + "credentials": { + "allow": [{ + "type": "address", + "values": ["0x123", "0x456"] + }], + "deny": [{ + "type": "address", + "values": ["0x2222", "0x333"] + }] + }, - "nft": { - "address": "0x123", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", - "owner": "0x0000000", - "state": 0, - "created": "2000-10-31T01:30:00", - "tokenURI": "xxx" - }, + "nft": { + "address": "0x123", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000", + "state": 0, + "created": "2000-10-31T01:30:00", + "tokenURI": "xxx" + }, - "datatokens": [ - { - "address": "0x000000", - "name": "Datatoken 1", - "symbol": "DT-1", - "serviceId": "1" - }, - { - "address": "0x000001", - "name": "Datatoken 2", - "symbol": "DT-2", - "serviceId": "2" - } - ], + "datatokens": [{ + "address": "0x000000", + "name": "Datatoken 1", + "symbol": "DT-1", + "serviceId": "1" + }, + { + "address": "0x000001", + "name": "Datatoken 2", + "symbol": "DT-2", + "serviceId": "2" + } + ], - "event": { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "datetime": "2000-10-31T01:30:00" - }, + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" + }, - "purgatory": { - "state": false - }, + "purgatory": { + "state": false + }, - "stats": { - "orders": 4 - } + "stats": { + "orders": 4 + } } ``` From badeecf22bd92d27e91fd1129fe7bbf2ab886f97 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:16:21 +0100 Subject: [PATCH 119/186] ISsue-#850: Aquarius rest api --- config.js | 4 +- .../tutorials/compute-to-data-algorithms.md | 2 +- gatsby-config.js | 2 +- gatsby-node.js | 39 +++++++++++++++ src/components/HeaderHome.module.scss | 2 +- src/styles/_variables.scss | 2 +- src/styles/box.module.scss | 38 +++++++-------- src/templates/RestApi.jsx | 48 +++++++++++++++++++ 8 files changed, 112 insertions(+), 25 deletions(-) create mode 100644 src/templates/RestApi.jsx diff --git a/config.js b/config.js index 2e006ba7..cdef81d9 100644 --- a/config.js +++ b/config.js @@ -92,11 +92,11 @@ module.exports = { swaggerComponents: [ { name: 'aquarius', - url: 'https://aquarius.oceanprotocol.com/spec' + url: 'https://v4.aquarius.oceanprotocol.com/spec' }, { name: 'provider', - url: 'https://provider.mainnet.oceanprotocol.com/spec' + url: 'https://v4.provider.mainnet.oceanprotocol.com' } ] } diff --git a/content/tutorials/compute-to-data-algorithms.md b/content/tutorials/compute-to-data-algorithms.md index 34197cf8..4d35907a 100644 --- a/content/tutorials/compute-to-data-algorithms.md +++ b/content/tutorials/compute-to-data-algorithms.md @@ -42,7 +42,7 @@ To do so, create a Dockerfile with the appropriate instructions for dependency m We also collect some [example images](https://github.com/oceanprotocol/algo_dockers) which you can also view in Dockerhub. -When publishing an algorithm through the [Ocean Market](https://market.oceanprotoco.com), these properties can be set via the publish UI. +When publishing an algorithm through the [Ocean Market](https://market.oceanprotocol.com), these properties can be set via the publish UI. ### Environment Examples diff --git a/gatsby-config.js b/gatsby-config.js index 31879ac8..11a75ea3 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -156,7 +156,7 @@ module.exports = { name: 'repo-read-the-docs', remote: `https://github.com/oceanprotocol/readthedocs.git`, local: 'markdowns/', - branch: 'main', + branch: 'v4', patterns: [ 'markdowns/ocean-py', 'markdowns/aquarius', diff --git a/gatsby-node.js b/gatsby-node.js index 198794b1..ff680730 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -165,6 +165,27 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') + // const aquariusRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'aquarius' + // )[0].node + + // await createRestApiPage( + // createPage, + // aquariusRestApi, + // `/references/aquarius` + // ) + + // const providerRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'provider' + // )[0].node + // await createRestApiPage( + // createPage, + // providerRestApi, + // `/references/provider` + // ) + await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) await createReadTheDocsPage(createPage, 'ocean-subgraph', subgraphList) @@ -292,3 +313,21 @@ const createReadTheDocsPage = async (createPage, name, list) => { const filterMarkdownList = (markdownList, string) => { return markdownList.filter(({ node }) => node.frontmatter.app === string) } + +// const createRestApiPage = async (createPage, node, slug) => { +// const template = path.resolve('./src/templates/RestApi.jsx') +// createPage({ +// path: slug, +// component: template, +// context: { +// node, +// slug +// } +// }) +// } + +// const getRestApiPageFromMarkdownList = (markdownList, string) => { +// return markdownList.filter(({ node }) => { +// return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' +// }) +// } diff --git a/src/components/HeaderHome.module.scss b/src/components/HeaderHome.module.scss index 44168b33..7fcfadfe 100644 --- a/src/components/HeaderHome.module.scss +++ b/src/components/HeaderHome.module.scss @@ -48,5 +48,5 @@ } .searchButtonContainer { - margin-top: $spacer * 0.5 ; + margin-top: $spacer * 0.5; } diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index 385a08d5..640590f8 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -68,4 +68,4 @@ $narrowWidth: 35rem; $box-shadow-color: rgba(0, 0, 0, 0.2); $border-color: #e2e2e2; -$background-content: #fff; \ No newline at end of file +$background-content: #fff; diff --git a/src/styles/box.module.scss b/src/styles/box.module.scss index 5a53046a..22ba49fb 100644 --- a/src/styles/box.module.scss +++ b/src/styles/box.module.scss @@ -1,23 +1,23 @@ @import 'variables'; .box { - display: block; - background: $background-content; - border-radius: $border-radius; - border: 1px solid $border-color; - box-shadow: 0 6px 17px 0 $box-shadow-color; - padding: $spacer * 0.5; - } - - @media (min-width: 40rem) { - .box { - padding: var($spacer); - } - } - - a.box:hover, - a.box:focus { - outline: 0; - transform: translate3d(0, -0.1rem, 0); - box-shadow: 0 10px 25px 0 $box-shadow-color; + display: block; + background: $background-content; + border-radius: $border-radius; + border: 1px solid $border-color; + box-shadow: 0 6px 17px 0 $box-shadow-color; + padding: $spacer * 0.5; +} + +@media (min-width: 40rem) { + .box { + padding: var($spacer); } +} + +a.box:hover, +a.box:focus { + outline: 0; + transform: translate3d(0, -0.1rem, 0); + box-shadow: 0 10px 25px 0 $box-shadow-color; +} diff --git a/src/templates/RestApi.jsx b/src/templates/RestApi.jsx new file mode 100644 index 00000000..6caaed56 --- /dev/null +++ b/src/templates/RestApi.jsx @@ -0,0 +1,48 @@ +import React from 'react' +import { Helmet } from 'react-helmet' +import Layout from '../components/Layout' +import Content from '../components/Content' +import HeaderSection from '../components/HeaderSection' +import Sidebar from '../components/Sidebar' +import stylesDoc from '../templates/Doc.module.scss' +import Seo from '../components/Seo' +import DocContent from '../components/DocContent' +import PropTypes from 'prop-types' + +export default function RestApiDoc({ location, pageContext }) { + const { node, slug } = pageContext + return ( + <> + + + + + + + + + +
+ +
+ +
+
+
+
+ + ) +} + +RestApiDoc.propTypes = { + location: PropTypes.object.isRequired, + pageContext: PropTypes.object.isRequired +} From 26f7f29b37b480f020f3099e0f287d9c8b60b4d7 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:31:49 +0100 Subject: [PATCH 120/186] Generate rest-api docs from API.md --- config.js | 2 +- data/sidebars/references.yml | 4 +-- gatsby-node.js | 68 ++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/config.js b/config.js index cdef81d9..acf20322 100644 --- a/config.js +++ b/config.js @@ -96,7 +96,7 @@ module.exports = { }, { name: 'provider', - url: 'https://v4.provider.mainnet.oceanprotocol.com' + url: 'https://provider.mainnet.oceanprotocol.com/spec' } ] } diff --git a/data/sidebars/references.yml b/data/sidebars/references.yml index f9bbbd18..2bf0b143 100644 --- a/data/sidebars/references.yml +++ b/data/sidebars/references.yml @@ -11,12 +11,12 @@ - group: Aquarius REST API items: - title: API Reference - link: /references/aquarius/ + link: /references/aquarius-rest-api/ - group: provider REST API items: - title: API Reference - link: /references/provider/ + link: /references/provider-rest-api/ - group: Provider Py Module items: diff --git a/gatsby-node.js b/gatsby-node.js index ff680730..d1865367 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -165,26 +165,26 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - // const aquariusRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'aquarius' - // )[0].node + const aquariusRestApi = getRestApiPageFromMarkdownList( + markdowns, + 'aquarius' + )[0].node - // await createRestApiPage( - // createPage, - // aquariusRestApi, - // `/references/aquarius` - // ) + await createRestApiPage( + createPage, + aquariusRestApi, + `/references/aquarius-rest-api` + ) - // const providerRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'provider' - // )[0].node - // await createRestApiPage( - // createPage, - // providerRestApi, - // `/references/provider` - // ) + const providerRestApi = getRestApiPageFromMarkdownList( + markdowns, + 'provider' + )[0].node + await createRestApiPage( + createPage, + providerRestApi, + `/references/provider-rest-api` + ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) @@ -314,20 +314,20 @@ const filterMarkdownList = (markdownList, string) => { return markdownList.filter(({ node }) => node.frontmatter.app === string) } -// const createRestApiPage = async (createPage, node, slug) => { -// const template = path.resolve('./src/templates/RestApi.jsx') -// createPage({ -// path: slug, -// component: template, -// context: { -// node, -// slug -// } -// }) -// } +const createRestApiPage = async (createPage, node, slug) => { + const template = path.resolve('./src/templates/RestApi.jsx') + createPage({ + path: slug, + component: template, + context: { + node, + slug + } + }) +} -// const getRestApiPageFromMarkdownList = (markdownList, string) => { -// return markdownList.filter(({ node }) => { -// return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' -// }) -// } +const getRestApiPageFromMarkdownList = (markdownList, string) => { + return markdownList.filter(({ node }) => { + return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' + }) +} From cee06030d87bfeaa3e029b6665e64f6a9ebd87ae Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 17:55:56 +0100 Subject: [PATCH 121/186] Issue-#850: Aquarius rest api --- gatsby-node.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index d1865367..ac9cfeaf 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -180,6 +180,7 @@ exports.createPages = ({ graphql, actions }) => { markdowns, 'provider' )[0].node + await createRestApiPage( createPage, providerRestApi, @@ -327,7 +328,8 @@ const createRestApiPage = async (createPage, node, slug) => { } const getRestApiPageFromMarkdownList = (markdownList, string) => { - return markdownList.filter(({ node }) => { - return node.frontmatter.app === string && node.frontmatter.slug === 'API.md' - }) + return markdownList.filter( + ({ node }) => + node.frontmatter.app === string && node.frontmatter.slug === 'API.md' + ) } From b4663c125a8c9d0a0ca3790b9f5f7869d6e7534a Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 18:32:18 +0100 Subject: [PATCH 122/186] Issue-#850: Rest api --- gatsby-node.js | 65 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index ac9cfeaf..71fc21dd 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -103,6 +103,34 @@ exports.createPages = ({ graphql, actions }) => { } } } + + aquariusRestApi: allMarkdownRemark( + filter: { + frontmatter: { + title: { eq: "API.md" } + app: { eq: "aquarius" } + } + } + ) { + edges { + node { + id + html + htmlAst + tableOfContents + frontmatter { + title + description + slug + section + app + module + source + version + } + } + } + } } ` ).then(async (result) => { @@ -165,27 +193,24 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - const aquariusRestApi = getRestApiPageFromMarkdownList( - markdowns, - 'aquarius' - )[0].node - + console.log('Aquarius rest api', result.data.aquariusRestApi) + const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, aquariusRestApi, `/references/aquarius-rest-api` ) - const providerRestApi = getRestApiPageFromMarkdownList( - markdowns, - 'provider' - )[0].node + // const providerRestApi = getRestApiPageFromMarkdownList( + // markdowns, + // 'provider' + // )[0].node - await createRestApiPage( - createPage, - providerRestApi, - `/references/provider-rest-api` - ) + // await createRestApiPage( + // createPage, + // providerRestApi, + // `/references/provider-rest-api` + // ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) @@ -327,9 +352,9 @@ const createRestApiPage = async (createPage, node, slug) => { }) } -const getRestApiPageFromMarkdownList = (markdownList, string) => { - return markdownList.filter( - ({ node }) => - node.frontmatter.app === string && node.frontmatter.slug === 'API.md' - ) -} +// const getRestApiPageFromMarkdownList = (markdownList, string) => { +// return markdownList.filter( +// ({ node }) => +// node.frontmatter.app === string && node.frontmatter.slug === 'API.md' +// ) +// } From 028cfe52d69ce0e884854cc458b99ba0f2bb60dd Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:01:50 +0100 Subject: [PATCH 123/186] ISsue-#850: Rest api doc --- gatsby-node.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 71fc21dd..f755bca6 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -193,7 +193,7 @@ exports.createPages = ({ graphql, actions }) => { const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - console.log('Aquarius rest api', result.data.aquariusRestApi) + console.log('Aquarius rest api', markdowns) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, From 5f60b51529fc72f9de6d8851eab0c74a9a661dea Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:16:14 +0100 Subject: [PATCH 124/186] Issue-#850: Rest api doc --- gatsby-node.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index f755bca6..268ddbeb 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -192,8 +192,13 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - - console.log('Aquarius rest api', markdowns) + const aquariusList = filterMarkdownList(markdowns, 'aquarius') + const r = aquariusList.map(({ node }) => [ + node.frontmatter.title, + node.frontmatter.app, + node.frontmatter.source + ]) + console.log('Aquarius rest api', r) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, From fb13cef33d093ed233df60219edffc06cdb94a3e Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:27:02 +0100 Subject: [PATCH 125/186] Issue-#850: Rest api doc --- gatsby-node.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 268ddbeb..201dc67c 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -196,7 +196,8 @@ exports.createPages = ({ graphql, actions }) => { const r = aquariusList.map(({ node }) => [ node.frontmatter.title, node.frontmatter.app, - node.frontmatter.source + node.frontmatter.source, + node.frontmatter.version ]) console.log('Aquarius rest api', r) const aquariusRestApi = result.data.aquariusRestApi.edges[0].node From e787ff55ed93b00c42cd353aa37b43b13a761717 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Feb 2022 22:37:39 +0100 Subject: [PATCH 126/186] ISsue-#850: Rest api --- gatsby-node.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 201dc67c..55de9ed1 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -192,8 +192,8 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - const aquariusList = filterMarkdownList(markdowns, 'aquarius') - const r = aquariusList.map(({ node }) => [ + // const aquariusList = filterMarkdownList(markdowns, 'aquarius') + const r = markdowns.map(({ node }) => [ node.frontmatter.title, node.frontmatter.app, node.frontmatter.source, From 14d3d98934402b0b366748c78c415585d0d16842 Mon Sep 17 00:00:00 2001 From: Trent McConaghy <5305452+trentmc@users.noreply.github.com> Date: Thu, 24 Feb 2022 10:27:33 +0100 Subject: [PATCH 127/186] 2021 -> 2022 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5e6e69a9..736ce999 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ The latest deployment of the `main` branch is automatically aliased to `docs.oce ## License ```text -Copyright ((C)) 2021 Ocean Protocol Foundation Ltd. +Copyright ((C)) 2022 Ocean Protocol Foundation Ltd. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 7df4bad1748c14dba9cb66e2534c1d188838f667 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:04:19 +0100 Subject: [PATCH 128/186] Issue-#850: Aquarius rest api --- .gitignore | 3 ++- gatsby-config.js | 4 ++-- gatsby-node.js | 6 +++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 9e696fd5..47066e69 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ yarn-error.log .env.* markdowns/ .vscode/ -size-plugin.json \ No newline at end of file +size-plugin.json +read-the-docs/ \ No newline at end of file diff --git a/gatsby-config.js b/gatsby-config.js index 11a75ea3..25983575 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -155,7 +155,7 @@ module.exports = { options: { name: 'repo-read-the-docs', remote: `https://github.com/oceanprotocol/readthedocs.git`, - local: 'markdowns/', + local: 'read-the-docs', branch: 'v4', patterns: [ 'markdowns/ocean-py', @@ -167,7 +167,7 @@ module.exports = { { resolve: 'gatsby-source-filesystem', options: { - path: `${__dirname}/markdowns/markdowns`, + path: `${__dirname}/read-the-docs/markdowns`, name: 'markdowns' } }, diff --git a/gatsby-node.js b/gatsby-node.js index 55de9ed1..953eeafa 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -59,7 +59,11 @@ exports.createPages = ({ graphql, actions }) => { } allRepoMarkdown: allMarkdownRemark( - filter: { fileAbsolutePath: { regex: "/markdowns/markdowns/" } } + filter: { + fileAbsolutePath: { + regex: ".cache/gatsby-source-git/read-the-docs/markdowns/" + } + } ) { edges { node { From 1fbb75b1ada000a88ec54b12ef17b98e7f316f1b Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:05:50 +0100 Subject: [PATCH 129/186] Issue-#850: Update lint rule --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 45ac2709..33f2649a 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "ssr": "npm run build && serve -s public/", "format": "prettier --ignore-path .gitignore './**/*.{css,scss,yml,js,jsx,ts,tsx,json}' --write", "lint:js": "eslint --ignore-path .gitignore --ignore-path .prettierignore --ext .js,.jsx .", - "lint:md": "markdownlint './**/*.{md,markdown}' --ignore './{node_modules,external,public,.cache,markdowns}/**/*'", + "lint:md": "markdownlint './**/*.{md,markdown}' --ignore './{node_modules,external,public,.cache,markdowns,read-the-docs}/**/*'", "lint:yml": "prettier '**/*.{yml,yaml}' --list-different", "lint": "run-p --continue-on-error lint:js lint:md lint:yml", "test": "npm run lint" @@ -88,4 +88,4 @@ "not ie <= 11", "not op_mini all" ] -} +} \ No newline at end of file From 220ea7df29bfe525e9abbb46b6d9fd290f378643 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 20:15:01 +0100 Subject: [PATCH 130/186] Issue-#850: Aquarius rest api --- gatsby-config.js | 6 +++--- gatsby-node.js | 4 +--- package.json | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/gatsby-config.js b/gatsby-config.js index 25983575..119a51f3 100755 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -158,9 +158,9 @@ module.exports = { local: 'read-the-docs', branch: 'v4', patterns: [ - 'markdowns/ocean-py', - 'markdowns/aquarius', - 'markdowns/provider' + 'read-the-docs/ocean-py', + 'read-the-docs/aquarius', + 'read-the-docs/provider' ] } }, diff --git a/gatsby-node.js b/gatsby-node.js index 953eeafa..27110f7f 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -60,9 +60,7 @@ exports.createPages = ({ graphql, actions }) => { allRepoMarkdown: allMarkdownRemark( filter: { - fileAbsolutePath: { - regex: ".cache/gatsby-source-git/read-the-docs/markdowns/" - } + fileAbsolutePath: { regex: "/read-the-docs/markdowns/" } } ) { edges { diff --git a/package.json b/package.json index 33f2649a..657759b7 100644 --- a/package.json +++ b/package.json @@ -88,4 +88,4 @@ "not ie <= 11", "not op_mini all" ] -} \ No newline at end of file +} From 9b4de97167ed5c4add900cbeb951192ecef888b1 Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 23:10:38 +0100 Subject: [PATCH 131/186] Issue-#850: Rest api --- data/sidebars/references.yml | 4 +-- gatsby-node.js | 54 ++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/data/sidebars/references.yml b/data/sidebars/references.yml index 2bf0b143..f9bbbd18 100644 --- a/data/sidebars/references.yml +++ b/data/sidebars/references.yml @@ -11,12 +11,12 @@ - group: Aquarius REST API items: - title: API Reference - link: /references/aquarius-rest-api/ + link: /references/aquarius/ - group: provider REST API items: - title: API Reference - link: /references/provider-rest-api/ + link: /references/provider/ - group: Provider Py Module items: diff --git a/gatsby-node.js b/gatsby-node.js index 27110f7f..593d9ec3 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -133,6 +133,34 @@ exports.createPages = ({ graphql, actions }) => { } } } + + providerRestApi: allMarkdownRemark( + filter: { + frontmatter: { + title: { eq: "API.md" } + app: { eq: "aquarius" } + } + } + ) { + edges { + node { + id + html + htmlAst + tableOfContents + frontmatter { + title + description + slug + section + app + module + source + version + } + } + } + } } ` ).then(async (result) => { @@ -194,31 +222,21 @@ exports.createPages = ({ graphql, actions }) => { const oceanPyList = filterMarkdownList(markdowns, 'ocean.py') const providerList = filterMarkdownList(markdowns, 'provider') const subgraphList = filterMarkdownList(markdowns, 'ocean-subgraph') - // const aquariusList = filterMarkdownList(markdowns, 'aquarius') - const r = markdowns.map(({ node }) => [ - node.frontmatter.title, - node.frontmatter.app, - node.frontmatter.source, - node.frontmatter.version - ]) - console.log('Aquarius rest api', r) + const aquariusRestApi = result.data.aquariusRestApi.edges[0].node await createRestApiPage( createPage, aquariusRestApi, - `/references/aquarius-rest-api` + `/references/aquarius` ) - // const providerRestApi = getRestApiPageFromMarkdownList( - // markdowns, - // 'provider' - // )[0].node + const providerRestApi = result.data.providerRestApi.edges[0].node - // await createRestApiPage( - // createPage, - // providerRestApi, - // `/references/provider-rest-api` - // ) + await createRestApiPage( + createPage, + providerRestApi, + `/references/provider` + ) await createReadTheDocsPage(createPage, 'ocean-py', oceanPyList) await createReadTheDocsPage(createPage, 'provider', providerList) From 638a3021519e375877e12a650de9c9247b86257f Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 24 Feb 2022 23:20:19 +0100 Subject: [PATCH 132/186] Issue-#850: Rest api --- gatsby-node.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gatsby-node.js b/gatsby-node.js index 593d9ec3..3c455867 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -138,7 +138,7 @@ exports.createPages = ({ graphql, actions }) => { filter: { frontmatter: { title: { eq: "API.md" } - app: { eq: "aquarius" } + app: { eq: "provider" } } } ) { From af53e4416b9f468cb0eed4bd01a2affec86e48d9 Mon Sep 17 00:00:00 2001 From: mihaisc Date: Thu, 3 Mar 2022 10:29:33 +0200 Subject: [PATCH 133/186] add additionalInformation to service --- content/concepts/did-ddo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 338e2839..9300f7a7 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -187,7 +187,7 @@ An asset should have at least one service to be actually accessible, and can hav | **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | | **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset| - +| **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | #### Files The `files` field is returned as a `string` which holds the encrypted file URLs. From 786bfbb5514d921523bbc3b029b41342f4a067d6 Mon Sep 17 00:00:00 2001 From: mihaisc Date: Thu, 3 Mar 2022 10:34:18 +0200 Subject: [PATCH 134/186] small fix --- content/concepts/did-ddo.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 9300f7a7..df452cf3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -188,6 +188,8 @@ An asset should have at least one service to be actually accessible, and can hav | **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | | **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset| | **`additionalInformation`** | Object | | Stores additional information, this is customizable by publisher | + + #### Files The `files` field is returned as a `string` which holds the encrypted file URLs. From 08c989b53250d435d08512372b8715cc2be6fd5c Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 3 Mar 2022 12:06:10 +0100 Subject: [PATCH 135/186] Issue-#859: Add toggle button for v3-v4 --- src/components/Header.jsx | 4 ++ src/components/HeaderHome.jsx | 8 ++- src/components/HeaderHome.module.scss | 5 +- src/components/ToggleSwitch.jsx | 23 +++++++++ src/components/ToggleSwitch.module.scss | 69 +++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 src/components/ToggleSwitch.jsx create mode 100644 src/components/ToggleSwitch.module.scss diff --git a/src/components/Header.jsx b/src/components/Header.jsx index 16d0bf66..0bf03a13 100755 --- a/src/components/Header.jsx +++ b/src/components/Header.jsx @@ -3,6 +3,7 @@ import { Link, StaticQuery, graphql } from 'gatsby' import { ReactComponent as Logo } from '@oceanprotocol/art/logo/logo.svg' import styles from './Header.module.scss' import SearchButton from './Search/SearchButton' +import ToggleSwitch from './ToggleSwitch' const query = graphql` query { @@ -51,6 +52,9 @@ const Header = () => (
+
+ +
diff --git a/src/components/HeaderHome.jsx b/src/components/HeaderHome.jsx index 8f186867..99e24634 100644 --- a/src/components/HeaderHome.jsx +++ b/src/components/HeaderHome.jsx @@ -4,6 +4,7 @@ import { ReactComponent as Logo } from '@oceanprotocol/art/logo/logo.svg' import Content from '../components/Content' import styles from './HeaderHome.module.scss' import SearchButton from '../components/Search/SearchButton' +import ToggleSwitch from './ToggleSwitch' const HeaderHome = () => ( (

{siteTitle}

{siteDescription} -

+
+
+
+ +
+

diff --git a/src/components/HeaderHome.module.scss b/src/components/HeaderHome.module.scss index 44168b33..5a4ab8d6 100644 --- a/src/components/HeaderHome.module.scss +++ b/src/components/HeaderHome.module.scss @@ -47,6 +47,7 @@ } } -.searchButtonContainer { - margin-top: $spacer * 0.5 ; +.container { + margin-top: $spacer * 0.5; + align-items: 'center'; } diff --git a/src/components/ToggleSwitch.jsx b/src/components/ToggleSwitch.jsx new file mode 100644 index 00000000..6ebda7d2 --- /dev/null +++ b/src/components/ToggleSwitch.jsx @@ -0,0 +1,23 @@ +import React from 'react' +import styles from './ToggleSwitch.module.scss' + +const ToggleSwitch = () => { + return ( +
+ { + if (window) { + window.open('https://v3.docs.oceanprotocol.com/', '_self') + } + }} + /> + +
+ ) +} + +export default ToggleSwitch diff --git a/src/components/ToggleSwitch.module.scss b/src/components/ToggleSwitch.module.scss new file mode 100644 index 00000000..bb762e9f --- /dev/null +++ b/src/components/ToggleSwitch.module.scss @@ -0,0 +1,69 @@ +@import 'variables'; + +.switchButton { + background: rgba(255, 255, 255, 0.56); + border-radius: 0.5rem; + overflow: hidden; + width: $spacer * 4; + text-align: center; + font-size: $font-size-base; + letter-spacing: 1px; + color: $brand-purple; + position: relative; + padding-right: $spacer * 2; + + &:before { + content: 'v3'; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: $spacer * 2; + display: flex; + align-items: center; + justify-content: center; + z-index: 3; + pointer-events: none; + } + + &Checkbox { + cursor: pointer; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 100%; + height: 100%; + opacity: 0; + + &:checked + .switchButtonLabel:before { + transform: translateX($spacer * 2); + transition: transform 300ms linear; + } + + & + .switchButtonLabel { + position: relative; + padding: 0 0; + display: block; + user-select: none; + pointer-events: none; + + &:before { + content: ''; + background: $brand-grey-lighter; + height: 100%; + width: 100%; + position: absolute; + left: 0; + top: 0; + border-radius: 0.5rem; + transform: translateX(0); + transition: transform 300ms; + } + + .switchButtonLabelSpan { + position: relative; + } + } + } +} From d9db7ba62abe2cf681bfab65a82a371015ae892e Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 12:51:44 +0100 Subject: [PATCH 136/186] Issue-#908: Fix spelling and grammatical issues in architecture.md file --- content/concepts/architecture.md | 33 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 8d483294..b0fd1353 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -11,34 +11,31 @@ Here is the Ocean architecture. Here’s an overview of the figure. -- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, alogrithm, compute-to-data into crypto (publish and mint data NFTs and datatokens), hold datatokens as assets (data wallets), discover assets and buy / sell datatokens for fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). -- Below that are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: +- The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, algorithms, compute-to-data into crypto (publish and mint data NFTs and datatokens), hold datatokens as assets (data wallets), discover assets, and buy/sell datatokens for a fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). +- Below are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: - **Aquarius**: Provides metadata cache for faster search by caching on-chain data into elasticsearch - - **Provider**: Facilitates downloading assets, DDO encryption and communicating with `operater-service` for Compute-to-Data jobs. - - **TheGraph**: 3rd party tool -Developers can utilize the libraries to built thier custom applications and marketplaces. -- The lowest level has the **smart contracts** used by the libraries. They’re deployed on Ethereum mainnet, and other compatible networks. To see the list of supported networks click [here](/concepts/networks/). - -The rest of this page elaborates. + - **Provider**: Facilitates downloading assets, DDO encryption, and communicating with `operator-service` for Compute-to-Data jobs. + - **The Graph**: It is a 3rd party tool that developers can utilize the libraries to build their custom applications and marketplaces. +- The lowest level has the **smart contracts**. The smart contracts are deployed on the Ethereum mainnet and other compatible networks. Libraries encapsulate the calls to these smart contracts and provide features like publishing new assets, facilitating consumption, managing pricing, and much more. To see the supported networks click [here](/concepts/networks/). ## Data NFTs, Datatokens and Access Control Tools -Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one data NFT contract. +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new dataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one data NFT contract. Click [here](/concepts/datanft-and-datatoken/) to further read about data NFTs and datatokens. -ERC721 data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. +ERC721 dataNFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. -Datatoken represents the asset which the publisher want to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. +Datatoken represents the asset that the publisher wants to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. In the **publish** step, the publisher invokes **Ocean Datatoken Factory** to deploy a new datatoken to the chain. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC20 datatoken template**. The publisher then mints datatokens. -The publisher runs their own **Ocean Provider** or can use one deployed by Ocean Protocol. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database; however this adds another dependency. To avoid this, Provider encrypts the URL and it URL on-chain. +The publisher runs their own **Ocean Provider** or can use one deployed by Ocean Protocol. In the **consume** step, Provider software needs to retrieve the data service URL given a datatoken address. One approach would be for the publisher to run a database. However, this adds another dependency. To avoid this, the Provider encrypts the URL and it URL on-chain. To initiate the **consume** step, the data consumer sends 1.0 datatokens to the Provider wallet. Then they make a service request to the Provider. The Provider loads the encrypted URL, decrypts it, and provisions the requested service (send static data, or enable a compute-to-data job). -Instead of running a Provider themselves, the publisher can have a 3rd party like Ocean Market run it. While more convenient, it means that the 3rd party has custody of the private encryption/decryption key (more centralized). Ocean will support more service types and url custody options in the future. +Instead of running a Provider themselves, the publisher can have a 3rd party like Ocean Market to run it. While more convenient, it means that the 3rd party has custody of the private encryption/decryption key (more centralized). Ocean will support more service types and URL custody options in the future. -**Ocean JavaScript and Python libraries** act as drivers for the lower-level contracts. Each library integrates with Ocean Provider to provision & consume data services, and Ocean Aquarius for metadata. **Ocean React hooks** use the JavaScript library, to help build web apps & React Native apps with Ocean. +**Ocean JavaScript and Python libraries** act as drivers for the lower-level contracts. Each library integrates with Ocean Provider to provision & consume data services, and Ocean Aquarius for metadata. @@ -52,7 +49,7 @@ The marketplaces are decentralized (no single owner or controller), and non-cust Ocean Market supports fixed pricing and automatic price discovery. -- For **fixed pricing**, there’s a simple contract for users to buy/sell datatokens for OCEAN, while avoiding custodianship during value transfer. +- For **fixed pricing**, there’s a simple contract for users to buy/sell datatokens for OCEAN while avoiding custodianship during value transfer. - For **automatic price discovery**, Ocean Market uses automated market makers (AMMs) powered by [Balancer](https://www.balancer.finance). Each pool is a datatoken-OCEAN pair. In the Ocean Market GUI, the user adds liquidity then invokes pool creation; the GUI’s React code calls the Ocean JavaScript library, which calls the **Pool Factory** to deploy a **Pool** contract. (The Python library also does this.) Deploying a datatoken pool can be viewed as an “Initial Data Offering” (IDO). Complementary to Ocean Market, Ocean has reference code to ease building **third-party data marketplaces**, such as for logistics ([dexFreight data marketplace](https://blog.oceanprotocol.com/dexfreight-ocean-protocol-partner-to-enable-transportation-logistics-companies-to-monetize-data-7aa839195ac)) or mobility ([Daimler](https://blog.oceanprotocol.com/ocean-protocol-delivers-proof-of-concept-for-daimler-ag-in-collaboration-with-daimler-south-east-564aa7d959ca)). @@ -63,14 +60,14 @@ Complementary to Ocean Market, Ocean has reference code to ease building **third ## Metadata Tools -Metadata (name of dataset, date created etc.) is used by marketplaces for data asset discovery. Each data asset can have a [decentralized identifier](https://w3c-ccg.github.io/did-spec/) (DID) that resolves to a DID document (DDO) for associated metadata. The DDO is essentially [JSON](https://www.json.org/) filling in metadata fields. For more details on working with OCEAN DIDs check out the [DID concept documentation](https://docs.oceanprotocol.com/concepts/did-ddo/). +Marketplaces use the Metadata of the asset for discovery. Metadata consists of information like the type of asset, name of the asset, creation date, license, etc. Each data asset can have a [decentralized identifier](https://w3c-ccg.github.io/did-spec/) (DID) that resolves to a DID document (DDO) for associated metadata. The DDO is essentially [JSON](https://www.json.org/) filling in metadata fields. For more details on working with OCEAN DIDs check out the [DID concept documentation](https://docs.oceanprotocol.com/concepts/did-ddo/). The [DDO Metadata documentation](https://docs.oceanprotocol.com/concepts/ddo-metadata/) goes into more depth regarding metadata structure. [OEP8](/concepts/did-ddo/) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). -Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the write fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. +Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the transaction fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. -Due to the permissionless, decentralized nature of data on Ethereum mainnet, any last-mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [TheGraph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. +Due to the permissionless, decentralized nature of data on the Ethereum mainnet, any last-mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [The Graph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. From 74ede5e64b814c69a2d92c770d3e365d20612025 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 12:59:27 +0100 Subject: [PATCH 137/186] Issue-#908: Fix spelling and grammatical issues in architecture.md file --- content/concepts/architecture.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index b0fd1353..779cba6f 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,6 +1,6 @@ --- title: Architecture Overview -description: Data NFTs and Datatokens architecture +description: DataNFTs and Datatokens architecture --- ## Overview @@ -18,10 +18,10 @@ Here’s an overview of the figure. - **The Graph**: It is a 3rd party tool that developers can utilize the libraries to build their custom applications and marketplaces. - The lowest level has the **smart contracts**. The smart contracts are deployed on the Ethereum mainnet and other compatible networks. Libraries encapsulate the calls to these smart contracts and provide features like publishing new assets, facilitating consumption, managing pricing, and much more. To see the supported networks click [here](/concepts/networks/). -## Data NFTs, Datatokens and Access Control Tools +## DataNFTs, Datatokens and Access Control Tools -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new dataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one data NFT contract. -Click [here](/concepts/datanft-and-datatoken/) to further read about data NFTs and datatokens. +DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new dataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one dataNFT contract. +Click [here](/concepts/datanft-and-datatoken/) to further read about dataNFTs and datatokens. ERC721 dataNFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. From 454316c687341dca0608e7124bd1b3b91505e965 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 13:05:49 +0100 Subject: [PATCH 138/186] Issue-#910: Fix broken link --- config.js | 2 +- content/concepts/compute-to-data.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config.js b/config.js index acf20322..25c602b1 100644 --- a/config.js +++ b/config.js @@ -42,7 +42,7 @@ module.exports = { }, { from: '/setup/compute-to-data/', - to: '/tutorials/compute-to-data/' + to: '/tutorials/compute-to-data-minikube/' }, { from: '/concepts/networks-overview/', diff --git a/content/concepts/compute-to-data.md b/content/concepts/compute-to-data.md index da470041..623ef380 100644 --- a/content/concepts/compute-to-data.md +++ b/content/concepts/compute-to-data.md @@ -24,7 +24,7 @@ The most basic scenario for a Publisher is to provide access to the datasets the - [Compute-to-Data architecture](/tutorials/compute-to-data-architecture/) - [Tutorial: Writing Algorithms](/tutorials/compute-to-data-algorithms/) -- [Tutorial: Set Up a Compute-to-Data Environment](/tutorials/compute-to-data/) +- [Tutorial: Set Up a Compute-to-Data Environment](/tutorials/compute-to-data-minikube/) - [Use Compute-to-Data in Ocean Market](https://blog.oceanprotocol.com/compute-to-data-is-now-available-in-ocean-market-58868be52ef7) - [Build ML models via Ocean Market or Python](https://medium.com/ravenprotocol/machine-learning-series-using-logistic-regression-for-classification-in-oceans-compute-to-data-18df49b6b165) - [Compute-to-Data Python Quickstart](https://github.com/oceanprotocol/ocean.py/blob/main/READMEs/c2d-flow.md) From 00b0b9161d8b20a3a515837a00881c72f4663157 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 13:52:51 +0100 Subject: [PATCH 139/186] Issue-#908: Fix spelling issues in datanft-and-datatoken.md --- content/concepts/datanft-and-datatoken.md | 40 ++++++++--------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index e6a77b8d..19205030 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,9 +1,9 @@ --- -title: Data NFTs and Datatokens -description: In Ocean Protocol, ERC721 Data NFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. +title: DataNFTs and Datatokens +description: In Ocean Protocol, ERC721 dataNFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. --- -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright / base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright / base IP through transfer transactions. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright/base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright / base IP through transfer transactions. Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH, you and Alice could swap your ETH and your final holdings remain the same. They're apples-to-apples. Licenses (contracts) to consume a copyrighted asset are naturally fungible - they can be swapped with each other. @@ -14,47 +14,33 @@ Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH The image above describes how ERC721 DataNFTs, ERC20 datatokens, and AMMs relate. -- Bottom: The publisher deploys an ERC721 dataNFT contract representing base IP for the data asset. They are now the manager of the dataNFT. +- Bottom: The publisher deploys an ERC721 dataNFT contract representing the base IP for the data asset. They are now the manager of the dataNFT. - Middle: The manager then deploys an ERC20 datatoken contract against the dataNFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. -- Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity for receive pool tokens, i.e. become liquidity providers (LPs). +- Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity to receive pool tokens, i.e. become liquidity providers (LPs). ## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. -- **Base IP holder** means the holder of the Base IP. Represented as the the actor that did the initial "publish" action. +- **Base IP holder** means the holder of the Base IP. Represented as the actor that did the initial "publish" action. - **Sub-licensee** is the holder of the sub-license. Represented as the entity that controls address ERC721.\_owners[tokenId=x]. -- **To Publish**: Claim copyright or exclusive base license -- **To Sub-license**:Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0) +- **To Publish**: Claim copyright or exclusive base license. +- **To Sub-license**: Transfer one (of many) sub-licenses to new licensee: ERC20.transfer(to=licensee, value=1.0). ## Implementation in Ocean Protocol -Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The creator of the contract can also create and mint ERC20 token instances for sub-licensing the **Base IP**. +Ocean Protocol defines the [ERC721Factory](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/ERC721Factory.sol) contract, allowing **Base IP holders** to create their ERC721 contract instances on any supported networks. The deployed contract stores Metadata, ownership, sub-license information, permissions. The contract creator can also create and mint ERC20 token instances for sub-licensing the **Base IP**. ERC721 tokens are non-fungible, thus cannot be used for automatic price discovery like ERC20 tokens. ERC721 and ERC20 combined together can be used for sub-licensing. Ocean Protocol's [ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4main/contracts/templates/ERC721Template.sol) solves this problem by using ERC721 for tokenizing the **Base IP** and tokenizing sub-licenses by using ERC20. Thus, sub-licenses can be traded on any AMM as the underlying contract is ERC20 compliant. -## Roles - -[ERC721Template](https://github.com/oceanprotocol/contracts/blob/v4Hardhat/contracts/templates/ERC721Template.sol) contract defines following roles: - -### NFT Owner - -- NFT Owner is the publisher. I.e. Owner is a public address which transacted with `ERC721Factory` contract and deployed a new `ERC721` contract. -- NFT Owner can assign managers while deploying the contract. -- NFT Owner is also added to the Managers. -- NFT Owner can add/remove Managers. -- Clean all permissions - -### Manager - -- A public address with a `Maganer` role can update the metadata -- Can deploy new ERC20 contract which is associtated with the `ERC721` contract. - ## High-Level Behavior ![Flow](images/use-case.png) -Here's an example. Alice has created a dataset. In step 1, she publishes her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright / base IP), then an ERC20 datatoken contract (license against base IP). Then in step 2, she mints some ERC20 datatokens and transfers 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. +Here's an example. + +- In step 1, Alice **publishes** her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright/base IP), then an ERC20 datatoken contract (license against base IP). +- In step 2, she **mints** some ERC20 datatokens and **transfers** 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. ## Other References From 0f7493a2d8f37069ba5c6b8b2f815e44dc4f9b31 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 16:00:48 +0100 Subject: [PATCH 140/186] Issue-#908: Fix spelling issues in did-ddo.md --- content/concepts/did-ddo.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 435b4a53..50469fe3 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -11,23 +11,23 @@ section: concepts This document describes how Ocean assets follow the DID/DDO specification, such that Ocean assets can inherit DID/DDO benefits and enhance interoperability. DIDs and DDOs follow the [specification defined by the World Wide Web Consortium (W3C)](https://w3c-ccg.github.io/did-spec/). -Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity and DIDs may represent humans, objects, and more. +Decentralized identifiers (DIDs) are a type of identifier that enable verifiable, decentralized digital identity. Each DID is associated with a unique entity, and DIDs may represent humans, objects, and more. A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. ## Rules for DIDs & DDOs -An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). +An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under the control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). -An _asset_ has a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). The DDO can only be modified by _owners_ or _delegated users_. +An _asset_ has a DID and DDO. The DDO should include [metadata](#metadata) about the asset, and define access in at least one [service](#services). Only _owners_ or _delegated users_ can modify the DDO. All DDOs are stored on-chain in encrypted form to be fully GDPR-compatible. A metadata cache like _Aquarius_ can help in reading, decrypting, and searching through encrypted DDO data from the chain. Because the file URLs are encrypted on top of the full DDO encryption, returning unencrypted DDOs e.g. via an API is safe to do as the file URLs will still stay encrypted. ## Publishing & Retrieving DDOs -The DDO is stored on-chain as part of the NFT contract, and stored encrypted using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. +The DDO is stored on-chain as part of the NFT contract and stored in encrypted form using the private key of the _Provider_. To resolve it, a metadata cache like _Aquarius_ must query the provider to decrypt the DDO. -Here is the complete flow: +Here is the flow: ![DDO flow](images/ddo-flow.png) @@ -62,7 +62,7 @@ In Ocean, a DID is a string that looks like this: did:op:0ebed8226ada17fde24b6bf2b95d27f8f05fcce09139ff5cec31f6d81a7cd2ea ``` -The part after `did:op:` is the the ERC721 contract address(in checksum format) and the chainId (expressed as decimal) the asset has been published to: +The part after `did:op:` is the ERC721 contract address(in checksum format) and the chainId (expressed as a decimal) the asset has been published to: ```js const checksum = sha256(ERC721 contract address + chainId) @@ -525,7 +525,7 @@ Example: ] ``` -Algorithms will have access to a json file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: +Algorithms will have access to a JSON file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: ```json { From e65a2b9302915d3366ebd4c4ecc0d31ec2793822 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 4 Mar 2022 16:03:16 +0100 Subject: [PATCH 141/186] Issue-#908: Fix spelling issues in datanft-and-datatoken.md --- content/concepts/datanft-and-datatoken.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index 19205030..02e8f9d2 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,9 +1,9 @@ --- title: DataNFTs and Datatokens -description: In Ocean Protocol, ERC721 dataNFTs represent holding copyright / base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. +description: In Ocean Protocol, ERC721 dataNFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. --- -A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright/base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright / base IP through transfer transactions. +A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright/base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright/base IP through transfer transactions. Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH, you and Alice could swap your ETH and your final holdings remain the same. They're apples-to-apples. Licenses (contracts) to consume a copyrighted asset are naturally fungible - they can be swapped with each other. From a75d953d4d6b1f6fbc482f66736aa57dcf0f412d Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 8 Mar 2022 17:13:07 +0100 Subject: [PATCH 142/186] Issue-#908: Update 'dataNFT' to 'Data NFT' --- content/concepts/architecture.md | 18 +++++++++--------- content/concepts/datanft-and-datatoken.md | 14 ++++++-------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 779cba6f..3ebdb21a 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,6 +1,6 @@ --- title: Architecture Overview -description: DataNFTs and Datatokens architecture +description: Data NFTs and Datatokens architecture --- ## Overview @@ -13,17 +13,17 @@ Here’s an overview of the figure. - The top layer is **applications** like Ocean Market. With these apps, users can onboard services like data, algorithms, compute-to-data into crypto (publish and mint data NFTs and datatokens), hold datatokens as assets (data wallets), discover assets, and buy/sell datatokens for a fixed or auto-determined price (data marketplaces), and consume data services (consume datatokens). - Below are **libraries** used by the applications: Ocean.js (JavaScript library) and Ocean.py (Python library). This also includes middleware to assist discovery: - - **Aquarius**: Provides metadata cache for faster search by caching on-chain data into elasticsearch - - **Provider**: Facilitates downloading assets, DDO encryption, and communicating with `operator-service` for Compute-to-Data jobs. - - **The Graph**: It is a 3rd party tool that developers can utilize the libraries to build their custom applications and marketplaces. -- The lowest level has the **smart contracts**. The smart contracts are deployed on the Ethereum mainnet and other compatible networks. Libraries encapsulate the calls to these smart contracts and provide features like publishing new assets, facilitating consumption, managing pricing, and much more. To see the supported networks click [here](/concepts/networks/). + - **Aquarius**: Provides metadata cache for faster search by caching on-chain data into elasticsearch + - **Provider**: Facilitates downloading assets, DDO encryption, and communicating with `operator-service` for Compute-to-Data jobs. + - **The Graph**: It is a 3rd party tool that developers can utilize the libraries to build their custom applications and marketplaces. +- The lowest level has the **smart contracts**. The smart contracts are deployed on the Ethereum mainnet and other compatible networks. Libraries encapsulate the calls to these smart contracts and provide features like publishing new assets, facilitating consumption, managing pricing, and much more. To see the supported networks click [here](/concepts/networks/). -## DataNFTs, Datatokens and Access Control Tools +## Data NFTs, Datatokens and Access Control Tools -DataNFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new dataNFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one dataNFT contract. -Click [here](/concepts/datanft-and-datatoken/) to further read about dataNFTs and datatokens. +Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new Data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one Data NFT contract. +Click [here](/concepts/datanft-and-datatoken/) to further read about Data NFTs and datatokens. -ERC721 dataNFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. +ERC721 Data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. Datatoken represents the asset that the publisher wants to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index 02e8f9d2..1090bb29 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,6 +1,6 @@ --- -title: DataNFTs and Datatokens -description: In Ocean Protocol, ERC721 dataNFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. +title: Data NFTs and Datatokens +description: In Ocean Protocol, ERC721 Data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. --- A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright/base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright/base IP through transfer transactions. @@ -9,16 +9,14 @@ Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH ![Data NFT and Datatoken](images/datanft-and-datatoken.png) - ## High-Level Architecture -The image above describes how ERC721 DataNFTs, ERC20 datatokens, and AMMs relate. +The image above describes how ERC721 Data NFTs, ERC20 datatokens, and AMMs relate. -- Bottom: The publisher deploys an ERC721 dataNFT contract representing the base IP for the data asset. They are now the manager of the dataNFT. -- Middle: The manager then deploys an ERC20 datatoken contract against the dataNFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. +- Bottom: The publisher deploys an ERC721 Data NFT contract representing the base IP for the data asset. They are now the manager of the Data NFT. +- Middle: The manager then deploys an ERC20 datatoken contract against the Data NFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. - Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity to receive pool tokens, i.e. become liquidity providers (LPs). - ## Terminology - **Base IP** means the artifact being copyrighted. Represented by the {ERC721 address, tokenId} from the publish transactions. @@ -39,7 +37,7 @@ ERC721 tokens are non-fungible, thus cannot be used for automatic price discover Here's an example. -- In step 1, Alice **publishes** her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright/base IP), then an ERC20 datatoken contract (license against base IP). +- In step 1, Alice **publishes** her dataset with Ocean: this means deploying an ERC721 data NFT contract (claiming copyright/base IP), then an ERC20 datatoken contract (license against base IP). - In step 2, she **mints** some ERC20 datatokens and **transfers** 1.0 of them to Bob's wallet; now he has a license to be able to consume that dataset. ## Other References From bc980315730b58f67ed2e0ef98cf29c981cd07bf Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 9 Mar 2022 16:22:10 +0100 Subject: [PATCH 143/186] Issue-#916: Remove duplicate links --- data/sidebars/concepts.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 3ad15b48..98d17377 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -10,8 +10,6 @@ link: /concepts/datanft-and-datatoken/ - title: Roles link: /concepts/roles/ - - title: DIDs & DDOs - link: /concepts/did-ddo/ - title: Supported Networks link: /concepts/networks/ From 54ec6159372ebd1fff95ca5c6a85a3b2cd34748e Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 9 Mar 2022 16:37:38 +0100 Subject: [PATCH 144/186] Issue-#908: Fix architecture diagram, other minor fixes --- content/concepts/architecture.md | 4 ++-- content/concepts/images/architecture.png | Bin 62956 -> 63161 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 3ebdb21a..ef874097 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -65,9 +65,9 @@ The [DDO Metadata documentation](https://docs.oceanprotocol.com/concepts/ddo-met [OEP8](/concepts/did-ddo/) specifies Ocean metadata schema, including fields that must be filled. It’s based on the public [DataSet schema from schema.org](https://schema.org/Dataset). -Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the transaction fee is paid, there are no further expenses or dev-ops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the tradeoff compared to alternatives. +Ocean uses the Ethereum mainnet and other compatible networks as an **on-chain metadata store**, i.e. to store both DID and DDO. This means that once the transaction fee is paid, there are no further expenses or devops work needed to ensure metadata availability into the future, aiding in the discoverability of data assets. It also simplifies integration with the rest of the Ocean system, which is Ethereum-based. Storage cost on Ethereum mainnet is not negligible, but not prohibitive and the other benefits are currently worth the trade-off compared to alternatives. -Due to the permissionless, decentralized nature of data on the Ethereum mainnet, any last-mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [The Graph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. +Due to the permissionless, decentralized nature of data on the Ethereum mainnet, any last mile tool can access metadata. **Ocean Aquarius** supports different metadata fields for each different Ocean-based marketplace. Developers could also use [The Graph](https://www.thegraph.com) to see metadata fields that are common across all marketplaces. diff --git a/content/concepts/images/architecture.png b/content/concepts/images/architecture.png index 68c9099f2fa0f7fcd6f3f533c98291a71787cb59..97084f851e5d63bebe7b7142fa51b3218c1fbf39 100644 GIT binary patch literal 63161 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 HRp|c$+0e_7 literal 62956 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 KxLVCN{J#K Date: Wed, 9 Mar 2022 16:53:40 +0100 Subject: [PATCH 145/186] Issue-#908: Change MetaData to Metadata --- content/concepts/roles.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 69a58a33..8c825a0d 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -1,6 +1,6 @@ --- title: Data NFTs and datatoken roles -description: The permissions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. +description: The permissions stored on chain in the contracts control the access to the data NFT (ERC721) and datatoken (ERC20) smart contract functions. --- The permissions are stored in the data NFT (ERC721) smart contract. The data NFT (ERC721) and datatoken (ERC20) smart contracts both use this information to restrict access to the smart contract functions. The tables below list restricted actions that are accessible only to the allowed users. @@ -8,30 +8,30 @@ The permissions are stored in the data NFT (ERC721) smart contract. The data NFT ## Roles in data NFT (ERC721) smart contract | Action ↓ / Role → | NFT Owner | Manager | ERC20 Deployer | Store Updater | Metadata Updater | -|-----------------------------------|--------------------|--------------------|--------------------|--------------------|--------------------| -| Set token URI | | | | | | +| --------------------------------- | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| Set token URI | | | | | | | Add manager |
🗸
| | | | | | Remove manager |
🗸
| | | | | | Clean permissions |
🗸
| | | | | | Set base URI |
🗸
| | | | | -| Set MetaData state | | | | |
🗸
| -| Set MetaData | | | | |
🗸
| +| Set Metadata state | | | | |
🗸
| +| Set Metadata | | | | |
🗸
| | Create new Datatoken | | |
🗸
| | | | Executes any other smart contract | |
🗸
| | | | | Set new key-value in store | | | |
🗸
| | ## Roles in datatoken (ERC20) smart contract -| Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | -|--------------------------------|--------------------------|--------------------------|--------------------------|--------------------------| -| Deploy pool |
🗸
| | | | -| Create Fixed Rate exchange |
🗸
| | | | -| Create Dispenser |
🗸
| | | | -| Add minter |
🗸
| | | | -| Remove minter |
🗸
| | | | -| Add fee manager |
🗸
| | | | -| Remove fee manager |
🗸
| | | | -| Set data |
🗸
| | | | -| Clean permissions | | |
🗸
| | -| Mint | |
🗸
| | | -| Set fee collector | | | |
🗸
| +| Action ↓ / Role → | ERC20 Deployer | Minter | NFT owner | Fee manager | +| --------------------------- | ------------------ | ------------------ | ------------------ | ------------------ | +| Deploy pool |
🗸
| | | | +| Create Fixed Rate exchange |
🗸
| | | | +| Create Dispenser |
🗸
| | | | +| Add minter |
🗸
| | | | +| Remove minter |
🗸
| | | | +| Add fee manager |
🗸
| | | | +| Remove fee manager |
🗸
| | | | +| Set data |
🗸
| | | | +| Clean permissions | | |
🗸
| | +| Mint | |
🗸
| | | +| Set fee collector | | | |
🗸
| From a501c142dac2be0cd69253c08c561f4b628c36ac Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 9 Mar 2022 17:01:59 +0100 Subject: [PATCH 146/186] Issue-#908: Update datanft-and-datatoken.png diagram --- .../concepts/images/datanft-and-datatoken.png | Bin 44985 -> 44976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/content/concepts/images/datanft-and-datatoken.png b/content/concepts/images/datanft-and-datatoken.png index e6034d7c5d03f0bbb044f91250cbd550a477009f..2a0c79fb495029c22a1aa3d80502e6eaaf9f5979 100644 GIT binary patch delta 21776 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 z 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 r$!A!gq4 Date: Thu, 10 Mar 2022 15:29:52 +0100 Subject: [PATCH 147/186] Issue-#909: Update introduction page --- content/concepts/introduction.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index 980b897f..a9452a36 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -3,20 +3,23 @@ title: Introduction description: Ocean Protocol - Tools for the Web3 Data Economy --- -In Ocean Protocol, each data service gets its own ERC20 **datatoken**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. +In Ocean Protocol, each data service gets its own ERC721 **data NFT** and one or more ERC20 **datatoken**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. OCEAN token is used for staking, and more. [Here](https://oceanprotocol.com/token) are details. -Ocean Protocol provides tools for developers to _build data markets_, and to _manage datatokens_ for use in DeFi. +Ocean Protocol provides tools for developers to _build data markets_, and to _manage data NFTs and datatokens_ for use in DeFi. **Build Data Markets.** Use Ocean Protocol software tools to build your own data marketplace, by either forking [Ocean Market](https://market.oceanprotocol.com/) code or building up with Ocean components. -**Manage Datatokens for use in DeFi.** Use Ocean [JavaScript](https://github.com/oceanprotocol/ocean.js) or [Python](https://github.com/oceanprotocol/ocean.py) drivers to manage datatokens: +**Manage Datatokens and Data NFTs for use in DeFi.** Use Ocean [JavaScript](https://github.com/oceanprotocol/ocean.js) or [Python](https://github.com/oceanprotocol/ocean.py) drivers to manage data NFTs and datatokens: -- _Publish and consume data services:_ downloadable files or compute-to-data. Use Ocean to deploy a new [ERC20](https://github.com/ethereum/EIPs/blob/7f4f0377730f5fc266824084188cc17cf246932e/EIPS/eip-20.md) datatoken contract for each data service, then mint datatokens. +- _Publish and consume data services:_ downloadable files or compute-to-data. Use Ocean to deploy a new [ERC721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md and [ERC20](https://github.com/ethereum/EIPs/blob/7f4f0377730f5fc266824084188cc17cf246932e/EIPS/eip-20.md) datatoken contract for each data service, then mint datatokens. - _Transfer datatokens_ to another owner (or approve & transferFrom). - _Manage pools._ Deploy OCEAN-datatoken [Balancer](https://www.balancer.finance/) pools, buy & sell datatokens (swap), and add & remove liquidity. - _And more._ Use ERC20 support in [web3.js](https://web3js.readthedocs.io/), [web3.py](https://web3py.readthedocs.io/en/stable/examples.html#working-with-an-erc20-token-contract) and Solidity to connect datatokens with crypto wallets and other DeFi services. + +**Compute-to-Data** +Ocean's "Compute-to-Data" feature gives compute access to privately-held data, which never leaves the data owner’s premises. Ocean-based marketplaces enable the monetization of private data while preserving privacy. [Here](/tutorials/compute-to-data-architecture/) are details. From 43d9265bd6d363be1ece099b3a4e0a983dec5c4a Mon Sep 17 00:00:00 2001 From: Akshay Date: Thu, 10 Mar 2022 17:51:45 +0100 Subject: [PATCH 148/186] Issue-#908: Fix image and did-ddo page link --- content/concepts/did-ddo.md | 380 ++++++++++++++------------- content/concepts/images/use-case.png | Bin 49288 -> 64730 bytes data/sidebars/concepts.yml | 2 +- 3 files changed, 192 insertions(+), 190 deletions(-) diff --git a/content/concepts/did-ddo.md b/content/concepts/did-ddo.md index 50469fe3..842f9963 100644 --- a/content/concepts/did-ddo.md +++ b/content/concepts/did-ddo.md @@ -15,7 +15,7 @@ Decentralized identifiers (DIDs) are a type of identifier that enable verifiable A DID Document (DDO) is a JSON blob that holds information about the DID. Given a DID, a _resolver_ will return the DDO of that DID. -## Rules for DIDs & DDOs +## Rules for DID & DDO An _asset_ in Ocean represents a downloadable file, compute service, or similar. Each asset is a _resource_ under the control of a _publisher_. The Ocean network itself does _not_ store the actual resource (e.g. files). @@ -128,12 +128,12 @@ Example: An asset of type `algorithm` has additional attributes under `metadata.algorithm`, describing the algorithm and the Docker environment it is supposed to be run under. -| Attribute | Type | Required | Description | -| --------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------ | -| **`language`** | `string` | | Language used to implement the software. | -| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | -| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before running the algorithm | -| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | +| Attribute | Type | Required | Description | +| ------------------------ | ------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ | +| **`language`** | `string` | | Language used to implement the software. | +| **`version`** | `string` | | Version of the software preferably in [SemVer](https://semver.org) notation. E.g. `1.0.0`. | +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before running the algorithm | +| **`container`** | `container` | **✓** | Object describing the Docker container image. See below | The `container` object has the following attributes defining the Docker image for running the algorithm: @@ -163,7 +163,7 @@ The `container` object has the following attributes defining the Docker image fo "tag": "latest", "checksum": "44e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550" }, - "consumerParameters":{}, + "consumerParameters": {} } } } @@ -175,18 +175,18 @@ Services define the access for an asset, and each service is represented by its An asset should have at least one service to be actually accessible, and can have as many services which make sense for a specific use case. -| Attribute | Type | Required | Description | -| ---------------------- | --------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -| **`id`** | `string` | **✓** | Unique ID | -| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | -| **`name`** | `string` | | Service friendly name | -| **`description`** | `string` | | Service description | -| **`datatokenAddress`** | `string` | **✓** | Datatoken address | -| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | -| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | -| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | -| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | -| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset| +| Attribute | Type | Required | Description | +| ------------------------ | ------------------------------------------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | +| **`id`** | `string` | **✓** | Unique ID | +| **`type`** | `string` | **✓** | Type of service (`access`, `compute`, `wss`, etc. | +| **`name`** | `string` | | Service friendly name | +| **`description`** | `string` | | Service description | +| **`datatokenAddress`** | `string` | **✓** | Datatoken address | +| **`serviceEndpoint`** | `string` | **✓** | Provider URL (schema + host) | +| **`files`** | [Files](#files) | **✓** | Encrypted file URLs. | +| **`timeout`** | `number` | **✓** | Describing how long the service can be used after consumption is initiated. A timeout of `0` represents no time limit. Expressed in seconds. | +| **`compute`** | [Compute](#compute-options) | **✓** (for compute assets only) | If service is of `type` `compute`, holds information about the compute-related privacy settings & resources. | +| **`consumerParameters`** | [Consumer Parameters](#consumer-parameters) | | An object the defines required consumer input before consuming the asset | #### Files @@ -200,8 +200,7 @@ Example: } ``` -During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. - +During the publish process, file URLs must be encrypted with a respective _Provider_ API call before storing the DDO on-chain. For this an array of objects defining the storage access details are sent. Type of objects supported : @@ -217,11 +216,11 @@ Type of objects supported : ```json [ - { - "type": "url", - "url": "https://url.com/file1.csv", - "method": "GET" - } + { + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" + } ] ``` @@ -240,11 +239,11 @@ First class integrations supported in the future :
"ipfs"IPFS files - ```json -[ +```json +[ { - "type":"ipfs", - "hash": "XXX" + "type": "ipfs", + "hash": "XXX" } ] ``` @@ -257,23 +256,21 @@ First class integrations supported in the future :
"sql"Sql connection, dataset is generated by a query 
- A service can contain multiple files, using multiple storage types. Example: ```json [ - { - "type": "url", - "url": "https://url.com/file1.csv", - "method": "GET" - - }, - { - "type": "ipfs", - "hash": "XXXX" - } + { + "type": "url", + "url": "https://url.com/file1.csv", + "method": "GET" + }, + { + "type": "ipfs", + "hash": "XXXX" + } ] ``` @@ -377,7 +374,6 @@ An asset with a service of `type` `compute` has the following additional attribu - The `publisherTrustedAlgorithms ` is an array of objects with the following structure: | Attribute | Type | Required | Description | @@ -443,7 +439,7 @@ Example: ] } ``` - + #### Consumer Parameters Sometimes, you may need some input before downloading a dataset or running an algorithm. @@ -456,27 +452,26 @@ It's an array of elements, each element object defines a field. An element looks like: ```json - { - "name":"hometown", - "type": "text", - "label": "Hometown", - "required": true, - "description":"What is your hometown?", - "default": "Nowhere", - "options": [] - } +{ + "name": "hometown", + "type": "text", + "label": "Hometown", + "required": true, + "description": "What is your hometown?", + "default": "Nowhere", + "options": [] +} ``` where: - - name = defines the parameter name (this is sent as HTTP param or key towards algo) - - type = defines the form type (text, number, select, boolean) - - label = defines the label which is displayed - - required = if this field is mandatory to have a consumer input. - - default = default value - - description = description of this element - - options = for select types, a list of options - +- name = defines the parameter name (this is sent as HTTP param or key towards algo) +- type = defines the form type (text, number, select, boolean) +- label = defines the label which is displayed +- required = if this field is mandatory to have a consumer input. +- default = default value +- description = description of this element +- options = for select types, a list of options Example: @@ -515,7 +510,7 @@ Example: "options": [ { "nodejs" : "I love NodeJs" - }, + }, { "python" : "I love Python" } @@ -525,7 +520,7 @@ Example: ] ``` -Algorithms will have access to a JSON file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: +Algorithms will have access to a JSON file located at /data/inputs/algoCustomData.json, which contains the keys/values for input data required. Example: ```json { @@ -536,7 +531,6 @@ Algorithms will have access to a JSON file located at /data/inputs/algoCustomDat } ``` - ### Credentials By default, a consumer can access a resource if they have 1 datatoken. _Credentials_ allow the publisher to optionally specify more fine-grained permissions. @@ -622,21 +616,21 @@ Each asset has a state, which is held by the NFT contract. The possible states a The following fields are added by _Aquarius_ in its DDO response for convenience reasons, where an asset returned by _Aquarius_ inherits the DDO fields stored on-chain. -These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-hash). +These additional fields are never stored on-chain, and are never taken into consideration when [hashing the DDO](#ddo-checksum). ### NFT The `nft` object contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. -| Attribute | Type | Description | -| ------------- | ---------------------- | ------------------------------------------------------------------------- | -| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | -| **`name`** | `string` | Name of NFT set in contract. | -| **`symbol`** | `string` | Symbol of NFT set in contract. | -| **`owner`** | `string` | ETH account address of the NFT owner. | -| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | -| **`created`** | `ISO date/time string` | Contains the date of NFT creation. | -| **`tokenURI`** | `string` | tokenURI | +| Attribute | Type | Description | +| -------------- | ---------------------- | ------------------------------------------------------------------------- | +| **`address`** | `string` | Contract address of the deployed ERC721 NFT contract. | +| **`name`** | `string` | Name of NFT set in contract. | +| **`symbol`** | `string` | Symbol of NFT set in contract. | +| **`owner`** | `string` | ETH account address of the NFT owner. | +| **`state`** | `number` | State of the asset reflecting the NFT contract value. See [State](#state) | +| **`created`** | `ISO date/time string` | Contains the date of NFT creation. | +| **`tokenURI`** | `string` | tokenURI | Example: @@ -735,8 +729,8 @@ Example: The `stats` section contains different statistics fields. -| Attribute | Type | Description | -| -------------- | -------- | ------------------------------------------------------------------------------------------------------------- | +| Attribute | Type | Description | +| ------------ | -------- | ------------------------------------------------------------------------------------------------------------ | | **`orders`** | `number` | How often an asset was ordered, meaning how often it was either downloaded or used as part of a compute job. | Example: @@ -753,123 +747,131 @@ Example: ```json { - "@context": ["https://w3id.org/did/v1"], - "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", - "version": "4.0.0", - "chainId": 1, - "nftAddress": "0x123", - "metadata": { - "created": "2020-11-15T12:27:48Z", - "updated": "2021-05-17T21:58:02Z", - "description": "Sample description", - "name": "Sample asset", - "type": "dataset", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms" - }, - "services": [{ - "id": "1", - "type": "access", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Download service", - "description": "Download service", - "datatokenAddress": "0x123", - "serviceEndpoint": "https://myprovider.com", - "timeout": 0, - "consumerParameters": [{ - "name": "surname", - "type": "text", - "label": "Name", - "required": true, - "default": "NoName", - "description": "Please fill your name" - }, - { - "name": "age", - "type": "number", - "label": "Age", - "required": false, - "default": 0, - "description": "Please fill your age" - } - ] - }, - { - "id": "2", - "type": "compute", - "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", - "name": "Compute service", - "description": "Compute service", - "datatokenAddress": "0x124", - "serviceEndpoint": "https://myprovider.com", - "timeout": 3600, - "compute": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], - "publisherTrustedAlgorithms": [{ - "did": "did:op:123", - "filesChecksum": "100", - "containerSectionChecksum": "200" - }, - { - "did": "did:op:124", - "filesChecksum": "110", - "containerSectionChecksum": "210" - } - ] - } - } - ], - "credentials": { - "allow": [{ - "type": "address", - "values": ["0x123", "0x456"] - }], - "deny": [{ - "type": "address", - "values": ["0x2222", "0x333"] - }] - }, + "@context": ["https://w3id.org/did/v1"], + "id": "did:op:ACce67694eD2848dd683c651Dab7Af823b7dd123", + "version": "4.0.0", + "chainId": 1, + "nftAddress": "0x123", + "metadata": { + "created": "2020-11-15T12:27:48Z", + "updated": "2021-05-17T21:58:02Z", + "description": "Sample description", + "name": "Sample asset", + "type": "dataset", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms" + }, + "services": [ + { + "id": "1", + "type": "access", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Download service", + "description": "Download service", + "datatokenAddress": "0x123", + "serviceEndpoint": "https://myprovider.com", + "timeout": 0, + "consumerParameters": [ + { + "name": "surname", + "type": "text", + "label": "Name", + "required": true, + "default": "NoName", + "description": "Please fill your name" + }, + { + "name": "age", + "type": "number", + "label": "Age", + "required": false, + "default": 0, + "description": "Please fill your age" + } + ] + }, + { + "id": "2", + "type": "compute", + "files": "0x044736da6dae39889ff570c34540f24e5e084f4e5bd81eff3691b729c2dd1465ae8292fc721e9d4b1f10f56ce12036c9d149a4dab454b0795bd3ef8b7722c6001e0becdad5caeb2005859642284ef6a546c7ed76f8b350480691f0f6c6dfdda6c1e4d50ee90e83ce3cb3ca0a1a5a2544e10daa6637893f4276bb8d7301eb35306ece50f61ca34dcab550b48181ec81673953d4eaa4b5f19a45c0e9db4cd9729696f16dd05e0edb460623c843a263291ebe757c1eb3435bb529cc19023e0f49db66ef781ca692655992ea2ca7351ac2882bf340c9d9cb523b0cbcd483731dc03f6251597856afa9a68a1e0da698cfc8e81824a69d92b108023666ee35de4a229ad7e1cfa9be9946db2d909735", + "name": "Compute service", + "description": "Compute service", + "datatokenAddress": "0x124", + "serviceEndpoint": "https://myprovider.com", + "timeout": 3600, + "compute": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": ["0x234", "0x235"], + "publisherTrustedAlgorithms": [ + { + "did": "did:op:123", + "filesChecksum": "100", + "containerSectionChecksum": "200" + }, + { + "did": "did:op:124", + "filesChecksum": "110", + "containerSectionChecksum": "210" + } + ] + } + } + ], + "credentials": { + "allow": [ + { + "type": "address", + "values": ["0x123", "0x456"] + } + ], + "deny": [ + { + "type": "address", + "values": ["0x2222", "0x333"] + } + ] + }, - "nft": { - "address": "0x123", - "name": "Ocean Protocol Asset v4", - "symbol": "OCEAN-A-v4", - "owner": "0x0000000", - "state": 0, - "created": "2000-10-31T01:30:00", - "tokenURI": "xxx" - }, + "nft": { + "address": "0x123", + "name": "Ocean Protocol Asset v4", + "symbol": "OCEAN-A-v4", + "owner": "0x0000000", + "state": 0, + "created": "2000-10-31T01:30:00", + "tokenURI": "xxx" + }, - "datatokens": [{ - "address": "0x000000", - "name": "Datatoken 1", - "symbol": "DT-1", - "serviceId": "1" - }, - { - "address": "0x000001", - "name": "Datatoken 2", - "symbol": "DT-2", - "serviceId": "2" - } - ], + "datatokens": [ + { + "address": "0x000000", + "name": "Datatoken 1", + "symbol": "DT-1", + "serviceId": "1" + }, + { + "address": "0x000001", + "name": "Datatoken 2", + "symbol": "DT-2", + "serviceId": "2" + } + ], - "event": { - "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", - "block": 12831214, - "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", - "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", - "datetime": "2000-10-31T01:30:00" - }, + "event": { + "tx": "0x8d127de58509be5dfac600792ad24cc9164921571d168bff2f123c7f1cb4b11c", + "block": 12831214, + "from": "0xAcca11dbeD4F863Bb3bC2336D3CE5BAC52aa1f83", + "contract": "0x1a4b70d8c9DcA47cD6D0Fb3c52BB8634CA1C0Fdf", + "datetime": "2000-10-31T01:30:00" + }, - "purgatory": { - "state": false - }, + "purgatory": { + "state": false + }, - "stats": { - "orders": 4 - } + "stats": { + "orders": 4 + } } ``` diff --git a/content/concepts/images/use-case.png b/content/concepts/images/use-case.png index 3fa8390516c6e996b8aa9560e5642a26310b0558..a581963f50226bf588a1d9216c639eaab0590db9 100644 GIT binary patch literal 64730 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
From 48089be3570bd7fa7e964b049b711ba02aff6984 Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 17 Mar 2022 01:59:28 -0700 Subject: [PATCH 153/186] update network list --- content/concepts/networks.md | 206 ++++------------------------------- 1 file changed, 20 insertions(+), 186 deletions(-) diff --git a/content/concepts/networks.md b/content/concepts/networks.md index a7e17303..840cd2e6 100644 --- a/content/concepts/networks.md +++ b/content/concepts/networks.md @@ -7,178 +7,9 @@ Ocean Protocol contracts are deployed on multiple public networks. You can alway In each network, you’ll need ETH to pay for gas, and OCEAN for certain Ocean actions. Because the Ethereum mainnet is a network for production settings, ETH and OCEAN tokens have real value on there. The ETH and OCEAN tokens in each test network don’t have real value and are used for testing-purposes only. They can be obtained with _faucets_ to dole out ETH and OCEAN. -The universal Aquarius Endpoint is `https://aquarius.oceanprotocol.com`. - -## Ethereum Mainnet - -The Ethereum Mainnet is Ocean’s production network. - -MetaMask and other ERC20 wallets default to Ethereum mainnet, therefore your wallet is almost certainly pointing to Ethereum by default. - -**Tokens** - -- ETH: - - Native token to pay transaction fees - - [Exchanges to purchase](https://www.coingecko.com/en/coins/ethereum#markets) -- OCEAN: - - Address: [0x967da4048cD07aB37855c090aAF366e4ce1b9F48](https://etherscan.io/token/0x967da4048cD07aB37855c090aAF366e4ce1b9F48) - - [Exchanges to purchase](https://oceanprotocol.com/token#get) - -**Additional Components** - -| What | URL | -| ------------ | -------------------------------------------- | -| Explorer | https://etherscan.io | -| Ocean Market | https://market.oceanprotocol.com | -| Provider | `https://provider.mainnet.oceanprotocol.com` | -| Subgraph | `https://subgraph.mainnet.oceanprotocol.com` | - -## Polygon Mainnet - -Ocean is [deployed](https://blog.oceanprotocol.com/ocean-on-polygon-network-8abad19cbf47) to the [Polygon](https://polygon.technology/) production network. Polygon's native token is MATIC. - -If you don't find Polygon as a predefined network in your wallet, you can connect to it manually via [this guide](/tutorials/metamask-setup/#set-up-custom-network) and the parameters below. - -| What | Value | -| ------------------ | ---------------------------------------- | -| Network Name | `Matic Mainnet` | -| RPC | `https://rpc.polygon.oceanprotocol.com/` | -| Chain Id | `137` | -| Currency Symbol | `MATIC` | -| Block Explorer URL | `https://explorer.matic.network/` | - -**Tokens** - -- MATIC: - - Native token to pay transaction fees - - [Exchanges to purchase](https://www.coingecko.com/en/coins/polygon#markets) -- Polygon OCEAN: - - Address: [0x282d8efCe846A88B159800bd4130ad77443Fa1A1](https://polygonscan.com/token/0x282d8efCe846A88B159800bd4130ad77443Fa1A1) - - [Exchanges to purchase](https://oceanprotocol.com/token#get) - -**Additional Components** - -| What | URL | -| ------------ | -------------------------------------------------------------------- | -| Explorer | https://polygonscan.com/ | -| Ocean Market | Point wallet to Polygon network, at https://market.oceanprotocol.com | -| Provider | `https://provider.polygon.oceanprotocol.com` | -| Subgraph | `https://subgraph.polygon.oceanprotocol.com` | - -**Bridge** - -Check our [Polygon Bridge guide](/tutorials/polygon-bridge/) to learn how you can deposit, withdraw and send tokens. - -## Moonriver - -Ocean is deployed to [Moonriver](https://moonbeam.network/networks/moonriver/), another production network. Moonriver's native token is MOVR. - -If you don't find Moonriver as a predefined network in your wallet, you can connect to it manually via [Ocean's guide](/tutorials/metamask-setup/#set-up-custom-network) and the parameters below. - -| What | Value | -| ------------------ | ----------------------------------- | -| Network Name | `Moonriver` | -| RPC | `https://rpc.moonriver.moonbeam.network`| -| Chain Id | `1285` | -| Currency Symbol | `MOVR` | -| Block Explorer URL | `https://blockscout.moonriver.moonbeam.network` | - -**Tokens** - -- Moonriver MOVR: - - Native token to pay transaction fees - - Exchanges to purchase: [List](https://coinmarketcap.com/currencies/moonriver/markets/) -- Moonriver OCEAN: - - Address: [0x99C409E5f62E4bd2AC142f17caFb6810B8F0BAAE](https://blockscout.moonriver.moonbeam.network/address/0x99C409E5f62E4bd2AC142f17caFb6810B8F0BAAE/) - - [Exchanges to purchase](https://oceanprotocol.com/token#get) - -**Additional Components** - -| What | URL | -| ------------ | ---------------------------------------------------------------- | -| Explorer | https://blockscout.moonriver.moonbeam.network/ | -| Ocean Market | Point wallet to Moonriver network, at https://market.oceanprotocol.com | -| Provider | `https://provider.moonriver.oceanprotocol.com` | -| Subgraph | `https://subgraph.moonriver.oceanprotocol.com` | - -**Bridge** - -Use [Anyswap](https://anyswap.exchange/#/bridge) to bridge between ETH Mainnet and Moonriver +The universal Aquarius Endpoint is `https://v4.aquarius.oceanprotocol.com`. -## Energy Web Chain - -Ocean is deployed to [Energy Web Chain](https://energy-web-foundation.gitbook.io/energy-web/technology/the-stack/trust-layer-energy-web-chain), another production network. Energy Web's native token is EWT. - -If you don't find Energy Web Chain as a predefined network in your wallet, you can connect to it manually via [Ocean's guide](/tutorials/metamask-setup/#set-up-custom-network) and the parameters below. - -| What | Value | -| ------------------ | ----------------------------------- | -| Network Name | `Energy Web Chain` | -| RPC | `https://rpc.energyweb.org` | -| Chain Id | `246` | -| Currency Symbol | `EWT` | -| Block Explorer URL | `https://explorer.energyweb.org/` | - -**Tokens** - -- Energy Web Chain EWT: - - Native token to pay transaction fees - - Exchanges to purchase: [List](https://coinmarketcap.com/currencies/energy-web-token/markets/) -- Energy Web Chain OCEAN: - - Address: [0x593122aae80a6fc3183b2ac0c4ab3336debee528](https://explorer.energyweb.org/tokens/0x593122AAE80A6Fc3183b2AC0c4ab3336dEbeE528) - - [Exchanges to purchase](https://oceanprotocol.com/token#get) - -**Additional Components** - -| What | URL | -| ------------ | ---------------------------------------------------------------- | -| Explorer | https://explorer.energyweb.org/ | -| Ocean Market | Point wallet to Energy Web Chain network, at https://market.oceanprotocol.com | -| Provider | `https://provider.energyweb.oceanprotocol.com` | -| Subgraph | `https://subgraph.energyweb.oceanprotocol.com` | - -**Bridge** - -Use [Carbonswap bridge](https://bridge.carbonswap.exchange/bridge) to bridge between ETH Mainnet and Energy Web Chain - - - -## Binance Smart Chain - -Ocean is deployed to [Binance Smart Chain (BSC)](https://academy.binance.com/en/articles/how-to-get-started-with-binance-smart-chain-bsc), another production network. BSC's native token is BNB - the Binance token. - -If you don't find BSC as a predefined network in your wallet, you can connect to it manually via [Binance's guide](https://academy.binance.com/en/articles/connecting-metamask-to-binance-smart-chain) or [Ocean's guide](/tutorials/metamask-setup/#set-up-custom-network) and the parameters below. - -| What | Value | -| ------------------ | ----------------------------------- | -| Network Name | `Smart Chain` | -| RPC | `https://bsc-dataseed.binance.org/` | -| Chain Id | `56` | -| Currency Symbol | `BNB` | -| Block Explorer URL | `https://bscscan.com` | - -**Tokens** - -- BSC BNB: - - Native token to pay transaction fees - - Exchanges to purchase: typically [binance.com](https://www.binance.com) -- BSC OCEAN: - - Address: [0xdce07662ca8ebc241316a15b611c89711414dd1a](https://bscscan.com/token/0xdce07662ca8ebc241316a15b611c89711414dd1a) - - [Exchanges to purchase](https://oceanprotocol.com/token#get) - -**Additional Components** - -| What | URL | -| ------------ | ---------------------------------------------------------------- | -| Explorer | https://bscscan.com/ | -| Ocean Market | Point wallet to BSC network, at https://market.oceanprotocol.com | -| Provider | `https://provider.bsc.oceanprotocol.com` | -| Subgraph | `https://subgraph.bsc.oceanprotocol.com` | - -**Bridge** - -Check our [BSC Bridge guide](/tutorials/bsc-bridge/) to learn how you can deposit, withdraw and send tokens. ## Ropsten @@ -201,8 +32,8 @@ In MetaMask and other ERC20 wallets, click on the network name dropdown, then se | ------------ | -------------------------------------------------------------------- | | Explorer | https://ropsten.etherscan.io | | Ocean Market | Point wallet to Ropsten network, at https://market.oceanprotocol.com | -| Provider | `https://provider.ropsten.oceanprotocol.com` | -| Subgraph | `https://subgraph.ropsten.oceanprotocol.com` | +| Provider | `https://v4.provider.ropsten.oceanprotocol.com` | +| Subgraph | `https://v4.subgraph.ropsten.oceanprotocol.com` | ## Rinkeby @@ -225,8 +56,8 @@ In MetaMask and other ERC20 wallets, click on the network name dropdown, then se | ------------ | -------------------------------------------------------------------- | | Explorer | https://rinkeby.etherscan.io | | Ocean Market | Point wallet to Rinkeby network, at https://market.oceanprotocol.com | -| Provider | `https://provider.rinkeby.oceanprotocol.com` | -| Subgraph | `https://subgraph.rinkeby.oceanprotocol.com` | +| Provider | `https://v4.provider.rinkeby.oceanprotocol.com` | +| Subgraph | `https://v4.subgraph.rinkeby.oceanprotocol.com` | ## Mumbai @@ -249,31 +80,34 @@ If you don't find Mumbai as a predefined network in your wallet, you can connect | ------------ | ------------------------------------------------------------------- | | Explorer | https://mumbai.polygonscan.com | | Ocean Market | Point wallet to Mumbai network, at https://market.oceanprotocol.com | -| Provider | `https://provider.mumbai.oceanprotocol.com` | -| Subgraph | `https://subgraph.mumbai.oceanprotocol.com` | +| Provider | `https://v4.provider.mumbai.oceanprotocol.com` | +| Subgraph | `https://v4.subgraph.mumbai.oceanprotocol.com` | -## Celo Alfajores -Alfajores is a Celo test network for developers building on the Celo platform. +## Moonbase -Celo docs: https://docs.celo.org/. +Moonbase is a test network tuned for Moonbeam / Moonriver. -Wallet setup: https://celo.org/developers/wallet +If you don't find Moonbase as a predefined network in your wallet, you can connect to it manually via [Moonbase guide](https://docs.moonbeam.network/learn/platform/networks/moonbase/). **Tokens** -- Alfajores CELO: +- Moonbase DEV: - Native token to pay transaction fees - - [Faucet](https://celo.org/developers/faucet). -- Alfajores OCEAN: - - Address: [0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8](https://alfajores-blockscout.celo-testnet.org/address/0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8/) - + - Facuet: See above guide You may find others by [searching](https://www.google.com/search?q=moonbase+dev+faucet). +- Moonbase OCEAN: + - Address: [0xF6410bf5d773C7a41ebFf972f38e7463FA242477](https://moonbase.moonscan.io/token/0xF6410bf5d773C7a41ebFf972f38e7463FA242477) + - [Faucet](https://faucet.moonbase.oceanprotocol.com/) **Additional Components** | What | URL | | ------------ | ------------------------------------------------------------------- | -| Explorer | https://alfajores-blockscout.celo-testnet.org/ | +| Explorer | https://moonbase.moonscan.io/ | +| Ocean Market | Point wallet to Moonbase network, at https://market.oceanprotocol.com | +| Provider | `https://provider.moonbase.oceanprotocol.com/` | +| Subgraph | `https://v4.subgraph.moonbase.oceanprotocol.com` | + ## Local / Ganache From 654d98fd0818e1179ca3ce8c330667e0cd9d88da Mon Sep 17 00:00:00 2001 From: alexcos20 Date: Thu, 17 Mar 2022 02:02:09 -0700 Subject: [PATCH 154/186] fix typo --- content/concepts/networks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/networks.md b/content/concepts/networks.md index 840cd2e6..14a95de3 100644 --- a/content/concepts/networks.md +++ b/content/concepts/networks.md @@ -105,7 +105,7 @@ If you don't find Moonbase as a predefined network in your wallet, you can conne | ------------ | ------------------------------------------------------------------- | | Explorer | https://moonbase.moonscan.io/ | | Ocean Market | Point wallet to Moonbase network, at https://market.oceanprotocol.com | -| Provider | `https://provider.moonbase.oceanprotocol.com/` | +| Provider | `https://v4.provider.moonbase.oceanprotocol.com/` | | Subgraph | `https://v4.subgraph.moonbase.oceanprotocol.com` | From 0353aaf523a097d9ddf6374a999291137514dba2 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Mar 2022 17:21:31 +0100 Subject: [PATCH 155/186] Issue:#849: Add table for fees --- content/tutorials/marketplace-fees.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 1b69a6dc..efd45a6a 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -54,6 +54,31 @@ Provider fee can also be used to charge for computing resources. Based on the co This fee incentivizes individuals and organizations to run their provider instances and charge consumers according to resource usage. +## Fee values + +| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | +| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | +| publishMarket: Pools | Set in market config, by OPF Value = 0 (agreed Feb 28 by T, A, Mihai, Matthias, Ana) | Set in market config, by publishMarket | +| publishMarket: FixedRate | Set in market config, by OPF Value = 0 (agreed etc.) | SSet in market config, by publishMarket | +| consumeMarket: Pools | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by consumeMarket | +| consumeMarket: FixedRate: ERC20Template | Hardcoded to 0 in contract | | +| consumeMarket: FixedRate: EnterpriseTemplate | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by consumeMarket | +| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | OPF gov can update in smart contract Value = 0.1% (agreed etc.) | | +| Ocean Community: Pools & FixedRate: other basetoken | OPF gov can update in smart contract Value = 0.2% (agreed etc.) | | +| Pool Liquidity Provider (LP): Pools only | Default 1%; Set by pool creator on contract deployment Min allowed (in contract) = 0.001% Min allowed (in Ocean Market) = 0.1% Max allowed (in contract) = 10% Min allowed (in Ocean Market) = 10% | | +| Publish Fees | | | +| (no publish fees) | - | - | +| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | +| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by PublishMarket | +| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by ConsumeMarket | +| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT (agreed etc.) for all initial templates | | +| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | +| Token in which fee is charged: PROVIDER_FEE_TOKEN | OCEAN | E.g. USDC | +| Download: COST_PER_MB | Set in Provider envvars, by OPF Value = 0 (agreed etc.) | Set in Provider envvars, by 3rd party running Provider | +| Compute: COST_PER_MIN | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 (agreed etc) | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: COST_PER_MIN | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (agreed etc) (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | +| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | + ## Further reading - [The Web3 Sustainability Loop](https://blog.oceanprotocol.com/the-web3-sustainability-loop-b2a4097a36e) From 04c80bf62e29305dd69c124da217e19f74a8a184 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 23 Mar 2022 18:34:18 +0100 Subject: [PATCH 156/186] Issue-#849: Fix _ issues --- content/tutorials/marketplace-fees.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index efd45a6a..92e6ccb2 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -73,10 +73,10 @@ This fee incentivizes individuals and organizations to run their provider instan | consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by ConsumeMarket | | Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT (agreed etc.) for all initial templates | | | Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | -| Token in which fee is charged: PROVIDER_FEE_TOKEN | OCEAN | E.g. USDC | +| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | | Download: COST_PER_MB | Set in Provider envvars, by OPF Value = 0 (agreed etc.) | Set in Provider envvars, by 3rd party running Provider | -| Compute: COST_PER_MIN | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 (agreed etc) | Set in OperatorEngine envvars, by 3rd party running Provider | -| Compute: COST_PER_MIN | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (agreed etc) (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 (agreed etc) | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (agreed etc) (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | | Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | ## Further reading From 37842b23521419aaaf70c92660444c8091e2b39c Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:26:05 +0200 Subject: [PATCH 157/186] Issue:#849: Fees doc --- content/tutorials/marketplace-fees.md | 54 +++++++++++++-------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 92e6ccb2..bb49b597 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -5,7 +5,7 @@ description: The Ocean Protocol defines various fees for creating a sustainabili ## Path to sustainability -Ocean Protocol aims to be a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants need to be rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. +Ocean Protocol aims to be a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants are rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. ## Fee types @@ -23,7 +23,7 @@ These are the fees that are applied whenever a user swaps basetoken or datatoken Publish fees will be charged to a publisher when they publish an asset. -Currently, no fees are applicable in Ocean's default marketplace. However, it is possible to charge a publish fee in the custom marketplace by adding an extra transaction in the publish flow. +Currently, no fees are applicable in Ocean's default marketplace. However, it is possible to charge a publishing fee in the custom marketplace by adding an extra transaction in the publish flow. Based on the use case of the marketplace, the marketplace owner can decide if this fee should be charged or not. @@ -40,44 +40,44 @@ The following fees apply to the consumption of data assets as a part of Consume ### Ocean Community fee -Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently. This fee is set to 0 (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. +Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently, this fee is set to 0 (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. Whereas a fee of 0.1% is applicable on all swaps using another token as the base token. ### Provider fee -Provider is a component of Ocean Protocol's ecosystem which facilitates data consumption, starting compute jobs, encryption of DDOs, and decryption of DDOs. Provider also validates if the user can access a particular data asset or service. To know more about Provider, click here. +Provider is a component of Ocean Protocol's ecosystem which facilitates data consumption, starts compute jobs, encrypts DDOs, and decrypts DDOs. Provider also validates if the user can access a particular data asset or service. To know more about Provider, click [here](https://github.com/oceanprotocol/provider). Provider fees are paid to the individual or organization running their Provider instance whenever a user consumes a data asset or swaps a datatoken for a basetoken. These fees can be set to an absolute amount, and the receiver can also decide which token to receive the fees in - they don't have to be in the same currency used in the consuming market. -Provider fee can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount of pay according to their needs. +Provider fee can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount to pay according to their needs. This fee incentivizes individuals and organizations to run their provider instances and charge consumers according to resource usage. ## Fee values -| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | -| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | -| publishMarket: Pools | Set in market config, by OPF Value = 0 (agreed Feb 28 by T, A, Mihai, Matthias, Ana) | Set in market config, by publishMarket | -| publishMarket: FixedRate | Set in market config, by OPF Value = 0 (agreed etc.) | SSet in market config, by publishMarket | -| consumeMarket: Pools | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by consumeMarket | -| consumeMarket: FixedRate: ERC20Template | Hardcoded to 0 in contract | | -| consumeMarket: FixedRate: EnterpriseTemplate | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by consumeMarket | -| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | OPF gov can update in smart contract Value = 0.1% (agreed etc.) | | -| Ocean Community: Pools & FixedRate: other basetoken | OPF gov can update in smart contract Value = 0.2% (agreed etc.) | | -| Pool Liquidity Provider (LP): Pools only | Default 1%; Set by pool creator on contract deployment Min allowed (in contract) = 0.001% Min allowed (in Ocean Market) = 0.1% Max allowed (in contract) = 10% Min allowed (in Ocean Market) = 10% | | -| Publish Fees | | | -| (no publish fees) | - | - | -| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | -| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by PublishMarket | -| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | Set in market config, by OPF Value = 0 (agreed etc.) | Set in market config, by ConsumeMarket | -| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT (agreed etc.) for all initial templates | | -| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | -| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | -| Download: COST_PER_MB | Set in Provider envvars, by OPF Value = 0 (agreed etc.) | Set in Provider envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 (agreed etc) | Set in OperatorEngine envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (agreed etc) (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | -| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | +| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | +| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | +| publishMarket: Pools | Set in market config, by OPF Value = 0 | Set in the market config, by the publishing market | +| publishMarket: FixedRate | Set in market config, by OPF Value = 0 | Set in the market config, by the publishing market | +| consumeMarket: Pools | Set in market config, by OPF Value = 0 | Set in market config, by consumeMarket | +| consumeMarket: FixedRate: ERC20Template | Hardcoded to 0 in contract | | +| consumeMarket: FixedRate: EnterpriseTemplate | Set in market config, by OPF Value = 0 | Set in market config, by consumeMarket | +| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | OPF gov can update in smart contract Value = 0.1% | | +| Ocean Community: Pools & FixedRate: other basetoken | OPF gov can update in smart contract Value = 0.2% | | +| Pool Liquidity Provider (LP): Pools only | Default 1%; Set by pool creator on contract deployment Min allowed (in contract) = 0.001% Min allowed (in Ocean Market) = 0.1% Max allowed (in contract) = 10% Min allowed (in Ocean Market) = 10% | | +| Publish Fees | | | +| (no publish fees) | - | - | +| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | +| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | Set in market config, by OPF Value = 0 | Set in market config, by PublishMarket | +| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | Set in market config, by OPF Value = 0 | Set in market config, by ConsumeMarket | +| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT for all initial templates | | +| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | +| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | +| Download: COST_PER_MB | Set in Provider envvars, by OPF Value = 0 | Set in Provider envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | +| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | ## Further reading From 73a10a79abca9a1238dbdadb9839b3b697b1fc8c Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:28:02 +0200 Subject: [PATCH 158/186] Issue:#849: Fees doc --- content/tutorials/marketplace-fees.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index bb49b597..79d4e831 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -5,7 +5,7 @@ description: The Ocean Protocol defines various fees for creating a sustainabili ## Path to sustainability -Ocean Protocol aims to be a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants are rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. +Ocean Protocol is a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants are rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. ## Fee types From a5e3e561d7eb7d962ba62bc996f515886471e6dc Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:31:27 +0200 Subject: [PATCH 159/186] Issue:#849: Marketplace doc --- content/tutorials/marketplace.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace.md b/content/tutorials/marketplace.md index 4f05b4df..2ae74d32 100644 --- a/content/tutorials/marketplace.md +++ b/content/tutorials/marketplace.md @@ -9,10 +9,10 @@ Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provider a web By doing so, developers can: -- Change the name of the marketplace. +- Change the source of the asset information. - Implement their own branding, style. - Change the source of asset information. -- Change fee address. +- Customise the fees ## Forking marketplace From 7db90f4b77f26ae6865cdee9ea2c141b2b2bfc41 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:37:32 +0200 Subject: [PATCH 160/186] Issue:#849: Marketplace doc --- content/tutorials/marketplace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/tutorials/marketplace.md b/content/tutorials/marketplace.md index 2ae74d32..2c55196d 100644 --- a/content/tutorials/marketplace.md +++ b/content/tutorials/marketplace.md @@ -5,7 +5,7 @@ description: ## About marketplace -Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provider a web interface for accessing assets published on the chain. By default, the assets are pulled from Aquarius hosted by Ocean Protocol. To extend the existing features of the marketplace, developers can fork the marketplace. +Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provides a web interface for accessing assets published on the chain. By default, the metadata of the assets are pulled from Aquarius hosted by Ocean Protocol. To extend the existing features of the marketplace, developers can fork the marketplace. By doing so, developers can: From a16b18cfa662cd3011fb1b0c3398c89fd4b81efb Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:41:26 +0200 Subject: [PATCH 161/186] Issue:#849: Marketplace doc --- content/tutorials/marketplace.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace.md b/content/tutorials/marketplace.md index 2c55196d..cd61c1cf 100644 --- a/content/tutorials/marketplace.md +++ b/content/tutorials/marketplace.md @@ -9,9 +9,9 @@ Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provides a web By doing so, developers can: +- Change the name of the marketplace. +- Implement their own branding and style. - Change the source of the asset information. -- Implement their own branding, style. -- Change the source of asset information. - Customise the fees ## Forking marketplace From 361a7b44d7548ae98aa2b7622831eaae1c9e302b Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 21:51:38 +0200 Subject: [PATCH 162/186] Issue:#849: Fees doc --- content/tutorials/marketplace-fees.md | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 79d4e831..4f4b0aa6 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -56,28 +56,28 @@ This fee incentivizes individuals and organizations to run their provider instan ## Fee values -| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | -| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | -| publishMarket: Pools | Set in market config, by OPF Value = 0 | Set in the market config, by the publishing market | -| publishMarket: FixedRate | Set in market config, by OPF Value = 0 | Set in the market config, by the publishing market | -| consumeMarket: Pools | Set in market config, by OPF Value = 0 | Set in market config, by consumeMarket | -| consumeMarket: FixedRate: ERC20Template | Hardcoded to 0 in contract | | -| consumeMarket: FixedRate: EnterpriseTemplate | Set in market config, by OPF Value = 0 | Set in market config, by consumeMarket | -| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | OPF gov can update in smart contract Value = 0.1% | | -| Ocean Community: Pools & FixedRate: other basetoken | OPF gov can update in smart contract Value = 0.2% | | -| Pool Liquidity Provider (LP): Pools only | Default 1%; Set by pool creator on contract deployment Min allowed (in contract) = 0.001% Min allowed (in Ocean Market) = 0.1% Max allowed (in contract) = 10% Min allowed (in Ocean Market) = 10% | | -| Publish Fees | | | -| (no publish fees) | - | - | -| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | -| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | Set in market config, by OPF Value = 0 | Set in market config, by PublishMarket | -| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | Set in market config, by OPF Value = 0 | Set in market config, by ConsumeMarket | -| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT for all initial templates | | -| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | -| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | -| Download: COST_PER_MB | Set in Provider envvars, by OPF Value = 0 | Set in Provider envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 60 secs max Value = 0 | Set in OperatorEngine envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | Set in OperatorEngine envvars, by OPF OPF Provider hardware setup: 1 cpu, 1 h max Value = 1.0 OCEAN / min (high cost incentivizes serious people to run their own provider) | Set in OperatorEngine envvars, by 3rd party running Provider | -| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | +| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | +| --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | +| publishMarket: Pools | 0 | Set in the market config, by the publishing market | +| publishMarket: FixedRate | 0 | Set in the market config, by the publishing market | +| consumeMarket: Pools | 0 | Set in market config, by consumeMarket | +| consumeMarket: FixedRate: ERC20Template | 0 | | +| consumeMarket: FixedRate: EnterpriseTemplate | 0 | Set in market config, by consumeMarket | +| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | 0.1% | | +| Ocean Community: Pools & FixedRate: other basetoken | 0.2% | | +| Pool Liquidity Provider (LP): Pools only | 1% and then the max and min values | | +| Publish Fees | | | +| (no publish fees) | - | - | +| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | +| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by PublishMarket | +| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by ConsumeMarket | +| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT for all initial templates | | +| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | +| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | +| Download: COST_PER_MB | 0 | Set in Provider envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars, by 3rd party running Provider | +| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | ## Further reading From 2a717c3ccc70f74b8ced3ae3e6d8d5e572b7b8de Mon Sep 17 00:00:00 2001 From: Akshay Date: Sun, 27 Mar 2022 22:04:02 +0200 Subject: [PATCH 163/186] Issue:#849: Fees doc --- content/tutorials/marketplace-fees.md | 44 +++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 4f4b0aa6..e4b6c1f5 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -56,28 +56,28 @@ This fee incentivizes individuals and organizations to run their provider instan ## Fee values -| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | -| --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | -| publishMarket: Pools | 0 | Set in the market config, by the publishing market | -| publishMarket: FixedRate | 0 | Set in the market config, by the publishing market | -| consumeMarket: Pools | 0 | Set in market config, by consumeMarket | -| consumeMarket: FixedRate: ERC20Template | 0 | | -| consumeMarket: FixedRate: EnterpriseTemplate | 0 | Set in market config, by consumeMarket | -| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | 0.1% | | -| Ocean Community: Pools & FixedRate: other basetoken | 0.2% | | -| Pool Liquidity Provider (LP): Pools only | 1% and then the max and min values | | -| Publish Fees | | | -| (no publish fees) | - | - | -| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | -| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by PublishMarket | -| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by ConsumeMarket | -| Ocean Community - Fee = fixed price in DT | Goal: to avoid wash consume in DF, assuming APY < 125%) OPF gov can update Value = 0.03 DT for all initial templates | | -| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | -| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | -| Download: COST_PER_MB | 0 | Set in Provider envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars, by 3rd party running Provider | -| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | +| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | +| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ | +| publishMarket: Pools | 0 | Set in the market config, by the publishing market | +| publishMarket: FixedRate | 0 | Set in the market config, by the publishing market | +| consumeMarket: Pools | 0 | Set in market config, by consumeMarket | +| consumeMarket: FixedRate: ERC20Template | 0 | | +| consumeMarket: FixedRate: EnterpriseTemplate | 0 | Set in market config, by consumeMarket | +| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | 0.1% | | +| Ocean Community: Pools & FixedRate: other basetoken | 0.2% | | +| Pool Liquidity Provider (LP): Pools only | 1% and then the max and min values | | +| Publish Fees | | | +| (no publish fees) | - | - | +| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | +| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by PublishMarket | +| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by ConsumeMarket | +| Ocean Community - Fee = fixed price in DT | 0.03 DT | | +| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | +| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | +| Download: COST_PER_MB | 0 | Set in Provider envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars, by 3rd party running Provider | +| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars, by 3rd party running Provider | +| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | ## Further reading From d3abe243c50e873f9ffaefe460778cf0c3b4d400 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Mon, 28 Mar 2022 12:52:29 +0300 Subject: [PATCH 164/186] Updated "Fee values" table and minor change on the "About marketplace" section --- content/tutorials/marketplace-fees.md | 39 +++++++++++++-------------- content/tutorials/marketplace.md | 2 +- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index e4b6c1f5..6e377de7 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -56,28 +56,27 @@ This fee incentivizes individuals and organizations to run their provider instan ## Fee values -| Swap Fees (Fixed Price or Auto) | Value in Ocean Market, using any Provider | Value in Other Markets | +| Swap Fees | Value in Ocean Market, using any Provider | Value in Other Markets | | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ | -| publishMarket: Pools | 0 | Set in the market config, by the publishing market | -| publishMarket: FixedRate | 0 | Set in the market config, by the publishing market | -| consumeMarket: Pools | 0 | Set in market config, by consumeMarket | -| consumeMarket: FixedRate: ERC20Template | 0 | | -| consumeMarket: FixedRate: EnterpriseTemplate | 0 | Set in market config, by consumeMarket | -| Ocean Community: Pools & FixedRate: basetoken is OCEAN, H2O, .. (“approved token”) | 0.1% | | -| Ocean Community: Pools & FixedRate: other basetoken | 0.2% | | -| Pool Liquidity Provider (LP): Pools only | 1% and then the max and min values | | -| Publish Fees | | | -| (no publish fees) | - | - | -| Order Fees (taken on order/consume) The consumer has 1.0 datatokens, they use it to get access to the dataset. | | | -| publishMarket - Fee is an absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by PublishMarket | -| consumeMarket - Fee is an absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by ConsumeMarket | -| Ocean Community - Fee = fixed price in DT | 0.03 DT | | -| Ocean Provider Fees | OPF-run Provider | 3rd party-run Provider | +| publishMarket: Pools | 0% | Set in the market config, by the publishing market. | +| publishMarket: FixedRate | 0% | Set in the market config, by the publishing market. | +| consumeMarket: Pools | 0% | Set in market config, by the consuming market. | +| consumeMarket: FixedRate
ERC20Template | 0% | 0% | +| consumeMarket: FixedRate
EnterpriseTemplate | 0% | Set in market config, by the consuming market. | +| Ocean Community: Pools & FixedRate
OCEAN, H2O as basetoken | 0.1% | 0.1% | +| Ocean Community: Pools & FixedRate
other basetoken | 0.2% | 0.2% | +| Pool Liquidity Provider (LP) | 1% | Set by the pool creator on contract deployment.
Min = 0.001%(contract) & 0.1%(market)
Max = 10%(contract & market) | +| Publish Fees | 0% | 0% | +| Order Fees
The consumer has 1.0 datatokens, they use it to get access to the dataset.
| | | +| publishMarket
Absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by the publishing market. | +| consumeMarket
Absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by the consuming market. | +| Ocean Community
Fixed price in DT | 0.03 DT | 0.03 DT | +| Ocean Provider Fees | OPF Provider | 3rd party Provider | | Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | -| Download: COST_PER_MB | 0 | Set in Provider envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars, by 3rd party running Provider | -| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars, by 3rd party running Provider | -| Ocean Community (percent from above) | OPF gov can update in smart contract 0% of Provider fee | | +| Download: `COST_PER_MB` | 0 | Set in Provider envvars. | +| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars. | +| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars. | +| Ocean Community | 0% of the Provider fee | 0% of the Provider fee | ## Further reading diff --git a/content/tutorials/marketplace.md b/content/tutorials/marketplace.md index cd61c1cf..89359c1e 100644 --- a/content/tutorials/marketplace.md +++ b/content/tutorials/marketplace.md @@ -5,7 +5,7 @@ description: ## About marketplace -Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provides a web interface for accessing assets published on the chain. By default, the metadata of the assets are pulled from Aquarius hosted by Ocean Protocol. To extend the existing features of the marketplace, developers can fork the marketplace. +Ocean Protocol's [marketplace](https://market.oceanprotocol.com/) provides a web interface for accessing assets published on the chain. By default, assets metadata is pulled from Aquarius, component hosted by Ocean Protocol. To extend the existing features of the marketplace, developers can fork the marketplace. By doing so, developers can: From 069a20b68fc645414d7a78dcf6a2a642950eee44 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Mon, 28 Mar 2022 13:45:10 +0300 Subject: [PATCH 165/186] Added environment to the compute: cost_per_min --- content/tutorials/marketplace-fees.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 6e377de7..e20988d2 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -74,8 +74,8 @@ This fee incentivizes individuals and organizations to run their provider instan | Ocean Provider Fees | OPF Provider | 3rd party Provider | | Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | | Download: `COST_PER_MB` | 0 | Set in Provider envvars. | -| Compute: `COST_PER_MIN` | 0 | Set in OperatorEngine envvars. | -| Compute: `COST_PER_MIN` | 1.0 OCEAN/min | Set in OperatorEngine envvars. | +| Compute: `COST_PER_MIN`
Environment: 1 CPU, 60 secs max | 0 | Set in OperatorEngine envvars. | +| Compute: `COST_PER_MIN`
Environment: 1 CPU, 1 hour max | 1.0 OCEAN/min | Set in OperatorEngine envvars. | | Ocean Community | 0% of the Provider fee | 0% of the Provider fee | ## Further reading From ac937436fb909c1883ebef903bbef2c44d9838e2 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Tue, 29 Mar 2022 17:55:22 +0300 Subject: [PATCH 166/186] Updated fees table with min and max values, adjuted the UI of the table and changed "basetoken" to "base token" --- content/tutorials/marketplace-fees.md | 52 +++++++++++++-------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index e20988d2..56667abb 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -11,8 +11,8 @@ Ocean Protocol is a community-driven project. Through OceanDAO, the project aims ### Swap fee -Swap fees are collected whenever someone swaps a datatoken for basetoken (e.g., OCEAN) or basetoken for datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. -These are the fees that are applied whenever a user swaps basetoken or datatoken: +Swap fees are collected whenever someone swaps a datatoken for base token (e.g., OCEAN) or base token for datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. +These are the fees that are applied whenever a user swaps base token or datatoken: - Publisher Marketplace swap fee - Consumer Marketplace swap fee @@ -40,15 +40,15 @@ The following fees apply to the consumption of data assets as a part of Consume ### Ocean Community fee -Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently, this fee is set to 0 (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. +Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently, this fee is set to 0.1% (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. -Whereas a fee of 0.1% is applicable on all swaps using another token as the base token. +Whereas a fee of 0.2% is applicable on all swaps using another token as the base token. ### Provider fee Provider is a component of Ocean Protocol's ecosystem which facilitates data consumption, starts compute jobs, encrypts DDOs, and decrypts DDOs. Provider also validates if the user can access a particular data asset or service. To know more about Provider, click [here](https://github.com/oceanprotocol/provider). -Provider fees are paid to the individual or organization running their Provider instance whenever a user consumes a data asset or swaps a datatoken for a basetoken. These fees can be set to an absolute amount, and the receiver can also decide which token to receive the fees in - they don't have to be in the same currency used in the consuming market. +Provider fees are paid to the individual or organization running their Provider instance whenever a user consumes a data asset or swaps a datatoken for a base token. These fees can be set to an absolute amount, and the receiver can also decide which token to receive the fees in - they don't have to be in the same currency used in the consuming market. Provider fee can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount to pay according to their needs. @@ -56,27 +56,27 @@ This fee incentivizes individuals and organizations to run their provider instan ## Fee values -| Swap Fees | Value in Ocean Market, using any Provider | Value in Other Markets | -| --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------------ | -| publishMarket: Pools | 0% | Set in the market config, by the publishing market. | -| publishMarket: FixedRate | 0% | Set in the market config, by the publishing market. | -| consumeMarket: Pools | 0% | Set in market config, by the consuming market. | -| consumeMarket: FixedRate
ERC20Template | 0% | 0% | -| consumeMarket: FixedRate
EnterpriseTemplate | 0% | Set in market config, by the consuming market. | -| Ocean Community: Pools & FixedRate
OCEAN, H2O as basetoken | 0.1% | 0.1% | -| Ocean Community: Pools & FixedRate
other basetoken | 0.2% | 0.2% | -| Pool Liquidity Provider (LP) | 1% | Set by the pool creator on contract deployment.
Min = 0.001%(contract) & 0.1%(market)
Max = 10%(contract & market) | -| Publish Fees | 0% | 0% | -| Order Fees
The consumer has 1.0 datatokens, they use it to get access to the dataset.
| | | -| publishMarket
Absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by the publishing market. | -| consumeMarket
Absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by the consuming market. | -| Ocean Community
Fixed price in DT | 0.03 DT | 0.03 DT | -| Ocean Provider Fees | OPF Provider | 3rd party Provider | -| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | -| Download: `COST_PER_MB` | 0 | Set in Provider envvars. | -| Compute: `COST_PER_MIN`
Environment: 1 CPU, 60 secs max | 0 | Set in OperatorEngine envvars. | -| Compute: `COST_PER_MIN`
Environment: 1 CPU, 1 hour max | 1.0 OCEAN/min | Set in OperatorEngine envvars. | -| Ocean Community | 0% of the Provider fee | 0% of the Provider fee | +| Swap Fees | Value in Ocean Market, using any Provider | Value in Other Markets | +| :------------------------------------------------------------ | :----------------------------------------:| :----------------------------------------------------------------------------------------------------------------------------------------------- | +| publishMarket: Pools | 0% | Set in the market config, by the publishing market.
Min = 0.001%
Max = 10% | +| publishMarket: FixedRate | 0% | Set in the market config, by the publishing market.
Min = 0.001%
Max = 50% | +| consumeMarket: Pools | 0% | Set in market config, by the consuming market.
Min = 0.001%
Max = 10% | +| consumeMarket: FixedRate
ERC20Template | 0% | 0% | +| consumeMarket: FixedRate
EnterpriseTemplate | 0% | Set in market config, by the consuming market. | +| Ocean Community: Pools & FixedRate
OCEAN, H2O as base token| 0.1% | 0.1% | +| Ocean Community: Pools & FixedRate
other base token | 0.2% | 0.2% | +| Pool Liquidity Provider (LP) | 1% | Set by the pool creator on contract deployment.
Contracts
Min = 0.001%
Max = 10%
Market
Min = 0.1%
Max = 10%| +| Publish Fees | 0% | 0% | +| Order Fees
1 datatoken available to get dataset acces | | | +| publishMarket
Absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by the publishing market. | +| consumeMarket
Absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by the consuming market. | +| Ocean Community
Fixed price in DT | 0.03 DT | 0.03 DT | +| Ocean Provider Fees | OPF Provider | 3rd party Provider | +| Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | +| Download: `COST_PER_MB` | 0 | Set in Provider envvars. | +| Compute: `COST_PER_MIN`
Environment: 1 CPU, 60 secs max | 0 | Set in OperatorEngine envvars. | +| Compute: `COST_PER_MIN`
Environment: 1 CPU, 1 hour max | 1.0 OCEAN/min | Set in OperatorEngine envvars. | +| Ocean Community | 0% of the Provider fee | 0% of the Provider fee | ## Further reading From da65fbccd57f1d83e05d865a769aa443f688fc12 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Wed, 30 Mar 2022 11:10:05 +0300 Subject: [PATCH 167/186] Updated "Fees" document based on the PR feedback --- content/tutorials/marketplace-fees.md | 30 ++++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 56667abb..0a0228fd 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -5,13 +5,17 @@ description: The Ocean Protocol defines various fees for creating a sustainabili ## Path to sustainability -Ocean Protocol is a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants are rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. +Ocean Protocol achieves sustainability via the [Web3 sustainability loop](https://blog.oceanprotocol.com/the-web3-sustainability-loop-b2a4097a36e). +- The project grows and improves through the efforts of OceanDAO grant recipients. +- The OceanDAO votes to decide which proposals receive grants. +- Grant funds are sourced from the Ocean Protocol community treasury. +- The Ocean Protocol community collects fees when users interact with the protocol, thus completing the sustainability loop. ## Fee types ### Swap fee -Swap fees are collected whenever someone swaps a datatoken for base token (e.g., OCEAN) or base token for datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. +Swap fees are collected whenever someone swaps a datatoken the base token (e.g., OCEAN) or base token for a datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. These are the fees that are applied whenever a user swaps base token or datatoken: - Publisher Marketplace swap fee @@ -21,17 +25,17 @@ These are the fees that are applied whenever a user swaps base token or datatoke ### Publish fee -Publish fees will be charged to a publisher when they publish an asset. +Publish fees can be charged to a publisher when they publish an asset. -Currently, no fees are applicable in Ocean's default marketplace. However, it is possible to charge a publishing fee in the custom marketplace by adding an extra transaction in the publish flow. +Currently, the Ocean marketplace does not charge a publishing fee. Custom marketplaces can charge a publishing fee by adding an extra transaction in the publish flow. Based on the use case of the marketplace, the marketplace owner can decide if this fee should be charged or not. ### Consume fee -Consume fee is charged when a user holding datatoken exchanges it for a compute service, downloading a data asset or an algorithm. +Consume fees (aka. Order fees) are charged when a user holding a datatoken exchanges it for the right to download an asset or to start a compute job that uses the asset. -The following fees apply to the consumption of data assets as a part of Consume fee: +These are the fees that are applied whenever a user consumes an asset: - Consume Market Consumption Fee - Publisher Market Consumption Fee @@ -40,19 +44,21 @@ The following fees apply to the consumption of data assets as a part of Consume ### Ocean Community fee -Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently, this fee is set to 0.1% (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. +Ocean's smart contracts collect **Ocean Community fees** during swap and order operations. These fees are reinvested in community projects via OceanDAO and other initiatives. -Whereas a fee of 0.2% is applicable on all swaps using another token as the base token. +For swaps involving approved base tokens like OCEAN and H2O, the Ocean Community swap fee is 0.1%. For swaps involving other base tokens, the Ocean Community swap fee is 0.2%. The Ocean Community order fee is 0.3 DT per order operation. + +These fees can be updated by the Ocean Protocol Foundation. ### Provider fee -Provider is a component of Ocean Protocol's ecosystem which facilitates data consumption, starts compute jobs, encrypts DDOs, and decrypts DDOs. Provider also validates if the user can access a particular data asset or service. To know more about Provider, click [here](https://github.com/oceanprotocol/provider). +Provider is a component of Ocean Protocol's ecosystem that facilitates data consumption, starts compute jobs, encrypts DDOs, and decrypts DDOs. Provider also validates if the user can access a particular data asset or service. To learn more about Provider, click [here](https://github.com/oceanprotocol/provider). -Provider fees are paid to the individual or organization running their Provider instance whenever a user consumes a data asset or swaps a datatoken for a base token. These fees can be set to an absolute amount, and the receiver can also decide which token to receive the fees in - they don't have to be in the same currency used in the consuming market. +Provider fees are paid to the individual or organization running their Provider instance when the user orders an asset. These fees can be set to an absolute amount, not as a percentage. The provider can also specify which token the fees must be paid in - they don't have to be the same token used in the consuming market. -Provider fee can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount to pay according to their needs. +Provider fees can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount to pay according to their needs. -This fee incentivizes individuals and organizations to run their provider instances and charge consumers according to resource usage. +These fees incentivize individuals and organizations to run their provider instances and charge consumers according to resource usage. ## Fee values From c7f1b0ffefd7e17e2129f47abaf4b68cb01ca8c3 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 30 Mar 2022 10:19:16 +0200 Subject: [PATCH 168/186] Issue-#921: Include pre-release --- gatsby-node.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/gatsby-node.js b/gatsby-node.js index 3c455867..f219ea77 100755 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -193,10 +193,7 @@ exports.createPages = ({ graphql, actions }) => { // API: ocean.js const lastRelease = result.data.oceanJs.repository.releases.edges.filter( - ({ node }) => - !node.isPrerelease && - !node.isDraft && - node.releaseAssets.edges.length > 0 + ({ node }) => !node.isDraft && node.releaseAssets.edges.length > 0 )[0].node.releaseAssets.edges[0].node await createTypeDocPage( From 7ad5c5efba9ad86a190b55414de74a7600ab4fb5 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 30 Mar 2022 10:21:57 +0200 Subject: [PATCH 169/186] Issue-#849: Fix lint issues --- content/tutorials/marketplace-fees.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 0a0228fd..b3a4639a 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -6,6 +6,7 @@ description: The Ocean Protocol defines various fees for creating a sustainabili ## Path to sustainability Ocean Protocol achieves sustainability via the [Web3 sustainability loop](https://blog.oceanprotocol.com/the-web3-sustainability-loop-b2a4097a36e). + - The project grows and improves through the efforts of OceanDAO grant recipients. - The OceanDAO votes to decide which proposals receive grants. - Grant funds are sourced from the Ocean Protocol community treasury. @@ -44,9 +45,9 @@ These are the fees that are applied whenever a user consumes an asset: ### Ocean Community fee -Ocean's smart contracts collect **Ocean Community fees** during swap and order operations. These fees are reinvested in community projects via OceanDAO and other initiatives. +Ocean's smart contracts collect **Ocean Community fees** during swap and order operations. These fees are reinvested in community projects via OceanDAO and other initiatives. -For swaps involving approved base tokens like OCEAN and H2O, the Ocean Community swap fee is 0.1%. For swaps involving other base tokens, the Ocean Community swap fee is 0.2%. The Ocean Community order fee is 0.3 DT per order operation. +For swaps involving approved base tokens like OCEAN and H2O, the Ocean Community swap fee is 0.1%. For swaps involving other base tokens, the Ocean Community swap fee is 0.2%. The Ocean Community order fee is 0.3 DT per order operation. These fees can be updated by the Ocean Protocol Foundation. From ab3325b732a1c4f0f23a5ea1a62b69415d2b28df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:51:05 +0100 Subject: [PATCH 171/186] Bump simple-get from 3.1.0 to 3.1.1 (#883) Bumps [simple-get](https://github.com/feross/simple-get) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/feross/simple-get/releases) - [Commits](https://github.com/feross/simple-get/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: simple-get dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b9084bc..38b8c6d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20650,9 +20650,9 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -22940,9 +22940,9 @@ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.0.tgz", - "integrity": "sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", "requires": { "decompress-response": "^6.0.0", "once": "^1.3.1", From 63e8ff7d29f5732e11eaf58b8a0ce8735e76f40b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:51:20 +0100 Subject: [PATCH 172/186] Bump ajv from 6.12.0 to 6.12.6 (#889) Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.0 to 6.12.6. - [Release notes](https://github.com/ajv-validator/ajv/releases) - [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.0...v6.12.6) --- updated-dependencies: - dependency-name: ajv dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 38b8c6d3..f30d3eda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3177,18 +3177,6 @@ "strip-json-comments": "^3.1.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "globals": { "version": "13.11.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", @@ -5158,9 +5146,9 @@ } }, "ajv": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", - "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -9870,9 +9858,9 @@ }, "dependencies": { "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -22532,17 +22520,6 @@ "semver": "^7.3.2" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -22585,19 +22562,6 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - } } }, "scss-tokenizer": { From a91ceefe77adf499d0caaa648c6753de911a0810 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:51:37 +0100 Subject: [PATCH 173/186] Bump url-parse from 1.5.3 to 1.5.10 (#905) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.3 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.3...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index f30d3eda..ff6e5716 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25147,9 +25147,9 @@ } }, "url-parse": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", - "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" From 3628d7cb03c8cb8c0c7794f79a16f267f2d18d86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:51:53 +0100 Subject: [PATCH 174/186] Bump axios from 0.25.0 to 0.26.1 (#920) Bumps [axios](https://github.com/axios/axios) from 0.25.0 to 0.26.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.25.0...v0.26.1) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 15 +++++++++++---- package.json | 2 +- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff6e5716..d6149904 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5786,11 +5786,18 @@ "integrity": "sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg==" }, "axios": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", - "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", "requires": { - "follow-redirects": "^1.14.7" + "follow-redirects": "^1.14.8" + }, + "dependencies": { + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + } } }, "axobject-query": { diff --git a/package.json b/package.json index 657759b7..1d172a1a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ }, "dependencies": { "@oceanprotocol/art": "^3.2.0", - "axios": "^0.25.0", + "axios": "^0.26.1", "classnames": "^2.3.1", "gatsby": "^2.32.13", "gatsby-image": "^3.11.0", From 866f9766239f7be0070be111ff1bbeeb41d52ae4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:52:10 +0100 Subject: [PATCH 175/186] Bump follow-redirects from 1.14.7 to 1.14.9 (#927) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.7 to 1.14.9. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.7...v1.14.9) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index d6149904..139ed58d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11389,9 +11389,9 @@ } }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "for-in": { "version": "1.0.2", From fc965355a64f1277f73842b2f106079b6420abb8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:52:24 +0100 Subject: [PATCH 176/186] Bump minimist from 1.2.5 to 1.2.6 (#928) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 139ed58d..fecc84e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18359,9 +18359,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "3.1.3", From 180b0d800bd4a5f95e268df559c40324a8bd334d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 30 Mar 2022 10:52:39 +0100 Subject: [PATCH 177/186] Bump plist from 3.0.4 to 3.0.5 (#929) Bumps [plist](https://github.com/TooTallNate/node-plist) from 3.0.4 to 3.0.5. - [Release notes](https://github.com/TooTallNate/node-plist/releases) - [Changelog](https://github.com/TooTallNate/plist.js/blob/master/History.md) - [Commits](https://github.com/TooTallNate/node-plist/commits) --- updated-dependencies: - dependency-name: plist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fecc84e6..d954438b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19867,9 +19867,9 @@ } }, "plist": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", - "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { "base64-js": "^1.5.1", "xmlbuilder": "^9.0.7" From dbf607493f36f8fb0bf9cabd49a2012dabebf7d9 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 30 Mar 2022 11:17:34 +0100 Subject: [PATCH 178/186] limit test runs, fix TOC --- .github/workflows/ci.yml | 3 ++- docs/apis.md | 6 +++--- docs/github.md | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1902cd7..4cc07b5b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,7 +3,8 @@ name: 'CI' on: push: branches: - - '**' + - main + - v4 pull_request: branches: - '**' diff --git a/docs/apis.md b/docs/apis.md index 2881bf1e..0b276e77 100644 --- a/docs/apis.md +++ b/docs/apis.md @@ -1,8 +1,8 @@ # API References -- [Overview](#Overview) -- [Swagger specs](#Swagger-specs) -- [TypeDoc specs](#TypeDoc-specs) +- [Overview](#overview) +- [Swagger specs](#swagger-specs) +- [TypeDoc specs](#typedoc-specs) ## Overview diff --git a/docs/github.md b/docs/github.md index 525e956c..042a42f7 100644 --- a/docs/github.md +++ b/docs/github.md @@ -1,8 +1,8 @@ # GitHub Data Fetching -- [Overview](#Overview) -- [GitHub GraphQL API](#GitHub-GraphQL-API) -- [GitHub REST API](#GitHub-REST-API) +- [Overview](#overview) +- [GitHub GraphQL API](#github-graphql-api) +- [GitHub REST API](#github-rest-api) ## Overview From 680fbce9dffceaa787d62368129e472197473e16 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 30 Mar 2022 11:26:26 +0100 Subject: [PATCH 179/186] bump markdownlint-cli --- content/tutorials/azure-for-provider.md | 4 +- content/tutorials/on-premise-for-provider.md | 3 +- package-lock.json | 360 +++++++++++-------- package.json | 4 +- 4 files changed, 224 insertions(+), 147 deletions(-) diff --git a/content/tutorials/azure-for-provider.md b/content/tutorials/azure-for-provider.md index 1dd3169e..fef6efaf 100644 --- a/content/tutorials/azure-for-provider.md +++ b/content/tutorials/azure-for-provider.md @@ -2,7 +2,8 @@ title: Set Up Azure Storage description: Tutorial about how to set up Azure storage for use with Ocean. --- -*Note: This needs updating for Ocean V3.* + +_Note: This needs updating for Ocean V3._ This tutorial is for publishers who want to get started using Azure to store some of their data assets. (Some data assets could also be stored in other places.) @@ -174,4 +175,3 @@ You now have a storage account, but you don't have any data stored under it yet. Azure Storage can store blobs, files, queues and tables. To work with Ocean Network, you should store your files in [Azure Blob storage (also called object storage)](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction), not Azure Files. Besides Azure Storage Explorer, there are [many other Azure Storage APIs, libraries and tools](https://docs.microsoft.com/en-us/azure/storage/common/storage-introduction#storage-apis-libraries-and-tools). - diff --git a/content/tutorials/on-premise-for-provider.md b/content/tutorials/on-premise-for-provider.md index a3d26825..e78dbc40 100644 --- a/content/tutorials/on-premise-for-provider.md +++ b/content/tutorials/on-premise-for-provider.md @@ -2,7 +2,8 @@ title: Set Up On-Premise Storage description: Tutorial about how to set up on-premise storage for use with Ocean. --- -*Note: This needs updating for Ocean V3.* + +_Note: This needs updating for Ocean V3._ To enable Provider to use files stored in on-premise storage (i.e. files with an URL not containing `core.windows.net` or `s3://`), there is _nothing to do, other than make sure Provider can resolve the URLs_. In particular, you don't have to set any Provider-specific configuration settings, e.g. in the `[osmosis]` section of the Provider config file or in some special Provider environment variables. diff --git a/package-lock.json b/package-lock.json index d954438b..878e2253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3561,10 +3561,7 @@ "cross-fetch": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", - "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", - "requires": { - "node-fetch": "2.6.1" - } + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==" }, "form-data": { "version": "4.0.0", @@ -5183,34 +5180,44 @@ "integrity": "sha512-4g5Np4CVD3c5c/36Mj0jllEA5bQcuXF0dqakZcuHGeubBzw93EAhwRuQCzgFm4/ZwvyBMzFdtn9BcihOjnxIdQ==" }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -6576,8 +6583,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "ansi-styles": { "version": "4.3.0", @@ -6991,9 +6997,9 @@ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" } } }, @@ -7799,8 +7805,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "ansi-styles": { "version": "4.3.0", @@ -8035,6 +8040,13 @@ "integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==", "requires": { "node-fetch": "2.6.1" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + } } }, "cross-spawn": { @@ -9565,9 +9577,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "astral-regex": { @@ -9984,9 +9996,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -11786,8 +11798,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "strip-ansi": { "version": "6.0.0", @@ -12177,6 +12188,14 @@ "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } } } }, @@ -12462,8 +12481,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "strip-ansi": { "version": "6.0.0", @@ -12533,8 +12551,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "ansi-styles": { "version": "4.3.0", @@ -13350,9 +13367,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "debug": { "version": "4.3.1", @@ -14656,9 +14673,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -15968,9 +15985,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.2.1", @@ -16829,9 +16846,9 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { @@ -16882,14 +16899,14 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -17147,12 +17164,6 @@ "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" }, - "lodash.differencewith": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.differencewith/-/lodash.differencewith-4.5.0.tgz", - "integrity": "sha1-uvr7yRi1UVTheRdqALsK76rIVLc=", - "dev": true - }, "lodash.every": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz", @@ -17393,9 +17404,9 @@ "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" }, "markdown-it": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", - "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", "dev": true, "requires": { "argparse": "^2.0.1", @@ -17428,33 +17439,29 @@ } }, "markdownlint": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.24.0.tgz", - "integrity": "sha512-OJIGsGFV/rC9irI5E1FMy6v9hdACSwaa+EN3224Y5KG8zj2EYzdHOw0pOJovIYmjNfEZ9BtxUY4P7uYHTSNnbQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz", + "integrity": "sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==", "dev": true, "requires": { - "markdown-it": "12.2.0" + "markdown-it": "12.3.2" } }, "markdownlint-cli": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.30.0.tgz", - "integrity": "sha512-NiG8iERjwsRZtJAIyLMDdYL2O3bJVn3fUxzDl+6Iv61/YYz9H9Nzgke/v0/cW9HfGvgZHhbfI19LFMp6gbKdyw==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.31.1.tgz", + "integrity": "sha512-keIOMwQn+Ch7MoBwA+TdkyVMuxAeZFEGmIIlvwgV0Z1TGS5MxPnRr29XCLhkNzCHU+uNKGjU+VEjLX+Z9kli6g==", "dev": true, "requires": { - "commander": "~8.3.0", - "deep-extend": "~0.6.0", - "get-stdin": "~8.0.0", + "commander": "~9.0.0", + "get-stdin": "~9.0.0", "glob": "~7.2.0", - "ignore": "~5.1.9", + "ignore": "~5.2.0", "js-yaml": "^4.1.0", "jsonc-parser": "~3.0.0", - "lodash.differencewith": "~4.5.0", - "lodash.flatten": "~4.4.0", - "markdownlint": "~0.24.0", - "markdownlint-rule-helpers": "~0.15.0", - "minimatch": "~3.0.4", - "minimist": "~1.2.5", + "markdownlint": "~0.25.1", + "markdownlint-rule-helpers": "~0.16.0", + "minimatch": "~3.0.5", "run-con": "~1.2.10" }, "dependencies": { @@ -17465,15 +17472,15 @@ "dev": true }, "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz", + "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==", "dev": true }, "get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true }, "glob": { @@ -17491,9 +17498,9 @@ } }, "ignore": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", - "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "js-yaml": { @@ -17504,13 +17511,22 @@ "requires": { "argparse": "^2.0.1" } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, "markdownlint-rule-helpers": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.15.0.tgz", - "integrity": "sha512-A+9mswc3m/kkqpJCqntmte/1VKhDJ+tjZsERLz5L4h/Qr7ht2/BkGkgY5E7/wsxIhcpl+ctIfz+oS3PQrMOB2w==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz", + "integrity": "sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w==", "dev": true }, "md5-file": { @@ -18503,13 +18519,12 @@ } }, "mozjpeg": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.0.0.tgz", - "integrity": "sha512-mH7atSbIusVTO3A4H43sEdmveN3aWn54k6V0edefzCEvOsTrbjg5murY2TsNznaztWnIgaRbWxeLVp4IgKdedQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-7.1.1.tgz", + "integrity": "sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==", "requires": { "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "logalot": "^2.1.0" + "bin-wrapper": "^4.0.0" } }, "ms": { @@ -18677,9 +18692,12 @@ "integrity": "sha1-n7CwmbzSoCGUDmA8ZCVNwAPZp6g=" }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } }, "node-forge": { "version": "0.10.0", @@ -19821,6 +19839,11 @@ "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA=" }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, "picomatch": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", @@ -19945,27 +19968,18 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" }, "postcss": { - "version": "7.0.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", - "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "picocolors": "^0.2.1", + "source-map": "^0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -20668,9 +20682,9 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "prettier": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", - "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", + "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==" }, "prettier-linter-helpers": { "version": "1.0.0", @@ -20714,9 +20728,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -22042,21 +22056,85 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" }, "dependencies": { - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.0.1.tgz", + "integrity": "sha512-z93ZGFLNc6yaoXAmVhqoSIb+BduplteCt1fepvwhBUQK6MNE4g6fgjpuZKJKp0esUe+vXWlIkwZZjNWoOKw0ZA==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" + } } } }, @@ -24965,8 +25043,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "ansi-styles": { "version": "4.3.0", @@ -26422,11 +26499,11 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "widest-line": { @@ -26439,8 +26516,7 @@ "dependencies": { "ansi-regex": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved": "" }, "emoji-regex": { "version": "8.0.0", diff --git a/package.json b/package.json index 1d172a1a..18e2eaa3 100644 --- a/package.json +++ b/package.json @@ -73,10 +73,10 @@ "eslint-plugin-prettier": "^4.0.0", "git-format-staged": "^2.1.3", "husky": "^7.0.4", - "markdownlint-cli": "^0.30.0", + "markdownlint-cli": "^0.31.1", "node-sass": "^5.0.0", "npm-run-all": "^4.1.5", - "prettier": "^2.5.1" + "prettier": "^2.6.1" }, "repository": { "type": "git", From 99a5cbabd319ab88929c9210a1d70c066f2f6c2a Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 30 Mar 2022 11:40:13 +0100 Subject: [PATCH 180/186] fix markdown test maybe --- docs/github.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/github.md b/docs/github.md index 042a42f7..7bb3b6b4 100644 --- a/docs/github.md +++ b/docs/github.md @@ -22,8 +22,7 @@ For local development, you can simply [create a personal access token](https://g ```bash cp .env.sample .env -vi .env -# GITHUB_TOKEN=add_your_token_here +vi .env # GITHUB_TOKEN=add_your_token_here ``` When running the site locally, you can use the GraphiQL client running under [localhost:8000/\_\_\_graphql](http://localhost:8000/___graphql) to explore the whole GraphQL layer of the site (not just the GitHub infos). From e1440f16ffe45d41c07f83f541d7e33f5f6ac58c Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Wed, 30 Mar 2022 14:21:33 +0300 Subject: [PATCH 181/186] Updated contracts address.json file link --- content/concepts/networks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/networks.md b/content/concepts/networks.md index 14a95de3..d68358b4 100644 --- a/content/concepts/networks.md +++ b/content/concepts/networks.md @@ -3,7 +3,7 @@ title: Supported Networks description: All the public networks the Ocean Protocol contracts are deployed to, and additional core components deployed to them. --- -Ocean Protocol contracts are deployed on multiple public networks. You can always find the most up-to-date deployment addresses for all individual contracts in the [address.json](https://github.com/oceanprotocol/contracts/blob/master/artifacts/address.json) artifact. +Ocean Protocol contracts are deployed on multiple public networks. You can always find the most up-to-date deployment addresses for all individual contracts in the [address.json](https://github.com/oceanprotocol/contracts/blob/v4main/addresses/address.json). In each network, you’ll need ETH to pay for gas, and OCEAN for certain Ocean actions. Because the Ethereum mainnet is a network for production settings, ETH and OCEAN tokens have real value on there. The ETH and OCEAN tokens in each test network don’t have real value and are used for testing-purposes only. They can be obtained with _faucets_ to dole out ETH and OCEAN. From 47c0a76474fe6c297e447783e8bb96ff89728893 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Wed, 30 Mar 2022 15:10:14 +0300 Subject: [PATCH 182/186] Added disclaimer of fee tables values and split the table in two based on the header options --- content/tutorials/marketplace-fees.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index b3a4639a..af439724 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -16,7 +16,7 @@ Ocean Protocol achieves sustainability via the [Web3 sustainability loop](https: ### Swap fee -Swap fees are collected whenever someone swaps a datatoken the base token (e.g., OCEAN) or base token for a datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. +Swap fees are collected whenever someone swaps a datatoken for base token (e.g., OCEAN) or base token for a datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. These are the fees that are applied whenever a user swaps base token or datatoken: - Publisher Marketplace swap fee @@ -63,6 +63,8 @@ These fees incentivize individuals and organizations to run their provider insta ## Fee values +The table is periodically updated. Users are advised to confirm new values through the [contracts](https://github.com/oceanprotocol/contracts) and the [market](https://github.com/oceanprotocol/market). + | Swap Fees | Value in Ocean Market, using any Provider | Value in Other Markets | | :------------------------------------------------------------ | :----------------------------------------:| :----------------------------------------------------------------------------------------------------------------------------------------------- | | publishMarket: Pools | 0% | Set in the market config, by the publishing market.
Min = 0.001%
Max = 10% | @@ -78,7 +80,9 @@ These fees incentivize individuals and organizations to run their provider insta | publishMarket
Absolute value, in any token. E.g. 5 USDT | 0 | Set in market config, by the publishing market. | | consumeMarket
Absolute value, in any token. E.g. 2 DAI | 0 | Set in market config, by the consuming market. | | Ocean Community
Fixed price in DT | 0.03 DT | 0.03 DT | -| Ocean Provider Fees | OPF Provider | 3rd party Provider | + +| Ocean Provider Fees | OPF Provider | 3rd party Provider | +| :------------------------------------------------------------ | :----------------------------------------:| :----------------------------------------------------------------------------------------------------------------------------------------------- | | Token in which fee is charged: `PROVIDER_FEE_TOKEN` | OCEAN | E.g. USDC | | Download: `COST_PER_MB` | 0 | Set in Provider envvars. | | Compute: `COST_PER_MIN`
Environment: 1 CPU, 60 secs max | 0 | Set in OperatorEngine envvars. | From 99a8314c2725a88a33440ae9ec471f7ffb4d2492 Mon Sep 17 00:00:00 2001 From: Akshay Date: Wed, 30 Mar 2022 14:23:47 +0200 Subject: [PATCH 183/186] Issue:#934: Introduction page content --- content/concepts/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index 15985e4f..e9a57d82 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -3,7 +3,7 @@ title: Introduction description: Ocean Protocol - Tools for the Web3 Data Economy --- -In Ocean Protocol, each data service gets its own ERC721 **data NFT** and one or more ERC20 **datatokens**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. +In Ocean Protocol, each asset gets its own ERC721 **data NFT** and one(or more) ERC20 **datatokens**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. OCEAN token is used for staking, and more. [Here](https://oceanprotocol.com/token) are details. From fcaf69f37b4d919a3036d0a6086e3e718743c50d Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Thu, 31 Mar 2022 10:10:17 +0300 Subject: [PATCH 184/186] Fix linter issues --- .markdownlint.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.markdownlint.json b/.markdownlint.json index 6c7ee37e..c5d00817 100644 --- a/.markdownlint.json +++ b/.markdownlint.json @@ -11,5 +11,6 @@ "no-trailing-punctuation": false, "ol-prefix": false, "ul-style": { "style": "dash" }, - "no-emphasis-as-header": false + "no-emphasis-as-header": false, + "blanks-around-fences": false } From f0272026e086b8ce57187255d0bf0553ef5e8123 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Thu, 31 Mar 2022 10:49:26 +0300 Subject: [PATCH 185/186] Minor Cleanup. Data NFT and Datatoken caps when is necessary --- content/concepts/architecture.md | 8 ++++---- content/concepts/datanft-and-datatoken.md | 10 +++++----- content/concepts/introduction.md | 2 +- content/concepts/roles.md | 2 +- content/tutorials/marketplace-publish-data-asset.md | 4 ++-- content/tutorials/marketplace-swap-and-stake.md | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index ef874097..92142f83 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -1,6 +1,6 @@ --- title: Architecture Overview -description: Data NFTs and Datatokens architecture +description: Data NFTs and datatokens architecture --- ## Overview @@ -20,10 +20,10 @@ Here’s an overview of the figure. ## Data NFTs, Datatokens and Access Control Tools -Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new Data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each Datatoken contract is associated with one Data NFT contract. -Click [here](/concepts/datanft-and-datatoken/) to further read about Data NFTs and datatokens. +Data NFTs are based on [ERC721](https://eips.ethereum.org/EIPS/eip-721) standard. The publisher can use Marketplace or client libraries to deploy a new data NFT contract. To save gas fees, it uses [ERC1167](https://eips.ethereum.org/EIPS/eip-1167) proxy approach on the **ERC721 template**. Publisher can then assign manager role to other Ethereum addresses who can deploy new datatoken contracts and even mint them. Each datatoken contract is associated with one data NFT contract. +Click [here](/concepts/datanft-and-datatoken/) to further read about data NFTs and datatokens. -ERC721 Data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. +ERC721 data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the data asset. Datatoken represents the asset that the publisher wants to monetize. The asset can be a dataset or an algorithm. The publisher actor holds the asset in Google Drive, Dropbox, AWS S3, on their phone, on their home server, etc. The publisher can optionally use IPFS for a content-addressable URL. Or instead of a file, the publisher may run a compute-to-data service. diff --git a/content/concepts/datanft-and-datatoken.md b/content/concepts/datanft-and-datatoken.md index 1090bb29..7dce5d01 100644 --- a/content/concepts/datanft-and-datatoken.md +++ b/content/concepts/datanft-and-datatoken.md @@ -1,20 +1,20 @@ --- title: Data NFTs and Datatokens -description: In Ocean Protocol, ERC721 Data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. +description: In Ocean Protocol, ERC721 data NFTs represent holding copyright/base IP of a data asset, and ERC20 datatokens represent licenses to consume the assets. --- A non-fungible token stored on the blockchain represents a unique asset. NFTs can represent images, videos, digital art, or any piece of information. NFTs can be traded, and allow transfer of copyright/base IP. [EIP-721](https://eips.ethereum.org/EIPS/eip-721) defines an interface for handling NFTs on EVM-compatible blockchains. The creator of the NFT can deploy a new contract on Ethereum or any Blockchain supporting NFT related interface and also, transfer the ownership of copyright/base IP through transfer transactions. Fungible tokens represent fungible assets. If you have 5 ETH and Alice has 5 ETH, you and Alice could swap your ETH and your final holdings remain the same. They're apples-to-apples. Licenses (contracts) to consume a copyrighted asset are naturally fungible - they can be swapped with each other. -![Data NFT and Datatoken](images/datanft-and-datatoken.png) +![Data NFT and datatoken](images/datanft-and-datatoken.png) ## High-Level Architecture -The image above describes how ERC721 Data NFTs, ERC20 datatokens, and AMMs relate. +The image above describes how ERC721 data NFTs, ERC20 datatokens, and AMMs relate. -- Bottom: The publisher deploys an ERC721 Data NFT contract representing the base IP for the data asset. They are now the manager of the Data NFT. -- Middle: The manager then deploys an ERC20 datatoken contract against the Data NFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. +- Bottom: The publisher deploys an ERC721 data NFT contract representing the base IP for the data asset. They are now the manager of the data NFT. +- Middle: The manager then deploys an ERC20 datatoken contract against the data NFT. The ERC20 represents a license with specific terms like "can consume for the next 3 days". They could even publish further ERC20 datatoken contracts, to represent different license terms or for compute-to-data. - Top: The manager then deploys a pool of the datatoken and OCEAN (or H2O), adds initial liquidity, and receives ERC20 pool tokens in return. Others may also add liquidity to receive pool tokens, i.e. become liquidity providers (LPs). ## Terminology diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index e9a57d82..d7ba77a0 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -11,7 +11,7 @@ Ocean Protocol provides tools for developers to _build data markets_, and to _ma **Build Data Markets.** Use Ocean Protocol software tools to build your own data marketplace, by either forking [Ocean Market](https://market.oceanprotocol.com/) code or building up with Ocean components. -**Manage Datatokens and Data NFTs for use in DeFi.** Use Ocean [JavaScript](https://github.com/oceanprotocol/ocean.js) or [Python](https://github.com/oceanprotocol/ocean.py) drivers to manage data NFTs and datatokens: +**Manage datatokens and data NFTs for use in DeFi.** Use Ocean [JavaScript](https://github.com/oceanprotocol/ocean.js) or [Python](https://github.com/oceanprotocol/ocean.py) drivers to manage data NFTs and datatokens: - _Publish and consume data services:_ downloadable files or compute-to-data. Use Ocean to deploy a new [ERC721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) and [ERC20](https://github.com/ethereum/EIPs/blob/7f4f0377730f5fc266824084188cc17cf246932e/EIPS/eip-20.md) datatoken contract for each data service, then mint datatokens. diff --git a/content/concepts/roles.md b/content/concepts/roles.md index 8c825a0d..9470be03 100644 --- a/content/concepts/roles.md +++ b/content/concepts/roles.md @@ -16,7 +16,7 @@ The permissions are stored in the data NFT (ERC721) smart contract. The data NFT | Set base URI |
🗸
| | | | | | Set Metadata state | | | | |
🗸
| | Set Metadata | | | | |
🗸
| -| Create new Datatoken | | |
🗸
| | | +| Create new datatoken | | |
🗸
| | | | Executes any other smart contract | |
🗸
| | | | | Set new key-value in store | | | |
🗸
| | diff --git a/content/tutorials/marketplace-publish-data-asset.md b/content/tutorials/marketplace-publish-data-asset.md index ee6edf8f..568dd8a6 100644 --- a/content/tutorials/marketplace-publish-data-asset.md +++ b/content/tutorials/marketplace-publish-data-asset.md @@ -27,8 +27,8 @@ Ocean Market provides a convenient interface for individuals as well as organiza 5. After clicking submit, approve the transactions in the wallet. Here, you can see Metamask window. - Deploy a new Datatoken contract. - ![publish submit part-1](images/marketplace/submit-1.png 'Create Datatoken contract') + Deploy a new datatoken contract. + ![publish submit part-1](images/marketplace/submit-1.png 'Create datatoken contract') Contract interaction. ![publish submit part-2](images/marketplace/submit-2.png 'Contract interaction') diff --git a/content/tutorials/marketplace-swap-and-stake.md b/content/tutorials/marketplace-swap-and-stake.md index 87fa9c21..6adb247e 100644 --- a/content/tutorials/marketplace-swap-and-stake.md +++ b/content/tutorials/marketplace-swap-and-stake.md @@ -3,7 +3,7 @@ title: Swap and/or Stake Tokens description: --- -## Swap Ocean Tokens against Datatokens +## Swap OCEAN Tokens against datatokens 1. Search for the desired asset published on the [Ocean Marketplace](https://market.oceanprotocol.com/). From 693f533ed1849db33c6b3dbe75407011d0632af3 Mon Sep 17 00:00:00 2001 From: Ana Loznianu Date: Thu, 31 Mar 2022 11:14:06 +0300 Subject: [PATCH 186/186] Fix balancer links --- content/concepts/architecture.md | 2 +- content/concepts/introduction.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/concepts/architecture.md b/content/concepts/architecture.md index 92142f83..e1d4437b 100644 --- a/content/concepts/architecture.md +++ b/content/concepts/architecture.md @@ -50,7 +50,7 @@ The marketplaces are decentralized (no single owner or controller), and non-cust Ocean Market supports fixed pricing and automatic price discovery. - For **fixed pricing**, there’s a simple contract for users to buy/sell datatokens for OCEAN while avoiding custodianship during value transfer. -- For **automatic price discovery**, Ocean Market uses automated market makers (AMMs) powered by [Balancer](https://www.balancer.finance). Each pool is a datatoken-OCEAN pair. In the Ocean Market GUI, the user adds liquidity then invokes pool creation; the GUI’s React code calls the Ocean JavaScript library, which calls the **Pool Factory** to deploy a **Pool** contract. (The Python library also does this.) Deploying a datatoken pool can be viewed as an “Initial Data Offering” (IDO). +- For **automatic price discovery**, Ocean Market uses automated market makers (AMMs) powered by [Balancer](https://www.balancer.fi). Each pool is a datatoken-OCEAN pair. In the Ocean Market GUI, the user adds liquidity then invokes pool creation; the GUI’s React code calls the Ocean JavaScript library, which calls the **Pool Factory** to deploy a **Pool** contract. (The Python library also does this.) Deploying a datatoken pool can be viewed as an “Initial Data Offering” (IDO). Complementary to Ocean Market, Ocean has reference code to ease building **third-party data marketplaces**, such as for logistics ([dexFreight data marketplace](https://blog.oceanprotocol.com/dexfreight-ocean-protocol-partner-to-enable-transportation-logistics-companies-to-monetize-data-7aa839195ac)) or mobility ([Daimler](https://blog.oceanprotocol.com/ocean-protocol-delivers-proof-of-concept-for-daimler-ag-in-collaboration-with-daimler-south-east-564aa7d959ca)). diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index d7ba77a0..3ee06bab 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -17,7 +17,7 @@ Ocean Protocol provides tools for developers to _build data markets_, and to _ma - _Transfer datatokens_ to another owner (or approve & transferFrom). -- _Manage pools._ Deploy OCEAN-datatoken [Balancer](https://www.balancer.finance/) pools, buy & sell datatokens (swap), and add & remove liquidity. +- _Manage pools._ Deploy OCEAN-datatoken [Balancer](https://www.balancer.fi/) pools, buy & sell datatokens (swap), and add & remove liquidity. - _And more._ Use ERC20 support in [web3.js](https://web3js.readthedocs.io/), [web3.py](https://web3py.readthedocs.io/en/stable/examples.html#working-with-an-erc20-token-contract) and Solidity to connect datatokens with crypto wallets and other DeFi services.

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 DVT%Da diff --git a/data/sidebars/concepts.yml b/data/sidebars/concepts.yml index 98d17377..04ea2055 100644 --- a/data/sidebars/concepts.yml +++ b/data/sidebars/concepts.yml @@ -20,7 +20,7 @@ - group: Specifying Assets items: - - title: DIDs & DDOs + - title: DID & DDO link: /concepts/did-ddo/ - group: Contribute From daf998a4cbeabf0fbba90107a69dd7f118e0ab86 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 11 Mar 2022 13:35:10 +0100 Subject: [PATCH 149/186] Issue-909: Fix link issue --- content/concepts/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index a9452a36..bc8ed6b3 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -13,7 +13,7 @@ Ocean Protocol provides tools for developers to _build data markets_, and to _ma **Manage Datatokens and Data NFTs for use in DeFi.** Use Ocean [JavaScript](https://github.com/oceanprotocol/ocean.js) or [Python](https://github.com/oceanprotocol/ocean.py) drivers to manage data NFTs and datatokens: -- _Publish and consume data services:_ downloadable files or compute-to-data. Use Ocean to deploy a new [ERC721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md and [ERC20](https://github.com/ethereum/EIPs/blob/7f4f0377730f5fc266824084188cc17cf246932e/EIPS/eip-20.md) datatoken contract for each data service, then mint datatokens. +- _Publish and consume data services:_ downloadable files or compute-to-data. Use Ocean to deploy a new [ERC721](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) and [ERC20](https://github.com/ethereum/EIPs/blob/7f4f0377730f5fc266824084188cc17cf246932e/EIPS/eip-20.md) datatoken contract for each data service, then mint datatokens. - _Transfer datatokens_ to another owner (or approve & transferFrom). From fea768d7e003bb0cd8ce920adbcc33a4be36f0f8 Mon Sep 17 00:00:00 2001 From: Akshay Date: Fri, 11 Mar 2022 14:23:11 +0100 Subject: [PATCH 150/186] Issue-#909: Update introduction page --- content/concepts/introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/concepts/introduction.md b/content/concepts/introduction.md index bc8ed6b3..15985e4f 100644 --- a/content/concepts/introduction.md +++ b/content/concepts/introduction.md @@ -3,7 +3,7 @@ title: Introduction description: Ocean Protocol - Tools for the Web3 Data Economy --- -In Ocean Protocol, each data service gets its own ERC721 **data NFT** and one or more ERC20 **datatoken**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. +In Ocean Protocol, each data service gets its own ERC721 **data NFT** and one or more ERC20 **datatokens**. This enables data wallets, data exchanges, and data co-ops by directly leveraging crypto wallets, exchanges, and more. OCEAN token is used for staking, and more. [Here](https://oceanprotocol.com/token) are details. From 9a27067f7a72ffa9bbb981984d42b5b12c01c418 Mon Sep 17 00:00:00 2001 From: Akshay Date: Mon, 14 Mar 2022 23:16:11 +0100 Subject: [PATCH 151/186] Issue-#913: Add content on fees --- content/tutorials/marketplace-fees.md | 47 +++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/content/tutorials/marketplace-fees.md b/content/tutorials/marketplace-fees.md index 175d8bd6..1b69a6dc 100644 --- a/content/tutorials/marketplace-fees.md +++ b/content/tutorials/marketplace-fees.md @@ -7,9 +7,52 @@ description: The Ocean Protocol defines various fees for creating a sustainabili Ocean Protocol aims to be a community-driven project. Through OceanDAO, the project aims at achieving decentralized governance and sustainability loop. For the project to grow and improve, the participants need to be rewarded for their contributions. The Ocean Protocol's smart contracts include a fee mechanism to maintain the sustainability loop. -### Community fee +## Fee types -### Market fee +### Swap fee + +Swap fees are collected whenever someone swaps a datatoken for basetoken (e.g., OCEAN) or basetoken for datatoken. The swap could be inside a pool (using an automated market maker) or in a fixed-rate exchange. +These are the fees that are applied whenever a user swaps basetoken or datatoken: + +- Publisher Marketplace swap fee +- Consumer Marketplace swap fee +- Provider Consumption Fees +- [Ocean Community Fee](#ocean-community-fee) + +### Publish fee + +Publish fees will be charged to a publisher when they publish an asset. + +Currently, no fees are applicable in Ocean's default marketplace. However, it is possible to charge a publish fee in the custom marketplace by adding an extra transaction in the publish flow. + +Based on the use case of the marketplace, the marketplace owner can decide if this fee should be charged or not. + +### Consume fee + +Consume fee is charged when a user holding datatoken exchanges it for a compute service, downloading a data asset or an algorithm. + +The following fees apply to the consumption of data assets as a part of Consume fee: + +- Consume Market Consumption Fee +- Publisher Market Consumption Fee +- Provider Consumption Fees +- [Ocean Community Fee](#ocean-community-fee) + +### Ocean Community fee + +Ocean's smart contract collects the **Ocean Community fee** during a swap operation. These fees are reinvested in community projects via Ocean DAO and other initiatives. Currently. This fee is set to 0 (as long as either Ocean or H20 are used as the base token in the market) in the smart contract but can be updated by the Ocean Protocol foundation. + +Whereas a fee of 0.1% is applicable on all swaps using another token as the base token. + +### Provider fee + +Provider is a component of Ocean Protocol's ecosystem which facilitates data consumption, starting compute jobs, encryption of DDOs, and decryption of DDOs. Provider also validates if the user can access a particular data asset or service. To know more about Provider, click here. + +Provider fees are paid to the individual or organization running their Provider instance whenever a user consumes a data asset or swaps a datatoken for a basetoken. These fees can be set to an absolute amount, and the receiver can also decide which token to receive the fees in - they don't have to be in the same currency used in the consuming market. + +Provider fee can also be used to charge for computing resources. Based on the compute resources needed to run an algorithm in the Compute-to-Data environment, a consumer can choose the amount of pay according to their needs. + +This fee incentivizes individuals and organizations to run their provider instances and charge consumers according to resource usage. ## Further reading From b16855b55e1202e27ddd5b1cfebd2e7e68c9b668 Mon Sep 17 00:00:00 2001 From: Akshay Date: Tue, 15 Mar 2022 10:27:36 +0100 Subject: [PATCH 152/186] Fix codeclimate issue --- src/templates/RestApi.jsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/templates/RestApi.jsx b/src/templates/RestApi.jsx index 6caaed56..5b458a41 100644 --- a/src/templates/RestApi.jsx +++ b/src/templates/RestApi.jsx @@ -30,6 +30,7 @@ export default function RestApiDoc({ location, pageContext }) {