mirror of
https://github.com/oceanprotocol/market.git
synced 2024-06-28 00:27:49 +02:00
* add balance check and check is consumable * add isOrderable and other helpers * finish start compute job * removed unused methods * add more comments * add pool logic for order * move asset selection to compute helper * small fix * fixed get algo list * refactor start compute job and more fixes * update order params * use compute env and compute consumer address * fix prices * fix algorithms selection list on allowAllPublisher case * fix edit compute settings * update compute resources valid until logic * fixes and cleanups * wip compute jobs * fix compute timeout value * fixed compute jobs logic * fix algo selection list name * fixed compute jobs from profile loading * update start compute flow messages * update set algo access details * update compute message logic * added logs * update package lock * remove logs * fix edit compute checksums for files and container * Fix compute dataset algorithm list (#1194) * fix query Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * remove comment Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * Fix previous order tx (#1197) * rename nft update query Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * fix previous order Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * fix build * handle order price, NaN and default 0 * optional value for all fee, prevent breaking when no value * fix aquarius call and added logs * update provider compute status call * remove percentage fee from price sum, depends smart contract calculation (#1249) Co-authored-by: Soon Huat <soon_huat.phan@daimler.com> * fix display of compute datasets with free price * removed to lowerCase on eth address * fix compute jobs section and your jobs * bumo ocean lib to 1.0.0-next.32 * c2d show price with fee, exclude provider fee * wip get results * include loading when calculating data + algo price, tooltip show order price * update get compute url and use oceanjs helper for download * update computeStatus signature to fix build and CI * added logs * refactor setting price and fees for assets * update compute details and compute results UI and style * update flex value * update download buttons style * update download buttons text * bump ocean lib version and lint fixes * get provier uri for compute results based on job input did * use zero adress for price and fees order * some fixes * Add reuse order in start compute flow (#1352) * wip add reuse order logic * add reuse order in start job * added missing check if no jobs found * update lib Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * fix lint Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> Co-authored-by: mihaisc <mihai.scarlat@smartcontrol.ro> * fix fixed rate * fix build * fix your compute jobs section when asset network not selected * disable edit compute settings for algorithms * fix compute jobs infinite loading when no jobs found * fix compute form * show token symbol for free assets also on compute price output * removed swp file * some decimal fixes * partial fix for asset with pool fees, algo not working yet * more decimal fixes * fix algo with pool price and fees fetching * fix selecting algorithms when on different network * fix compute jobs table auto refresh and details modal closing * wip compute initialize * order fixes * fix lint * fix conditions and cleanups * fix compute status text display * init prices and fees after starting a compute job * start/order button tweaks * kick in loader earlier * update compute status feedback messages * fixed initial price * compute jobs refetch and reuse order * remove logs * removed logs and added some explanations * use compute env max duration value in seconds * error handling on intializeCompute and order * removed console logs and added one new check * use optional on initialized provider check * remove toast from provider helper * fix compute env issue on start order * disable job selection during actions execution * temporary fix publish algo with custom docker image * fix provider fee display * remove unnecessary condition * fix alignment based button on action type (#1491) * fix alignment based on action type * moving to CSS modules * send providerFeeAmount as string * remove cast on providerFeeAmount * removed some logs and added few comments * update price output tooltip and total price logic * set providerFee amount only when avaialable * bump oceanlib to 1.1.2 * replace FIleMetadata to fix build * used approveWei for approving provider fees * fix free algo price selection and display * fix provider fee load at first algo selection * update compute help text * fix provider fee approve for free assets * cleanup * remove commented out code * remove unused state * removed unused imports * typos in comments, variables, props * more typos * shorten getAccessDetailsFromTokenPrice() a bit * state & hooks access reordering * Update src/@utils/ddo.ts remove metadata from service type Co-authored-by: Matthias Kretschmann <m@kretschmann.io> * effect dependency fixes * state renaming * effect dependency fixes * compute jobs profile visual fixes * effect dependency fixes * more comments removal * add accountId as a dependency in effect * move isOwner to asset provider * refactor handleComputeOrder for less complexity and more useful error reporting * more proper error throwing * provider fee statement tweak * more obvious edit action * empty array for `publisherTrustedAlgorithms` & `publisherTrustedAlgorithmPublishers` by default * ref #1538 * ref #1539 * don t use initial tx values as valid order use subgraph value * fix algo list fetching * closes #1537 * addresses #1538 * fix disable compute button if algo is consumable * move isOwner check to single effect * Correctly display trusted algorithms in compute asset (#1541) * fix allowed algo * fix trusted algo filter Co-authored-by: mihaisc <mihai.scarlat@smartcontrol.ro> Co-authored-by: Soon Huat <soon_huat.phan@daimler.com> Co-authored-by: Soon Huat <soonhuat.phan@hotmail.com> Co-authored-by: Enzo Vezzaro <enzo-vezzaro@live.it> Co-authored-by: Matthias Kretschmann <m@kretschmann.io> Co-authored-by: mihaisc <mihai@oceanprotocol.com>
191 lines
4.7 KiB
TypeScript
191 lines
4.7 KiB
TypeScript
import {
|
|
LoggerInstance,
|
|
Asset,
|
|
getHash,
|
|
Nft,
|
|
ProviderInstance,
|
|
DDO,
|
|
MetadataAndTokenURI,
|
|
NftCreateData
|
|
} from '@oceanprotocol/lib'
|
|
import { SvgWaves } from './SvgWaves'
|
|
import Web3 from 'web3'
|
|
import { TransactionReceipt } from 'web3-core'
|
|
|
|
// https://docs.opensea.io/docs/metadata-standards
|
|
export interface NftMetadata {
|
|
name: string
|
|
symbol: string
|
|
description: string
|
|
image?: string
|
|
/* eslint-disable camelcase */
|
|
external_url?: string
|
|
image_data?: string
|
|
background_color?: string
|
|
/* eslint-enable camelcase */
|
|
}
|
|
|
|
function encodeSvg(svgString: string): string {
|
|
return svgString
|
|
.replace(
|
|
'<svg',
|
|
~svgString.indexOf('xmlns')
|
|
? '<svg'
|
|
: '<svg xmlns="http://www.w3.org/2000/svg"'
|
|
)
|
|
.replace('></path>', '/>')
|
|
.replace(/"/g, "'")
|
|
.replace(/%/g, '%25')
|
|
.replace(/#/g, '%23')
|
|
.replace(/{/g, '%7B')
|
|
.replace(/}/g, '%7D')
|
|
.replace(/</g, '%3C')
|
|
.replace(/>/g, '%3E')
|
|
.replace(/\s+/g, ' ')
|
|
}
|
|
|
|
export function generateNftMetadata(): NftMetadata {
|
|
const waves = new SvgWaves()
|
|
const svg = waves.generateSvg()
|
|
const imageData = `data:image/svg+xml,${encodeSvg(svg.outerHTML)}`
|
|
|
|
const newNft: NftMetadata = {
|
|
name: 'Ocean Data NFT',
|
|
symbol: 'OCEAN-NFT',
|
|
description: `This NFT represents an asset in the Ocean Protocol v4 ecosystem.`,
|
|
external_url: 'https://market.oceanprotocol.com',
|
|
background_color: '141414', // dark background
|
|
image_data: imageData
|
|
}
|
|
|
|
return newNft
|
|
}
|
|
|
|
const tokenUriPrefix = 'data:application/json;base64,'
|
|
|
|
export function generateNftCreateData(
|
|
nftMetadata: NftMetadata,
|
|
accountId: string,
|
|
transferable = true
|
|
): any {
|
|
const nftCreateData: NftCreateData = {
|
|
name: nftMetadata.name,
|
|
symbol: nftMetadata.symbol,
|
|
templateIndex: 1,
|
|
tokenURI: '',
|
|
transferable,
|
|
owner: accountId
|
|
}
|
|
|
|
return nftCreateData
|
|
}
|
|
|
|
export function decodeTokenURI(tokenURI: string): NftMetadata {
|
|
if (!tokenURI) return undefined
|
|
try {
|
|
const nftMeta = JSON.parse(
|
|
Buffer.from(tokenURI.replace(tokenUriPrefix, ''), 'base64').toString()
|
|
) as NftMetadata
|
|
|
|
return nftMeta
|
|
} catch (error) {
|
|
LoggerInstance.error(`[NFT] ${error.message}`)
|
|
}
|
|
}
|
|
|
|
export async function setNftMetadata(
|
|
asset: Asset | DDO,
|
|
accountId: string,
|
|
web3: Web3,
|
|
signal: AbortSignal
|
|
): Promise<TransactionReceipt> {
|
|
const encryptedDdo = await ProviderInstance.encrypt(
|
|
asset,
|
|
asset.services[0].serviceEndpoint,
|
|
signal
|
|
)
|
|
LoggerInstance.log('[setNftMetadata] Got encrypted DDO', encryptedDdo)
|
|
|
|
const metadataHash = getHash(JSON.stringify(asset))
|
|
const nft = new Nft(web3)
|
|
|
|
// theoretically used by aquarius or provider, not implemented yet, will remain hardcoded
|
|
const flags = '0x2'
|
|
|
|
const setMetadataTx = await nft.setMetadata(
|
|
asset.nftAddress,
|
|
accountId,
|
|
0,
|
|
asset.services[0].serviceEndpoint,
|
|
'',
|
|
flags,
|
|
encryptedDdo,
|
|
'0x' + metadataHash
|
|
)
|
|
|
|
return setMetadataTx
|
|
}
|
|
|
|
export async function setNFTMetadataAndTokenURI(
|
|
asset: Asset | DDO,
|
|
accountId: string,
|
|
web3: Web3,
|
|
nftMetadata: NftMetadata,
|
|
signal: AbortSignal
|
|
): Promise<TransactionReceipt> {
|
|
const encryptedDdo = await ProviderInstance.encrypt(
|
|
asset,
|
|
asset.services[0].serviceEndpoint,
|
|
signal
|
|
)
|
|
LoggerInstance.log(
|
|
'[setNFTMetadataAndTokenURI] Got encrypted DDO',
|
|
encryptedDdo
|
|
)
|
|
|
|
const metadataHash = getHash(JSON.stringify(asset))
|
|
|
|
// add final did to external_url and asset link to description in nftMetadata before encoding
|
|
const externalUrl = `${nftMetadata.external_url}/asset/${asset.id}`
|
|
const encodedMetadata = Buffer.from(
|
|
JSON.stringify({
|
|
...nftMetadata,
|
|
description: `${nftMetadata.description}\n\nView on Ocean Market: ${externalUrl}`,
|
|
external_url: externalUrl
|
|
})
|
|
).toString('base64')
|
|
const nft = new Nft(web3)
|
|
|
|
// theoretically used by aquarius or provider, not implemented yet, will remain hardcoded
|
|
const flags = '0x02'
|
|
|
|
const metadataAndTokenURI: MetadataAndTokenURI = {
|
|
metaDataState: 0,
|
|
metaDataDecryptorUrl: asset.services[0].serviceEndpoint,
|
|
metaDataDecryptorAddress: '',
|
|
flags,
|
|
data: encryptedDdo,
|
|
metaDataHash: '0x' + metadataHash,
|
|
tokenId: 1,
|
|
tokenURI: `data:application/json;base64,${encodedMetadata}`,
|
|
metadataProofs: []
|
|
}
|
|
|
|
const estGasSetMetadataAndTokenURI = await nft.estGasSetMetadataAndTokenURI(
|
|
asset.nftAddress,
|
|
accountId,
|
|
metadataAndTokenURI
|
|
)
|
|
LoggerInstance.log(
|
|
'[setNFTMetadataAndTokenURI] est Gas set metadata and token uri --',
|
|
estGasSetMetadataAndTokenURI
|
|
)
|
|
const setMetadataAndTokenURITx = await nft.setMetadataAndTokenURI(
|
|
asset.nftAddress,
|
|
accountId,
|
|
metadataAndTokenURI
|
|
)
|
|
|
|
return setMetadataAndTokenURITx
|
|
}
|