2021-12-10 12:33:47 +01:00
|
|
|
// import {
|
|
|
|
// ServiceComputePrivacy,
|
|
|
|
// publisherTrustedAlgorithm as PublisherTrustedAlgorithm,
|
|
|
|
// Service,
|
|
|
|
// LoggerInstance,
|
|
|
|
// Provider,
|
|
|
|
// Config,
|
|
|
|
// Ocean,
|
|
|
|
// Account
|
|
|
|
// } from '@oceanprotocol/lib'
|
|
|
|
// import { ComputeJob } from '@oceanprotocol/lib/dist/node/ocean/interfaces/Compute'
|
2022-01-27 09:52:53 +01:00
|
|
|
import {
|
|
|
|
Asset,
|
|
|
|
DDO,
|
|
|
|
ComputeAlgorithm,
|
|
|
|
Service,
|
|
|
|
LoggerInstance,
|
|
|
|
ProviderInstance
|
|
|
|
} from '@oceanprotocol/lib'
|
2021-10-21 09:24:00 +02:00
|
|
|
import { CancelToken } from 'axios'
|
2021-09-01 16:03:52 +02:00
|
|
|
import { gql } from 'urql'
|
2021-10-21 09:24:00 +02:00
|
|
|
import { queryMetadata, getFilterTerm, generateBaseQuery } from './aquarius'
|
2021-09-01 16:03:52 +02:00
|
|
|
import { fetchDataForMultipleChains } from './subgraph'
|
2022-01-27 09:52:53 +01:00
|
|
|
import { getServiceById } from './ddo'
|
|
|
|
import { getOceanConfig } from './ocean'
|
2021-09-01 16:03:52 +02:00
|
|
|
|
|
|
|
const getComputeOrders = gql`
|
|
|
|
query ComputeOrders($user: String!) {
|
2022-01-13 22:24:06 +01:00
|
|
|
orders(
|
|
|
|
orderBy: createdTimestamp
|
2021-09-01 16:03:52 +02:00
|
|
|
orderDirection: desc
|
|
|
|
where: { payer: $user }
|
|
|
|
) {
|
|
|
|
id
|
|
|
|
serviceId
|
2022-01-13 22:24:06 +01:00
|
|
|
token {
|
2021-09-01 16:03:52 +02:00
|
|
|
address
|
2022-01-13 22:24:06 +01:00
|
|
|
isDatatoken
|
2021-09-01 16:03:52 +02:00
|
|
|
}
|
|
|
|
tx
|
2022-01-13 22:24:06 +01:00
|
|
|
createdTimestamp
|
2021-09-01 16:03:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const getComputeOrdersByDatatokenAddress = gql`
|
|
|
|
query ComputeOrdersByDatatokenAddress(
|
|
|
|
$user: String!
|
|
|
|
$datatokenAddress: String!
|
|
|
|
) {
|
2022-01-13 22:24:06 +01:00
|
|
|
orders(
|
|
|
|
orderBy: createdTimestamp
|
2021-09-01 16:03:52 +02:00
|
|
|
orderDirection: desc
|
2022-01-13 22:24:06 +01:00
|
|
|
where: { payer: $user, token: $datatokenAddress }
|
2021-09-01 16:03:52 +02:00
|
|
|
) {
|
|
|
|
id
|
|
|
|
serviceId
|
2022-01-13 22:24:06 +01:00
|
|
|
token {
|
2021-09-01 16:03:52 +02:00
|
|
|
address
|
2022-01-13 22:24:06 +01:00
|
|
|
isDatatoken
|
2021-09-01 16:03:52 +02:00
|
|
|
}
|
|
|
|
tx
|
2022-01-13 22:24:06 +01:00
|
|
|
createdTimestamp
|
2021-09-01 16:03:52 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
async function getAssetMetadata(
|
2021-10-21 09:24:00 +02:00
|
|
|
queryDtList: string[],
|
2021-09-01 16:03:52 +02:00
|
|
|
cancelToken: CancelToken,
|
|
|
|
chainIds: number[]
|
2021-11-11 08:51:13 +01:00
|
|
|
): Promise<Asset[]> {
|
2021-10-21 09:24:00 +02:00
|
|
|
const baseQueryparams = {
|
|
|
|
chainIds,
|
|
|
|
filters: [
|
|
|
|
getFilterTerm('dataToken', queryDtList),
|
|
|
|
getFilterTerm('service.type', 'compute'),
|
|
|
|
getFilterTerm('service.attributes.main.type', 'dataset')
|
|
|
|
],
|
|
|
|
ignorePurgatory: true
|
|
|
|
} as BaseQueryParams
|
|
|
|
const query = generateBaseQuery(baseQueryparams)
|
|
|
|
const result = await queryMetadata(query, cancelToken)
|
2021-09-01 16:03:52 +02:00
|
|
|
|
|
|
|
return result.results
|
|
|
|
}
|
|
|
|
|
2022-01-27 09:52:53 +01:00
|
|
|
export async function isOrderable(
|
|
|
|
asset: Asset | DDO,
|
|
|
|
serviceId: string,
|
|
|
|
algorithm: ComputeAlgorithm,
|
|
|
|
algorithmDDO: Asset | DDO
|
|
|
|
): Promise<boolean> {
|
|
|
|
const datasetService: Service = getServiceById(asset, serviceId)
|
|
|
|
if (!datasetService) return false
|
|
|
|
if (datasetService.type === 'compute') {
|
|
|
|
if (algorithm.meta) {
|
|
|
|
// check if raw algo is allowed
|
|
|
|
if (datasetService.compute.allowRawAlgorithm) return true
|
|
|
|
LoggerInstance.error('ERROR: This service does not allow raw algorithm')
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if (algorithm.documentId) {
|
|
|
|
const algoService: Service = getServiceById(
|
|
|
|
algorithmDDO,
|
|
|
|
algorithm.serviceId
|
|
|
|
)
|
|
|
|
if (algoService && algoService.type === 'compute') {
|
|
|
|
if (algoService.serviceEndpoint !== datasetService.serviceEndpoint) {
|
|
|
|
this.logger.error(
|
|
|
|
'ERROR: Both assets with compute service are not served by the same provider'
|
|
|
|
)
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
function getServiceEndpoints(data: TokenOrder[], assets: Asset[]): string[] {
|
|
|
|
// const serviceEndpoints: string[] = []
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
// for (let i = 0; i < data.length; i++) {
|
|
|
|
// try {
|
|
|
|
// const did = web3.utils
|
|
|
|
// .toChecksumAddress(data[i].datatokenId.address)
|
|
|
|
// .replace('0x', 'did:op:')
|
|
|
|
// const ddo = assets.filter((x) => x.id === did)[0]
|
|
|
|
// if (ddo === undefined) continue
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
// const service = ddo.services.filter(
|
|
|
|
// (x: Service) => x.index === data[i].serviceId
|
|
|
|
// )[0]
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
// if (!service || service.type !== 'compute') continue
|
|
|
|
// const { providerEndpoint } = service
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
// const wasProviderQueried =
|
|
|
|
// serviceEndpoints?.filter((x) => x === providerEndpoint).length > 0
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
// if (wasProviderQueried) continue
|
|
|
|
// serviceEndpoints.push(providerEndpoint)
|
|
|
|
// } catch (err) {
|
2021-12-10 12:33:47 +01:00
|
|
|
// LoggerInstance.error(err.message)
|
2021-11-11 08:51:13 +01:00
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return serviceEndpoints
|
2021-09-01 16:03:52 +02:00
|
|
|
|
2021-11-11 08:51:13 +01:00
|
|
|
return ['dummy']
|
2021-09-01 16:03:52 +02:00
|
|
|
}
|
|
|
|
|
2021-12-10 12:33:47 +01:00
|
|
|
// async function getProviders(
|
|
|
|
// serviceEndpoints: string[],
|
|
|
|
// config: Config,
|
|
|
|
// ocean: Ocean
|
|
|
|
// ): Promise<Provider[]> {
|
|
|
|
// const providers: Provider[] = []
|
|
|
|
|
|
|
|
// try {
|
|
|
|
// for (let i = 0; i < serviceEndpoints?.length; i++) {
|
|
|
|
// const instanceConfig = {
|
|
|
|
// config,
|
|
|
|
// web3: config.web3Provider,
|
|
|
|
// logger: LoggerInstance,
|
|
|
|
// ocean
|
|
|
|
// }
|
|
|
|
// const provider = await Provider.getInstance(instanceConfig)
|
|
|
|
// await provider.setBaseUrl(serviceEndpoints[i])
|
|
|
|
// const hasSameCompute =
|
|
|
|
// providers.filter((x) => x.computeAddress === provider.computeAddress)
|
|
|
|
// .length > 0
|
|
|
|
// if (!hasSameCompute) providers.push(provider)
|
|
|
|
// }
|
|
|
|
// } catch (err) {
|
|
|
|
// LoggerInstance.error(err.message)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return providers
|
|
|
|
// }
|
|
|
|
|
|
|
|
// async function getJobs(
|
|
|
|
// providers: Provider[],
|
|
|
|
// account: Account,
|
|
|
|
// assets: Asset[]
|
|
|
|
// ): Promise<ComputeJobMetaData[]> {
|
|
|
|
// const computeJobs: ComputeJobMetaData[] = []
|
|
|
|
|
|
|
|
// for (let i = 0; i < providers.length; i++) {
|
|
|
|
// try {
|
|
|
|
// const providerComputeJobs = (await providers[i].computeStatus(
|
|
|
|
// '',
|
|
|
|
// account,
|
|
|
|
// undefined,
|
|
|
|
// undefined,
|
|
|
|
// false
|
|
|
|
// )) as ComputeJob[]
|
|
|
|
|
|
|
|
// // means the provider uri is not good, so we ignore it and move on
|
|
|
|
// if (!providerComputeJobs) continue
|
|
|
|
// providerComputeJobs.sort((a, b) => {
|
|
|
|
// if (a.dateCreated > b.dateCreated) {
|
|
|
|
// return -1
|
|
|
|
// }
|
|
|
|
// if (a.dateCreated < b.dateCreated) {
|
|
|
|
// return 1
|
|
|
|
// }
|
|
|
|
// return 0
|
|
|
|
// })
|
|
|
|
|
|
|
|
// for (let j = 0; j < providerComputeJobs?.length; j++) {
|
|
|
|
// const job = providerComputeJobs[j]
|
|
|
|
// const did = job.inputDID[0]
|
|
|
|
// const ddo = assets.filter((x) => x.id === did)[0]
|
|
|
|
|
|
|
|
// if (!ddo) continue
|
|
|
|
|
|
|
|
// const compJob: ComputeJobMetaData = {
|
|
|
|
// ...job,
|
|
|
|
// assetName: ddo.metadata.name,
|
|
|
|
// assetDtSymbol: ddo.dataTokenInfo.symbol,
|
|
|
|
// networkId: ddo.chainId
|
|
|
|
// }
|
|
|
|
// computeJobs.push(compJob)
|
|
|
|
// }
|
|
|
|
// } catch (err) {
|
|
|
|
// LoggerInstance.error(err.message)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return computeJobs
|
|
|
|
// }
|
|
|
|
|
|
|
|
// function getDtList(data: TokenOrder[]): string[] {
|
|
|
|
// const dtList = []
|
|
|
|
|
|
|
|
// for (let i = 0; i < data.length; i++) {
|
|
|
|
// dtList.push(data[i].datatokenId.address)
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return dtList
|
|
|
|
// }
|
|
|
|
|
|
|
|
// export async function getComputeJobs(
|
|
|
|
// chainIds: number[],
|
|
|
|
// account: Account,
|
|
|
|
// ddo?: Asset,
|
|
|
|
// token?: CancelToken
|
|
|
|
// ): Promise<ComputeResults> {
|
|
|
|
// const assetDTAddress = ddo?.dataTokenInfo?.address
|
|
|
|
// let computeResult: ComputeResults = {
|
|
|
|
// computeJobs: [],
|
|
|
|
// isLoaded: false
|
|
|
|
// }
|
|
|
|
// let isLoading = true
|
|
|
|
// const variables = assetDTAddress
|
|
|
|
// ? {
|
|
|
|
// user: account?.getId().toLowerCase(),
|
|
|
|
// datatokenAddress: assetDTAddress.toLowerCase()
|
|
|
|
// }
|
|
|
|
// : {
|
|
|
|
// user: account?.getId().toLowerCase()
|
|
|
|
// }
|
|
|
|
|
|
|
|
// const result = await fetchDataForMultipleChains(
|
|
|
|
// assetDTAddress ? getComputeOrdersByDatatokenAddress : getComputeOrders,
|
|
|
|
// variables,
|
|
|
|
// assetDTAddress ? [ddo?.chainId] : chainIds
|
|
|
|
// )
|
|
|
|
// let data: TokenOrder[] = []
|
|
|
|
// for (let i = 0; i < result.length; i++) {
|
|
|
|
// if (!result[i]?.tokenOrders || result[i].tokenOrders.length === 0) continue
|
|
|
|
// result[i]?.tokenOrders.forEach((tokenOrder: TokenOrder) => {
|
|
|
|
// data.push(tokenOrder)
|
|
|
|
// })
|
|
|
|
// }
|
|
|
|
// if (!ocean || !account || !data) return
|
|
|
|
|
|
|
|
// if (data.length === 0) {
|
|
|
|
// return computeResult
|
|
|
|
// }
|
|
|
|
|
|
|
|
// data = data.sort((a, b) => b.timestamp - a.timestamp)
|
|
|
|
// const queryDtList = getDtList(data)
|
|
|
|
// if (!queryDtList) return
|
|
|
|
|
|
|
|
// const assets = await getAssetMetadata(queryDtList, token, chainIds)
|
|
|
|
// const serviceEndpoints = getServiceEndpoints(data, assets)
|
|
|
|
// const providers: Provider[] = await getProviders(
|
|
|
|
// serviceEndpoints,
|
|
|
|
// config,
|
|
|
|
// ocean
|
|
|
|
// )
|
|
|
|
// const computeJobs = await getJobs(providers, account, assets)
|
|
|
|
// isLoading = false
|
|
|
|
// computeResult = {
|
|
|
|
// computeJobs: computeJobs,
|
|
|
|
// isLoaded: isLoading
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return computeResult
|
|
|
|
// }
|
|
|
|
|
|
|
|
// export async function createTrustedAlgorithmList(
|
|
|
|
// selectedAlgorithms: string[], // list of DIDs
|
|
|
|
// ocean: Ocean
|
|
|
|
// ): Promise<PublisherTrustedAlgorithm[]> {
|
|
|
|
// const trustedAlgorithms = []
|
|
|
|
|
|
|
|
// for (const selectedAlgorithm of selectedAlgorithms) {
|
|
|
|
// const trustedAlgorithm =
|
|
|
|
// await ocean.compute.createPublisherTrustedAlgorithmfromDID(
|
|
|
|
// selectedAlgorithm
|
|
|
|
// )
|
|
|
|
// trustedAlgorithms.push(trustedAlgorithm)
|
|
|
|
// }
|
|
|
|
// return trustedAlgorithms
|
|
|
|
// }
|
|
|
|
|
|
|
|
// export async function transformComputeFormToServiceComputePrivacy(
|
|
|
|
// values: ComputePrivacyForm,
|
|
|
|
// ocean: Ocean
|
|
|
|
// ): Promise<ServiceComputePrivacy> {
|
|
|
|
// const { allowAllPublishedAlgorithms } = values
|
|
|
|
// const publisherTrustedAlgorithms = values.allowAllPublishedAlgorithms
|
|
|
|
// ? []
|
|
|
|
// : await createTrustedAlgorithmList(values.publisherTrustedAlgorithms, ocean)
|
|
|
|
|
|
|
|
// const privacy: ServiceComputePrivacy = {
|
|
|
|
// allowNetworkAccess: false,
|
|
|
|
// allowRawAlgorithm: false,
|
|
|
|
// allowAllPublishedAlgorithms,
|
|
|
|
// publisherTrustedAlgorithms
|
|
|
|
// }
|
|
|
|
|
|
|
|
// return privacy
|
|
|
|
// }
|