From 2c25699b250cc373c0e6fac5965309ee33bbd08e Mon Sep 17 00:00:00 2001 From: AdriGeorge Date: Wed, 23 Oct 2024 10:33:39 +0300 Subject: [PATCH] chore: wip --- src/@types/Asset.ts | 5 ++- src/@types/DDO/VerifiableCredential.ts | 40 ------------------- src/@types/DDO/versions/BaseDDO.ts | 14 +++++++ src/@types/DDO/{DDO.ts => versions/DDOv4.ts} | 20 ++-------- .../DDO/versions/VerifiableCredential.ts | 28 +++++++++++++ src/@types/index.ts | 2 +- src/services/Aquarius.ts | 5 ++- src/utils/DDO/DDO_V4.ts | 33 +++++++++++++++ src/utils/DDO/DdoFactory.ts | 23 +++++++++++ src/utils/DDO/VerifiableCredential.ts | 30 ++++++++++++++ src/utils/DDOType.ts | 5 +++ src/utils/OrderUtils.ts | 21 +++------- src/utils/verifiableCredential.ts | 9 ----- 13 files changed, 149 insertions(+), 86 deletions(-) delete mode 100644 src/@types/DDO/VerifiableCredential.ts create mode 100644 src/@types/DDO/versions/BaseDDO.ts rename src/@types/DDO/{DDO.ts => versions/DDOv4.ts} (73%) create mode 100644 src/@types/DDO/versions/VerifiableCredential.ts create mode 100644 src/utils/DDO/DDO_V4.ts create mode 100644 src/utils/DDO/DdoFactory.ts create mode 100644 src/utils/DDO/VerifiableCredential.ts create mode 100644 src/utils/DDOType.ts delete mode 100644 src/utils/verifiableCredential.ts diff --git a/src/@types/Asset.ts b/src/@types/Asset.ts index a16cde98..77c4de4f 100644 --- a/src/@types/Asset.ts +++ b/src/@types/Asset.ts @@ -1,4 +1,5 @@ -import { DDO } from '.' +import { DDOv4Type } from './DDO/versions/DDOv4' +import { VerifiableCredentialType } from './DDO/versions/VerifiableCredential' export interface AssetNft { /** @@ -137,7 +138,7 @@ export interface AssetLastEvent { datetime: string } -export interface Asset extends DDO { +export interface Asset extends DDOv4Type, VerifiableCredentialType { /** * Contains information about the ERC721 NFT contract which represents the intellectual property of the publisher. * @type {string} diff --git a/src/@types/DDO/VerifiableCredential.ts b/src/@types/DDO/VerifiableCredential.ts deleted file mode 100644 index c18bf519..00000000 --- a/src/@types/DDO/VerifiableCredential.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { AdditionalVerifiableCredentials } from './AdditionalVerifiableCredentials' -import { CredentialSubject } from './CredentialSubject' - -export interface VerifiableCredential { - /** - * Contexts used for validation. - * @type {string[]} - */ - '@context': string[] - - /** - * id optional for verifiable credential - * @type {string} - */ - id?: string - - /** - * @type {CredentialSubject} - */ - credentialSubject: CredentialSubject - - /** - * Version information in SemVer notation - * referring to the DDO spec version - * @type {string} - */ - version: string - - /** - * Id of issuer - * @type {string} - */ - issuer: string - - /** - * Additional ddos - * @type {AdditionalVerifiableCredentials[]} - */ - additionalDdos?: AdditionalVerifiableCredentials[] -} diff --git a/src/@types/DDO/versions/BaseDDO.ts b/src/@types/DDO/versions/BaseDDO.ts new file mode 100644 index 00000000..f41caba9 --- /dev/null +++ b/src/@types/DDO/versions/BaseDDO.ts @@ -0,0 +1,14 @@ +export interface BaseDDOType { + /** + * Contexts used for validation. + * @type {string[]} + */ + '@context': string[] + + /** + * Version information in SemVer notation + * referring to the DDO spec version + * @type {string} + */ + version: string +} diff --git a/src/@types/DDO/DDO.ts b/src/@types/DDO/versions/DDOv4.ts similarity index 73% rename from src/@types/DDO/DDO.ts rename to src/@types/DDO/versions/DDOv4.ts index 211813d6..feb4ac97 100644 --- a/src/@types/DDO/DDO.ts +++ b/src/@types/DDO/versions/DDOv4.ts @@ -1,29 +1,17 @@ -import { Service, Metadata, Credentials, Event } from '..' +import { BaseDDOType } from './BaseDDO' +import { Service, Metadata, Credentials, Event } from '../..' /** * DID Descriptor Object. * Contains metadata about the asset, and define access in at least one service. */ -export interface DDO { - /** - * Contexts used for validation. - * @type {string[]} - */ - '@context': string[] - +export interface DDOv4Type extends BaseDDOType { /** * DID, descentralized ID. * Computed as sha256(address of NFT contract + chainId) * @type {string} */ - id: string - - /** - * Version information in SemVer notation - * referring to the DDO spec version - * @type {string} - */ - version: string + id?: string /** * NFT contract address diff --git a/src/@types/DDO/versions/VerifiableCredential.ts b/src/@types/DDO/versions/VerifiableCredential.ts new file mode 100644 index 00000000..dcfd6c71 --- /dev/null +++ b/src/@types/DDO/versions/VerifiableCredential.ts @@ -0,0 +1,28 @@ +import { AdditionalVerifiableCredentials } from '../AdditionalVerifiableCredentials' +import { CredentialSubject } from '../CredentialSubject' +import { BaseDDOType } from './BaseDDO' + +export interface VerifiableCredentialType extends BaseDDOType { + /** + * id optional for verifiable credential + * @type {string} + */ + id?: string + + /** + * @type {CredentialSubject} + */ + credentialSubject: CredentialSubject + + /** + * Id of issuer + * @type {string} + */ + issuer: string + + /** + * Additional ddos + * @type {AdditionalVerifiableCredentials[]} + */ + additionalDdos?: AdditionalVerifiableCredentials[] +} diff --git a/src/@types/index.ts b/src/@types/index.ts index 8709fb13..a653e5dd 100644 --- a/src/@types/index.ts +++ b/src/@types/index.ts @@ -1,5 +1,5 @@ export * from './DDO/Credentials' -export * from './DDO/DDO' +export * from './DDO/versions/DDOv4' export * from './DDO/Event' export * from './DDO/Metadata' export * from './DDO/ConsumerParameter' diff --git a/src/services/Aquarius.ts b/src/services/Aquarius.ts index e3d02e1b..001f2300 100644 --- a/src/services/Aquarius.ts +++ b/src/services/Aquarius.ts @@ -1,6 +1,7 @@ import fetch from 'cross-fetch' import { LoggerInstance, sleep } from '../utils' -import { Asset, DDO, ValidateMetadata } from '../@types' +import { Asset, ValidateMetadata } from '../@types' +import { DDO_V4 } from '../utils/DDO/DDO_V4' export interface SearchQuery { from?: number @@ -91,7 +92,7 @@ export class Aquarius { * @param {AbortSignal} signal abort signal * @return {Promise}. */ - public async validate(ddo: DDO, signal?: AbortSignal): Promise { + public async validate(ddo: any, signal?: AbortSignal): Promise { const status: ValidateMetadata = { valid: false } diff --git a/src/utils/DDO/DDO_V4.ts b/src/utils/DDO/DDO_V4.ts new file mode 100644 index 00000000..e2dd3b78 --- /dev/null +++ b/src/utils/DDO/DDO_V4.ts @@ -0,0 +1,33 @@ +import { Asset, Metadata, Service } from '../../@types' +import { BaseDDOType } from '../../@types/DDO/versions/BaseDDO' + +export class DDO_V4 implements BaseDDOType { + '@context': string[] + id: string + version: string + nftAddress: string + chainId: number + metadata: Metadata + services: Service[] + + constructor(data: any) { + this['@context'] = data['@context'] + this.id = data.id + this.version = data.version + this.nftAddress = data.nftAddress + this.chainId = data.chainId + this.metadata = data.metadata + this.services = data.services + } + + /** + * Get param to order an asset based on the specified pricing schema and configuration. + * @param {Asset} asset - The asset to be ordered. + * @param {number} [serviceIndex=0] - Index of the service within the asset. + */ + getOrderAssetParams(asset: Asset, serviceIndex: number = 0) { + const did = asset.id + const serviceId = asset.services[serviceIndex].id + return { did, serviceId } + } +} diff --git a/src/utils/DDO/DdoFactory.ts b/src/utils/DDO/DdoFactory.ts new file mode 100644 index 00000000..246b3554 --- /dev/null +++ b/src/utils/DDO/DdoFactory.ts @@ -0,0 +1,23 @@ +import { DDO_V4 } from './DDO_V4' +import { VerifiableCredential } from './VerifiableCredential' + +type AssetType = DDO_V4 | VerifiableCredential + +export class DDOFactory { + static createDDO(data: any): AssetType { + const { version } = data + switch (version) { + case '4.1.0': + case '4.3.0': + case '4.5.0': + case '4.7.0': + return new DDO_V4(data) + + case '5.0.0': + return new VerifiableCredential(data) + + default: + throw new Error(`Unsupported DDO version: ${version}`) + } + } +} diff --git a/src/utils/DDO/VerifiableCredential.ts b/src/utils/DDO/VerifiableCredential.ts new file mode 100644 index 00000000..5096d497 --- /dev/null +++ b/src/utils/DDO/VerifiableCredential.ts @@ -0,0 +1,30 @@ +import { CredentialSubject } from '../../@types/DDO/CredentialSubject' +import { BaseDDOType } from '../../@types/DDO/versions/BaseDDO' +import { VerifiableCredentialType } from '../../@types/DDO/versions/VerifiableCredential' + +export class VerifiableCredential implements BaseDDOType { + '@context': string[] + id?: string + version: string + credentialSubject: CredentialSubject + issuer: string + + constructor(data: any) { + this['@context'] = data['@context'] + this.id = data.id + this.version = data.version + this.credentialSubject = data.credentialSubject + this.issuer = data.issuer + } + + /** + * Get param to order an asset based on the specified pricing schema and configuration. + * @param {Asset} asset - The asset to be ordered. + * @param {number} [serviceIndex=0] - Index of the service within the asset. + */ + getOrderAssetParams(asset: VerifiableCredentialType, serviceIndex: number = 0) { + const did = asset.credentialSubject.id + const serviceId = asset.credentialSubject.services[serviceIndex].id + return { did, serviceId } + } +} diff --git a/src/utils/DDOType.ts b/src/utils/DDOType.ts new file mode 100644 index 00000000..b1779567 --- /dev/null +++ b/src/utils/DDOType.ts @@ -0,0 +1,5 @@ +import { DDOFactory } from './DDO/DdoFactory' + +export async function getDDOType(assetData: any) { + return DDOFactory.createDDO(assetData) +} diff --git a/src/utils/OrderUtils.ts b/src/utils/OrderUtils.ts index 57950a08..3f5ec2fe 100644 --- a/src/utils/OrderUtils.ts +++ b/src/utils/OrderUtils.ts @@ -15,7 +15,7 @@ import { approveWei } from '../index' import Decimal from 'decimal.js' -import { isVerifiableCredential } from './verifiableCredential' +import { DDOFactory } from './DDO/DdoFactory' /** * Orders an asset based on the specified pricing schema and configuration. @@ -48,21 +48,10 @@ export async function orderAsset( serviceIndex: number = 0, fixedRateIndex: number = 0 ) { - let datatokenAddress: string - let serviceId: string - let dataTokenAddressFirstIndex: string - let did: string - if (isVerifiableCredential(asset)) { - did = (asset as any).credentialSubject.id - datatokenAddress = (asset as any).credentialSubject.datatokens[datatokenIndex].address - dataTokenAddressFirstIndex = (asset as any).credentialSubject.datatokens[0].address - serviceId = (asset as any).credentialSubject.services[serviceIndex].id - } else { - did = asset.id - datatokenAddress = asset.datatokens[datatokenIndex].address - dataTokenAddressFirstIndex = asset.datatokens[0].address - serviceId = asset.services[serviceIndex].id - } + const assetDDO = DDOFactory.createDDO(asset) + const { did, serviceId } = assetDDO.getOrderAssetParams(asset, serviceIndex) + const datatokenAddress = asset.datatokens[datatokenIndex].address + const dataTokenAddressFirstIndex = asset.datatokens[0].address const consumeMarketFeeToken = asset.stats.price.tokenAddress || '0x0000000000000000000000000000000000000000' if (!consumeMarketOrderFee) diff --git a/src/utils/verifiableCredential.ts b/src/utils/verifiableCredential.ts deleted file mode 100644 index d6bf4c03..00000000 --- a/src/utils/verifiableCredential.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Asset } from '../@types' - -export const isVerifiableCredential = (asset: Asset): boolean => { - return ( - (asset as any).type && - Array.isArray((asset as any).type) && - (asset as any).type.includes('VerifiableCredential') - ) -}