Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: update to support 2 subscription addresses #691

Merged
merged 17 commits into from
Jul 16, 2024
Merged
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 15 additions & 9 deletions integration/nevermined/NVMAppAPI.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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')
})

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -218,6 +223,7 @@ describe('NVM App API', () => {
datasetMetadata,
subscriptionDid,
1n, // every file download costs 1 credit to the subscriber
subscriptionNFTAddress,
)

assert.isDefined(ddo)
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
94 changes: 42 additions & 52 deletions src/nevermined/NvmApp.ts
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -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',
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -105,7 +105,7 @@ export class NvmApp {
*/
public static async getInstance(
appEnv: NVMAppEnvironments,
config?: Partial<NeverminedOptions>,
config?: Partial<NeverminedOptions | NeverminedAppOptions>,
): Promise<NvmApp> {
const defaultEnvConfig = this.getConfigFromTagName(appEnv)
const mergedConfig = config ? { ...defaultEnvConfig, ...config } : defaultEnvConfig
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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,
})
}

/**
Expand Down Expand Up @@ -397,7 +387,7 @@ export class NvmApp {
},
],
providers: this.assetProviders,
nftContractAddress: this.subscriptionNFTContractAddress,
nftContractAddress: this.subscriptionNFTContractCreditsAddress,
preMint: false,
})

Expand Down Expand Up @@ -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.
Expand All @@ -689,6 +680,7 @@ export class NvmApp {
costInCredits = 1n,
minCreditsToCharge = 1n,
maxCreditsToCharge = 1n,
nftContractAddress: string,
): SubscribablePromise<CreateProgressStep, DDO> {
if (!this.fullSDK || !this.isWeb3Connected() || !this.userAccount)
throw new Web3Error('Web3 not connected, try calling the connect method first')
Expand All @@ -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(
Expand All @@ -736,13 +722,15 @@ export class NvmApp {
costInCredits = 1n,
minCreditsToCharge = 1n,
maxCreditsToCharge = 1n,
nftContractAddress: string,
): Promise<DDO> {
return await this.registerServiceAsset(
metadata,
subscriptionDid,
costInCredits,
minCreditsToCharge,
maxCreditsToCharge,
nftContractAddress,
)
}

Expand All @@ -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.
Expand All @@ -760,6 +749,7 @@ export class NvmApp {
metadata: MetaData,
subscriptionDid: string,
costInCredits = 1n,
nftContractAddress: string,
): SubscribablePromise<CreateProgressStep, DDO> {
if (!this.fullSDK || !this.isWeb3Connected() || !this.userAccount)
throw new Web3Error('Web3 not connected, try calling the connect method first')
Expand All @@ -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,
})
}

/**
Expand All @@ -810,8 +794,14 @@ export class NvmApp {
metadata: MetaData,
subscriptionDid: string,
costInCredits = 1n,
nftContractAddress: string,
): Promise<DDO> {
return await this.registerFileAsset(metadata, subscriptionDid, costInCredits)
return await this.registerFileAsset(
metadata,
subscriptionDid,
costInCredits,
nftContractAddress,
)
}

/**
Expand Down
5 changes: 4 additions & 1 deletion src/nevermined/api/RegistryBaseApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Loading
Loading