From 031c48c728061a7817b5e37cb202e896cd5b7f1d Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Thu, 9 Oct 2025 17:19:09 +0200 Subject: [PATCH 1/8] Add data protection methods to iExec DataProtector - Implement `processProtectedData` method for secure processing of encrypted datasets. - Introduce `protectData` method for client-side encryption of user data. - Add `revokeAllAccess` method to manage access permissions for protected data. - Create `revokeOneAccess` method for targeted revocation of access permissions. - Implement `transferOwnership` method to transfer ownership of protected data securely. --- .vitepress/sidebar.ts | 184 +-------- .../{advanced => }/advanced-configuration.md | 18 - .../dataProtector/advanced/apps-whitelist.md | 81 ---- .../addAppToAddOnlyAppWhitelist.md | 104 ------ .../createAddOnlyAppWhitelist.md | 37 -- .../getUserAddOnlyAppWhitelist.md | 66 ---- .../dataProtector/dataProtectorSharing.md | 69 ---- .../dataProtectorSharing/collection.md | 74 ---- .../collection/addToCollection.md | 173 --------- .../collection/createCollection.md | 40 -- .../collection/removeCollection.md | 76 ---- .../removeProtectedDataFromCollection.md | 82 ---- .../consume/consumeProtectedData.md | 350 ------------------ .../dataProtectorSharing/data-sharing-sc.png | Bin 93263 -> 0 bytes .../inside-a-collection.png | Bin 113538 -> 0 bytes .../read/getCollectionOwners.md | 74 ---- .../read/getCollectionSubscriptions.md | 110 ------ .../read/getCollectionsByOwner.md | 94 ----- .../read/getProtectedDataInCollections.md | 233 ------------ .../read/getProtectedDataPricingParams.md | 69 ---- .../dataProtectorSharing/read/getRentals.md | 107 ------ .../dataProtectorSharing/renting.md | 46 --- .../renting/removeProtectedDataFromRenting.md | 72 ---- .../renting/rentProtectedData.md | 145 -------- .../renting/setProtectedDataRentingParams.md | 122 ------ .../renting/setProtectedDataToRenting.md | 124 ------- .../dataProtectorSharing/selling.md | 19 - .../selling/buyProtectedData.md | 171 --------- .../selling/removeProtectedDataForSale.md | 68 ---- .../selling/setProtectedDataForSale.md | 95 ----- .../dataProtectorSharing/subscription.md | 64 ---- .../removeProtectedDataFromSubscription.md | 83 ----- .../setProtectedDataToSubscription.md | 72 ---- .../subscription/setSubscriptionParams.md | 120 ------ .../subscription/subscribeToCollection.md | 141 ------- .../getGrantedAccess.md | 0 .../getProtectedData.md | 0 .../getResultFromCompletedTask.md | 0 .../grantAccess.md | 0 .../processProtectedData.md | 0 .../protectData.md | 0 .../revokeAllAccess.md | 0 .../revokeOneAccess.md | 0 .../transferOwnership.md | 0 44 files changed, 12 insertions(+), 3371 deletions(-) rename src/references/dataProtector/{advanced => }/advanced-configuration.md (89%) delete mode 100644 src/references/dataProtector/advanced/apps-whitelist.md delete mode 100644 src/references/dataProtector/advanced/apps-whitelist/addAppToAddOnlyAppWhitelist.md delete mode 100644 src/references/dataProtector/advanced/apps-whitelist/createAddOnlyAppWhitelist.md delete mode 100644 src/references/dataProtector/advanced/apps-whitelist/getUserAddOnlyAppWhitelist.md delete mode 100644 src/references/dataProtector/dataProtectorSharing.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/collection.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/collection/addToCollection.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/collection/createCollection.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/collection/removeCollection.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/data-sharing-sc.png delete mode 100644 src/references/dataProtector/dataProtectorSharing/inside-a-collection.png delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getCollectionOwners.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getCollectionSubscriptions.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getCollectionsByOwner.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getProtectedDataInCollections.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/read/getRentals.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/renting.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/renting/removeProtectedDataFromRenting.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/renting/rentProtectedData.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataRentingParams.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataToRenting.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/selling.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/selling/buyProtectedData.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/selling/removeProtectedDataForSale.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/selling/setProtectedDataForSale.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/subscription.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/subscription/removeProtectedDataFromSubscription.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/subscription/setProtectedDataToSubscription.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/subscription/setSubscriptionParams.md delete mode 100644 src/references/dataProtector/dataProtectorSharing/subscription/subscribeToCollection.md rename src/references/dataProtector/{dataProtectorCore => methods}/getGrantedAccess.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/getProtectedData.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/getResultFromCompletedTask.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/grantAccess.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/processProtectedData.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/protectData.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/revokeAllAccess.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/revokeOneAccess.md (100%) rename src/references/dataProtector/{dataProtectorCore => methods}/transferOwnership.md (100%) diff --git a/.vitepress/sidebar.ts b/.vitepress/sidebar.ts index f5f3deb6..7bc02979 100644 --- a/.vitepress/sidebar.ts +++ b/.vitepress/sidebar.ts @@ -223,179 +223,44 @@ export function getSidebar() { }, { text: 'DataProtector Core', - link: '/references/dataProtector/dataProtectorCore', + link: '/references/dataProtector/methods', collapsed: true, items: [ { text: 'protectData', - link: '/references/dataProtector/dataProtectorCore/protectData', + link: '/references/dataProtector/methods/protectData', }, { text: 'getProtectedData', - link: '/references/dataProtector/dataProtectorCore/getProtectedData', + link: '/references/dataProtector/methods/getProtectedData', }, { text: 'transferOwnership', - link: '/references/dataProtector/dataProtectorCore/transferOwnership', + link: '/references/dataProtector/methods/transferOwnership', }, { text: 'grantAccess', - link: '/references/dataProtector/dataProtectorCore/grantAccess', + link: '/references/dataProtector/methods/grantAccess', }, { text: 'getGrantedAccess', - link: '/references/dataProtector/dataProtectorCore/getGrantedAccess', + link: '/references/dataProtector/methods/getGrantedAccess', }, { text: 'revokeOneAccess', - link: '/references/dataProtector/dataProtectorCore/revokeOneAccess', + link: '/references/dataProtector/methods/revokeOneAccess', }, { text: 'revokeAllAccess', - link: '/references/dataProtector/dataProtectorCore/revokeAllAccess', + link: '/references/dataProtector/methods/revokeAllAccess', }, { text: 'processProtectedData', - link: '/references/dataProtector/dataProtectorCore/processProtectedData', + link: '/references/dataProtector/methods/processProtectedData', }, { text: 'getResultFromCompletedTask', - link: '/references/dataProtector/dataProtectorCore/getResultFromCompletedTask', - }, - ], - }, - { - text: 'DataProtector Sharing', - link: '/references/dataProtector/dataProtectorSharing', - collapsed: true, - items: [ - { - text: 'Collection', - link: '/references/dataProtector/dataProtectorSharing/collection', - collapsed: true, - items: [ - { - text: 'createCollection', - link: '/references/dataProtector/dataProtectorSharing/collection/createCollection', - }, - { - text: 'removeCollection', - link: '/references/dataProtector/dataProtectorSharing/collection/removeCollection', - }, - { - text: 'addToCollection', - link: '/references/dataProtector/dataProtectorSharing/collection/addToCollection', - }, - { - text: 'removeProtectedDataFromCollection', - link: '/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection', - }, - ], - }, - { - text: 'Renting', - link: '/references/dataProtector/dataProtectorSharing/renting', - collapsed: true, - items: [ - { - text: 'setProtectedDataToRenting', - link: '/references/dataProtector/dataProtectorSharing/renting/setProtectedDataToRenting', - }, - { - text: 'setProtectedDataRentingParams', - link: '/references/dataProtector/dataProtectorSharing/renting/setProtectedDataRentingParams', - }, - { - text: 'rentProtectedData', - link: '/references/dataProtector/dataProtectorSharing/renting/rentProtectedData', - }, - { - text: 'removeProtectedDataFromRenting', - link: '/references/dataProtector/dataProtectorSharing/renting/removeProtectedDataFromRenting', - }, - ], - }, - { - text: 'Selling', - link: '/references/dataProtector/dataProtectorSharing/selling', - collapsed: true, - items: [ - { - text: 'setProtectedDataForSale', - link: '/references/dataProtector/dataProtectorSharing/selling/setProtectedDataForSale', - }, - { - text: 'buyProtectedData', - link: '/references/dataProtector/dataProtectorSharing/selling/buyProtectedData', - }, - { - text: 'removeProtectedDataForSale', - link: '/references/dataProtector/dataProtectorSharing/selling/removeProtectedDataForSale', - }, - ], - }, - { - text: 'Subscription', - link: '/references/dataProtector/dataProtectorSharing/subscription', - collapsed: true, - items: [ - { - text: 'setProtectedDataToSubscription', - link: '/references/dataProtector/dataProtectorSharing/subscription/setProtectedDataToSubscription', - }, - { - text: 'setSubscriptionParams', - link: '/references/dataProtector/dataProtectorSharing/subscription/setSubscriptionParams', - }, - { - text: 'subscribeToCollection', - link: '/references/dataProtector/dataProtectorSharing/subscription/subscribeToCollection', - }, - { - text: 'removeProtectedDataFromSubscription', - link: '/references/dataProtector/dataProtectorSharing/subscription/removeProtectedDataFromSubscription', - }, - ], - }, - { - text: 'Consume', - collapsed: true, - items: [ - { - text: 'consumeProtectedData', - link: '/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData', - }, - ], - }, - { - text: 'Read Data', - collapsed: true, - items: [ - { - text: 'getProtectedDataInCollections', - link: '/references/dataProtector/dataProtectorSharing/read/getProtectedDataInCollections', - }, - { - text: 'getProtectedDataPricingParams', - link: '/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams', - }, - { - text: 'getCollectionOwners', - link: '/references/dataProtector/dataProtectorSharing/read/getCollectionOwners', - }, - { - text: 'getCollectionsByOwner', - link: '/references/dataProtector/dataProtectorSharing/read/getCollectionsByOwner', - }, - { - text: 'getCollectionSubscriptions', - link: '/references/dataProtector/dataProtectorSharing/read/getCollectionSubscriptions', - }, - { - text: 'getRentals', - link: '/references/dataProtector/dataProtectorSharing/read/getRentals', - }, - ], + link: '/references/dataProtector/methods/getResultFromCompletedTask', }, ], }, @@ -404,33 +269,8 @@ export function getSidebar() { link: '/references/dataProtector/types', }, { - text: 'Advanced', - collapsed: true, - items: [ - { - text: 'Advanced Configuration', - link: '/references/dataProtector/advanced/advanced-configuration', - }, - { - text: 'Apps whitelist', - link: '/references/dataProtector/advanced/apps-whitelist', - collapsed: true, - items: [ - { - text: 'createAddOnlyAppWhitelist', - link: '/references/dataProtector/advanced/apps-whitelist/createAddOnlyAppWhitelist', - }, - { - text: 'addAppToAddOnlyAppWhitelist', - link: '/references/dataProtector/advanced/apps-whitelist/addAppToAddOnlyAppWhitelist', - }, - { - text: 'getUserAddOnlyAppWhitelist', - link: '/references/dataProtector/advanced/apps-whitelist/getUserAddOnlyAppWhitelist', - }, - ], - }, - ], + text: 'Advanced Configuration', + link: '/references/dataProtector/advanced-configuration', }, ], }, diff --git a/src/references/dataProtector/advanced/advanced-configuration.md b/src/references/dataProtector/advanced-configuration.md similarity index 89% rename from src/references/dataProtector/advanced/advanced-configuration.md rename to src/references/dataProtector/advanced-configuration.md index 780fc0e9..5e46bc91 100644 --- a/src/references/dataProtector/advanced/advanced-configuration.md +++ b/src/references/dataProtector/advanced-configuration.md @@ -41,24 +41,6 @@ const dataProtector = new IExecDataProtector(web3Provider, { }); ``` -### sharingContractAddress - -`AddressOrENS` - -The Ethereum contract address or ENS (Ethereum Name Service) for dataProtector -sharing smart contract. If not provided, the default dataProtector sharing -contract address will be used. - -```ts twoslash -import { IExecDataProtector, getWeb3Provider } from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -// ---cut--- -const dataProtector = new IExecDataProtector(web3Provider, { - sharingContractAddress: '0x123abc...', // [!code focus] -}); -``` - ### subgraphUrl `string` diff --git a/src/references/dataProtector/advanced/apps-whitelist.md b/src/references/dataProtector/advanced/apps-whitelist.md deleted file mode 100644 index 63fda766..00000000 --- a/src/references/dataProtector/advanced/apps-whitelist.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Apps Whitelist -description: - Understand the Apps Whitelist mechanism for consuming protected data in the - iExec DataProtector Sharing module. Learn about the Trusted Execution - Environment (TEE) iApp and whitelist usage for secure data delivery. ---- - -# Apps whitelist - -In order to consume a protected data, an iExec TEE iApp needs to be provided. - -::: tip - -**TEE** stands for Trusted Execution Environment. Find more details -[in the TEE introduction guide](/protocol/tee/introduction) - -::: - -The story goes as follow: - -1. The collection owner adds a protected data to a collection. When doing so, - they need to set an `addOnlyAppWhitelist` parameter (see - [in the addToCollection documentation](/references/dataProtector/dataProtectorSharing/collection/addToCollection#addonlyappwhitelist)). - This parameter is the address of a whitelist smart contract that contains - applications allowed to consume the protected data. - -2. When a user wants to consume the protected data, they need to provide the - address of the application they want to use to consume the data (See - [consumeProtectedData](/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData#app-param) -  `app` parameter). This chosen application must be in the whitelist - defined by the collection owner. - -## Protected data delivery iApp - -Built for the needs of -[Content Creator use case](https://demo.iex.ec/content-creator/), this iExec TEE -iApp is simple: - -1. Download the protected data from IPFS. It expects to find a property named - `file` in the protected data. - -```json -{ - "file": "" -} -``` - -2. Encrypt the protected data with the beneficiary public key. - -3. Re-upload the encrypted data to IPFS and return the URL. - -::: warning - -Please note: This application and its whitelist can only be used **within the -dataProtectorSharing module**, as it is owned by the DataProtector Sharing smart -contract. - -::: - -### Whitelist - -**Whitelist address:** `0x256bcd881c33bdf9df952f2a0148f27d439f2e64` - -This whitelist contains current and past versions of the "Protected data -delivery iApp" - -See it in -[https://blockscout-bellecour.iex.ec/](https://blockscout-bellecour.iex.ec/address/0x256bcd881c33bdf9df952f2a0148f27d439f2e64). - -### iApp - -**Most recent iApp from this whitelist:** -`0x1cb7D4F3FFa203F211e57357D759321C6CE49921` - -See it in -[https://explorer.iex.ec/bellecour](https://explorer.iex.ec/bellecour/app/0x1cb7d4f3ffa203f211e57357d759321c6ce49921) - - diff --git a/src/references/dataProtector/advanced/apps-whitelist/addAppToAddOnlyAppWhitelist.md b/src/references/dataProtector/advanced/apps-whitelist/addAppToAddOnlyAppWhitelist.md deleted file mode 100644 index bbc717b1..00000000 --- a/src/references/dataProtector/advanced/apps-whitelist/addAppToAddOnlyAppWhitelist.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: addAppToAddOnlyAppWhitelist -description: - Method to add an app (iExec TEE iApp) into the AddOnlyAppWhitelist for secure - data access control. ---- - -# addAppToAddOnlyAppWhitelist - -Method to add an app (iExec TEE iApp) into the `AddOnlyAppWhitelist`. - -::: warning - -Once added, you can't remove an app from the whitelist. - -_Why?_ - -This is mainly **to protect users** who have paid for protected data. Imagine -the collection owner could remove all apps from the initial whitelist, users -having rented the protected data could no longer consume it. - -::: - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const isAddedToAddAppToAddOnlyAppWhitelist = - await dataProtectorSharing.addAppToAddOnlyAppWhitelist({ - addOnlyAppWhitelist: '0x123abc...', - app: '0x127ahs...', - }); -``` - -## Parameters - -```ts twoslash -import { type AddAppToAppWhitelistParams } from '@iexec/dataprotector'; -``` - -### addOnlyAppWhitelist - -**Type:** `Address` - -Address of the `addOnlyAppWhitelist` in which you want to add an app. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const isAddedToAddAppToAddOnlyAppWhitelist = - await dataProtectorSharing.addAppToAddOnlyAppWhitelist({ - addOnlyAppWhitelist: '0x123abc...', // [!code focus] - app: '0x127ahs...', - }); -``` - -### app {#app-param} - -**Type:** `AddressOrENS` - -Address of app that you want to add to the `addOnlyAppWhitelist`. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const isAddedToAddAppToAddOnlyAppWhitelist = - await dataProtectorSharing.addAppToAddOnlyAppWhitelist({ - addOnlyAppWhitelist: '0x123abc...', - app: '0x127ahs...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/advanced/apps-whitelist/createAddOnlyAppWhitelist.md b/src/references/dataProtector/advanced/apps-whitelist/createAddOnlyAppWhitelist.md deleted file mode 100644 index 935ee810..00000000 --- a/src/references/dataProtector/advanced/apps-whitelist/createAddOnlyAppWhitelist.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: createAddOnlyAppWhitelist -description: - Method to create an AddOnlyAppWhitelist for controlling app access. The caller - becomes the owner by default, with transferable ownership as an ERC721. ---- - -# createAddOnlyAppWhitelist - -Method to create an `AddOnlyAppWhitelist`. By default, the owner will be the -caller of the `createAddOnlyAppWhitelist` method, but as the -`AddOnlyAppWhitelist` is an ERC721, you can transfer ownership to someone else. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const isAddedToAddAppToAddOnlyAppWhitelist = - await dataProtectorSharing.createAddOnlyAppWhitelist(); -``` - -## Return Value - -```ts twoslash -import { type CreateAppWhitelistResponse } from '@iexec/dataprotector'; -``` - - diff --git a/src/references/dataProtector/advanced/apps-whitelist/getUserAddOnlyAppWhitelist.md b/src/references/dataProtector/advanced/apps-whitelist/getUserAddOnlyAppWhitelist.md deleted file mode 100644 index 5d5842b3..00000000 --- a/src/references/dataProtector/advanced/apps-whitelist/getUserAddOnlyAppWhitelist.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -title: getUserAddOnlyAppWhitelist -description: - Method to get AddOnlyAppWhitelist with filtering by user ethereum address for - app access control management. ---- - -# getUserAddOnlyAppWhitelist - -Method to get `AddOnlyAppWhitelist`, you can filter by user ethereum address. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const allAppOnlyAppWhitelistAvailable = - await dataProtectorSharing.getUserAddOnlyAppWhitelist(); -``` - -## Parameters - -```ts twoslash -import { type GetUserAppWhitelistParams } from '@iexec/dataprotector'; -``` - -### user - -**Type:** `AddressOrENS` - -Address or ENS of the user that manages the `AddAppToAddOnlyAppWhitelist` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const allUserAddOnlyAppWhitelist = - await dataProtectorSharing.getUserAddOnlyAppWhitelist({ - user: '0x123abc...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type GetUserAppWhitelistResponse } from '@iexec/dataprotector'; - -// Child types -import { type AddOnlyAppWhitelist } from '@iexec/dataprotector'; -``` - - diff --git a/src/references/dataProtector/dataProtectorSharing.md b/src/references/dataProtector/dataProtectorSharing.md deleted file mode 100644 index 25992d4a..00000000 --- a/src/references/dataProtector/dataProtectorSharing.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: DataProtector Sharing -description: - Distribute and monetize your protected data effortlessly with DataProtector - Sharing. Use smart contracts to manage access, rent, or sell data while - maintaining control and privacy. ---- - -# DataProtector Sharing - -The DataProtector Sharing module includes a set of methods for distributing and -monetizing your protected data. These work seamlessly in your own applications -in a way that's transparent to end users. The Sharing module supports the -following options for distributing a user's protected data: - -- Sharing freely with other users -- Renting data for a pre-determined period of time -- Providing access for a recurring subscription fee -- Selling ownership of the data - -Once access is obtained through one of these distribution methods, the `consume` -methods allow interaction with the protected data. The application designer uses -these methods to securely retrieve data from IPFS and decrypt it on the client -side. This ensures only the consumer gains access to the data. - -## How Does it Work? - -The user's protected data is managed by a special Data Sharing smart contract. -This smart contract enforces the user's desired sharing paradigm. Protected data -is bundled by the user into one or more collections. Within the collection, the -user may specify different sharing options for different pieces of data. This -illustration shows the hierarchy of a Data Sharing smart contract: - -![Data Sharing smart contract](/references/dataProtector/dataProtectorSharing/data-sharing-sc.png) - -The Data Sharing smart contract enforces governance over the user's protected -data based on their desired distribution choices. The user has complete control -over the mode of sharing for each Collection and each Protected Data contained -in their collections. - -The smart contract also protects the consumer of a user's data. If a consumer -rents access to a video clip, for example, even if the owner of the video clip -removes the rental option, the renter maintains their access for the duration of -the rental period. - -## How Does this Differ from `DataProtector Core`? - -With `DataProtector Core` you must grant each consumer individual access to your -protected data. This has several prerequisites: - -- The data owner must know the consumer's Ethereum address -- The data owner must sign a transaction at the moment you grant the access -- The data owner must define the number of times the consumer can access the - data up front - -With `DataProtector Sharing` a user can easily distribute their protected data -to a wider audience. The user authorizes distribution channels up front and -consumers of the data trigger smart contracts on their own, requiring no -additional activity from the data owner. This has several key benefits - -- The data owner doesn't need to know the consumer's Ethereum address -- The data owner doesn't need to sign a transaction at the moment of - distribution, only the consumer of the data signs their transaction -- The data owner doesn't manage access, the Data Sharing smart contract - automatically enforces the distribution and monetization choices - - diff --git a/src/references/dataProtector/dataProtectorSharing/collection.md b/src/references/dataProtector/dataProtectorSharing/collection.md deleted file mode 100644 index d875283a..00000000 --- a/src/references/dataProtector/dataProtectorSharing/collection.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Data Sharing - Collection Methods -description: - Organize your protected data into collections with iExec's Data Sharing - module. Choose distribution options like renting, free access, subscription, - or selling to control how your data is shared and monetized. ---- - -# Data Sharing - Collection Methods - -A collection is a way to group protected data for sharing by the Data Sharing -module. The Data Sharing smart contract operates on data contained within a -collection. You must group data within a collection before choosing a method of -distribution. The data owner is not restricted to only a single collection. This -diagram illustrates all the options for protected data within a collection: - -![Data Sharing collection](inside-a-collection.png) - -## Distribution Options - -The distribution choice impacts the visibility of the protected data when a -potential consumer is browsing the collection. Inside a collection, a data owner -may specify one of the following states: - -**Not distributed** - -Only the collection's owner can see it. This is useful for things in -development, or when the owner wishes to release things for a limited time. - -**For rent** - -The collection's owner allows a consumer to pay a set price to access the data -for a predetermined period of time. The smart contract ensures the consumer -maintains access. Even if the collection owner de-lists the data or changes the -rental terms, the consumer maintains their access for the duration of their -rental term. Once the rental term is up, the consumer loses access to the -protected data. If the user wishes to re-up their rental term, they are bound to -any new price or duration changes the data owner makes. - -**Free** - -This functions the same as a rental but with no price for the transaction. The -data owner may still set a duration for the free access. This supports scenarios -like a free giveaway, or a timed promotion. - -**Included in Subscription** - -The collection's owner may create one or more subscription models for -distribution of their data. A subscription bundle is a subset of the protected -data within the collection. Subscribers pay a set fee at a set cadence to -maintain access to all protected data within the subscription. The collection -owner may assign protected data to more than one subscription bundles at the -same time. - -The collection owner may add additional protected data to the subscription at -any time. They may not, however, remove protected data from the subscription -bundle if there are any active subscribers. A subscriber maintains access to all -protected data within the subscription as long as they continue paying the -subscription fee. The collection owner may de-list a subscription bundle by -setting either the price, the duration, or both, to zero. - -**Both For Rent and Included in Subscription** - -The collection owner may set any combination of rental and subscription terms -for any protected data in the collection. - -**For sale** - -The collection owner may list any of their protected data for sale. This is -especially useful for dealers of digital assets like NFTs. - - diff --git a/src/references/dataProtector/dataProtectorSharing/collection/addToCollection.md b/src/references/dataProtector/dataProtectorSharing/collection/addToCollection.md deleted file mode 100644 index d590d522..00000000 --- a/src/references/dataProtector/dataProtectorSharing/collection/addToCollection.md +++ /dev/null @@ -1,173 +0,0 @@ ---- -title: addToCollection -description: - Transfer a protected data to one of your collections in the Data Sharing smart - contract. The method approves the contract to manage the data and adds it to - the specified collection. ---- - -# addToCollection - -Method to transfer one of your protected data to a collection of yours in the -Data Sharing smart contract. - -Under the hood, this method performs two actions: - -- Approve the Data Sharing smart contract to manage your protected data. -- Add the protected data to your collection. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.addToCollection({ - protectedData: '0x123abc...', - collectionId: 12, - addOnlyAppWhitelist: '0x541abc...', -}); -``` - -## Parameters - -```ts twoslash -import { type AddToCollectionParams } from '@iexec/dataprotector'; -``` - -### collectionId - -**Type:** `number` - -Collection ID to which you'd like to add the protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.addToCollection({ - collectionId: 12, // [!code focus] - protectedData: '0x123abc...', - addOnlyAppWhitelist: '0x541abc...', -}); -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to add to your collection. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.addToCollection({ - collectionId: 12, - protectedData: '0x123abc...', // [!code focus] - addOnlyAppWhitelist: '0x541abc...', -}); -``` - -Before any smart contract interaction, the existence of the protected data will -be checked, as well as the ownership: it should be the wallet address you used -to instantiate DataProtector SDK. - -### addOnlyAppWhitelist - -**Type:** `AddressOrENS` - -Address of the whitelist smart contract that contains applications allowed to -consume the protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.addToCollection({ - collectionId: 12, - protectedData: '0x123abc...', - addOnlyAppWhitelist: '0xba46d6...', // [!code focus] -}); -``` - -::: tip - -For this `addOnlyAppWhitelist`, you are free to use -`0x256bcd881c33bdf9df952f2a0148f27d439f2e64`. - -For more details on how to create and manage appsWhitelist, see -[Apps whitelist](/references/dataProtector/advanced/apps-whitelist). - -::: - -### onStatusUpdate - -**Type:** `OnStatusUpdateFn` - -Callback function to be notified at intermediate steps. - - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.addToCollection({ - protectedData: '0x123abc...', - collectionId: 12, - addOnlyAppWhitelist: '0xba46d6...', - onStatusUpdate: ({ title, isDone }) => { // [!code focus] - console.log(title, isDone); // [!code focus] - }, // [!code focus] -}); -``` - - -You can expect this callback function to be called with the following titles: - -```ts -'APPROVE_COLLECTION_CONTRACT'; -'ADD_PROTECTED_DATA_TO_COLLECTION'; -``` - -Once with `isDone: false`, and then with `isDone: true` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/collection/createCollection.md b/src/references/dataProtector/dataProtectorSharing/collection/createCollection.md deleted file mode 100644 index b880deaf..00000000 --- a/src/references/dataProtector/dataProtectorSharing/collection/createCollection.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: createCollection -description: - Create a new NFT collection with iExec's createCollection method. Organize and - manage your protected data for seamless distribution and monetization through - DataProtector Sharing. ---- - -# createCollection - -Method to create a new collection in the Data Sharing smart contract. - -Having a collection is a required step before choosing how to distribute your -protected data. - -A wallet address may own multiple collections. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const createCollectionResult = await dataProtectorSharing.createCollection(); -``` - -## Return Value - -```ts twoslash -import { type CreateCollectionResponse } from '@iexec/dataprotector'; -``` - - diff --git a/src/references/dataProtector/dataProtectorSharing/collection/removeCollection.md b/src/references/dataProtector/dataProtectorSharing/collection/removeCollection.md deleted file mode 100644 index 17a565e7..00000000 --- a/src/references/dataProtector/dataProtectorSharing/collection/removeCollection.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: removeCollection -description: - Remove a collection from the Data Sharing smart contract by burning its - associated NFT. Transfer the NFT to the zero address and permanently remove - the collection. ---- - -# removeCollection - -Method to remove one of your collections in the Data Sharing smart contract. - -By removing a collection, we mean to burn the associated NFT, that is, to -**transfer it to the zero address**. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.removeCollection({ - collectionId: 15, -}); -``` - -## Pre-conditions - -- You must be the owner of the collection. -- There should be no protected data in the collection. See - [`removeProtectedDataFromCollection`](/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection). - -## Parameters - -```ts twoslash -import { type RemoveCollectionParams } from '@iexec/dataprotector'; -``` - -### collectionId - -**Type:** `number` - -The collection ID of the collection you want to remove. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.removeCollection({ - collectionId: 15, // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection.md b/src/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection.md deleted file mode 100644 index f33e24f6..00000000 --- a/src/references/dataProtector/dataProtectorSharing/collection/removeProtectedDataFromCollection.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: removeProtectedDataFromCollection -description: - Remove a protected data from one of your collections in the Data Sharing smart - contract. This method transfers the ownership of the protected data back to - the owner. ---- - -# removeProtectedDataFromCollection - -Method to remove one of your protected data from a collection of yours in the -Data Sharing smart contract. - -To put it differently, this method will transfer the ownership of the protected -data back to you. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.removeProtectedDataFromCollection( - { - protectedData: '0x123abc...', - } -); -``` - -## Pre-conditions - -- You must be the owner of the collection of which the protected data is - currently part of. -- There should be no active subscriptions to this collection. -- There should be no active rentals of this protected data. - -## Parameters - -```ts twoslash -import { type RemoveFromCollectionParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to remove from your collection. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.removeProtectedDataFromCollection( - { - protectedData: '0x123abc...', // [!code focus] - } -); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData.md b/src/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData.md deleted file mode 100644 index dc61707f..00000000 --- a/src/references/dataProtector/dataProtectorSharing/consume/consumeProtectedData.md +++ /dev/null @@ -1,350 +0,0 @@ ---- -title: consumeProtectedData -description: - Consume protected data in iExec by visualizing or downloading it. This method - involves generating RSA keys, interacting with iExec's Secret Management - Service, and securely retrieving encrypted data from InterPlanetary File - System (IPFS). ---- - -# consumeProtectedData - -Method to consume a protected data, that is, visualize it or download it. - -This method does a few things under the hood: - -- Generate an RSA key pair and save it to indexedDB (if available) -- Push the public key to iExec SMS (Secret Management Service) (For more info, - see - [iExec Advanced documentation](/guides/build-iapp/advanced/access-confidential-assets)) -- Wait for the consuming task to be executed by a worker. The iExec TEE iApp - being executed is the one given with the `app` parameter. The iExec TEE iApp - will get the protected data from IPFS, encrypt it with the public key - generated in the first step, and re-upload it to IPFS. -- Retrieve the encrypted data from IPFS and decrypt it with the private key - generated in the first step. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - }); -``` - -## Pre-conditions - -You need to either have: - -- an active rental for the protected data, -- an active subscription to the corresponding collection if the protected data - is part of the collection subscription bundle. - -## Parameters - -```ts twoslash -import { type ConsumeProtectedDataParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to visualize. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', // [!code focus] - app: '0x456def...', - }); -``` - -### app - -**Type:** `AddressOrENS` - -Address or Ethereum Name Service (ENS) of the iApp that will be used to consume -the protected data. This iExec TEE iApp is the one that runs within an iExec -worker. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', // [!code focus] - }); -``` - -::: tip - -For this `app` parameter you can use the "Protected data delivery TEE iApp": - -``` -0x1cb7D4F3FFa203F211e57357D759321C6CE49921 -``` - -
- -
Please note: This application can only be used within the -dataProtectorSharing module, as it is owned by the DataProtector Sharing smart contract. - -For more details, see -[Apps whitelist](/references/dataProtector/advanced/apps-whitelist). - -::: - -::: tip - -If you want to provide **your own TEE iApp**, you will need to create a -whitelist that contains your app. - -For more details, see -[Apps whitelist](/references/dataProtector/advanced/apps-whitelist). - -::: - -### path - -**Type:** `string` - -Under the hood, a protected data is a zip file. With this `path` parameter, you -can specify the file you're interested in. The zip file will be uncompressed for -you, and only the desired file will be given as the `result`. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - path: 'my-content', // [!code focus] - }); -``` - -### workerpool - -**Type:** `AddressOrENS` -**Default:** `{{ workerpoolAddress }}` (iExec's workerpool) - -Address or ENS of the workerpool on which your confidential task will run. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - workerpool: '0xa5de76...', // [!code focus] - }); -``` - -### maxPrice - -**Type:** `number` -**Default:** `0` - -The maximum price (in nRLC) that a requester is willing to pay for each task -related to consuming the protected data. It is the sum of the application price, -dataset price, and workerpool price per task. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - maxPrice: 10, // [!code focus] - }); -``` - -### pemPublicKey - -**Type:** `string` - -If you have previously called `consumeProtectedData()` and saved the returned -public key, you can reuse it in further calls. - -Alternatively, you can generate a RSA keypair on your own. - -If you provide a public key, you must also provide its corresponding private key -provided. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - pemPublicKey: '-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----', // [!code focus] - }); -``` - -### pemPrivateKey - -**Type:** `string` - -If you have previously called `consumeProtectedData()` and saved the returned -private key, you can reuse it in further calls. - -Alternatively, you can generate a RSA keypair on your own. - -If you provide a private key, you must also provide its corresponding public key -provided. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - pemPrivateKey: - '-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----', // [!code focus] - }); -``` - -### onStatusUpdate - -**Type:** `OnStatusUpdateFn` - -Callback function to be notified at intermediate steps. - - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const consumeProtectedDataResult = - await dataProtectorSharing.consumeProtectedData({ - protectedData: '0x123abc...', - app: '0x456def...', - onStatusUpdate: ({ title, isDone }) => { // [!code focus] - console.log(title, isDone); // [!code focus] - }, // [!code focus] - }); -``` - - -You can expect this callback function to be called with the following titles: - -```ts -'FETCH_WORKERPOOL_ORDERBOOK'; -'PUSH_ENCRYPTION_KEY'; -'CONSUME_ORDER_REQUESTED'; -'CONSUME_TASK'; -'CONSUME_RESULT_DOWNLOAD'; -'CONSUME_RESULT_DECRYPT'; -``` - -## Return Value - -```ts twoslash -import { type ConsumeProtectedDataResponse } from '@iexec/dataprotector'; -``` - -### txHash - -`string` - -The transaction hash corresponding to the execution of the function. - -### dealId - -`string` - -Identifies the specific deal associated with this transaction. - -### taskId - -`string` - -Identifies the specific task associated with the deal. - -### result - -`ArrayBuffer` - -The actual content of the protected file. - - diff --git a/src/references/dataProtector/dataProtectorSharing/data-sharing-sc.png b/src/references/dataProtector/dataProtectorSharing/data-sharing-sc.png deleted file mode 100644 index 189c41087644a4fea1142a0e18d39a6bde0a751d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93263 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

-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

0@7GQASvsf)WEB8EZx9i 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 diff --git a/src/references/dataProtector/dataProtectorSharing/inside-a-collection.png b/src/references/dataProtector/dataProtectorSharing/inside-a-collection.png deleted file mode 100644 index aac8c11a574e6cbad5f426f19f3813a0382d9edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113538 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 z 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 TvldJR{?t{pE)<@-cISTpV+`6% diff --git a/src/references/dataProtector/dataProtectorSharing/read/getCollectionOwners.md b/src/references/dataProtector/dataProtectorSharing/read/getCollectionOwners.md deleted file mode 100644 index d2747ff1..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getCollectionOwners.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: getCollectionOwners -description: - Method to get all collection owners with results ordered by creation timestamp - in descending order. ---- - -# getCollectionOwners - -Method to get all collection owners. - -Results of `CollectionOwner.collections` are ordered by -`collections.creationTimestamp` desc. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const collectionOwners = await dataProtectorSharing.getCollectionOwners(); -``` - -## Parameters - -```ts twoslash -import { type GetCollectionOwnersParams } from '@iexec/dataprotector'; -``` - -### limit - -**Type:** `number` -**Default:** `100` -**Range:** `[1...1000]` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const collectionOwners = await dataProtectorSharing.getCollectionOwners({ - limit: 100, // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import type { GetCollectionOwnersResponse } from '@iexec/dataprotector'; - -// Child types -import type { CollectionOwner, SubscriptionParams } from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - -### hasActiveSubscription - -`true` if you (logged-in user) have an active subscription to one of the -collections. - - diff --git a/src/references/dataProtector/dataProtectorSharing/read/getCollectionSubscriptions.md b/src/references/dataProtector/dataProtectorSharing/read/getCollectionSubscriptions.md deleted file mode 100644 index 4a922cb2..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getCollectionSubscriptions.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -title: getCollectionSubscriptions -description: - Fetch all subscriptions for a specific collection or user in iExec. Get - detailed information about subscription activity based on collection ID. ---- - -# getCollectionSubscriptions - -Method to get all subscriptions for: - -- a specific collection -- a specific user - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const collectionActiveSubscriptions = - await dataProtectorSharing.getCollectionSubscriptions({ - collectionId: 9, - }); -``` - -## Parameters - -```ts twoslash -import { type GetCollectionSubscriptionsParams } from '@iexec/dataprotector'; -``` - -### subscriberAddress - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userActiveSubscriptions = - await dataProtectorSharing.getCollectionSubscriptions({ - subscriberAddress: '0x246bdf...', // [!code focus] - }); -``` - -### collectionId - -**Type:** `number` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const collectionActiveSubscriptions = - await dataProtectorSharing.getCollectionSubscriptions({ - collectionId: 9, // [!code focus] - }); -``` - -### includePastSubscriptions - -**Type:** `boolean` -**Default:** `false` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userRentals = await dataProtectorSharing.getCollectionSubscriptions({ - subscriberAddress: '0x246bdf...', - includePastSubscriptions: true, // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import { type GetCollectionSubscriptionsResponse } from '@iexec/dataprotector'; - -// Child types -import { type CollectionSubscription } from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - - diff --git a/src/references/dataProtector/dataProtectorSharing/read/getCollectionsByOwner.md b/src/references/dataProtector/dataProtectorSharing/read/getCollectionsByOwner.md deleted file mode 100644 index d03a6acd..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getCollectionsByOwner.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: getCollectionsByOwner -description: - Method to get all collections for a specific user with filtering and - pagination options. ---- - -# getCollectionsByOwner - -Method to get all collections for a specific user. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userCollections = await dataProtectorSharing.getCollectionsByOwner({ - owner: '0xa0c15e...', -}); -``` - -## Parameters - -```ts twoslash -import { type GetCollectionsByOwnerParams } from '@iexec/dataprotector'; -``` - -### owner - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userCollections = await dataProtectorSharing.getCollectionsByOwner({ - owner: '0xa0c15e...', // [!code focus] -}); -``` - -### includeHiddenProtectedDatas - -**Type:** `boolean` -**Default:** `false` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userCollectionsWithAllProtectedData = - await dataProtectorSharing.getCollectionsByOwner({ - owner: '0xa0c15e...', - includeHiddenProtectedDatas: true, // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import type { GetCollectionsByOwnerResponse } from '@iexec/dataprotector'; - -// Child types -import type { - CollectionWithProtectedDatas, - ProtectedDataInCollection, - SubscriptionParams, - RentingParams, - SellingParams, -} from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - - diff --git a/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataInCollections.md b/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataInCollections.md deleted file mode 100644 index f708c21a..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataInCollections.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -title: getProtectedDataInCollections -description: - Retrieve protected data from collections in iExec. Each protected data can - belong to only one collection at a time, with results ordered by creation - timestamp in descending order. ---- - -# getProtectedDataInCollections - -Method to get protected data that are in collections. - -A protected data can only be in one collection at a time. - -Results are ordered by `creationTimestamp` desc. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedData = - await dataProtectorSharing.getProtectedDataInCollections(); -``` - -## Parameters - -```ts twoslash -import { type GetProtectedDataInCollectionsParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const oneProtectedData = - await dataProtectorSharing.getProtectedDataInCollections({ - protectedData: '0x123abc...', // [!code focus] - }); -``` - -### collectionId - -**Type:** `number` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataByCollection = - await dataProtectorSharing.getProtectedDataInCollections({ - collectionId: 12, // [!code focus] - }); -``` - -### collectionOwner - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataByOwner = - await dataProtectorSharing.getProtectedDataInCollections({ - collectionOwner: '0x123...', // [!code focus] - }); -``` - -### createdAfterTimestamp - -**Type:** `number` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const latestProtectedData = - await dataProtectorSharing.getProtectedDataInCollections({ - createdAfterTimestamp: 1707237580, // Feb 6th, 2024 16:39:40 GMT // [!code focus] - }); -``` - -### isRentable - -**Type:** `boolean` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const rentableProtectedData = - await dataProtectorSharing.getProtectedDataInCollections({ - isRentable: true, // [!code focus] - }); -``` - -### isForSale - -**Type:** `boolean` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataForSale = - await dataProtectorSharing.getProtectedDataInCollections({ - isForSale: true, // [!code focus] - }); -``` - -### isDistributed - -**Type:** `boolean` - -Used to filter protected data that are either for sale, renting or part of a -subscription. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataForSale = - await dataProtectorSharing.getProtectedDataInCollections({ - isDistributed: true, // [!code focus] - }); -``` - -### page - -**Type:** `number` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedData = await dataProtectorSharing.getProtectedDataInCollections({ - collectionId: 12, - page: 3, // [!code focus] - pageSize: 25, -}); -``` - -### pageSize - -**Type:** `number` -**Range:** `[10...1000]` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedData = await dataProtectorSharing.getProtectedDataInCollections({ - collectionId: 12, - page: 3, - pageSize: 25, // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import type { GetProtectedDataInCollectionsResponse } from '@iexec/dataprotector'; - -// Child types -import type { - ProtectedDataInCollection, - RentingParams, - SellingParams, -} from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - - diff --git a/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams.md b/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams.md deleted file mode 100644 index 8a613842..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: getProtectedDataPricingParams -description: - Get pricing parameters for renting a specific protected data in iExec. - Retrieve rental price and duration to determine the cost and terms for data - access. ---- - -# getProtectedDataPricingParams - -Method to get all distribution params for a protected data. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const pricingParams = await dataProtectorSharing.getProtectedDataPricingParams({ - protectedData: '0x123abc...', -}); -``` - -## Parameters - -```ts twoslash -import { type GetProtectedDataPricingParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to get the pricing params for. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const pricingParams = await dataProtectorSharing.getProtectedDataPricingParams({ - protectedData: '0x123abc...', // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import type { GetProtectedDataPricingParamsResponse } from '@iexec/dataprotector'; - -// Child types -import type { SubscriptionParams, RentingParams } from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - - diff --git a/src/references/dataProtector/dataProtectorSharing/read/getRentals.md b/src/references/dataProtector/dataProtectorSharing/read/getRentals.md deleted file mode 100644 index 3297a896..00000000 --- a/src/references/dataProtector/dataProtectorSharing/read/getRentals.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: getRentals -description: - Retrieve all rentals for a specific protected data or user in iExec. Access - detailed rental information based on the protected data address. ---- - -# getRentals - -Method to get all rentals for: - -- a specific protected data -- a specific user - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataActiveRentals = await dataProtectorSharing.getRentals({ - protectedData: '0x123abc...', -}); -``` - -## Parameters - -```ts twoslash -import { type GetRentalsParams } from '@iexec/dataprotector'; -``` - -### renterAddress - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userActiveRentals = await dataProtectorSharing.getRentals({ - renterAddress: '0x246bdf...', // [!code focus] -}); -``` - -### protectedData - -**Type:** `AddressOrENS` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const protectedDataActiveRentals = await dataProtectorSharing.getRentals({ - protectedData: '0x123abc...', // [!code focus] -}); -``` - -### includePastRentals - -**Type:** `boolean` -**Default:** `false` - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const userRentals = await dataProtectorSharing.getRentals({ - renterAddress: '0x246bdf...', - includePastRentals: true, // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import { type GetRentalsResponse } from '@iexec/dataprotector'; - -// Child types -import type { ProtectedDataRental } from '@iexec/dataprotector'; -``` - -[See Type ↗️](https://github.com/iExecBlockchainComputing/dataprotector-sdk/blob/c83e30e6ce8b55ecf8a35ecb4eb1014cd4ecefe9/packages/sdk/src/lib/types/sharingTypes.ts) - - diff --git a/src/references/dataProtector/dataProtectorSharing/renting.md b/src/references/dataProtector/dataProtectorSharing/renting.md deleted file mode 100644 index 90495442..00000000 --- a/src/references/dataProtector/dataProtectorSharing/renting.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Data Sharing - Renting -description: - Renting options for distributing protected data allow consumers to access data - for a set price and duration. The Data Sharing smart contract ensures renter - protection, guaranteeing access for the agreed term and enforcing rental - terms, even if modified by the owner. ---- - -# Data Sharing - Renting - -Rental agreements are one of the options given for distributing a collection -owner's protected data. A rental agreement has the following attributes: - -**Rental Price** - -The collection owner allows a consumer to pay a set price to access the data. -This is a one-time up-front cost. - -**Rental Duration** - -The collection owner allows the renter access to the data for a set period of -time. - -## Renter Protection - -The Data Sharing smart contract ensures the renter maintains access for the -duration of their rental term. Once the rental term is up, the renter loses -access to the protected data. This assurance is critical to the renting paradigm -to ensure trust between the data owner and the renter. - -## Modifying Rental Terms - -The collection owner has a few options once they list protected data for rent: - -- The owner may remove the rental terms and effectively de-list the protected - data -- The owner may also modify the rental price or duration - -Making either of these chances is effective immediately but only for future -rentals. The Data Sharing smart contract enforces any ongoing rental agreements -until the terms expire. - - diff --git a/src/references/dataProtector/dataProtectorSharing/renting/removeProtectedDataFromRenting.md b/src/references/dataProtector/dataProtectorSharing/renting/removeProtectedDataFromRenting.md deleted file mode 100644 index 92e8e7c1..00000000 --- a/src/references/dataProtector/dataProtectorSharing/renting/removeProtectedDataFromRenting.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: removeProtectedDataFromRenting -description: - The removeProtectedDataFromRenting method allows the collection owner to - remove a protected data item from being rented. Active rentals will still be - honored until their rental period ends. ---- - -# removeProtectedDataFromRenting - -Method to remove a protected data from renting. - -If there are still active rentals to the protected data, these rentals will be -honored until the end of their rental period. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const notForRentingAnymoreResult = - await dataProtectorSharing.removeProtectedDataFromRenting({ - protectedData: '0x123abc...', - }); -``` - -## Parameters - -```ts twoslash -import { type RemoveProtectedDataFromRentingParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to remove from renting. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const notForRentingAnymoreResult = - await dataProtectorSharing.removeProtectedDataFromRenting({ - protectedData: '0x123abc...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/renting/rentProtectedData.md b/src/references/dataProtector/dataProtectorSharing/renting/rentProtectedData.md deleted file mode 100644 index cfd1516c..00000000 --- a/src/references/dataProtector/dataProtectorSharing/renting/rentProtectedData.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: rentProtectedData -description: - The rentProtectedData method allows you to rent a protected data item by - specifying the price and duration. If the parameters don't match the current - listing, the SDK will not submit the transaction to avoid paying gas fees for - a transaction that would revert. ---- - -# rentProtectedData - -Method to rent a protected data. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const rentResult = await dataProtectorSharing.rentProtectedData({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -::: tip - -Technically, `price` and `duration` parameters could be avoided. It is mainly a -protection against front-running "attacks", that is, if the collection owner -changes the price **at the same time** you rent the protected data, you would -end up paying more than expected. Passing the `price` here allows the SDK to -ensure you're paying the right price. If prices don't match, the SDK will throw -an error. - -::: - -## Parameters - -```ts twoslash -import { type RentProtectedDataParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address or ENS of the protected data that you'd like rent. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const rentResult = await dataProtectorSharing.rentProtectedData({ - protectedData: '0x123abc...', // [!code focus] - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -### price - -**Type:** `number` - -Price of the rental for the protected data that you expect to rent. This -parameter ensures that you will not be front-run by the owner of the protected -data. The unit is in nano RLC (nRLC). - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const rentResult = await dataProtectorSharing.rentProtectedData({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC // [!code focus] - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -::: tip - -To get the renting price of the given protected data, you can use -[getProtectedDataPricingParams](/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams). - -::: - -### duration - -**Type:** `number` - -Duration of the rental for the protected data that you expect to rent. This -parameter ensures that you will not be front-run by the owner of the protected -data. The unit is in seconds. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const rentResult = await dataProtectorSharing.rentProtectedData({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days // [!code focus] -}); -``` - -::: tip - -To get the renting duration of the given protected data, you can use -[getProtectedDataPricingParams](/references/dataProtector/dataProtectorSharing/read/getProtectedDataPricingParams). - -::: - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataRentingParams.md b/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataRentingParams.md deleted file mode 100644 index d66a297c..00000000 --- a/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataRentingParams.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -title: setProtectedDataRentingParams -description: - The setProtectedDataRentingParams method allows you to set or update the - renting parameters (price and duration) for a protected data item. If the data - isn't listed for rent yet, it will be set for renting with the provided terms. ---- - -# setProtectedDataRentingParams - -Method to update a protected data renting params. - -If the protected data is not yet available for renting, it will be set for -renting. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataRentingParams({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -## Parameters - -```ts twoslash -import { type SetProtectedDataRentingParams } from '@iexec/dataprotector'; -``` - -### protectedData - -`AddressOrENS` - -Address of the protected data you'd like to set renting parameters. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataRentingParams({ - protectedData: '0x123abc...', // [!code focus] - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### price - -`number` - -The price in nano RLC (nRLC) you ask from someone who wants to rent the -protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataRentingParams({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC // [!code focus] - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### duration - -`number` - -The duration of the rental in seconds. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataRentingParams({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataToRenting.md b/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataToRenting.md deleted file mode 100644 index c9033977..00000000 --- a/src/references/dataProtector/dataProtectorSharing/renting/setProtectedDataToRenting.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: setProtectedDataToRenting -description: - The setProtectedDataToRenting method allows a protected data item to be listed - for rent. This method sets the price and duration for future rentals. If the - data is already listed for rent, it updates the terms accordingly. ---- - -# setProtectedDataToRenting - -Method to allow a protected data to be rented. - -If you call this method on a protected data that is already set for renting, it -will update the `price` and `duration` parameters, and will apply to future -rentals. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataToRenting({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -## Parameters - -```ts twoslash -import { type SetProtectedDataToRentingParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to set renting parameters for. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataToRenting({ - protectedData: '0x123abc...', // [!code focus] - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### price - -**Type:** `number` - -The price in nano RLC (nRLC) you ask from someone who wants to rent the -protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataToRenting({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC // [!code focus] - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### duration - -**Type:** `number` - -The duration of the rental in seconds. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForRentingResult = - await dataProtectorSharing.setProtectedDataToRenting({ - protectedData: '0x123abc...', - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 30, // 30 days // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/selling.md b/src/references/dataProtector/dataProtectorSharing/selling.md deleted file mode 100644 index b9f4c257..00000000 --- a/src/references/dataProtector/dataProtectorSharing/selling.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Data Sharing - Selling -description: - Learn how to list protected data for sale, transfer ownership permanently - through blockchain transactions, and manage data listing operations. ---- - -# Data Sharing - Selling - -The owner of protected data may list the data for sale. Upon completion of a -sale, ownership of the protected data transfers to the buyer. This is a -permanent operation enforced by the blockchain and executed by the Data Sharing -smart contract. The data owner may de-list the protected data at any point until -a sale is completed. The new owner of the protected data has full rights to -distribute the protected data through any channels they desire. - - diff --git a/src/references/dataProtector/dataProtectorSharing/selling/buyProtectedData.md b/src/references/dataProtector/dataProtectorSharing/selling/buyProtectedData.md deleted file mode 100644 index 9969ce89..00000000 --- a/src/references/dataProtector/dataProtectorSharing/selling/buyProtectedData.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -title: buyProtectedData -description: - Allows a user to purchase protected data that is listed for sale. Upon - successful purchase, the buyer gains full ownership and can distribute or keep - the data as desired. ---- - -# buyProtectedData - -Method to buy a protected data that is for sale. - -"Buying" here means to get ownership of the protected data. - -After buying a protected data, you'll be free to distribute it again at your own -terms, or to keep it for yourself. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.buyProtectedData({ - protectedData: '0x123abc...', - price: 1, -}); -``` - -## Parameters - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -import { type BuyProtectedDataParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to buy. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.buyProtectedData({ - protectedData: '0x123abc...', // [!code focus] - price: 1, -}); -``` - -### price - -**Type:** `number` - -Price of the protected data that you expect to buy. This parameter ensures that -you will not be front-run by the owner of the protected data. The unit is in -nano RLC (nRLC). - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.buyProtectedData({ - protectedData: '0x123abc...', - price: 1, // [!code focus] -}); -``` - -### addToCollectionId - -**Type:** `number` - -Collection ID to which you'd like to transfer the ownership of the protected -data. -The Data Sharing smart contract will still be the technical owner of the -protected data, but you'll fully own it as you own the collection to which it'll -transferred. If you use this param the `addOnlyAppWhitelist` is mandatory -because you must specify which `addOnlyAppWhitelist` will be able to consume -your protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.buyProtectedData({ - protectedData: '0x123abc...', - price: 1, - addToCollectionId: 12, // [!code focus] - addOnlyAppWhitelist: '0xdef456...', -}); -``` - -### addOnlyAppWhitelist - -**Type:** `AddressOrENS` - -Address of the whitelist smart contract that contains applications allowed to -consume the protected data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.buyProtectedData({ - protectedData: '0x123abc...', - price: 1, - addToCollectionId: 12, - addOnlyAppWhitelist: '0xdef456...', // [!code focus] -}); -``` - -::: tip - -For this `addOnlyAppWhitelist`, you are free to use -`0x256bcd881c33bdf9df952f2a0148f27d439f2e64` that contains apps created for the -purpose of Content Creator usecase-demo. This `addOnlyAppWhitelist` is managed -by iExec. - -For more details on how to create and manage appsWhitelist, see -[Apps whitelist](/references/dataProtector/advanced/apps-whitelist). - -::: - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/selling/removeProtectedDataForSale.md b/src/references/dataProtector/dataProtectorSharing/selling/removeProtectedDataForSale.md deleted file mode 100644 index 6044f308..00000000 --- a/src/references/dataProtector/dataProtectorSharing/selling/removeProtectedDataForSale.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: removeProtectedDataForSale -description: - Method to remove a protected data from sale listing, preventing further - purchase transactions. ---- - -# removeProtectedDataForSale - -Method to remove a protected data for sale. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const notForSaleAnymoreResult = - await dataProtectorSharing.removeProtectedDataForSale({ - protectedData: '0x123abc...', - }); -``` - -## Parameters - -```ts twoslash -import { type RemoveProtectedDataForSaleParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data that you'd like to remove for sale. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const notForSaleAnymoreResult = - await dataProtectorSharing.removeProtectedDataForSale({ - protectedData: '0x123abc...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/selling/setProtectedDataForSale.md b/src/references/dataProtector/dataProtectorSharing/selling/setProtectedDataForSale.md deleted file mode 100644 index 2d642382..00000000 --- a/src/references/dataProtector/dataProtectorSharing/selling/setProtectedDataForSale.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: setProtectedDataForSale -description: - Allows a data owner to list their protected data for sale by setting a price. - Upon successful sale, ownership is transferred to the buyer, who can choose - their own pricing or retain the data for personal use." ---- - -# setProtectedDataForSale - -Method to set a protected data for sale. - -During a successful sale, **the ownership** of the protected data **is -transferred** to the buyer. The buyer will then be able to set their own pricing -parameters, or simply keep the protected data for their own use. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForSaleResult = await dataProtectorSharing.setProtectedDataForSale({ - protectedData: '0x123abc...', - price: 2, // 2 nRLC -}); -``` - -## Parameters - -```ts twoslash -import { type SetProtectedDataForSaleParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data that you'd like to set for sale. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForSaleResult = await dataProtectorSharing.setProtectedDataForSale({ - protectedData: '0x123abc...', // [!code focus] - price: 2, // 2 nRLC -}); -``` - -### price - -**Type:** `number` - -The price in nano RLC (nRLC) you ask from someone who wants to buy the protected -data. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setForSaleResult = await dataProtectorSharing.setProtectedDataForSale({ - protectedData: '0x123abc...', - price: 2, // 2 nRLC // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/subscription.md b/src/references/dataProtector/dataProtectorSharing/subscription.md deleted file mode 100644 index f2f2d913..00000000 --- a/src/references/dataProtector/dataProtectorSharing/subscription.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: Data Sharing - Subscription -description: - Learn how to manage subscription agreements for protected data on the iExec - platform. Understand subscription pricing and duration, along with options for - modifying terms and protecting subscribers' access. ---- - -# Data Sharing - Subscription - -Subscription agreements are one of the options for distributing a collection -owner's protected data. Similar to the rental distribution terms, a subscription -agreement has the following attributes: - -**Subscription Price** - -The collection owner allows a subscriber to pay a set price to access the data. -The subscription fee is a one-time payment, not a recurring one. Subscriptions -do not auto-renew. - -**Subscription Duration** - -The collection owner allows the subscriber access to the data for a set period -of time. - -## The Subscription Bundle - -Where subscriptions differ from rental distribution terms is that a subscription -may cover more than one protected data. We use the term `subscription bundle` -for this grouping of data. The Data Sharing smart contract supports various -different methods for altering the contents of a subscription bundle. Once a -user purchases a subscription to the bundle, they retain access to all protected -data in the bundle until their subscription term expires. The owner may add new -data to the bundle but may not remove protected data from the bundle as long as -there remains at least one subscriber to it. - -## Subscriber Protection - -The Data Sharing smart contract ensures the subscriber maintains access for the -duration of their subscription term. Once the subscription expires, the consumer -loses access to all protected data. The subscriber has the option to pay the -subscription fee again to retain access. The data owner may update the -subscription fee and duration, but any data included in the subscription remains -available. This assurance is critical to the subscription paradigm to ensure -trust between the data owner and the subscriber. - -## Modifying Subscription Terms - -The collection owner has a few options to manage their subscription bundles: - -- The owner may remove the subscription terms and effectively de-list the - subscription bundle -- The owner may modify the subscription price or duration -- The owner may add additional protected data to the subscription -- The owner may remove protected data from the subscription only if there are no - active subscribers - -Making any of these changes is effective immediately. For any existing -subscribers, updates to the subscription terms take effect upon renewal of the -subscription. - - diff --git a/src/references/dataProtector/dataProtectorSharing/subscription/removeProtectedDataFromSubscription.md b/src/references/dataProtector/dataProtectorSharing/subscription/removeProtectedDataFromSubscription.md deleted file mode 100644 index fa54fcc2..00000000 --- a/src/references/dataProtector/dataProtectorSharing/subscription/removeProtectedDataFromSubscription.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: removeProtectedDataFromSubscription -description: - Remove a protected data from your subscription in iExec. Stop providing the - data to current and future subscribers, removing it from subscription access. ---- - -# removeProtectedDataFromSubscription - -Method to remove a protected data from your subscription. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = - await dataProtectorSharing.removeProtectedDataFromSubscription({ - protectedData: '0x123abc...', - }); -``` - -## Pre-conditions - -- You must be the owner of the collection of which the protected data is - currently part of. -- There should be no active subscriptions to this collection. -- The protected data should be part of your subscription. - -## Parameters - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -import { type RemoveProtectedDataFromSubscriptionParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to remove from subscription. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = - await dataProtectorSharing.removeProtectedDataFromSubscription({ - protectedData: '0x123abc...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/subscription/setProtectedDataToSubscription.md b/src/references/dataProtector/dataProtectorSharing/subscription/setProtectedDataToSubscription.md deleted file mode 100644 index f35b16a6..00000000 --- a/src/references/dataProtector/dataProtectorSharing/subscription/setProtectedDataToSubscription.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: setProtectedDataToSubscription -description: - Add your protected data to a subscription on the iExec platform. Allow active - subscribers to access your data easily by linking it to your subscribers to - access your data easily. ---- - -# setProtectedDataToSubscription - -Method to set a protected data as part of your subscription. - -Any user who has an active subscription to your collection will be able to -consume this protected data. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setToSubscriptionResult = - await dataProtectorSharing.setProtectedDataToSubscription({ - protectedData: '0x123abc...', - }); -``` - -## Parameters - -```ts twoslash -import { type SetProtectedDataToSubscriptionParams } from '@iexec/dataprotector'; -``` - -### protectedData - -**Type:** `AddressOrENS` - -Address of the protected data you'd like to be part of your subscription. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setToSubscriptionResult = - await dataProtectorSharing.setProtectedDataToSubscription({ - protectedData: '0x123abc...', // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/subscription/setSubscriptionParams.md b/src/references/dataProtector/dataProtectorSharing/subscription/setSubscriptionParams.md deleted file mode 100644 index d31e44a2..00000000 --- a/src/references/dataProtector/dataProtectorSharing/subscription/setSubscriptionParams.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: setSubscriptionParams -description: - Set subscription parameters for your data collection on the iExec platform. - Define pricing, duration, and manage access to your protected data efficiently - using the Data Sharing smart contract. ---- - -# setSubscriptionParams - -Method to set subscription parameters for a given collection of yours. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setSubscriptionParamsResult = - await dataProtectorSharing.setSubscriptionParams({ - collectionId: 12, - price: 2, // 2 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -## Parameters - -```ts twoslash -import { type SetSubscriptionParams } from '@iexec/dataprotector'; -``` - -### collectionId - -**Type:** `number` - -Collection ID to which you'd like to set the subscription params. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setSubscriptionParamsResult = - await dataProtectorSharing.setSubscriptionParams({ - collectionId: 12, // [!code focus] - price: 2, // 2 nRLC - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### price - -**Type:** `number` - -The price in nano RLC (nRLC) it's going to cost a subscriber to access your -collection. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setSubscriptionParamsResult = - await dataProtectorSharing.setSubscriptionParams({ - collectionId: 12, - price: 2, // 2 nRLC // [!code focus] - duration: 60 * 60 * 24 * 30, // 30 days - }); -``` - -### duration - -**Type:** `number` - -The duration (in seconds) for a period of subscription. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const setSubscriptionParamsResult = - await dataProtectorSharing.setSubscriptionParams({ - collectionId: 12, - price: 2, // 2 nRLC - duration: 60 * 60 * 24 * 30, // 30 days // [!code focus] - }); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorSharing/subscription/subscribeToCollection.md b/src/references/dataProtector/dataProtectorSharing/subscription/subscribeToCollection.md deleted file mode 100644 index 7b7f0c50..00000000 --- a/src/references/dataProtector/dataProtectorSharing/subscription/subscribeToCollection.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -title: subscribeToCollection -description: - Subscribe to a collection on iExec and gain access to both current and future - protected data. Manage your subscription with a fixed price and duration, with - no automatic renewal, using the Data Sharing smart contract. ---- - -# subscribeToCollection - -Method to subscribe to a collection. - -You subscribe for a certain price and duration. **The subscription will not -automatically renew.** - -With an active subscription, you'll have access to current **and future** -protected data. - -## Usage - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.subscribeToCollection({ - collectionId: 12, - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -::: tip - -Technically, `price` and `duration` parameters could be avoided. It is mainly a -protection against front-running "attacks", that is, if the collection owner -changes the price **at the same time** you subscribe to the collection, you -would end up paying more than expected. Passing the `price` here allows the SDK -to ensure you're paying the right price. If prices don't match, the SDK will -throw an error. - -::: - -## Pre-conditions - -- The collection must be available for subscription, that is, the collection - owner must have set a price and a duration. - -## Parameters - -```ts twoslash -import { type SubscribeToCollectionParams } from '@iexec/dataprotector'; -``` - -### collectionId - -**Type:** `number` - -Collection ID to which you'd like to subscribe. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.subscribeToCollection({ - collectionId: 12, // [!code focus] - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -### price - -**Type:** `number` - -Price of the rental for the protected data that you expect to rent. This -parameter ensures that you will not be front-run by the owner of the protected -data. The unit is in nano RLC (nRLC). - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.subscribeToCollection({ - collectionId: 12, - price: 1, // 1 nRLC // [!code focus] - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days -}); -``` - -### duration - -**Type:** `number` - -Duration of the rental for the protected data that you expect to rent. This -parameter ensures that you will not be front-run by the owner of the protected -data. The unit is in seconds. - -```ts twoslash -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -const web3Provider = getWeb3Provider('PRIVATE_KEY'); -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -// ---cut--- -const { txHash } = await dataProtectorSharing.subscribeToCollection({ - collectionId: 12, - price: 1, // 1 nRLC - duration: 60 * 60 * 24 * 2, // 172,800 sec = 2 days // [!code focus] -}); -``` - -## Return Value - -```ts twoslash -import { type SuccessWithTransactionHash } from '@iexec/dataprotector'; -``` - -See -[`SuccessWithTransactionHash`](/references/dataProtector/types#successwithtransactionhash) - - diff --git a/src/references/dataProtector/dataProtectorCore/getGrantedAccess.md b/src/references/dataProtector/methods/getGrantedAccess.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/getGrantedAccess.md rename to src/references/dataProtector/methods/getGrantedAccess.md diff --git a/src/references/dataProtector/dataProtectorCore/getProtectedData.md b/src/references/dataProtector/methods/getProtectedData.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/getProtectedData.md rename to src/references/dataProtector/methods/getProtectedData.md diff --git a/src/references/dataProtector/dataProtectorCore/getResultFromCompletedTask.md b/src/references/dataProtector/methods/getResultFromCompletedTask.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/getResultFromCompletedTask.md rename to src/references/dataProtector/methods/getResultFromCompletedTask.md diff --git a/src/references/dataProtector/dataProtectorCore/grantAccess.md b/src/references/dataProtector/methods/grantAccess.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/grantAccess.md rename to src/references/dataProtector/methods/grantAccess.md diff --git a/src/references/dataProtector/dataProtectorCore/processProtectedData.md b/src/references/dataProtector/methods/processProtectedData.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/processProtectedData.md rename to src/references/dataProtector/methods/processProtectedData.md diff --git a/src/references/dataProtector/dataProtectorCore/protectData.md b/src/references/dataProtector/methods/protectData.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/protectData.md rename to src/references/dataProtector/methods/protectData.md diff --git a/src/references/dataProtector/dataProtectorCore/revokeAllAccess.md b/src/references/dataProtector/methods/revokeAllAccess.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/revokeAllAccess.md rename to src/references/dataProtector/methods/revokeAllAccess.md diff --git a/src/references/dataProtector/dataProtectorCore/revokeOneAccess.md b/src/references/dataProtector/methods/revokeOneAccess.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/revokeOneAccess.md rename to src/references/dataProtector/methods/revokeOneAccess.md diff --git a/src/references/dataProtector/dataProtectorCore/transferOwnership.md b/src/references/dataProtector/methods/transferOwnership.md similarity index 100% rename from src/references/dataProtector/dataProtectorCore/transferOwnership.md rename to src/references/dataProtector/methods/transferOwnership.md From f098de6f64d25135448016c98521d307012cb17a Mon Sep 17 00:00:00 2001 From: Le-Caignec Date: Thu, 9 Oct 2025 17:48:58 +0200 Subject: [PATCH 2/8] Refactor DataProtector documentation and remove outdated content - Removed references to the DataProtector Sharing module and related examples from quick-start and use-cases documentation. - Updated links in various methods to point to the correct paths for access management functions. - Streamlined content in the DataProtector overview and getting-started sections for clarity. - Enhanced descriptions for project cards in tooling and explorers section to provide better context. --- src/get-started/helloWorld/3-buildIApp.md | 6 - .../helloWorld/4-manageDataAccess.md | 18 +- src/get-started/overview/iapp.md | 177 ------------------ src/get-started/overview/privacy-iapp.md | 4 - src/get-started/quick-start.md | 10 - .../subgraph-explorer.md | 8 +- src/get-started/use-cases.md | 10 - .../handle-schemas-dataset-types.md | 2 +- src/guides/manage-data/manage-access.md | 8 +- src/references/dataProtector.md | 23 +-- .../dataProtector/getting-started.md | 106 +---------- .../dataProtector/methods/getGrantedAccess.md | 4 +- .../dataProtector/methods/getProtectedData.md | 2 +- .../methods/processProtectedData.md | 5 +- .../dataProtector/methods/revokeOneAccess.md | 3 +- src/references/dataProtector/types.md | 3 +- src/references/web3mail/methods/sendEmail.md | 2 +- .../web3telegram/methods/sendTelegram.md | 2 +- 18 files changed, 25 insertions(+), 368 deletions(-) delete mode 100644 src/get-started/overview/iapp.md diff --git a/src/get-started/helloWorld/3-buildIApp.md b/src/get-started/helloWorld/3-buildIApp.md index 24db293c..11c428d4 100644 --- a/src/get-started/helloWorld/3-buildIApp.md +++ b/src/get-started/helloWorld/3-buildIApp.md @@ -56,12 +56,6 @@ Telegram handles. [Github](https://github.com/iExecBlockchainComputing/web3telegram-sdk/tree/main/dapp) | [Documentation](/references/web3telegram) -### 🌐 Content delivery - -Transfer, sell or rent protected content to authorized users. -[Github](https://github.com/iExecBlockchainComputing/protected-data-delivery-dapp) -| [Documentation](/references/dataProtector/dataProtectorSharing) - ::: tip These are just a few examples, the possibilities are endless. Want to explore diff --git a/src/get-started/helloWorld/4-manageDataAccess.md b/src/get-started/helloWorld/4-manageDataAccess.md index bb5e542a..8a18e3c3 100644 --- a/src/get-started/helloWorld/4-manageDataAccess.md +++ b/src/get-started/helloWorld/4-manageDataAccess.md @@ -112,21 +112,9 @@ users and iApp, and **process it safely**. But here's where it gets even more exciting... **monetization!**. -Our SDK offers flexible **monetization mechanisms**, allowing you to create -**protected data collections** and implement advanced models like -**subscriptions**, **rentals**, or **direct sales**. The choice is yours! - -Want to see it in action? Check out our -[Content Creator Demo](https://demo.iex.ec/content-creator/) where you can: - -- Create and protect your own content -- Set pricing and access rules -- Manage subscriptions and rentals -- Track your earnings - -For more technical details, see the -[DataProtector Sharing](/references/dataProtector/dataProtectorSharing) -documentation. +Our SDK offers flexible **monetization mechanisms**, allowing you to monetize +your protected data. For more technical details, see the guide +[Monetize you Protected Data](/guides/manage-data-monetize-protected-data). diff --git a/src/get-started/overview/iapp.md b/src/get-started/overview/iapp.md deleted file mode 100644 index ef36dc4f..00000000 --- a/src/get-started/overview/iapp.md +++ /dev/null @@ -1,177 +0,0 @@ ---- -title: What is an iApp? -description: - Learn about iExec Applications (iApp) - confidential computing apps that - process sensitive data in secure TEE environments. Build privacy-preserving - AI, data analysis, and Web3 apps. ---- - - - -# What is an iApp? - -An iExec Application (iApp) is an application that runs inside a confidential -environment (TEEs) to process Protected Data (created with DataProtector). - -Your Python scripts, AI models, or data processors can securely process -protected data inside a TEE. - -## Why iApp Matters? - -iApps provide privacy capabilities, allowing you to process sensitive data while -keeping it private and secure. - -Imagine you want to build: - - - -- An AI that analyzes personal health data -- An email tool that needs access to contact lists -- A financial advisor that processes bank statements -- A content filter that reads private messages - - - -Users have this data, but they won't trust your regular app with it. **With -Privacy iApps, they will.** - -**You gain their trust. They gain their privacy. Everyone wins.** - -## Key Concepts - - - -✅ **True Privacy:** Users never expose their raw data. Your app processes it -privately inside secure enclaves. - -✅ **Trusted Execution:** iExec ensures your code runs inside a Trusted -Execution Environment (TEE), guaranteeing only the specified Docker image -executes in a secure, isolated environment. - -✅ **Decentralized Infrastructure:** No single point of failure. Your app runs -across a distributed network of workers. - -✅ **Zero Trust Architecture:** User data is protected by hardware-based TEEs, -keeping data confidential and inaccessible to the host, cloud provider, or -operating system during execution. - - - -## How it Works - -Your code runs in a Trusted Execution Environment (TEE). This secure area exists -inside specific processors (Intel Software Guard Extensions (SGX) or Trust -Domain Extensions (TDX) chipsets). Everything stays private and protected there, -even from the operating system. - -Authorized users trigger an iApp that processes protected data inside this -private environment. Your iApp uses the data but never exposes it, not even to -you. - - - -1. User provides private data -2. Data is protected with DataProtector -3. You build and deploy a confidential iApp that processes protected data -4. Run the iApp with the corresponding protected data, performing confidential - computing - - - -Your iApp can send emails, update contracts, make transactions, trigger -notifications - anything your code needs. This isn't about trust. We provide -**cryptographic and hardware-enforced guarantees** that preserve privacy within -the TEE execution environment. - -## Use Cases - - - - -### Healthcare - -Process medical data for AI diagnosis without exposing patient information - - - - - -### Finance - -Analyze financial data for credit scoring while maintaining privacy - - - - - -### Media - -Content recommendation engines that don't track user behavior - - - - - -### Research - -Collaborative research on sensitive datasets across institutions - - - - - -## Getting Started - - - -## Time to build - -Let's build an iApp that can process protected data in a secure environment -using the [iExec iApp generator tool](/references/iapp-generator). This tool -helps you create, test and deploy iApps with just a few commands. - - - -### Quick Start Path - -1. **Protect your data** with [DataProtector](/references/dataProtector) -2. **Build your iApp** using the [iApp Generator](/references/iapp-generator) -3. **Deploy and test** your application -4. **Process protected data** securely - -### What You'll Learn - -- How to create a Docker container for your application -- How to handle inputs and outputs securely -- How to deploy to the iExec network -- How to process protected data in TEE environments - -::: tip - -These are just a few examples, the possibilities are endless. Want to explore -iApp Generator? Check out our [documentation](/references/iapp-generator) and -see what you can build! - -::: - -## Technical Requirements - -- **Docker**: Your application must be containerized -- **Input/Output**: Define clear input and output schemas -- **TEE Compatibility**: Ensure your code runs in secure enclaves -- **Network Access**: Configure any external API calls or dependencies - -## Next Steps - -Ready to build your first privacy-preserving application? Start with our -[Hello World tutorial](/get-started/helloWorld) or dive into the -[iApp Generator documentation](/references/iapp-generator). - -For more technical details, see the -[DataProtector Sharing](/references/dataProtector/dataProtectorSharing) -documentation. diff --git a/src/get-started/overview/privacy-iapp.md b/src/get-started/overview/privacy-iapp.md index 885d61cc..ceedfedf 100644 --- a/src/get-started/overview/privacy-iapp.md +++ b/src/get-started/overview/privacy-iapp.md @@ -171,7 +171,3 @@ see what you can build! Ready to build your first privacy-preserving application? Start with our [Hello World tutorial](/get-started/helloWorld) or dive into the [iApp Generator documentation](/references/iapp-generator). - -For more technical details, see the -[DataProtector Sharing](/references/dataProtector/dataProtectorSharing) -documentation. diff --git a/src/get-started/quick-start.md b/src/get-started/quick-start.md index 29eb8f29..9a818aff 100644 --- a/src/get-started/quick-start.md +++ b/src/get-started/quick-start.md @@ -70,16 +70,6 @@ learning and prototyping. buttonHref="https://codesandbox.io/p/github/iExecBlockchainComputing/dataprotector-sandbox/main" /> - - - - @@ -19,16 +19,6 @@ and **record ownership on a smart contract**, ensuring confidentiality and traceability. Granting access to authorized applications is streamlined, facilitating secure data management. -## DataProtector Sharing - -Building upon DataProtector Core, DataProtector Sharing introduces **advanced -features for data sharing** and ownership transfer. Users can securely transfer -ownership of protected data, enabling collaboration and potential **monetization -opportunities**. This module empowers users to share and manage their data -securely, fostering innovation and collaboration in the digital realm. - -## Which One to Use? - With `DataProtector Core`, you can **grant access** to your protected data **to a specific user**. @@ -37,12 +27,3 @@ a specific user**. protected data. - You'll have to sign a transaction at the moment you grant access to the user and the iApp (iExec TEE Dapp). - -With `DataProtector Sharing`, you can **distribute** your protected data to **a -wider audience**. - -- You don't need to know the user's Ethereum address. -- You define a period of time and a price for which the user can access the - data. -- Any user can access your content as long as they comply with your distribution - and monetization choices. diff --git a/src/references/dataProtector/getting-started.md b/src/references/dataProtector/getting-started.md index a7921cf3..ccc780eb 100644 --- a/src/references/dataProtector/getting-started.md +++ b/src/references/dataProtector/getting-started.md @@ -52,53 +52,6 @@ minimal working project ### Instantiate SDK -Depending on your project's requirements, you can instantiate the SDK using the -umbrella module for full functionality or opt for one of the submodules to -access specific sets of features. - -#### Instantiate Using the Umbrella Module - -For projects requiring the full functionality of the SDK, including both core -and sharing functions. - -::: code-group - -```ts twoslash [Browser] -declare global { - interface Window { - ethereum: any; - } -} -// ---cut--- -import { IExecDataProtector } from '@iexec/dataprotector'; - -const web3Provider = window.ethereum; -// Instantiate using the umbrella module for full functionality -const dataProtector = new IExecDataProtector(web3Provider); - -const dataProtectorCore = dataProtector.core; -const dataProtectorSharing = dataProtector.sharing; -``` - -```ts twoslash [NodeJS] -import { IExecDataProtector, getWeb3Provider } from '@iexec/dataprotector'; - -// Get Web3 provider from a private key -const web3Provider = getWeb3Provider('YOUR_PRIVATE_KEY'); - -// Instantiate using the umbrella module for full functionality -const dataProtector = new IExecDataProtector(web3Provider); - -const dataProtectorCore = dataProtector.core; // access to core methods -const dataProtectorSharing = dataProtector.sharing; // access to methods -``` - -::: - -#### Instantiate Only the `Core` Module - -For projects focusing solely on core data protection functions. - ::: code-group ```ts twoslash [Browser] @@ -121,47 +74,12 @@ import { IExecDataProtectorCore, getWeb3Provider } from '@iexec/dataprotector'; // Get Web3 provider from a private key const web3Provider = getWeb3Provider('YOUR_PRIVATE_KEY'); -// Instantiate only the Core module +// Instantiate the Core module const dataProtectorCore = new IExecDataProtectorCore(web3Provider); ``` ::: -#### Instantiate Only the `Sharing` Module - -For projects that need access management functions specifically. - -::: code-group - -```ts twoslash [Browser] -declare global { - interface Window { - ethereum: any; - } -} -// ---cut--- -import { IExecDataProtectorSharing } from '@iexec/dataprotector'; - -const web3Provider = window.ethereum; -// Instantiate only the Sharing module -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -``` - -```ts twoslash [NodeJS] -import { - IExecDataProtectorSharing, - getWeb3Provider, -} from '@iexec/dataprotector'; - -// Get Web3 provider from a private key -const web3Provider = getWeb3Provider('YOUR_PRIVATE_KEY'); - -// Instantiate only the Sharing module -const dataProtectorSharing = new IExecDataProtectorSharing(web3Provider); -``` - -::: - #### Instantiate Without a Web3 Provider For projects that only require read functions, you can instantiate the SDK @@ -177,8 +95,6 @@ import { // Instantiate only the Core module for read-only core methods const dataProtectorCore = new IExecDataProtectorCore(); -// Instantiate only the Sharing module for read-only sharing methods -const dataProtectorSharing = new IExecDataProtectorSharing(); ``` ```ts twoslash [Umbrella Module] @@ -189,8 +105,6 @@ const dataProtector = new IExecDataProtector(); // Access to read-only core methods const dataProtectorCore = dataProtector.core; -// Access to read-only sharing methods -const dataProtectorSharing = dataProtector.sharing; ``` ::: @@ -198,7 +112,7 @@ const dataProtectorSharing = dataProtector.sharing; #### Advanced Configuration To add optional parameters, see -[advanced configuration](/references/dataProtector/advanced/advanced-configuration). +[advanced configuration](/references/dataProtector/advanced-configuration). ::: info @@ -208,9 +122,7 @@ protected data in the experimental **intel TDX** environment. For more details see: -- [configure DataProtector TDX](/references/dataProtector/advanced/advanced-configuration#iexecoptions) -- [create TDX protected data](/references/dataProtector/dataProtectorCore/protectData#usage) -- [process TDX protected data](/references/dataProtector/dataProtectorCore/processProtectedData#workerpool) +- [process TDX protected data](/references/dataProtector/methods/processProtectedData#workerpool) ⚠️ Keep in mind: TDX mode is experimental and can be subject to instabilities or discontinuity. @@ -233,18 +145,6 @@ discontinuity. githubLabel="Sandbox Github" /> - -