Skip to main content

Overview

The AgrospAI Data Space Portal integrates with multiple data sources to provide comprehensive asset discovery, blockchain data queries, and content moderation.

Aquarius

Aquarius is the metadata cache and search API for Ocean Protocol assets. It indexes asset metadata from the blockchain and provides Elasticsearch-based search capabilities.

queryMetadata

Query assets using Elasticsearch-based search with filtering, sorting, and pagination.
query
SearchQuery
required
Elasticsearch query object containing search criteria
cancelToken
CancelToken
required
Axios cancel token for request cancellation
results
Asset[]
Array of matching assets
page
number
Current page number (1-indexed)
totalPages
number
Total number of pages available
totalResults
number
Total number of matching assets
aggregations
any
Elasticsearch aggregations data
import { queryMetadata, generateBaseQuery } from '@utils/aquarius'
import axios from 'axios'

const cancelToken = axios.CancelToken.source().token

const baseQueryParams = {
  chainIds: [1, 137],
  sortOptions: {
    sortBy: 'metadata.created',
    sortDirection: 'desc'
  },
  esPaginationOptions: {
    from: 0,
    size: 20
  }
}

const query = generateBaseQuery(baseQueryParams)
const results = await queryMetadata(query, cancelToken)

getAsset

Retrieve a single asset by its DID (Decentralized Identifier).
did
string
required
Asset DID in format did:op:[64-char-hex]
cancelToken
CancelToken
required
Axios cancel token for request cancellation
asset
Asset
Complete asset metadata object
import { getAsset } from '@utils/aquarius'
import axios from 'axios'

const did = 'did:op:1234567890abcdef...'
const cancelToken = axios.CancelToken.source().token
const asset = await getAsset(did, cancelToken)

getAssetsFromDids

Fetch multiple assets by their DIDs in a single query.
didList
string[]
required
Array of asset DIDs
chainIds
number[]
required
Chain IDs to search on
cancelToken
CancelToken
required
Axios cancel token
import { getAssetsFromDids } from '@utils/aquarius'

const dids = [
  'did:op:abc123...',
  'did:op:def456...'
]
const assets = await getAssetsFromDids(dids, [137], cancelToken)

Query Helper Functions

generateBaseQuery

Generate an Elasticsearch query from high-level parameters.
baseQueryParams
BaseQueryParams
required
Query configuration object
interface BaseQueryParams {
  chainIds: number[]
  nestedQuery?: any
  esPaginationOptions?: {
    from?: number
    size?: number
  }
  sortOptions?: {
    sortBy: string
    sortDirection: 'asc' | 'desc'
  }
  aggs?: any
  filters?: FilterTerm[]
  ignorePurgatory?: boolean
  ignoreState?: boolean
  showSaas?: boolean
}

getFilterTerm

Create an Elasticsearch filter term.
filterField
string
required
DDO field path (e.g., ‘metadata.type’, ‘nft.owner’)
value
string | number | boolean | string[] | number[]
required
Filter value
key
'term' | 'terms' | 'match' | 'match_phrase'
default:"term"
Elasticsearch query type
import { getFilterTerm } from '@utils/aquarius'

const typeFilter = getFilterTerm('metadata.type', 'dataset')
const multiFilter = getFilterTerm('chainId', [1, 137])
const matchFilter = getFilterTerm('nft.owner', '0x123...', 'match')

Subgraph

The Ocean Protocol Subgraph indexes on-chain events and provides GraphQL queries for blockchain data.

getUserTokenOrders

Fetch all token orders (purchases) for a user across multiple chains.
accountId
string
required
User’s Ethereum address
chainIds
number[]
required
Array of chain IDs to query
orders
OrdersData[]
Array of order objects with datatoken and transaction details
import { getUserTokenOrders } from '@utils/subgraph'

const orders = await getUserTokenOrders(
  '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb',
  [1, 137]
)

// Order structure
interface OrdersData {
  consumer: { id: string }
  datatoken: {
    id: string
    address: string
    symbol: string
  }
  consumerMarketToken: {
    address: string
    symbol: string
  }
  createdTimestamp: number
  tx: string
}

getOpcFees

Retrieve Ocean Protocol Community (OPC) fee configuration for a chain.
chainId
number
required
Chain ID to query fees for
swapOceanFee
string
Fee percentage for OCEAN token swaps
swapNonOceanFee
string
Fee percentage for non-OCEAN token swaps
orderFee
string
Fee percentage for orders
providerFee
string
Fee percentage for provider operations
import { getOpcFees } from '@utils/subgraph'

const fees = await getOpcFees(137)
console.log(fees.orderFee) // '0.001'

getOpcsApprovedTokens

Get list of approved tokens for payments on a specific chain.
chainId
number
required
Chain ID
tokens
TokenInfo[]
Array of approved token information
import { getOpcsApprovedTokens } from '@utils/subgraph'

const tokens = await getOpcsApprovedTokens(137)

// TokenInfo structure
interface TokenInfo {
  address: string
  symbol: string
  name: string
  decimals: number
}

Query Helpers

getSubgraphUri

Get the subgraph URI for a specific chain.
import { getSubgraphUri } from '@utils/subgraph'

const uri = getSubgraphUri(137)
// 'https://v4.subgraph.polygon.oceanprotocol.com'

getQueryContext

Create an operation context for urql queries.
import { getQueryContext } from '@utils/subgraph'

const context = getQueryContext(137)
// { url: '...', requestPolicy: 'network-only' }

fetchData

Execute a GraphQL query against the subgraph.
query
TypedDocumentNode
required
GraphQL query document
variables
any
required
Query variables
context
OperationContext
required
Query context with URL and options
import { fetchData, getQueryContext } from '@utils/subgraph'
import { gql } from 'urql'

const query = gql`
  query GetAssets($owner: String!) {
    nfts(where: { owner: $owner }) {
      id
      owner
      tokenUri
    }
  }
`

const context = getQueryContext(137)
const result = await fetchData(query, { owner: '0x123...' }, context)

ENS (Ethereum Name Service)

ENS support is integrated through Ocean Protocol’s configuration system.
import { getOceanConfig } from '@utils/ocean'

const config = getOceanConfig(1) // Ethereum mainnet
// ENS names are automatically resolved by Ocean Protocol SDK

Purgatory

Purgatory is a content moderation system that flags problematic assets or accounts.

getAccountPurgatoryData

Check if an account address is in purgatory (flagged for moderation).
address
string
required
Ethereum address to check
address
string | undefined
Address if in purgatory, undefined otherwise
reason
string | undefined
Reason for purgatory status
import { getAccountPurgatoryData } from '@utils/purgatory'

const result = await getAccountPurgatoryData('0x123...')

if (result.address) {
  console.log(`Account flagged: ${result.reason}`)
}

Purgatory Filtering in Queries

Aquarius queries automatically filter out purgatory assets unless explicitly disabled:
const baseQueryParams = {
  chainIds: [137],
  ignorePurgatory: false // Default: filters purgatory assets
}

// To include purgatory assets
const queryAllParams = {
  chainIds: [137],
  ignorePurgatory: true // Include flagged assets
}

Error Handling

All data source functions include built-in error handling with logging:
import { LoggerInstance } from '@oceanprotocol/lib'
import { queryMetadata } from '@utils/aquarius'

try {
  const results = await queryMetadata(query, cancelToken)
  if (!results) {
    console.error('No results returned')
  }
} catch (error) {
  LoggerInstance.error('Query failed:', error.message)
}

Type Definitions

// Asset returned from Aquarius
import { Asset } from '@oceanprotocol/lib'

// Paged results
interface PagedAssets {
  results: Asset[]
  page: number
  totalPages: number
  totalResults: number
  aggregations: any
}

// Purgatory data
interface PurgatoryDataAccount {
  address: string
  reason: string
}

Build docs developers (and LLMs) love