diff --git a/metadata/jsAlgo.json b/metadata/jsAlgo.json index 599c698..ac0d874 100644 --- a/metadata/jsAlgo.json +++ b/metadata/jsAlgo.json @@ -1,11 +1,9 @@ { - "@context": [ - "https://w3id.org/did/v1" - ], + "@context": ["https://w3id.org/did/v1"], "id": "", "nftAddress": "", "version": "4.1.0", - "chainId": 137, + "chainId": null, "metadata": { "created": "2023-08-01T17:09:39Z", "updated": "2023-08-01T17:09:39Z", @@ -68,4 +66,4 @@ "owner": "", "created": "" } -} \ No newline at end of file +} diff --git a/metadata/jsIPFSAlgo.json b/metadata/jsIPFSAlgo.json index 5dc46b3..62a3bbe 100644 --- a/metadata/jsIPFSAlgo.json +++ b/metadata/jsIPFSAlgo.json @@ -1,70 +1,68 @@ { - "@context": [ - "https://w3id.org/did/v1" - ], - "id": "", - "nftAddress": "", - "version": "4.1.0", - "chainId": 8996, - "metadata": { - "created": "2023-08-01T17:09:39Z", - "updated": "2023-08-01T17:09:39Z", - "type": "algorithm", - "name": "avreage price real estate algo", - "description": "Cli algo", - "author": "OPF", - "license": "https://market.oceanprotocol.com/terms", - "additionalInformation": { - "termsAndConditions": true - }, - "algorithm": { - "language": "", - "version": "0.1", - "container": { - "entrypoint": "node $ALGO", - "image": "node", - "tag": "latest", - "checksum": "sha256:1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36" - } - } + "@context": ["https://w3id.org/did/v1"], + "id": "", + "nftAddress": "", + "version": "4.1.0", + "chainId": null, + "metadata": { + "created": "2023-08-01T17:09:39Z", + "updated": "2023-08-01T17:09:39Z", + "type": "algorithm", + "name": "avreage price real estate algo", + "description": "Cli algo", + "author": "OPF", + "license": "https://market.oceanprotocol.com/terms", + "additionalInformation": { + "termsAndConditions": true }, - "services": [ - { - "id": "1234567890", - "type": "compute", - "files": { - "datatokenAddress": "0x0", - "nftAddress": "0x0", - "files": [ - { - "hash": "QmQN9hWcqN7chF3qrAL5HpZSkfc9kvjSH7o4LaGVMxs9gu", - "type" : "ipfs" - } - ] - }, - "timeout": 86400, - "compute": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": [], - "publisherTrustedAlgorithms": [] - } + "algorithm": { + "language": "", + "version": "0.1", + "container": { + "entrypoint": "node $ALGO", + "image": "node", + "tag": "latest", + "checksum": "sha256:1155995dda741e93afe4b1c6ced2d01734a6ec69865cc0997daf1f4db7259a36" } - ], - "stats": { - "allocated": 0, - "orders": 0, - "price": { - "value": "0" + } + }, + "services": [ + { + "id": "1234567890", + "type": "compute", + "files": { + "datatokenAddress": "0x0", + "nftAddress": "0x0", + "files": [ + { + "hash": "QmQN9hWcqN7chF3qrAL5HpZSkfc9kvjSH7o4LaGVMxs9gu", + "type": "ipfs" + } + ] + }, + "timeout": 86400, + "compute": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": [], + "publisherTrustedAlgorithms": [] } - }, - "nft": { - "address": "", - "name": "Ocean Data NFT", - "symbol": "OCEAN-NFT", - "state": 5, - "tokenURI": "", - "owner": "", - "created": "" } - } \ No newline at end of file + ], + "stats": { + "allocated": 0, + "orders": 0, + "price": { + "value": "0" + } + }, + "nft": { + "address": "", + "name": "Ocean Data NFT", + "symbol": "OCEAN-NFT", + "state": 5, + "tokenURI": "", + "owner": "", + "created": "" + } +} diff --git a/metadata/pythonAlgo.json b/metadata/pythonAlgo.json index b9b7ff3..93bdaca 100644 --- a/metadata/pythonAlgo.json +++ b/metadata/pythonAlgo.json @@ -1,11 +1,9 @@ { - "@context": [ - "https://w3id.org/did/v1" - ], + "@context": ["https://w3id.org/did/v1"], "id": "", "nftAddress": "", "version": "4.1.0", - "chainId": 8996, + "chainId": null, "metadata": { "created": "2023-08-01T17:09:39Z", "updated": "2023-08-01T17:09:39Z", diff --git a/metadata/simpleComputeDataset.json b/metadata/simpleComputeDataset.json index 3aa0a71..478b419 100644 --- a/metadata/simpleComputeDataset.json +++ b/metadata/simpleComputeDataset.json @@ -1,20 +1,16 @@ { - "@context": [ - "https://w3id.org/did/v1" - ], + "@context": ["https://w3id.org/did/v1"], "id": "", "nftAddress": "", "version": "4.1.0", - "chainId": 8996, + "chainId": null, "metadata": { "created": "2021-12-20T14:35:20Z", "updated": "2021-12-20T14:35:20Z", "type": "dataset", "name": "cli fixed asset", "description": "asset published using ocean.js cli tool", - "tags": [ - "test" - ], + "tags": ["test"], "author": "oceanprotocol", "license": "https://market.oceanprotocol.com/terms", "additionalInformation": { @@ -47,8 +43,7 @@ } } ], - "event": { - }, + "event": {}, "nft": { "address": "", "name": "Ocean Data NFT", @@ -61,8 +56,7 @@ "purgatory": { "state": false }, - "datatokens": [ - ], + "datatokens": [], "stats": { "allocated": 0, "orders": 0, diff --git a/metadata/simpleDownloadDataset.json b/metadata/simpleDownloadDataset.json index e810193..5a8240e 100644 --- a/metadata/simpleDownloadDataset.json +++ b/metadata/simpleDownloadDataset.json @@ -3,7 +3,7 @@ "id": "", "nftAddress": "", "version": "4.1.0", - "chainId": 11155420, + "chainId": null, "metadata": { "created": "2021-12-20T14:35:20Z", "updated": "2021-12-20T14:35:20Z", diff --git a/metadata/simpleIPFSComputeDataset.json b/metadata/simpleIPFSComputeDataset.json index 3808a9d..5bba914 100644 --- a/metadata/simpleIPFSComputeDataset.json +++ b/metadata/simpleIPFSComputeDataset.json @@ -1,72 +1,66 @@ { - "@context": [ - "https://w3id.org/did/v1" - ], - "id": "", - "nftAddress": "", - "version": "4.1.0", - "chainId": 8996, - "metadata": { - "created": "2021-12-20T14:35:20Z", - "updated": "2021-12-20T14:35:20Z", - "type": "dataset", - "name": "dubai real estate data", - "description": "dubai real estate dataset published using ocean.js cli tool", - "tags": [ - "test" - ], - "author": "oceanprotocol", - "license": "https://market.oceanprotocol.com/terms", - "additionalInformation": { - "termsAndConditions": true - } - }, - "services": [ - { - "id": "ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025", - "type": "compute", - "files": { - "datatokenAddress": "0x0", - "nftAddress": "0x0", - "files": [ - { - "type": "ipfs", - "hash": "QmdXLHfMwupDZbMXmTD1qA8QAiVfHdt1NiGwvokppdUxj4" - } - ] - }, - "datatokenAddress": "", - "serviceEndpoint": "https://v4.provider.oceanprotocol.com", - "timeout": 86400, - "compute": { - "allowRawAlgorithm": false, - "allowNetworkAccess": true, - "publisherTrustedAlgorithmPublishers": [], - "publisherTrustedAlgorithms": [] - } - } - ], - "event": { - }, - "nft": { - "address": "", - "name": "Ocean Data NFT", - "symbol": "OCEAN-NFT", - "state": 5, - "tokenURI": "", - "owner": "", - "created": "" - }, - "purgatory": { - "state": false - }, - "datatokens": [ - ], - "stats": { - "allocated": 0, - "orders": 0, - "price": { - "value": "0" + "@context": ["https://w3id.org/did/v1"], + "id": "", + "nftAddress": "", + "version": "4.1.0", + "chainId": null, + "metadata": { + "created": "2021-12-20T14:35:20Z", + "updated": "2021-12-20T14:35:20Z", + "type": "dataset", + "name": "dubai real estate data", + "description": "dubai real estate dataset published using ocean.js cli tool", + "tags": ["test"], + "author": "oceanprotocol", + "license": "https://market.oceanprotocol.com/terms", + "additionalInformation": { + "termsAndConditions": true + } + }, + "services": [ + { + "id": "ccb398c50d6abd5b456e8d7242bd856a1767a890b537c2f8c10ba8b8a10e6025", + "type": "compute", + "files": { + "datatokenAddress": "0x0", + "nftAddress": "0x0", + "files": [ + { + "type": "ipfs", + "hash": "QmdXLHfMwupDZbMXmTD1qA8QAiVfHdt1NiGwvokppdUxj4" + } + ] + }, + "datatokenAddress": "", + "serviceEndpoint": "https://v4.provider.oceanprotocol.com", + "timeout": 86400, + "compute": { + "allowRawAlgorithm": false, + "allowNetworkAccess": true, + "publisherTrustedAlgorithmPublishers": [], + "publisherTrustedAlgorithms": [] } } - } \ No newline at end of file + ], + "event": {}, + "nft": { + "address": "", + "name": "Ocean Data NFT", + "symbol": "OCEAN-NFT", + "state": 5, + "tokenURI": "", + "owner": "", + "created": "" + }, + "purgatory": { + "state": false + }, + "datatokens": [], + "stats": { + "allocated": 0, + "orders": 0, + "price": { + "value": "0" + } + } +} diff --git a/package-lock.json b/package-lock.json index 1f4ff38..0d67472 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "@libp2p/tcp": "^10.0.7", "@libp2p/websockets": "^9.0.6", "@multiformats/multiaddr": "^12.3.1", - "@oceanprotocol/lib": "^3.3.3", + "@oceanprotocol/lib": "^3.4.6", "axios": "^1.7.7", "chai": "^4.3.10", "cross-fetch": "^4.0.0", @@ -2030,9 +2030,9 @@ "integrity": "sha512-QhewXdtTebycRSZEdkAdvJkSMMnGZyxldlw2eX4VOJto8wymyNdxuhjL/tiaZ5xO7SS5BqURricx9170hfh2kQ==" }, "node_modules/@oceanprotocol/lib": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-3.4.4.tgz", - "integrity": "sha512-TRdW7lfBgDmqgG50S6YDiF3fe6cy0lDTtIazsTvvUs5sWAk1+a1TGQU1qfIYSpfNJM+Yg1KMUSJAPVOTZ65ehQ==", + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-3.4.6.tgz", + "integrity": "sha512-ZG9sOrQHWN1PxPjN75RrRqEBdo1gNd2NuEKNiCLfkSbAUMh2AgHfyq6mEHCPiAxFsmsKMyvhtOif7C6BiHLMqw==", "license": "Apache-2.0", "dependencies": { "@oasisprotocol/sapphire-paratime": "^1.3.2", diff --git a/package.json b/package.json index d48289d..5f4398f 100644 --- a/package.json +++ b/package.json @@ -88,7 +88,7 @@ "@libp2p/tcp": "^10.0.7", "@libp2p/websockets": "^9.0.6", "@multiformats/multiaddr": "^12.3.1", - "@oceanprotocol/lib": "^3.3.3", + "@oceanprotocol/lib": "^3.4.6", "axios": "^1.7.7", "chai": "^4.3.10", "cross-fetch": "^4.0.0", diff --git a/src/extension.ts b/src/extension.ts index 7cd7a1e..8bc8953 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -3,7 +3,7 @@ import { Aquarius, Asset } from '@oceanprotocol/lib' import { OceanProtocolViewProvider } from './viewProvider' import { ethers } from 'ethers' import * as fs from 'fs' -import { createAsset } from './helpers/publish' +import { createAssetUtil } from './helpers/publish' import fetch from 'cross-fetch' import { OceanP2P } from './helpers/oceanNode' import { download } from './helpers/download' @@ -124,7 +124,7 @@ export async function activate(context: vscode.ExtensionContext) { const aquarius = new Aquarius(config.aquariusUrl) - const urlAssetId = await createAsset( + const urlAssetId = await createAssetUtil( asset.nft.name, asset.nft.symbol, signer, @@ -132,7 +132,6 @@ export async function activate(context: vscode.ExtensionContext) { asset, config.providerUrl, aquarius, - undefined, // macOsProviderUrl true // encryptDDO ) diff --git a/src/helpers/publish.ts b/src/helpers/publish.ts index 42e3e7c..ac9f62c 100644 --- a/src/helpers/publish.ts +++ b/src/helpers/publish.ts @@ -1,25 +1,7 @@ -import { - Aquarius, - DatatokenCreateParams, - Nft, - NftCreateData, - NftFactory, - ProviderInstance, - ZERO_ADDRESS, - ConfigHelper, - getEventFromTx, - DispenserCreationParams, - FreCreationParams -} from '@oceanprotocol/lib' -import { ethers, Signer } from 'ethers' -import { SHA256 } from 'crypto-js' -import { hexlify } from 'ethers/lib/utils' -import { createHash } from 'crypto' -import fs from 'fs' -import os from 'os' -import path from 'path' +import { Aquarius, createAsset, ZERO_ADDRESS, Datatoken4 } from '@oceanprotocol/lib' +import { Signer } from 'ethers' -export async function createAsset( +export async function createAssetUtil( name: string, symbol: string, owner: Signer, @@ -27,179 +9,21 @@ export async function createAsset( ddo: any, providerUrl: string, aquariusInstance: Aquarius, - macOsProviderUrl?: string, - encryptDDO: boolean = true + encryptDDO: boolean = true, + templateIndex: number = 1, + providerFeeToken?: string, + macOsProviderUrl?: string ) { - // Expand the ${HOME} variable in the ADDRESS_FILE path - const addressFilePath = process.env.ADDRESS_FILE - ? process.env.ADDRESS_FILE.replace('${HOME}', os.homedir()) - : path.join(os.homedir(), '.ocean', 'ocean-contracts', 'artifacts', 'address.json') - - console.log('Address file path:', addressFilePath) - - // Check if the address file exists - if (!fs.existsSync(addressFilePath)) { - throw new Error(`Address file not found: ${addressFilePath}`) - } - - // Read the address file - const addressFileContent = fs.readFileSync(addressFilePath, 'utf8') - const addresses = JSON.parse(addressFileContent) - console.log('Addresses:', addresses) - - const { chainId } = await owner.provider.getNetwork() - console.log('Chain ID:', chainId) - const nft = new Nft(owner, chainId) - const config = new ConfigHelper().getConfig(chainId) - console.log('Config:', config) - - // Use the addresses from the file if available - const networkAddresses = addresses[config.network] - console.log('Network addresses:', networkAddresses) - if (networkAddresses) { - config.nftFactoryAddress = networkAddresses.ERC721Factory || config.nftFactoryAddress - config.oceanTokenAddress = networkAddresses.Ocean || config.oceanTokenAddress - config.dispenserAddress = networkAddresses.Dispenser || config.dispenserAddress - config.fixedRateExchangeAddress = - networkAddresses.FixedPrice || config.fixedRateExchangeAddress - } - - if (!config.nftFactoryAddress) { - throw new Error(`NFT Factory address not found for network: ${config.network}`) - } - - const nftFactory = new NftFactory(config.nftFactoryAddress, owner) - - ddo.chainId = parseInt(chainId.toString(10)) - console.log('DDO chain ID:', ddo.chainId) - const nftParamsAsset: NftCreateData = { + return await createAsset( name, symbol, - templateIndex: 1, - tokenURI: 'aaa', - transferable: true, - owner: await owner.getAddress() - } - console.log('NFT params:', nftParamsAsset) - const datatokenParams: DatatokenCreateParams = { - templateIndex: 1, - cap: '100000', - feeAmount: '0', - paymentCollector: await owner.getAddress(), - feeToken: config.oceanTokenAddress, - minter: await owner.getAddress(), - mpFeeAddress: ZERO_ADDRESS - } - console.log('Datatoken params:', datatokenParams) - - let bundleNFT - if (!ddo.stats.price.value) { - console.log('Creating NFT with datatoken') - bundleNFT = await nftFactory.createNftWithDatatoken(nftParamsAsset, datatokenParams) - } else if (ddo.stats.price.value === '0') { - console.log('Creating NFT with datatoken and dispenser') - const dispenserParams: DispenserCreationParams = { - dispenserAddress: config.dispenserAddress, - maxTokens: '1', - maxBalance: '100000000', - withMint: true, - allowedSwapper: ZERO_ADDRESS - } - - bundleNFT = await nftFactory.createNftWithDatatokenWithDispenser( - nftParamsAsset, - datatokenParams, - dispenserParams - ) - } else { - console.log('Creating NFT with datatoken and fixed rate') - console.log('fixed rate address: ', config.fixedRateExchangeAddress) - console.log('ocean token address: ', config.oceanTokenAddress) - console.log('owner: ', await owner.getAddress()) - console.log('fixed rate:', ddo.stats.price.value) - - const fixedPriceParams: FreCreationParams = { - fixedRateAddress: config.fixedRateExchangeAddress, - baseTokenAddress: config.oceanTokenAddress, - owner: await owner.getAddress(), - marketFeeCollector: await owner.getAddress(), - baseTokenDecimals: 18, - datatokenDecimals: 18, - fixedRate: ddo.stats.price.value.toString(), - marketFee: '0', - allowedConsumer: await owner.getAddress(), - withMint: true - } - console.log('nft params:', nftParamsAsset) - console.log('datatoken params:', datatokenParams) - console.log('Fixed rate params:', fixedPriceParams) - - try { - bundleNFT = await nftFactory.createNftWithDatatokenWithFixedRate( - nftParamsAsset, - datatokenParams, - fixedPriceParams - ) - } catch (error) { - console.error('Error creating NFT with fixed rate!') - console.error('Error creating NFT with fixed rate:', error) - throw error - } - } - console.log('Bundle NFT:', bundleNFT) - - const trxReceipt = await bundleNFT.wait() - console.log('Transaction receipt:', trxReceipt) - // events have been emitted - const nftCreatedEvent = getEventFromTx(trxReceipt, 'NFTCreated') - const tokenCreatedEvent = getEventFromTx(trxReceipt, 'TokenCreated') - - const nftAddress = nftCreatedEvent.args.newTokenAddress - console.log('NFT address:', nftAddress) - const datatokenAddressAsset = tokenCreatedEvent.args.newTokenAddress - // create the files encrypted string - assetUrl.datatokenAddress = datatokenAddressAsset - assetUrl.nftAddress = nftAddress - ddo.services[0].files = await ProviderInstance.encrypt( + owner, assetUrl, - chainId, - macOsProviderUrl || providerUrl - ) - ddo.services[0].datatokenAddress = datatokenAddressAsset - ddo.services[0].serviceEndpoint = providerUrl - - ddo.nftAddress = nftAddress - ddo.id = 'did:op:' + SHA256(ethers.utils.getAddress(nftAddress) + chainId.toString(10)) - - let metadata - let metadataHash - let flags - if (encryptDDO) { - metadata = await ProviderInstance.encrypt( - ddo, - chainId, - macOsProviderUrl || providerUrl - ) - const validateResult = await aquariusInstance.validate(ddo) - metadataHash = validateResult.hash - flags = 2 - } else { - const stringDDO = JSON.stringify(ddo) - const bytes = Buffer.from(stringDDO) - metadata = hexlify(bytes) - metadataHash = '0x' + createHash('sha256').update(metadata).digest('hex') - flags = 0 - } - - await nft.setMetadata( - nftAddress, - await owner.getAddress(), - 0, - providerUrl, - '', - ethers.utils.hexlify(flags), - metadata, - metadataHash + templateIndex, + ddo, + encryptDDO, + macOsProviderUrl || providerUrl, + providerFeeToken || ZERO_ADDRESS, + aquariusInstance ) - return ddo.id } diff --git a/test/publish.test.ts b/test/publish.test.ts index c00f8e4..bf9345b 100644 --- a/test/publish.test.ts +++ b/test/publish.test.ts @@ -1,7 +1,7 @@ import { expect } from 'chai' import { ethers } from 'ethers' import { Aquarius } from '@oceanprotocol/lib' -import { createAsset } from '../src/helpers/publish' +import { createAssetUtil } from '../src/helpers/publish' import * as dotenv from 'dotenv' dotenv.config() @@ -77,7 +77,7 @@ describe('createAsset function', function () { const providerUrl = process.env.OCEAN_NODE_URL || 'http://localhost:8001' try { - const assetId = await createAsset( + const assetId = await createAssetUtil( name, symbol, signer,