Skip to main content
Version: 1.0.0-beta

Publication of service offerings

The following example shows the publication process for 2 datasets(one for access and one for compute) and one algorithm for the purpose of computation.

import * as dotenv from 'dotenv'
import {
LogLevel,
Nautilus,
AssetBuilder,
FileTypes,
ServiceTypes,
ServiceBuilder,
UrlFile,
ConsumerParameterBuilder,
} from '@deltadao/nautilus'
import { Wallet, providers } from 'ethers'
dotenv.config()

const networkConfig = {
chainId: 80001,
network: 'mumbai',
metadataCacheUri: 'https://v4.aquarius.oceanprotocol.com',
nodeUri: 'https://rpc-mumbai.maticvigil.com',
providerUri: 'https://v4.provider.oceanprotocol.com',
subgraphUri: 'https://v4.subgraph.mumbai.oceanprotocol.com',
explorerUri: 'https://mumbai.polygonscan.com',
oceanTokenAddress: '0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8',
oceanTokenSymbol: 'OCEAN',
fixedRateExchangeAddress: '0x25e1926E3d57eC0651e89C654AB0FA182C6D5CF7',
dispenserAddress: '0x21bc18b92F7551e715B490E2C2875E8532317F8d',
startBlock: 26354458,
transactionBlockTimeout: 50,
transactionConfirmationBlocks: 1,
transactionPollingTimeout: 750,
gasFeeMultiplier: 1.1,
nftFactoryAddress: '0x7d46d74023507D30ccc2d3868129fbE4e400e40B',
opfCommunityFeeCollector: '0xd8839c98ca8CE07dDa4e460a71B634A4A82f8BD6',
veAllocate: '0x3fa1d5AC45ab1Ff9CFAe227c5583Ec0484b54Ef9',
veOCEAN: '0x061955B6980A34fce74b235f90DBe20d76f087b1',
veDelegation: '0x96E3aE4247a01C3d40a261df1F8ead70E32E7C0c',
veFeeDistributor: '0x35F1e6765750E874EB9d0675393A1A394A4749b4',
veDelegationProxy: '0x51B1b14b8bfb43a2fB0b49843787Ca440200F6b7',
DFRewards: '0x4259c164eedA7483dda2b4b622D761A88674D31f',
DFStrategyV1: '0x1be9C72500B41c286C797D4FE727747Ae9C4E195',
veFeeEstimate: '0xCFeF55c6ae4d250586e293f29832967a04A9087d'
}
const pricingConfig = {
FREE: {
type: 'free'
} as PricingConfigWithoutOwner,
FIXED_OCEAN: {
type: 'fixed',
freCreationParams: {
fixedRateAddress: '0x25e1926E3d57eC0651e89C654AB0FA182C6D5CF7',
baseTokenAddress: '0xd8992Ed72C445c35Cb4A2be468568Ed1079357c8',
baseTokenDecimals: 18,
datatokenDecimals: 18,
fixedRate: '1',
marketFee: '0',
marketFeeCollector: '0x0000000000000000000000000000000000000000'
}
} as PricingConfigWithoutOwner,
FIXED_EUROE: {
type: 'fixed',
freCreationParams: {
fixedRateAddress: '0x25e1926E3d57eC0651e89C654AB0FA182C6D5CF7',
baseTokenAddress: '0xA089a21902914C3f3325dBE2334E9B466071E5f1',
baseTokenDecimals: 6,
datatokenDecimals: 18,
fixedRate: '1',
marketFee: '0',
marketFeeCollector: '0x0000000000000000000000000000000000000000'
}
} as PricingConfigWithoutOwner
}

const privateKey = process.env.PRIVATE_KEY as string
const provider = new providers.JsonRpcProvider(networkConfig.nodeUri)
const wallet = new Wallet(privateKey, provider)

async function main() {
Nautilus.setLogLevel(LogLevel.Verbose) // optional to show more nautilus internal logs
const nautilus = await Nautilus.create(wallet, networkConfig)

// PUBLISH FUNCTIONS
await publishAccessDataset(nautilus)
await publishComputeDataset(nautilus)
await publishComputeAlgorithm(nautilus)
}

async function publishAccessDataset(nautilus: Nautilus) {
const owner = await wallet.getAddress()
console.log(`Your address is ${owner}`)

const serviceBuilder = new ServiceBuilder(ServiceTypes.ACCESS, FileTypes.URL) // access type dataset with URL data source

const urlFile: UrlFile = {
type: 'url', // there are multiple supported data source types, see https://docs.oceanprotocol.com/developers/storage
url: 'https://www.delta-dao.com/.well-known/did.json', // link to your file or api
method: 'GET', // HTTP request method
// headers: {
// Authorization: 'Basic XXX' // optional headers field e.g. for basic access control
// }
}

const service = serviceBuilder
.setServiceEndpoint(networkConfig.providerUri)
.setTimeout(86400)
.addFile(urlFile)
.setPricing(pricingConfig.FREE)
.setDatatokenNameAndSymbol('My Datatoken Name', 'SYMBOL') // important for following access token transactions in the explorer
.build()

const assetBuilder = new AssetBuilder()
const asset = assetBuilder
.setType('dataset')
.setName('Access Dataset Name')
.setDescription('Access Dataset Description (supports Markdown)')
.setAuthor('Company Name')
.setLicense('MIT')
.addService(service)
.setOwner(owner)
.build()

const result = await nautilus.publish(asset)
console.log(result)
}

async function publishComputeDataset(nautilus: Nautilus) {
const owner = await wallet.getAddress()
console.log(`Your address is ${owner}`)

const consumerParameterBuilder = new ConsumerParameterBuilder() // optional

const cunsumerParameter = consumerParameterBuilder // optional
.setType('number')
.setName('myNumberParam')
.setLabel('My Param Label')
.setDescription('A description of my param for the enduser.')
.setDefault('5')
.setRequired(false)
.build()

const serviceBuilder = new ServiceBuilder(ServiceTypes.COMPUTE, FileTypes.URL) // compute type dataset with URL data source

const urlFile: UrlFile = {
type: 'url',
url: 'https://www.delta-dao.com/.well-known/did.json', // link to your file or api
method: 'GET',
// headers: {
// Authorization: 'Basic XXX' // optional headers field e.g. for basic access control
// }
}

const service = serviceBuilder
.setServiceEndpoint(networkConfig.providerUri)
.setTimeout(86400)
.addFile(urlFile)
.setPricing(pricingConfig.FREE)
.setDatatokenNameAndSymbol('My Datatoken Name', 'SYMBOL') // important for following access token transactions in the explorer
.addConsumerParameter(cunsumerParameter) // optional
.build()

const assetBuilder = new AssetBuilder()
const asset = assetBuilder
.setType('dataset')
.setName('Compute Dataset Name')
.setDescription('Compute Dataset Description (supports Markdown)')
.setAuthor('Company Name')
.setLicense('MIT')
.addService(service)
.setOwner(owner)
.build()

const result = await nautilus.publish(asset)
console.log(result)
}

async function publishComputeAlgorithm(nautilus: Nautilus) {
const owner = await wallet.getAddress()
console.log(`Your address is ${owner}`)

const serviceBuilder = new ServiceBuilder(ServiceTypes.COMPUTE, FileTypes.URL)

const urlFile: UrlFile = {
type: 'url',
url: 'https://raw.githubusercontent.com/deltaDAO/files/main/demo.js', // link to your algorithm logic, will be run using the defined conatainer
method: 'GET',
}

const service = serviceBuilder
.setServiceEndpoint(networkConfig.providerUri)
.setTimeout(86400)
.addFile(urlFile)
.setPricing(pricingConfig.FIXED_OCEAN)
.setDatatokenNameAndSymbol('My Datatoken Name', 'SYMBOL')
.build()

const algoMetadata = {
language: 'Node.js',
version: '1.0.0',
container: {
// https://hub.docker.com/layers/library/node/18.17.1/images/sha256-91e37377b960d0b15d3c15d15321084163bc8d950e14f77bbc84ab23cf3d6da7?context=explore
entrypoint: 'node $ALGO',
image: 'node',
tag: '18.17.1',
checksum:
'sha256:91e37377b960d0b15d3c15d15321084163bc8d950e14f77bbc84ab23cf3d6da7',
},
}

const assetBuilder = new AssetBuilder()

const asset = assetBuilder
.setType('algorithm')
.setName('Compute Algorithm Name')
.setDescription('Compute Algorithm description (supports Markdown)') // supports markdown
.setAuthor('Your Company Name')
.setLicense('MIT')
.setAlgorithm(algoMetadata)
.addService(service)
.setOwner(owner)
.build()

const result = await nautilus.publish(asset)
console.log(result)
}