diff --git a/src/balancer/OceanPool.ts b/src/balancer/OceanPool.ts index c66b8997..3153c0a1 100644 --- a/src/balancer/OceanPool.ts +++ b/src/balancer/OceanPool.ts @@ -782,6 +782,7 @@ export class OceanPool extends Pool { fromBlock: 0, toBlock: 'latest' }) + events.sort((a, b) => (a.blockNumber > b.blockNumber ? 1 : -1)) for (let i = 0; i < events.length; i++) { const constituents = await super.getCurrentTokens(events[i].returnValues[0]) if (constituents.includes(dtAddress)) result.push(events[i].returnValues[0]) diff --git a/src/ocean/Assets.ts b/src/ocean/Assets.ts index 14f2e478..f0f41e5e 100644 --- a/src/ocean/Assets.ts +++ b/src/ocean/Assets.ts @@ -1,13 +1,7 @@ import { SearchQuery, QueryResult } from '../metadatacache/MetadataCache' import { DDO } from '../ddo/DDO' import { Metadata } from '../ddo/interfaces/Metadata' -import { - Service, - ServiceAccess, - ServiceComputePrivacy, - ServiceCommon -} from '../ddo/interfaces/Service' - +import { Service, ServiceAccess, ServiceComputePrivacy } from '../ddo/interfaces/Service' import { EditableMetadata } from '../ddo/interfaces/EditableMetadata' import Account from './Account' import DID from './DID' @@ -17,6 +11,7 @@ import { WebServiceConnector } from './utils/WebServiceConnector' import BigNumber from 'bignumber.js' import { Provider } from '../provider/Provider' import { isAddress } from 'web3-utils' +import { MetadataMain } from '../ddo/interfaces' export enum CreateProgressStep { CreatingDataToken, @@ -124,7 +119,8 @@ export class Assets extends Instantiable { this.logger.log('Encrypting files') observer.next(CreateProgressStep.EncryptingFiles) - let provider + let provider: Provider + if (providerUri) { provider = new Provider(this.instanceConfig) provider.setBaseUrl(providerUri) @@ -175,7 +171,7 @@ export class Assets extends Instantiable { index, url: undefined })) - } as any + } as MetadataMain } }, ...services @@ -375,12 +371,10 @@ export class Assets extends Instantiable { } as SearchQuery) } - public async getServiceByType( - did: string, - serviceType: string - ): Promise { - const services: ServiceCommon[] = (await this.resolve(did)).service - let service + public async getServiceByType(did: string, serviceType: string): Promise { + let service: Service + const services: Service[] = (await this.resolve(did)).service + services.forEach((serv) => { if (serv.type.toString() === serviceType) { service = serv @@ -389,12 +383,10 @@ export class Assets extends Instantiable { return service } - public async getServiceByIndex( - did: string, - serviceIndex: number - ): Promise { - const services: ServiceCommon[] = (await this.resolve(did)).service - let service + public async getServiceByIndex(did: string, serviceIndex: number): Promise { + let service: Service + const services: Service[] = (await this.resolve(did)).service + services.forEach((serv) => { if (serv.index === serviceIndex) { service = serv @@ -441,8 +433,7 @@ export class Assets extends Instantiable { * @param {String} serviceType * @param {String} consumerAddress * @param {Number} serviceIndex - * @param {String} mpFeePercent will be converted to Wei - * @param {String} mpAddress mp fee collector address + * @param {String} serviceEndpoint * @return {Promise} Order details */ public async initialize( @@ -466,7 +457,7 @@ export class Assets extends Instantiable { * @param {String} serviceType * @param {String} payerAddress * @param {Number} serviceIndex - * @param {String} mpAddress mp fee collector address + * @param {String} mpAddress Marketplace fee collector address * @param {String} consumerAddress Optionally, if the consumer is another address than payer * @return {Promise} transactionHash of the payment */ @@ -478,7 +469,8 @@ export class Assets extends Instantiable { mpAddress?: string, consumerAddress?: string ): Promise { - let service + let service: Service + if (!consumerAddress) consumerAddress = payerAddress if (serviceIndex === -1) { service = await this.getServiceByType(did, serviceType) diff --git a/src/ocean/Compute.ts b/src/ocean/Compute.ts index 582c0c2b..ba2e99b3 100644 --- a/src/ocean/Compute.ts +++ b/src/ocean/Compute.ts @@ -183,7 +183,8 @@ export class Compute extends Instantiable { did?: string, jobId?: string ): Promise { - let provider + let provider: Provider + if (did) { const ddo = await this.ocean.assets.resolve(did) const service = ddo.findServiceByType('compute') diff --git a/src/provider/Provider.ts b/src/provider/Provider.ts index 562e8cfd..1c9bfb16 100644 --- a/src/provider/Provider.ts +++ b/src/provider/Provider.ts @@ -7,6 +7,7 @@ import { Output } from '../ocean/interfaces/ComputeOutput' import { MetadataAlgorithm } from '../ddo/interfaces/MetadataAlgorithm' import { Versions } from '../ocean/Versions' import { Response } from 'node-fetch' +import { DDO } from '../ddo/DDO' const apiPath = '/api/v1/services' @@ -19,7 +20,8 @@ const apiPath = '/api/v1/services' export class Provider extends Instantiable { public nonce: string private baseUrl: string - public get url() { + + public get url(): string { return this.baseUrl } @@ -101,7 +103,8 @@ export class Provider extends Instantiable { serviceType: string, consumerAddress: string ): Promise { - let DDO + let DDO: DDO + try { DDO = await this.ocean.assets.resolve(did) } catch (e) { diff --git a/test/integration/ComputeFlow.test.ts b/test/integration/ComputeFlow.test.ts index 07cb5887..3b33088b 100644 --- a/test/integration/ComputeFlow.test.ts +++ b/test/integration/ComputeFlow.test.ts @@ -3,50 +3,50 @@ import { TestContractHandler } from '../TestContractHandler' import { DataTokens } from '../../src/datatokens/Datatokens' import { Ocean } from '../../src/ocean/Ocean' import { ConfigHelper } from '../../src/utils/ConfigHelper' - import { assert } from 'chai' -import { ServiceCommon, ServiceComputePrivacy } from '../../src/ddo/interfaces/Service' +import { Service, ServiceComputePrivacy } from '../../src/ddo/interfaces/Service' import Web3 from 'web3' import factory from '@oceanprotocol/contracts/artifacts/DTFactory.json' import datatokensTemplate from '@oceanprotocol/contracts/artifacts/DataTokenTemplate.json' +import { Account, DDO, Metadata } from '../../src/lib' +import { Cluster, Container, Server } from '../../src/ocean/Compute' const web3 = new Web3('http://127.0.0.1:8545') -function sleep(ms) { +function sleep(ms: number) { return new Promise((resolve) => { setTimeout(resolve, ms) }) } describe('Compute flow', () => { - let owner - let bob - let ddo - let alice - let asset - let datasetNoRawAlgo - let datasetWithTrustedAlgo - let algorithmAsset - let contracts + let owner: Account + let bob: Account + let ddo: DDO + let alice: Account + let asset: Metadata + let datasetNoRawAlgo: DDO + let datasetWithTrustedAlgo: DDO + let algorithmAsset: DDO + let contracts: TestContractHandler let datatoken: DataTokens - let tokenAddress - let tokenAddressNoRawAlgo - let tokenAddressWithTrustedAlgo - let tokenAddressAlgorithm + let tokenAddress: string + let tokenAddressNoRawAlgo: string + let tokenAddressWithTrustedAlgo: string + let tokenAddressAlgorithm: string let price: string - let ocean - let computeService: ServiceCommon - let data - let blob - let jobId + let ocean: Ocean + let computeService: Service + let data: { t: number; url: string } + let blob: string + let jobId: string - let cluster - let servers - let containers - let provider + let cluster: Cluster + let servers: Server[] + let containers: Container[] + let providerAttributes: any const dateCreated = new Date(Date.now()).toISOString().split('.')[0] + 'Z' // remove milliseconds - const marketplaceAllowance = '20' const tokenAmount = '100' const timeout = 86400 @@ -170,7 +170,7 @@ describe('Compute flow', () => { 'sha256:cb57ecfa6ebbefd8ffc7f75c0f00e57a7fa739578a429b6f72a0df19315deadc' ) ] - provider = ocean.compute.createProviderAttributes( + providerAttributes = ocean.compute.createProviderAttributes( 'Azure', 'Compute service with 16gb ram for each node.', cluster, @@ -186,7 +186,7 @@ describe('Compute flow', () => { alice, price, dateCreated, - provider, + providerAttributes, origComputePrivacy as ServiceComputePrivacy ) ddo = await ocean.assets.create(asset, alice, [computeService], tokenAddress) @@ -205,7 +205,7 @@ describe('Compute flow', () => { alice, '1000', dateCreated, - provider, + providerAttributes, origComputePrivacy as ServiceComputePrivacy ) datasetNoRawAlgo = await ocean.assets.create( @@ -229,7 +229,7 @@ describe('Compute flow', () => { alice, '1000', dateCreated, - provider, + providerAttributes, origComputePrivacy as ServiceComputePrivacy ) datasetWithTrustedAlgo = await ocean.assets.create( @@ -243,7 +243,7 @@ describe('Compute flow', () => { }) it('should publish an algorithm', async () => { - const algoAsset = { + const algoAsset: Metadata = { main: { type: 'algorithm', name: 'Test Algo', @@ -344,7 +344,7 @@ describe('Compute flow', () => { undefined, algorithmMeta, output, - computeService.index, + `${computeService.index}`, computeService.type ) jobId = response.jobId @@ -365,7 +365,8 @@ describe('Compute flow', () => { assert(jobId != null) await ocean.compute.stop(bob, ddo.id, jobId) const response = await ocean.compute.status(bob, ddo.id, jobId) - assert(response[0].stopreq === 1) + // TODO: typings say that `stopreq` does not exist + assert((response[0] as any).stopreq === 1) }) it('should not allow order the compute service with raw algo for dataset that does not allow raw algo', async () => { const service1 = datasetNoRawAlgo.findServiceByType('compute') @@ -416,7 +417,7 @@ describe('Compute flow', () => { algorithmAsset.id, undefined, output, - computeService.index, + `${computeService.index}`, computeService.type, orderalgo, algorithmAsset.dataToken diff --git a/test/integration/Marketplaceflow.test.ts b/test/integration/Marketplaceflow.test.ts index e4ee2f60..bef949b7 100644 --- a/test/integration/Marketplaceflow.test.ts +++ b/test/integration/Marketplaceflow.test.ts @@ -5,7 +5,7 @@ import spies from 'chai-spies' import Web3 from 'web3' import { AbiItem } from 'web3-utils/types' import { DataTokens } from '../../src/datatokens/Datatokens' -import { Account, EditableMetadata, ServiceAccess, ServiceCommon } from '../../src/lib' +import { Account, EditableMetadata, Service, ServiceAccess } from '../../src/lib' import { Ocean } from '../../src/ocean/Ocean' import { ConfigHelper } from '../../src/utils/ConfigHelper' import { TestContractHandler } from '../TestContractHandler' @@ -33,7 +33,7 @@ describe('Marketplace flow', () => { let service1: ServiceAccess let price: string let ocean: Ocean - let accessService: ServiceCommon + let accessService: Service let data let blob