diff --git a/CHANGELOG.md b/CHANGELOG.md index 026fd1a7b..147e7a09d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v3.0.18-rc3](https://github.com/nevermined-io/sdk-js/compare/v3.0.18-rc2...v3.0.18-rc3) + +> 16 July 2024 + +- feat: add check [`698162f`](https://github.com/nevermined-io/sdk-js/commit/698162f97af15052284a8946a8cfb163586f6ce3) +- Automated CHANGELOG.md update [`dea6693`](https://github.com/nevermined-io/sdk-js/commit/dea6693169800e767de3766cf964d490b9126c88) + +#### [v3.0.18-rc2](https://github.com/nevermined-io/sdk-js/compare/v3.0.18-rc1...v3.0.18-rc2) + +> 16 July 2024 + +- fix: value initialization [`d2d81d9`](https://github.com/nevermined-io/sdk-js/commit/d2d81d9458263132bf1c48771a221c68ec0769e0) +- Automated CHANGELOG.md update [`a034641`](https://github.com/nevermined-io/sdk-js/commit/a0346419e7055090f758e1f570b61fad857c1466) + +#### [v3.0.18-rc1](https://github.com/nevermined-io/sdk-js/compare/v3.0.18-rc0...v3.0.18-rc1) + +> 16 July 2024 + +- feat: udpate with isolatedModules removed [`6d9b055`](https://github.com/nevermined-io/sdk-js/commit/6d9b055ba395f8a7f6ab8f1f1fd348edc8023b6f) +- Automated CHANGELOG.md update [`4820951`](https://github.com/nevermined-io/sdk-js/commit/4820951f880f83da41ac59997076df121478f3d5) +- fix: issue [`c189931`](https://github.com/nevermined-io/sdk-js/commit/c18993168af73eda9078d9ce9e33e2f0366ed560) + +#### [v3.0.18-rc0](https://github.com/nevermined-io/sdk-js/compare/v3.0.17...v3.0.18-rc0) + +> 15 July 2024 + +- docs: updating documentation [skip actions] [`67b3644`](https://github.com/nevermined-io/sdk-js/commit/67b364426f50da9468a5c6c15a107bcddbfc2def) +- feat: update to support 2 subscription addresses [`47d50ac`](https://github.com/nevermined-io/sdk-js/commit/47d50acff14bfe5d5c7756ad3d86a0d1af107cf2) +- feat: make tests pass [`019bebe`](https://github.com/nevermined-io/sdk-js/commit/019bebec8059a23e45ea9cd7fb7a75c82963ce1f) + #### [v3.0.17](https://github.com/nevermined-io/sdk-js/compare/v3.0.17-rc1...v3.0.17) > 11 July 2024 diff --git a/integration/nevermined/NVMAppAPI.test.ts b/integration/nevermined/NVMAppAPI.test.ts index 72ff277cd..ec3762010 100644 --- a/integration/nevermined/NVMAppAPI.test.ts +++ b/integration/nevermined/NVMAppAPI.test.ts @@ -2,17 +2,17 @@ import chai, { assert } from 'chai' import chaiAsPromised from 'chai-as-promised' -import config from '../../test/config' -import TestContractHandler from '../../test/keeper/TestContractHandler' -import { Nevermined } from '../../src/nevermined/Nevermined' -import { NvmAccount } from '../../src/models/NvmAccount' +import { NativeTokenAddress } from '../../src/constants/AssetConstants' +import { NvmAppMetadata } from '../../src/ddo/NvmAppMetadata' +import { Web3Error } from '../../src/errors/NeverminedErrors' import { AssetPrice } from '../../src/models/AssetPrice' -import { ResourceAuthentication } from '../../src/types/DDOTypes' +import { NvmAccount } from '../../src/models/NvmAccount' +import { Nevermined } from '../../src/nevermined/Nevermined' import { NVMAppEnvironments, NvmApp } from '../../src/nevermined/NvmApp' import { SubscriptionCreditsNFTApi } from '../../src/nevermined/api/nfts/SubscriptionCreditsNFTApi' -import { NativeTokenAddress } from '../../src/constants/AssetConstants' -import { Web3Error } from '../../src/errors/NeverminedErrors' -import { NvmAppMetadata } from '../../src/ddo/NvmAppMetadata' +import { ResourceAuthentication } from '../../src/types/DDOTypes' +import config from '../../test/config' +import TestContractHandler from '../../test/keeper/TestContractHandler' chai.use(chaiAsPromised) @@ -98,7 +98,11 @@ describe('NVM App API', () => { it('Overwrite the default config with some parameters', async () => { assert.notEqual(nvmApp.config.artifactsFolder, './artifacts') - nvmApp = await NvmApp.getInstance(NVMAppEnvironments.Local, config) + nvmApp = await NvmApp.getInstance(NVMAppEnvironments.Local, { + ...config, + nftContractTimeAddress: subscriptionNFTAddress, + nftContractCreditsAddress: subscriptionNFTAddress, + }) assert.equal(nvmApp.config.artifactsFolder, './artifacts') }) @@ -188,6 +192,7 @@ describe('NVM App API', () => { 2n, // default cost in credits for every succesful query to the agent 1n, // min amount of credits to be consumed 5n, // max amount of credits to be consumed + subscriptionNFTAddress, ) assert.isDefined(ddo) @@ -218,6 +223,7 @@ describe('NVM App API', () => { datasetMetadata, subscriptionDid, 1n, // every file download costs 1 credit to the subscriber + subscriptionNFTAddress, ) assert.isDefined(ddo) diff --git a/package.json b/package.json index cf3a65a7b..62d02758d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nevermined-io/sdk", - "version": "3.0.17", + "version": "3.0.18", "description": "Javascript SDK for connecting with Nevermined Data Platform ", "main": "./dist/node/sdk.js", "typings": "./dist/node/sdk.d.ts", diff --git a/src/nevermined/NvmApp.ts b/src/nevermined/NvmApp.ts index 4e9c5eaed..bd5f49850 100644 --- a/src/nevermined/NvmApp.ts +++ b/src/nevermined/NvmApp.ts @@ -1,7 +1,7 @@ +import { SmartAccountSigner } from 'permissionless/accounts' import { NETWORK_FEE_DENOMINATOR } from '../constants/AssetConstants' import { DDO } from '../ddo/DDO' import { Web3Error } from '../errors/NeverminedErrors' -import { ContractHandler } from '../keeper/ContractHandler' import { AssetPrice } from '../models/AssetPrice' import { NFTAttributes } from '../models/NFTAttributes' import { NeverminedOptions } from '../models/NeverminedOptions' @@ -28,7 +28,6 @@ import { CreateProgressStep, OrderProgressStep, UpdateProgressStep } from './Pro import { SearchApi } from './api/SearchApi' import { ServicesApi } from './api/ServicesApi' import { createKernelClient, isValidAddress } from './utils/BlockchainViemUtils' -import { SmartAccountSigner } from 'permissionless/accounts' export enum NVMAppEnvironments { Staging = 'staging', @@ -71,7 +70,8 @@ export class NvmApp { private zeroDevSignerAccount: SmartAccountSigner<'custom', `0x${string}`> | undefined public assetProviders: string[] = [] private loginCredentials: string | undefined - private subscriptionNFTContractAddress: string | undefined + private subscriptionNFTContractTimeAddress: string | undefined + private subscriptionNFTContractCreditsAddress: string | undefined private networkFeeReceiver: string | undefined private networkFee: bigint | undefined @@ -105,7 +105,7 @@ export class NvmApp { */ public static async getInstance( appEnv: NVMAppEnvironments, - config?: Partial, + config?: Partial, ): Promise { const defaultEnvConfig = this.getConfigFromTagName(appEnv) const mergedConfig = config ? { ...defaultEnvConfig, ...config } : defaultEnvConfig @@ -184,21 +184,17 @@ export class NvmApp { const nodeInfo = await this.fullSDK.services.node.getNeverminedNodeInfo() this.assetProviders = [nodeInfo['provider-address']] - if (!isValidAddress(this.configNVM.nftContractAddress as string)) { - const contractABI = await ContractHandler.getABIArtifact( - 'NFT1155SubscriptionUpgradeable', - this.configNVM.artifactsFolder, - await this.fullSDK.keeper.getNetworkName(), - this.configNVM.chainId, - ) - this.subscriptionNFTContractAddress = contractABI.address - } else { - this.subscriptionNFTContractAddress = this.configNVM.nftContractAddress + this.subscriptionNFTContractTimeAddress = this.configNVM.nftContractTimeAddress + this.subscriptionNFTContractCreditsAddress = this.configNVM.nftContractCreditsAddress + + if (!isValidAddress(this.subscriptionNFTContractTimeAddress as string)) { + throw new Web3Error('Invalid Subscription NFT contract time address') } - if (!isValidAddress(this.subscriptionNFTContractAddress as string)) { - throw new Web3Error('Invalid Subscription NFT contract address') + if (!isValidAddress(this.subscriptionNFTContractCreditsAddress as string)) { + throw new Web3Error('Invalid Subscription NFT contract credits address') } - this.sdk.contracts.loadNft1155(this.subscriptionNFTContractAddress as string) + this.sdk.contracts.loadNft1155(this.subscriptionNFTContractTimeAddress as string) + this.sdk.contracts.loadNft1155(this.subscriptionNFTContractCreditsAddress as string) this.networkFeeReceiver = await this.fullSDK.keeper.nvmConfig.getFeeReceiver() this.networkFee = await this.fullSDK.keeper.nvmConfig.getNetworkFee() return { @@ -325,20 +321,14 @@ export class NvmApp { }, ], providers: this.assetProviders, - nftContractAddress: this.subscriptionNFTContractAddress, + nftContractAddress: this.subscriptionNFTContractTimeAddress, preMint: false, }) - return this.fullSDK.nfts1155.create( - nftAttributes, - this.userAccount, - { - metadata: PublishMetadataOptions.OnlyMetadataAPI, - did: PublishOnChainOptions.DIDRegistry, - }, - // TODO: Review ZeroDev integration as part of the NvmAccount - // { ...(this.useZeroDevSigner && { zeroDevSigner: this.zeroDevSignerAccount }) }, - ) + return this.fullSDK.nfts1155.create(nftAttributes, this.userAccount, { + metadata: PublishMetadataOptions.OnlyMetadataAPI, + did: PublishOnChainOptions.DIDRegistry, + }) } /** @@ -397,7 +387,7 @@ export class NvmApp { }, ], providers: this.assetProviders, - nftContractAddress: this.subscriptionNFTContractAddress, + nftContractAddress: this.subscriptionNFTContractCreditsAddress, preMint: false, }) @@ -679,6 +669,7 @@ export class NvmApp { * @param costInCredits - The cost in credits (default: 1). * @param minCreditsToCharge - The minimum credits required to charge (default: 1). * @param maxCreditsToCharge - The maximum credits to charge (default: 1). + * @param nftContractAddress - The address of the NFT contract associated with the file asset. * @returns A promise that resolves to the progress steps and the registered DDO. * @throws {Web3Error} If Web3 is not connected. * @throws {Error} If the metadata validation fails. @@ -689,6 +680,7 @@ export class NvmApp { costInCredits = 1n, minCreditsToCharge = 1n, maxCreditsToCharge = 1n, + nftContractAddress: string, ): SubscribablePromise { if (!this.fullSDK || !this.isWeb3Connected() || !this.userAccount) throw new Web3Error('Web3 not connected, try calling the connect method first') @@ -714,20 +706,14 @@ export class NvmApp { }, ], providers: this.assetProviders, - nftContractAddress: this.subscriptionNFTContractAddress, + nftContractAddress, preMint: false, }) - return this.fullSDK.nfts1155.create( - nftAttributes, - this.userAccount, - { - metadata: PublishMetadataOptions.OnlyMetadataAPI, - did: PublishOnChainOptions.DIDRegistry, - }, - // TODO: Review ZeroDev integration as part of the NvmAccount - // { ...(this.useZeroDevSigner && { zeroDevSigner: this.zeroDevSignerAccount }) }, - ) + return this.fullSDK.nfts1155.create(nftAttributes, this.userAccount, { + metadata: PublishMetadataOptions.OnlyMetadataAPI, + did: PublishOnChainOptions.DIDRegistry, + }) } public async registerServiceAssetAsync( @@ -736,6 +722,7 @@ export class NvmApp { costInCredits = 1n, minCreditsToCharge = 1n, maxCreditsToCharge = 1n, + nftContractAddress: string, ): Promise { return await this.registerServiceAsset( metadata, @@ -743,6 +730,7 @@ export class NvmApp { costInCredits, minCreditsToCharge, maxCreditsToCharge, + nftContractAddress, ) } @@ -752,6 +740,7 @@ export class NvmApp { * @param metadata - The metadata of the file asset. * @param subscriptionDid - The subscription DID (Decentralized Identifier) associated with the file asset. * @param costInCredits - The cost of the file asset in credits (default is 1). + * @param nftContractAddress - The address of the NFT contract associated with the file asset. * @returns A `SubscribablePromise` that resolves to a `DDO` (Decentralized Data Object) representing the registered file asset. * @throws {Web3Error} If the Web3 connection is not established. * @throws {Error} If the file asset metadata is not valid. @@ -760,6 +749,7 @@ export class NvmApp { metadata: MetaData, subscriptionDid: string, costInCredits = 1n, + nftContractAddress: string, ): SubscribablePromise { if (!this.fullSDK || !this.isWeb3Connected() || !this.userAccount) throw new Web3Error('Web3 not connected, try calling the connect method first') @@ -782,20 +772,14 @@ export class NvmApp { }, ], providers: this.assetProviders, - nftContractAddress: this.subscriptionNFTContractAddress, + nftContractAddress, preMint: false, }) - return this.fullSDK.nfts1155.create( - nftAttributes, - this.userAccount, - { - metadata: PublishMetadataOptions.OnlyMetadataAPI, - did: PublishOnChainOptions.DIDRegistry, - }, - // TODO: Review ZeroDev integration as part of the NvmAccount - // { ...(this.useZeroDevSigner && { zeroDevSigner: this.zeroDevSignerAccount }) }, - ) + return this.fullSDK.nfts1155.create(nftAttributes, this.userAccount, { + metadata: PublishMetadataOptions.OnlyMetadataAPI, + did: PublishOnChainOptions.DIDRegistry, + }) } /** @@ -810,8 +794,14 @@ export class NvmApp { metadata: MetaData, subscriptionDid: string, costInCredits = 1n, + nftContractAddress: string, ): Promise { - return await this.registerFileAsset(metadata, subscriptionDid, costInCredits) + return await this.registerFileAsset( + metadata, + subscriptionDid, + costInCredits, + nftContractAddress, + ) } /** diff --git a/src/nevermined/api/RegistryBaseApi.ts b/src/nevermined/api/RegistryBaseApi.ts index 045ea1a95..6084a1492 100644 --- a/src/nevermined/api/RegistryBaseApi.ts +++ b/src/nevermined/api/RegistryBaseApi.ts @@ -404,7 +404,10 @@ export abstract class RegistryBaseApi extends Instantiable { ) metadataService.attributes.encryptedFiles = JSON.parse(encryptedFilesResponse)['hash'] - if (metadataService.attributes.main.type === 'service') { + if ( + metadataService.attributes.main.type === 'service' && + metadataService.attributes.main.webService.internalAttributes + ) { const encryptedServiceAttributesResponse = await this.nevermined.services.node.encrypt( ddo.id, JSON.stringify(metadataService.attributes.main.webService.internalAttributes), diff --git a/src/nevermined/resources/AppNetworks.ts b/src/nevermined/resources/AppNetworks.ts index 9a9e43eab..1cf6f967f 100644 --- a/src/nevermined/resources/AppNetworks.ts +++ b/src/nevermined/resources/AppNetworks.ts @@ -2,7 +2,8 @@ import { NeverminedOptions } from '../../models' export class NeverminedAppOptions extends NeverminedOptions { instanceName: string - nftContractAddress?: string + nftContractTimeAddress?: string + nftContractCreditsAddress?: string tokenAddress?: string // ERC-20 token address or zero address (0x000..) for native token } @@ -18,7 +19,8 @@ export class AppDeploymentLocal extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined } export class AppDeploymentStaging extends NeverminedAppOptions { @@ -33,7 +35,8 @@ export class AppDeploymentStaging extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' } @@ -49,7 +52,8 @@ export class AppDeploymentTesting extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d' } @@ -65,7 +69,8 @@ export class AppDeploymentArbitrum extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0xaf88d065e77c8cC2239327C5EDb3A432268e5831' } @@ -81,7 +86,8 @@ export class AppDeploymentGnosis extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83' } @@ -97,7 +103,8 @@ export class AppDeploymentMatic extends NeverminedAppOptions { verbose = true gasMultiplier = 1.2 gasPriceMultiplier = 1.2 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0x2791bca1f2de4661ed88a30c99a7a9449aa84174' } @@ -113,7 +120,8 @@ export class AppDeploymentBase extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913' } @@ -129,7 +137,8 @@ export class AppDeploymentCelo extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0xef4229c8c3250C675F21BCefa42f58EfbfF6002a' } @@ -145,6 +154,7 @@ export class AppDeploymentOptimism extends NeverminedAppOptions { verbose = true gasMultiplier = 0 gasPriceMultiplier = 0 - nftContractAddress = undefined + nftContractTimeAddress = undefined + nftContractCreditsAddress = undefined tokenAddress = '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85' } diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 743724b82..246d036e9 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,7 +1,7 @@ { "compilerOptions": { "strict": true, - "isolatedModules": true, + // "isolatedModules": true, "useDefineForClassFields": true, // "noImplicitReturns": true, // Not enabled by default in `strict` mode. // "useUnknownInCatchVariables": true, // TODO: This would normally be enabled in `strict` mode but would require some adjustments to the codebase. diff --git a/tsconfig.json b/tsconfig.json index 68e87ac3a..16c81f167 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { "strict": true, - "isolatedModules": true, "useDefineForClassFields": true, // "noImplicitReturns": true, // Not enabled by default in `strict` mode. // "useUnknownInCatchVariables": true, // TODO: This would normally be enabled in `strict` mode but would require some adjustments to the codebase.