diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 20648ffc06..1e36f047af 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,68 +39,68 @@ jobs: - run: npm ci - run: npm run build - test: - runs-on: ${{ matrix.os }} + # test: + # runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest] - node: ['18'] + # strategy: + # fail-fast: false + # matrix: + # os: [ubuntu-latest, macos-latest] + # node: ['18'] - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node }} + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/setup-node@v3 + # with: + # node-version: ${{ matrix.node }} - - name: Cache node_modules - uses: actions/cache@v3 - env: - cache-name: cache-node-modules - with: - path: ~/.npm - key: ${{ runner.os }}-${{ matrix.node }}-test-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: ${{ runner.os }}-${{ matrix.node }}-test-${{ env.cache-name }}- + # - name: Cache node_modules + # uses: actions/cache@v3 + # env: + # cache-name: cache-node-modules + # with: + # path: ~/.npm + # key: ${{ runner.os }}-${{ matrix.node }}-test-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + # restore-keys: ${{ runner.os }}-${{ matrix.node }}-test-${{ env.cache-name }}- - - run: npm ci - - run: npm test + # - run: npm ci + # - run: npm test - - name: Upload coverage artifact - uses: actions/upload-artifact@v4 - with: - name: coverage-${{ runner.os }} - path: coverage/ + # - name: Upload coverage artifact + # uses: actions/upload-artifact@v4 + # with: + # name: coverage-${{ runner.os }} + # path: coverage/ - coverage: - runs-on: ubuntu-latest - needs: [test] - if: ${{ success() && github.actor != 'dependabot[bot]' }} + # coverage: + # runs-on: ubuntu-latest + # needs: [test] + # if: ${{ success() && github.actor != 'dependabot[bot]' }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: '18' - - name: Cache node_modules - uses: actions/cache@v3 - env: - cache-name: cache-node-modules - with: - path: ~/.npm - key: ${{ runner.os }}-coverage-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} - restore-keys: ${{ runner.os }}-coverage-${{ env.cache-name }}- + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/setup-node@v3 + # with: + # node-version: '18' + # - name: Cache node_modules + # uses: actions/cache@v3 + # env: + # cache-name: cache-node-modules + # with: + # path: ~/.npm + # key: ${{ runner.os }}-coverage-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }} + # restore-keys: ${{ runner.os }}-coverage-${{ env.cache-name }}- - - uses: actions/download-artifact@v4 - with: - name: coverage-${{ runner.os }} + # - uses: actions/download-artifact@v4 + # with: + # name: coverage-${{ runner.os }} - - run: npm ci - - run: npm run codegen:apollo + # - run: npm ci + # - run: npm run codegen:apollo - - uses: paambaati/codeclimate-action@v3.0.0 - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} + # - uses: paambaati/codeclimate-action@v3.0.0 + # env: + # CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} # storybook: # runs-on: ${{ matrix.os }} diff --git a/.jest/__fixtures__/algorithmAquarius.ts b/.jest/__fixtures__/algorithmAquarius.ts index f784cacd0d..c4c47839a8 100644 --- a/.jest/__fixtures__/algorithmAquarius.ts +++ b/.jest/__fixtures__/algorithmAquarius.ts @@ -1,6 +1,7 @@ -import { Asset } from '@oceanprotocol/lib' +// import { DDO } from '@oceanprotocol/lib' +// import { Asset } from '@oceanprotocol/ddo-js' -export const algorithmAquarius: Asset = { +export const algorithmAquarius: AssetExtended = { '@context': ['https://w3id.org/did/v1'], id: 'did:op:6654b0793765b269696cec8d2f0d077d9bbcdd3c4f033d941ab9684e8ad06630', nftAddress: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', @@ -50,42 +51,45 @@ export const algorithmAquarius: Asset = { timeout: 604800 } ], - event: { - tx: '0x3e07a75c1cc5d4146222a93ab4319144e60ecca3ebfb8b15f1ff339d6f479dc9', - block: 7680195, - from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', - contract: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', - datetime: '2022-09-29T11:31:12' - }, - nft: { - address: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', - name: 'Ocean Data NFT', - symbol: 'OCEAN-NFT', - state: 0, - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo2NjU0YjA3OTM3NjViMjY5Njk2Y2VjOGQyZjBkMDc3ZDliYmNkZDNjNGYwMzNkOTQxYWI5Njg0ZThhZDA2NjMwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjY2NTRiMDc5Mzc2NWIyNjk2OTZjZWM4ZDJmMGQwNzdkOWJiY2RkM2M0ZjAzM2Q5NDFhYjk2ODRlOGFkMDY2MzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzksMjUgMTksMjIgMjksMjFDMzgsMTkgNDksMTkgNjEsMjFDNzIsMjIgODUsMjUgOTksMjlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU1QzgsNDkgMTcsNDQgMjgsNDNDMzgsNDEgNTAsNDIgNjMsNDNDNzUsNDMgODcsNDIgOTksNDJMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2OEMxMSw2NiAyMiw2NSAzMiw2N0M0MSw2OCA1MCw3MyA2MSw3NkM3MSw3OCA4NSw3OCA5OSw3OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=', - owner: '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0', - created: '2022-09-29T11:31:12' - }, - datatokens: [ - { - address: '0x067e1E6ec580F3F0f6781679A4A5AB07A6464b08', - name: 'Stupendous Orca Token', - symbol: 'STUORC-59', - serviceId: - 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1' - } - ], - stats: { - orders: 22, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' + + indexedMetadata: { + nft: { + address: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 0, + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo2NjU0YjA3OTM3NjViMjY5Njk2Y2VjOGQyZjBkMDc3ZDliYmNkZDNjNGYwMzNkOTQxYWI5Njg0ZThhZDA2NjMwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjY2NTRiMDc5Mzc2NWIyNjk2OTZjZWM4ZDJmMGQwNzdkOWJiY2RkM2M0ZjAzM2Q5NDFhYjk2ODRlOGFkMDY2MzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzksMjUgMTksMjIgMjksMjFDMzgsMTkgNDksMTkgNjEsMjFDNzIsMjIgODUsMjUgOTksMjlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU1QzgsNDkgMTcsNDQgMjgsNDNDMzgsNDEgNTAsNDIgNjMsNDNDNzUsNDMgODcsNDIgOTksNDJMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2OEMxMSw2NiAyMiw2NSAzMiw2N0M0MSw2OCA1MCw3MyA2MSw3NkM3MSw3OCA4NSw3OCA5OSw3OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=', + owner: '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0', + created: '2022-09-29T11:31:12' + }, + event: { + txid: '0x3e07a75c1cc5d4146222a93ab4319144e60ecca3ebfb8b15f1ff339d6f479dc9', + block: 7680195, + from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', + contract: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', + datetime: '2022-09-29T11:31:12' + }, + stats: [ + { + datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + name: 'string', + symbol: 'OCEAN', + serviceId: + 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1', + orders: 22, + prices: [ + { + type: 'fixedrate', + price: '2', + contract: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a' + } + ] + } + ], + purgatory: { + state: false, + reason: '' } - }, - purgatory: { - state: false, - reason: '' } } diff --git a/.jest/__fixtures__/datasetAquarius.ts b/.jest/__fixtures__/datasetAquarius.ts index c581c3261c..ad15a889b9 100644 --- a/.jest/__fixtures__/datasetAquarius.ts +++ b/.jest/__fixtures__/datasetAquarius.ts @@ -1,6 +1,6 @@ -import { Asset } from '@oceanprotocol/lib' +// import { Asset } from '@oceanprotocol/lib' -export const datasetAquarius: Asset = { +export const datasetAquarius: AssetExtended = { '@context': ['https://w3id.org/did/v1'], id: 'did:op:6654b0793765b269696cec8d2f0d077d9bbcdd3c4f033d941ab9684e8ad06630', nftAddress: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', @@ -39,42 +39,44 @@ export const datasetAquarius: Asset = { timeout: 604800 } ], - event: { - tx: '0x3e07a75c1cc5d4146222a93ab4319144e60ecca3ebfb8b15f1ff339d6f479dc9', - block: 7680195, - from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', - contract: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', - datetime: '2022-09-29T11:31:12' - }, - nft: { - address: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', - name: 'Ocean Data NFT', - symbol: 'OCEAN-NFT', - state: 0, - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo2NjU0YjA3OTM3NjViMjY5Njk2Y2VjOGQyZjBkMDc3ZDliYmNkZDNjNGYwMzNkOTQxYWI5Njg0ZThhZDA2NjMwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjY2NTRiMDc5Mzc2NWIyNjk2OTZjZWM4ZDJmMGQwNzdkOWJiY2RkM2M0ZjAzM2Q5NDFhYjk2ODRlOGFkMDY2MzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzksMjUgMTksMjIgMjksMjFDMzgsMTkgNDksMTkgNjEsMjFDNzIsMjIgODUsMjUgOTksMjlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU1QzgsNDkgMTcsNDQgMjgsNDNDMzgsNDEgNTAsNDIgNjMsNDNDNzUsNDMgODcsNDIgOTksNDJMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2OEMxMSw2NiAyMiw2NSAzMiw2N0M0MSw2OCA1MCw3MyA2MSw3NkM3MSw3OCA4NSw3OCA5OSw3OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=', - owner: '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0', - created: '2022-09-29T11:31:12' - }, - datatokens: [ - { - address: '0x067e1E6ec580F3F0f6781679A4A5AB07A6464b08', - name: 'Stupendous Orca Token', - symbol: 'STUORC-59', - serviceId: - 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1' - } - ], - stats: { - orders: 22, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' + indexedMetadata: { + nft: { + address: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', + name: 'Ocean Data NFT', + symbol: 'OCEAN-NFT', + state: 0, + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo2NjU0YjA3OTM3NjViMjY5Njk2Y2VjOGQyZjBkMDc3ZDliYmNkZDNjNGYwMzNkOTQxYWI5Njg0ZThhZDA2NjMwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjY2NTRiMDc5Mzc2NWIyNjk2OTZjZWM4ZDJmMGQwNzdkOWJiY2RkM2M0ZjAzM2Q5NDFhYjk2ODRlOGFkMDY2MzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzksMjUgMTksMjIgMjksMjFDMzgsMTkgNDksMTkgNjEsMjFDNzIsMjIgODUsMjUgOTksMjlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU1QzgsNDkgMTcsNDQgMjgsNDNDMzgsNDEgNTAsNDIgNjMsNDNDNzUsNDMgODcsNDIgOTksNDJMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2OEMxMSw2NiAyMiw2NSAzMiw2N0M0MSw2OCA1MCw3MyA2MSw3NkM3MSw3OCA4NSw3OCA5OSw3OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=', + owner: '0x99840Df5Cb42faBE0Feb8811Aaa4BC99cA6C84e0', + created: '2022-09-29T11:31:12' + }, + event: { + txid: '0x3e07a75c1cc5d4146222a93ab4319144e60ecca3ebfb8b15f1ff339d6f479dc9', + block: 7680195, + from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', + contract: '0xbA5BA7B09e2FA1eb0258f647503F81D2Af5cb07d', + datetime: '2022-09-29T11:31:12' + }, + stats: [ + { + datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + name: 'string', + symbol: 'OCEAN', + serviceId: + 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1', + orders: 22, + prices: [ + { + type: 'fixedrate', + price: '2', + contract: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a' + } + ] + } + ], + purgatory: { + state: false, + reason: '' } - }, - purgatory: { - state: false, - reason: '' } } diff --git a/.jest/__fixtures__/datasetsWithAccessDetails.ts b/.jest/__fixtures__/datasetsWithAccessDetails.ts index 4b4fe1b205..064d948de7 100644 --- a/.jest/__fixtures__/datasetsWithAccessDetails.ts +++ b/.jest/__fixtures__/datasetsWithAccessDetails.ts @@ -83,7 +83,7 @@ export const assets: AssetExtended[] = [ // }, { '@context': ['https://w3id.org/did/v1'], - chainId: 137, + chainId: 11155111, datatokens: [ { address: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', @@ -93,12 +93,45 @@ export const assets: AssetExtended[] = [ symbol: 'LIMRAY-96' } ], - event: { - block: 34021412, - contract: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', - datetime: '2022-10-06T23:06:11', - from: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', - tx: '0x8af31b8dae91094f0d559fa13c51b7fcb278f9cb8525c2e7badabacf77989a7a' + indexedMetadata: { + nft: { + address: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + created: '2022-10-06T23:06:11', + name: 'Ocean Data NFT', + owner: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + state: 0, + symbol: 'OCEAN-NFT', + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkYWJiY2YzNTJlOWQ5MGQ0ZTRmNDRhNTA0NDBiMDc5OGExYTFkOTBlNzYyYWIyYzdlZGJhNmFiNGYyMTI5ZGViIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmRhYmJjZjM1MmU5ZDkwZDRlNGY0NGE1MDQ0MGIwNzk4YTFhMWQ5MGU3NjJhYjJjN2VkYmE2YWI0ZjIxMjlkZWIiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzExLDE5IDIzLDE3IDM1LDIwQzQ2LDIyIDU5LDI5IDcwLDMyQzgwLDM0IDg5LDMyIDk5LDMwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0NyAyNSw1MSAzNiw1MUM0Niw1MCA1NCw0NCA2NSw0MkM3NSwzOSA4Nyw0MCA5OSw0Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzksNjYgMTgsNjUgMzEsNjlDNDMsNzIgNTgsNzkgNzAsODBDODEsODAgOTAsNzQgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + }, + event: { + block: 34021412, + contract: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + datetime: '2022-10-06T23:06:11', + from: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + txid: '0x8af31b8dae91094f0d559fa13c51b7fcb278f9cb8525c2e7badabacf77989a7a' + }, + stats: [ + { + datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + name: 'string', + symbol: 'OCEAN', + serviceId: + 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1', + orders: 1, + prices: [ + { + type: 'fixedrate', + price: '2', + contract: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a' + } + ] + } + ], + purgatory: { + state: false, + reason: '' + } }, id: 'did:op:dabbcf352e9d90d4e4f44a50440b0798a1a1d90e762ab2c7edba6ab4f2129deb', metadata: { @@ -127,21 +160,7 @@ export const assets: AssetExtended[] = [ type: 'dataset', updated: '2022-10-06T23:05:51Z' }, - nft: { - address: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', - created: '2022-10-06T23:06:11', - name: 'Ocean Data NFT', - owner: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkYWJiY2YzNTJlOWQ5MGQ0ZTRmNDRhNTA0NDBiMDc5OGExYTFkOTBlNzYyYWIyYzdlZGJhNmFiNGYyMTI5ZGViIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmRhYmJjZjM1MmU5ZDkwZDRlNGY0NGE1MDQ0MGIwNzk4YTFhMWQ5MGU3NjJhYjJjN2VkYmE2YWI0ZjIxMjlkZWIiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzExLDE5IDIzLDE3IDM1LDIwQzQ2LDIyIDU5LDI5IDcwLDMyQzgwLDM0IDg5LDMyIDk5LDMwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0NyAyNSw1MSAzNiw1MUM0Niw1MCA1NCw0NCA2NSw0MkM3NSwzOSA4Nyw0MCA5OSw0Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzksNjYgMTgsNjUgMzEsNjlDNDMsNzIgNTgsNzkgNzAsODBDODEsODAgOTAsNzQgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' - }, nftAddress: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', - purgatory: { - state: false, - reason: '' - }, services: [ { datatokenAddress: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', @@ -153,15 +172,6 @@ export const assets: AssetExtended[] = [ type: 'access' } ], - stats: { - allocated: 45554.69921875, - orders: 1, - price: { - tokenAddress: '0x282d8efCe846A88B159800bd4130ad77443Fa1A1', - tokenSymbol: 'mOCEAN', - value: 100 - } - }, version: '4.1.0', accessDetails: { templateId: 1, @@ -188,187 +198,114 @@ export const assets: AssetExtended[] = [ }, { '@context': ['https://w3id.org/did/v1'], - chainId: 5, + chainId: 137, datatokens: [ { - address: '0x57201e593912f4abBB62fEaa4479598c3Ad0010B', - name: 'Delighted Anchovy Token', + address: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', + name: 'Limpid Ray Token', serviceId: - '9325f8ff50ff3a46f757e7d819379b4d69fc73e4496880210c8fef8e587addbe', - symbol: 'DELANC-21' - } - ], - event: { - block: 7724118, - contract: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', - datetime: '2022-10-06T21:31:12', - from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - tx: '0x59b3cda87fe2c1c88ee1f253f2ebe2f089b7987791357247bb4af8f96200c119' - }, - id: 'did:op:fcfaffeab039fd4406b4546dab57a0380d971f6a2746f588bbeafeb38fc406c9', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: - 'Anna Padée, Pascal Missonnier, Anne Prévot, Grégoire Favre, Isabelle Gothuey, Marco Merlo, Jonas Richiardi', - created: '2022-10-06T21:31:05Z', - description: - 'This is a schizophrenia in ultimatum game task study for Fribourg University. Participants were asked to play the UG in both roles, both as responder and proposer. 128 electrode EEG was recorded during the task. 19 patients with psychosis episodes and 24 healthy controls were recorded during the task.\n\nThis dataset was recorded at the Fribourg University in Switzerland. The project was approved by the Ethics Committee of the University of Fribourg (reference number: 054/13-CER-FR).\n\nParticipants sat in a shielded room, in a comfortable chair and played the game, while EEG was recorded.\n\nFor each role, participants performed three blocks, consisting of 30 repetitions each.', - license: 'https://market.oceanprotocol.com/terms', - name: 'Fribourg Ultimatum Game in Schizophrenia Study (EEG)', - tags: ['eeg', 'schizophrenia', 'psychosis'], - type: 'dataset', - updated: '2022-10-06T21:31:05Z' - }, - nft: { - address: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', - created: '2022-10-06T21:31:12', - name: 'Ocean Data NFT', - owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmZjZmFmZmVhYjAzOWZkNDQwNmI0NTQ2ZGFiNTdhMDM4MGQ5NzFmNmEyNzQ2ZjU4OGJiZWFmZWIzOGZjNDA2YzkiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6ZmNmYWZmZWFiMDM5ZmQ0NDA2YjQ1NDZkYWI1N2EwMzgwZDk3MWY2YTI3NDZmNTg4YmJlYWZlYjM4ZmM0MDZjOSIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDNywyNyAxNSwyOSAyMywyN0MzMCwyNCAzNywxNyA0NywxOEM1NiwxOCA2NywyNCA3NiwyN0M4NCwyOSA5MSwyNiA5OSwyNEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDhDOCw0OCAxNyw0OSAyNiw1MUMzNCw1MiA0Miw1NSA1MCw1NkM1Nyw1NiA2Myw1NCA3Miw1NEM4MCw1MyA4OSw1MyA5OSw1M0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDcxQzksNzMgMTgsNzUgMjcsNzdDMzUsNzggNDMsODAgNTEsODBDNTgsNzkgNjUsNzcgNzMsNzZDODAsNzQgODksNzMgOTksNzNMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' - }, - nftAddress: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x57201e593912f4abBB62fEaa4479598c3Ad0010B', - files: - '0x043776dfd05df01a140bc2a622625902ce3c50e676801dace92a7a43ea1c35eff5d4970a25b35f4fc13285abe9512d695ad7eceaf3db0b47dbc438566dc165038a5deafb6570f390c4b80afef3d042f57cd3fb664bfc503baf6a772c191dbd458f4ba0d7bd69a738b141d80009b8cb89fcd32c6a90b73a8164445fe34fce90fbc17ca9a6f0f158dd995d1392ad7b821f162eae9b0410bbc452f65b301bb273cf0987e38cf9315ae92af2ed65ac3c0b31e876c2abd7c14b6c7927e85420d62c28ab88b639800d98137d84d8f86f53e43434a322d2db34c175337d57b99015b9fab0be0c026eaa6c334a2d664162ad966cfcdb91cf4aa4499aa4f480a46b2523f83b7c430586f04c89012851b2b0f6e179e95279478d5f12403362e976002257608aa9db50c7673628f1c150b3d1c6f7c660ab3f1851009121003483e4242d6d28563c07b0238e337391ec5cb887000533afda5846e0d9fe5c4b9efd92802409e4f532875dbc14d7dbece876f9d616a11a0ce53c220ba9bda9', - id: '9325f8ff50ff3a46f757e7d819379b4d69fc73e4496880210c8fef8e587addbe', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 86400, - type: 'access' + '52ce21def42afaef2b51e90389355e13bd93e502147172b22051f16f74af163d', + symbol: 'LIMRAY-96' } ], - stats: { - allocated: 0, - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'fixed', - addressOrId: - '0x6f09253bd70ed45e9e5d807e80319b71c0f444a27360cf51be749c520d0bbc9b', - price: '7', - isPurchasable: true, - baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', - decimals: 18 + indexedMetadata: { + nft: { + address: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + created: '2022-10-06T23:06:11', + name: 'Ocean Data NFT', + owner: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + state: 0, + symbol: 'OCEAN-NFT', + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkYWJiY2YzNTJlOWQ5MGQ0ZTRmNDRhNTA0NDBiMDc5OGExYTFkOTBlNzYyYWIyYzdlZGJhNmFiNGYyMTI5ZGViIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmRhYmJjZjM1MmU5ZDkwZDRlNGY0NGE1MDQ0MGIwNzk4YTFhMWQ5MGU3NjJhYjJjN2VkYmE2YWI0ZjIxMjlkZWIiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzExLDE5IDIzLDE3IDM1LDIwQzQ2LDIyIDU5LDI5IDcwLDMyQzgwLDM0IDg5LDMyIDk5LDMwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0NyAyNSw1MSAzNiw1MUM0Niw1MCA1NCw0NCA2NSw0MkM3NSwzOSA4Nyw0MCA5OSw0Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzksNjYgMTgsNjUgMzEsNjlDNDMsNzIgNTgsNzkgNzAsODBDODEsODAgOTAsNzQgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' }, - datatoken: { - address: '0x57201e593912f4abbb62feaa4479598c3ad0010b', - name: 'Delighted Anchovy Token', - symbol: 'DELANC-21' + event: { + block: 34021412, + contract: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + datetime: '2022-10-06T23:06:11', + from: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + txid: '0x8af31b8dae91094f0d559fa13c51b7fcb278f9cb8525c2e7badabacf77989a7a' }, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0xC48934b7FfE9a061039e8a2a0DAe303D2b1b68AF', - name: 'Arcadian Shell Token', - serviceId: - 'f0e61512966f65e3198fc3caecf198a1f20ff3ca781437e15fe9edc7a00745a4', - symbol: 'ARCSHE-59' + stats: [ + { + datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + name: 'string', + symbol: 'OCEAN', + serviceId: + 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1', + orders: 1, + prices: [ + { + type: 'fixedrate', + price: '2', + contract: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a' + } + ] + } + ], + purgatory: { + state: false, + reason: '' } - ], - event: { - block: 7724103, - contract: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', - datetime: '2022-10-06T21:27:36', - from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - tx: '0xba3eacfddb57f41e383fa3d6b581ebca4a42a4aa1d751e661636f100a4142a23' }, - id: 'did:op:16cf424daaa8cf763c0a753c4fe9045981fdc728571b95021514450d2160bbb8', + id: 'did:op:dabbcf352e9d90d4e4f44a50440b0798a1a1d90e762ab2c7edba6ab4f2129deb', metadata: { additionalInformation: { termsAndConditions: true }, - author: - 'Haxby, J., Gobbini, M., Furey, M., Ishai, A., Schouten, J., and Pietrini, P.', - created: '2022-10-06T21:25:49Z', + author: 'MG_DAO', + created: '2022-10-06T23:05:51Z', description: - 'This dataset was gathered between 2017 and 2018 for as part of the "First-in-human evaluation of [ 11 C]PS13, a novel PET radioligand, to quantify cyclooxygenase-1 in the brain". This dataset consists of 17 subjects and their imaging data as a first release. The second release of this dataset will include blood data for each of the the 17 subjects involved in this study.', + "General Info:\n-------------\nThis dataset curated by the MGH DAO contains key stats about the Sandbox, Decentraland and Axie LANDs NFTs.\n \n__After clicking download, open the .txt file and access all the datasets we have created so far. We update the dataset on a daily basis and store a snapshot of the dataset once per week.__\n \n \nThe data is taken from Etherscan and Opensea and fed to a machine learning algorithm that is trained using past price movements and is retrained on a regular basis to keep the accuracy of the price predictions high.\nThe core of the dataset are the aforementioned price predictions for each land that has enough trading history to compute a reasonable prediction.\n \nThe dataset contains two types of data:\n--------\n* Aggregated data retrieved from Opensea and Etherscan\n \n* Processed data from a machine learning algorithm\n \nThe aggregated data is divided into data for every token id and for the whole NFT collection. It includes variables such as tokenid, LAND coordinates, ask, bid, floor, average, max price, suggested operation, and\nkey volume stats.\n \nThe processed data contains two main variables: A predicted price and a price manipulation index for every token id\n \nEvery dataset is divided in two sheets: A Land Valuation and a Global Stats sheet\n \n \nThe dataset is provided by the MGH DAO and it will be continuously improved. If you have feedback or some suggestions on which data should be added, don't hesitate to write us an email to: info@thedac.info\n \nAbout MetaGameHub\n-----------------------\n \nThe MetaGameHub DAO focuses on the convergence of DeFi, Data and the Metaverse. The MGH DAO is a decentralized state within the open metaverse, where its community members collaboratively decide which LANDs to acquire, how to develop them and monetize them through, lending, renting, advertising and the creation of in-house play-to-earn experiences. MetaGameHub adds value to the metaverse ecosystem by providing valuation tools for virtual LANDs, SDKs (Software Development Kits) for metaverse development, oracle nodes for on-chain LAND pricing, and datasets portraying valuable virtual real estate pricing data. MGH wants to improve the infrastructure and transparency of the virtual real estate market while letting its users navigate through the metaverse in a seamless way.\n\n [Twitter](https://twitter.com/MGH_DAO) | [Telegram](https://t.me/metagamehub_dao) | [Website](https://www.metagamehub.io/) | [Discord](https://discord.gg/uG5XaP6ms3)", license: 'https://market.oceanprotocol.com/terms', - name: 'Novel PET radioligand, [11C]PS13 Quantifying Cyclooxygenase-1 in the Brain (PET)', - tags: ['pet', 'radiogland', 'biomarker'], + links: [ + 'https://docs.google.com/spreadsheets/d/1KA7eaoTQshOTbPqnkoJ-ePvlw6z95zGI1iT7BtzX7nI/edit?usp=sharing' + ], + name: 'The Metaverse LAND Dataset', + tags: [ + 'metaverse', + 'ai', + 'dao', + 'the-sandbox', + 'decentraland', + 'axie', + 'virtual-real-estate', + 'nft' + ], type: 'dataset', - updated: '2022-10-06T21:25:49Z' - }, - nft: { - address: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', - created: '2022-10-06T21:27:36', - name: 'Ocean Data NFT', - owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjE2Y2Y0MjRkYWFhOGNmNzYzYzBhNzUzYzRmZTkwNDU5ODFmZGM3Mjg1NzFiOTUwMjE1MTQ0NTBkMjE2MGJiYjgiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6MTZjZjQyNGRhYWE4Y2Y3NjNjMGE3NTNjNGZlOTA0NTk4MWZkYzcyODU3MWI5NTAyMTUxNDQ1MGQyMTYwYmJiOCIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMzFDMTIsMjUgMjQsMjAgMzUsMTlDNDUsMTcgNTUsMjAgNjYsMjFDNzYsMjEgODcsMjEgOTksMjFMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDQ2QzgsNTAgMTYsNTQgMjksNTRDNDEsNTMgNTYsNDYgNjksNDVDODEsNDMgOTAsNDUgOTksNDhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2N0MxMSw2OSAyMiw3MiAzNCw3M0M0NSw3MyA1Niw3MSA2Nyw3MUM3Nyw3MCA4OCw3MSA5OSw3M0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' - }, - nftAddress: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', - purgatory: { - state: false, - reason: '' + updated: '2022-10-06T23:05:51Z' }, + nftAddress: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', services: [ { - datatokenAddress: '0xC48934b7FfE9a061039e8a2a0DAe303D2b1b68AF', + datatokenAddress: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', files: - '0x043e6b925b876905ec72df9e7db50b155b748e6145ca69d27c8c2af814a9e0cd8ade58cbfea27de7d4823ee30c192b0d73260d605f985edf6dfe51c68e8645425d1097d6e204ad3fab1fce3bed78c720df1e875c653b3c0103f8d2e5b1c24946f2c215ad8e365a9b8ff19dd70451540991008447fd103a0b015392675d5e57ddcca093fc5792b45f5ea9f782a94b57f3111e2e5efe2134422985a29387bd8237ad9f5c83630cd2d5afe01a54decf2ce070a446a827e53d015da04ac3d623988ea78a51fd456f5b2ef6049aebdd36065b12bbdbac1879721beaef3ec0e140842299459afc28cb9a1ac805db3cf93849de5d91cff5ab655daf59569621743f5551240b0298d765b3425609e6c864aeace8c91ee40e53e18c30344b901aa8164a975ca0f23e5db8d8a2693ec79f6bfe357cadbe28c3f3023b312161ad32c132d4b867ab51ca8361539c147798ded00845664c2566bf10cfa7ed3afbd91c960ceca43d20611d7d23c1e14816aefe2712052bf2b74fee56efc1f15ab98d8aa6134120651422902d10d5a523ae3a2c6dc9e561', - id: 'f0e61512966f65e3198fc3caecf198a1f20ff3ca781437e15fe9edc7a00745a4', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 86400, + '0x044412f77fcd2d53dc6243c921c307c38d0c6cd80a7e230bf7251ce38f444b309398aba1380884026efb87c4429eddd555872a495810e9aa3750054bef0a6e043cf630a80867934a7fd978306dff8e54ca8e8d17cca08ca7e4f5e50d4b39d0485d8212d12021f8ea5f8b1c21d791cb7239dc607cfb403bdf0108d327b3126c946bc3af5e9403f5d8ac58e91957bfc81e09a6d24c97ced61517768c3d2e5d69a6232c0c9a1f0c85759fdfc891affad883f816f419b103148db9d5cc917e0223b88cbb1c02c3e16ed6f1b24300914df2e86fe87d7b5a3abcf5fcbe34f4ea54e13dc984717465b8714602f7e416d053f0caf1361ddad20ec0fb939b8e914f2d87f42a62ad5256ee5b6704cf8df93bf79a501ea2926063d4e24010e05deda814316c2b004c0f130b2d9d48150b504178810ce34af2c75b76a5aa34a12be013efd5794802704ecf5570b60928f44507041d7c1670f65091c10a15fba1aea3010de62574cfaee092dfc37135a577abf2b551cf728922fd42ba5cca7e', + id: '52ce21def42afaef2b51e90389355e13bd93e502147172b22051f16f74af163d', + serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + timeout: 604800, type: 'access' } ], - stats: { - allocated: 50.2051887512, - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, version: '4.1.0', accessDetails: { templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: - '0xcaf28ecd5a5a3674f7f7b2d61d9546fa50d16607d55ba7a8f9a4ac818f35f311', - price: '10', + '0x403f7f69caa8c0db7cd2f14d8f90b488ec7e70e83ff1c30d7bbdcd9d3605c529', + price: '100', isPurchasable: true, baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', + address: '0x282d8efce846a88b159800bd4130ad77443fa1a1', + name: 'Ocean Token (PoS)', + symbol: 'mOCEAN', decimals: 18 }, datatoken: { - address: '0xc48934b7ffe9a061039e8a2a0dae303d2b1b68af', - name: 'Arcadian Shell Token', - symbol: 'ARCSHE-59' + address: '0xe5e5056a988eae27f1624cf1212895f5b01d487b', + name: 'Limpid Ray Token', + symbol: 'LIMRAY-96' }, isOwned: false, validOrderTx: null @@ -379,196 +316,175 @@ export const assets: AssetExtended[] = [ chainId: 5, datatokens: [ { - address: '0x1FC8dB81E8b68EB1891f83e742377827b56a0663', - name: 'Querulous Plankton Token', + address: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', + name: 'Limpid Ray Token', serviceId: - '9a3135912010f6b27a6c1511c0221853136b3cbc1a55c62ce2b147512300402f', - symbol: 'QUEPLA-8' + '52ce21def42afaef2b51e90389355e13bd93e502147172b22051f16f74af163d', + symbol: 'LIMRAY-96' } ], - event: { - block: 7724073, - contract: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', - datetime: '2022-10-06T21:20:36', - from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - tx: '0x3b4114e150106247ac71ff96c22604993eae1c0c58725eb8df217aaa3d716238' + indexedMetadata: { + nft: { + address: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + created: '2022-10-06T23:06:11', + name: 'Ocean Data NFT', + owner: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + state: 0, + symbol: 'OCEAN-NFT', + tokenURI: + 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkYWJiY2YzNTJlOWQ5MGQ0ZTRmNDRhNTA0NDBiMDc5OGExYTFkOTBlNzYyYWIyYzdlZGJhNmFiNGYyMTI5ZGViIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmRhYmJjZjM1MmU5ZDkwZDRlNGY0NGE1MDQ0MGIwNzk4YTFhMWQ5MGU3NjJhYjJjN2VkYmE2YWI0ZjIxMjlkZWIiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzExLDE5IDIzLDE3IDM1LDIwQzQ2LDIyIDU5LDI5IDcwLDMyQzgwLDM0IDg5LDMyIDk5LDMwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0NyAyNSw1MSAzNiw1MUM0Niw1MCA1NCw0NCA2NSw0MkM3NSwzOSA4Nyw0MCA5OSw0Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzksNjYgMTgsNjUgMzEsNjlDNDMsNzIgNTgsNzkgNzAsODBDODEsODAgOTAsNzQgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + }, + event: { + block: 34021412, + contract: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', + datetime: '2022-10-06T23:06:11', + from: '0x58754d9b3dbB4ddF5AC3502AcB963743b15e6398', + txid: '0x8af31b8dae91094f0d559fa13c51b7fcb278f9cb8525c2e7badabacf77989a7a' + }, + stats: [ + { + datatokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + name: 'string', + symbol: 'OCEAN', + serviceId: + 'dbc42f4c62d2452f8731fd023eacfae74e9c7a42fbd12ce84310f13342e4aab1', + orders: 2, + prices: [ + { + type: 'fixedrate', + price: '2', + contract: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a' + } + ] + } + ], + purgatory: { + state: false, + reason: '' + } }, - id: 'did:op:930b016ea9790156593e016ba2a4fe7a8bd276c8043320f8ba34d9b36395069e', + id: 'did:op:dabbcf352e9d90d4e4f44a50440b0798a1a1d90e762ab2c7edba6ab4f2129deb', metadata: { additionalInformation: { termsAndConditions: true }, - author: - 'Gaël Varoquaux, Alexandre Gramfort, Fabian Pedregosa, Vincent Michel, Bertrand Thirion, Richardson, Hilary, Lisandrelli, Grace, Riobueno-Naylor, Alexa, Saxe, Rebecca', - created: '2022-10-06T21:19:37Z', + author: 'MG_DAO', + created: '2022-10-06T23:05:51Z', description: - 'Brain functional networks and parcels can extracted from resting-state fMRI. For this purpose we use a multi-subject version of sparse dictionary learning and estimate a group-level atlas of brain networks. This can be understand as a variant of ICA based on the assumption of sparsity rather than independence.\n\nExperiment Details\nParticipants watched Disney Pixar’s “Partly Cloudy” while lying in the scanner. There was no task; participants were simply instructed to lie still and watch the movie. The movie began after 10s of rest (black screen; TRs 1-5). The first 10s of the movie are the opening credits (disney castle, pixar logo; TRs 6-10). \n\nIPS = 168 TRs\nTR = 2s\nExperiment length: 5.6 minutes\n\nPixar Movie Reverse Correlation Events\nEvents defined by conducting reverse correlation analysis in two separate adult samples, using the average response in ToM brain regions (ToM events) and in the pain matrix (Pain events). Events listed are those that replicated across the two samples. Onsets and Durations are noted in TRs (1 TR = 2s); scanner trigger = TR 1.\n\nEvent types: Theory of Mind (ToM), Physical Sensation/Pain (Pain)\nTRs identified by RC analysis, as reported in Richardson et al. 2018\nToM Event Onsets; Durations \n46; 2\n52; 3\n63; 2\n91; 8\n122; 3\n129; 4\n153; 3\n\nPain Event Onsets; Durations\n38; 2\n49; 1\n56; 2\n71; 5\n100; 2\n108; 6\n117; 3\n134; 3\n159; 2\n\n\nTIMING OF EVENTS FOR MODELING (taking into account hemodynamic lag (4s), scanner trigger = 0):\nAll timings assume 10s from trigger until movie begins to play.\n\nIn seconds:\nMental Event Onsets; Durations\n86; 4\n98; 6\n120; 4\n176; 16\n238; 6\n252; 8\n300; 6\n\nPain Event Onsets; Durations\n70; 4\n92; 2\n106; 4\n136; 10\n194; 4\n210; 12\n228; 6\n262; 6\n312; 4\n\nIn TRs when TR=2:\nMental Event Onsets; Durations\n43; 2\n49; 3\n60; 2\n88; 8\n119; 3\n126; 4\n150; 3\n\nPain Event Onsets; Durations\n35; 2\n46; 1\n53; 2\n68; 5\n97; 2\n105; 6\n114; 3\n131; 3\n156; 2', + "General Info:\n-------------\nThis dataset curated by the MGH DAO contains key stats about the Sandbox, Decentraland and Axie LANDs NFTs.\n \n__After clicking download, open the .txt file and access all the datasets we have created so far. We update the dataset on a daily basis and store a snapshot of the dataset once per week.__\n \n \nThe data is taken from Etherscan and Opensea and fed to a machine learning algorithm that is trained using past price movements and is retrained on a regular basis to keep the accuracy of the price predictions high.\nThe core of the dataset are the aforementioned price predictions for each land that has enough trading history to compute a reasonable prediction.\n \nThe dataset contains two types of data:\n--------\n* Aggregated data retrieved from Opensea and Etherscan\n \n* Processed data from a machine learning algorithm\n \nThe aggregated data is divided into data for every token id and for the whole NFT collection. It includes variables such as tokenid, LAND coordinates, ask, bid, floor, average, max price, suggested operation, and\nkey volume stats.\n \nThe processed data contains two main variables: A predicted price and a price manipulation index for every token id\n \nEvery dataset is divided in two sheets: A Land Valuation and a Global Stats sheet\n \n \nThe dataset is provided by the MGH DAO and it will be continuously improved. If you have feedback or some suggestions on which data should be added, don't hesitate to write us an email to: info@thedac.info\n \nAbout MetaGameHub\n-----------------------\n \nThe MetaGameHub DAO focuses on the convergence of DeFi, Data and the Metaverse. The MGH DAO is a decentralized state within the open metaverse, where its community members collaboratively decide which LANDs to acquire, how to develop them and monetize them through, lending, renting, advertising and the creation of in-house play-to-earn experiences. MetaGameHub adds value to the metaverse ecosystem by providing valuation tools for virtual LANDs, SDKs (Software Development Kits) for metaverse development, oracle nodes for on-chain LAND pricing, and datasets portraying valuable virtual real estate pricing data. MGH wants to improve the infrastructure and transparency of the virtual real estate market while letting its users navigate through the metaverse in a seamless way.\n\n [Twitter](https://twitter.com/MGH_DAO) | [Telegram](https://t.me/metagamehub_dao) | [Website](https://www.metagamehub.io/) | [Discord](https://discord.gg/uG5XaP6ms3)", license: 'https://market.oceanprotocol.com/terms', - name: 'Probabilistic Atlas of Functional Regions in Movie-Watching ', + links: [ + 'https://docs.google.com/spreadsheets/d/1KA7eaoTQshOTbPqnkoJ-ePvlw6z95zGI1iT7BtzX7nI/edit?usp=sharing' + ], + name: 'The Metaverse LAND Dataset', tags: [ - 'msdl', - 'probabilistic-atlas', - 'resting-state', - 'fmri', - 'visual-stimuli' + 'metaverse', + 'ai', + 'dao', + 'the-sandbox', + 'decentraland', + 'axie', + 'virtual-real-estate', + 'nft' ], type: 'dataset', - updated: '2022-10-06T21:19:37Z' - }, - nft: { - address: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', - created: '2022-10-06T21:20:36', - name: 'Ocean Data NFT', - owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjkzMGIwMTZlYTk3OTAxNTY1OTNlMDE2YmEyYTRmZTdhOGJkMjc2YzgwNDMzMjBmOGJhMzRkOWIzNjM5NTA2OWUiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6OTMwYjAxNmVhOTc5MDE1NjU5M2UwMTZiYTJhNGZlN2E4YmQyNzZjODA0MzMyMGY4YmEzNGQ5YjM2Mzk1MDY5ZSIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjRDNywyNSAxNSwyNiAyNywyN0MzOCwyNyA1NCwyNiA2NywyNkM3OSwyNSA4OSwyNCA5OSwyNEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDFDOSw0NyAxOCw1MyAyOSw1NUM0MCw1NiA1Myw1NCA2NSw1M0M3Nyw1MSA4OCw1MSA5OSw1Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDc5QzEzLDc5IDI3LDgwIDM3LDc3QzQ2LDczIDUyLDY2IDYyLDY3QzcxLDY3IDg1LDc0IDk5LDgxTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' - }, - nftAddress: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', - purgatory: { - state: false, - reason: '' + updated: '2022-10-06T23:05:51Z' }, + nftAddress: '0x866e4ED7b001f40c4067d0a37d6d401a0B13EfD6', services: [ { - datatokenAddress: '0x1FC8dB81E8b68EB1891f83e742377827b56a0663', + datatokenAddress: '0xE5E5056A988EAE27f1624CF1212895f5B01D487b', files: - '0x0421fc24dc6b2bbe70ec05954eeda9e60156fc62e4a90aff80d1bd34ff647324bef394500adc3b202bf4d2a22af48cccd414c599579fb054876ccc631ad4fa39eb76bde29c7bde581b6954334891bffef4c4a9d5e08369ec12b26964a552b9f9d0796f053705a71737f692d74be64fa21db0a06811a6eedc4d7b3a4416cddca0aaacaeda4f327e2e7579bdf40c6b894adb72c33c41d181b52b4100a3381f4b7ae0c83effb9edbf025630a6691804b1911560d6d15934ae5ae79e548e72e325173d0a8c8920981367cf1e7ba9126f5be6a756a5e4508e614ed78a15f97f39c5a317fa65de1e2481d144db2802fcdeff77a1b43db7d6ad45a82d7cf375b629387335495d93b63bb78a45219ba0e9ee7c0ab85713d4bd315ccb46eed6c0a87d45e01a9c4cb278f988e1e05f7b24ab25bc9bca3763457116e0c4c8e7336d5fcbed697aa2ec0c13a224a800bb0ce7693d421ff833', - id: '9a3135912010f6b27a6c1511c0221853136b3cbc1a55c62ce2b147512300402f', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 86400, + '0x044412f77fcd2d53dc6243c921c307c38d0c6cd80a7e230bf7251ce38f444b309398aba1380884026efb87c4429eddd555872a495810e9aa3750054bef0a6e043cf630a80867934a7fd978306dff8e54ca8e8d17cca08ca7e4f5e50d4b39d0485d8212d12021f8ea5f8b1c21d791cb7239dc607cfb403bdf0108d327b3126c946bc3af5e9403f5d8ac58e91957bfc81e09a6d24c97ced61517768c3d2e5d69a6232c0c9a1f0c85759fdfc891affad883f816f419b103148db9d5cc917e0223b88cbb1c02c3e16ed6f1b24300914df2e86fe87d7b5a3abcf5fcbe34f4ea54e13dc984717465b8714602f7e416d053f0caf1361ddad20ec0fb939b8e914f2d87f42a62ad5256ee5b6704cf8df93bf79a501ea2926063d4e24010e05deda814316c2b004c0f130b2d9d48150b504178810ce34af2c75b76a5aa34a12be013efd5794802704ecf5570b60928f44507041d7c1670f65091c10a15fba1aea3010de62574cfaee092dfc37135a577abf2b551cf728922fd42ba5cca7e', + id: '52ce21def42afaef2b51e90389355e13bd93e502147172b22051f16f74af163d', + serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + timeout: 604800, type: 'access' } ], - stats: { - allocated: 0, - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, version: '4.1.0', accessDetails: { templateId: 1, publisherMarketOrderFee: '0', type: 'fixed', addressOrId: - '0x938802c3fe89c54a0e6b1cd47fa5263817282185a2e0f78fa2957ec1aff970fc', - price: '6', + '0x403f7f69caa8c0db7cd2f14d8f90b488ec7e70e83ff1c30d7bbdcd9d3605c529', + price: '100', isPurchasable: true, baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', + address: '0x282d8efce846a88b159800bd4130ad77443fa1a1', + name: 'Ocean Token (PoS)', + symbol: 'mOCEAN', decimals: 18 }, datatoken: { - address: '0x1fc8db81e8b68eb1891f83e742377827b56a0663', - name: 'Querulous Plankton Token', - symbol: 'QUEPLA-8' + address: '0xe5e5056a988eae27f1624cf1212895f5b01d487b', + name: 'Limpid Ray Token', + symbol: 'LIMRAY-96' }, isOwned: false, validOrderTx: null } - }, + } // { // '@context': ['https://w3id.org/did/v1'], - // accessDetails: { - // templateId: 1, - // publisherMarketOrderFee: '0', - // type: 'fixed', - // addressOrId: - // '0xb9060a712a494f584b072b0753dc275e1c531178510679ac085053ee38b5f742', - // price: '5', - // isPurchasable: true, - // baseToken: { - // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - // name: 'Ocean Token', - // symbol: 'OCEAN', - // decimals: 18 - // }, - // datatoken: { - // address: '0x0a9cfaff200efb1d6f125e342dfc78fb3edd28a4', - // name: 'Inspired Ling Token', - // symbol: 'INSLIN-54' - // }, - // isOwned: false, - // validOrderTx: null - // }, // chainId: 5, // datatokens: [ // { - // address: '0x0A9CFaFf200efb1d6F125E342Dfc78Fb3edD28A4', - // name: 'Inspired Ling Token', + // address: '0x57201e593912f4abBB62fEaa4479598c3Ad0010B', + // name: 'Delighted Anchovy Token', // serviceId: - // '383b0e1b8dc3e816af394bfae899eb0c9826f2383602c0fbcd70705e1e9c1302', - // symbol: 'INSLIN-54' + // '9325f8ff50ff3a46f757e7d819379b4d69fc73e4496880210c8fef8e587addbe', + // symbol: 'DELANC-21' // } // ], // event: { - // block: 7723888, - // contract: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', - // datetime: '2022-10-06T20:31:36', + // block: 7724118, + // contract: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', + // datetime: '2022-10-06T21:31:12', // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - // tx: '0x18b1d0af634fab3196921a99618fd9333c4a2113a016bf4757d609ddfdb64432' + // tx: '0x59b3cda87fe2c1c88ee1f253f2ebe2f089b7987791357247bb4af8f96200c119' // }, - // id: 'did:op:6b4314bd7345d07a10ba2c82a352655273b00cdceb2eedd31c8e0d2b5881eb16', + // id: 'did:op:fcfaffeab039fd4406b4546dab57a0380d971f6a2746f588bbeafeb38fc406c9', // metadata: { // additionalInformation: { // termsAndConditions: true // }, // author: - // 'Haxby, J. V., Gobbini, M. I., Furey, M. L., Ishai, A., Schouten, J. L. & Pietrini, P. ', - // created: '2022-10-06T20:30:01Z', + // 'Anna Padée, Pascal Missonnier, Anne Prévot, Grégoire Favre, Isabelle Gothuey, Marco Merlo, Jonas Richiardi', + // created: '2022-10-06T21:31:05Z', // description: - // 'This is a block-design fMRI dataset from a study on face and object representation in human ventral temporal cortex. It consists of 6 subjects with 12 runs per subject. In each run, the subjects passively viewed greyscale images of eight object categories, grouped in 24s blocks separated by rest periods. Each image was shown for 500ms and was followed by a 1500ms inter-stimulus interval. Full-brain fMRI data were recorded with a volume repetition time of 2.5s, thus, a stimulus block was covered by roughly 9 volumes. This dataset has been repeatedly reanalyzed. For a complete description of the experimental design, fMRI acquisition parameters, and previously obtained results see the [references](http://www.pymvpa.org/datadb/haxby2001.html#references) below. \n\n', + // 'This is a schizophrenia in ultimatum game task study for Fribourg University. Participants were asked to play the UG in both roles, both as responder and proposer. 128 electrode EEG was recorded during the task. 19 patients with psychosis episodes and 24 healthy controls were recorded during the task.\n\nThis dataset was recorded at the Fribourg University in Switzerland. The project was approved by the Ethics Committee of the University of Fribourg (reference number: 054/13-CER-FR).\n\nParticipants sat in a shielded room, in a comfortable chair and played the game, while EEG was recorded.\n\nFor each role, participants performed three blocks, consisting of 30 repetitions each.', // license: 'https://market.oceanprotocol.com/terms', - // name: 'Faces and Objects in Ventral Temporal Cortex (fMRI) (Compute) ', - // tags: ['fmri', 'bold', 'visual-stimuli', '4d', 'functional'], + // name: 'Fribourg Ultimatum Game in Schizophrenia Study (EEG)', + // tags: ['eeg', 'schizophrenia', 'psychosis'], // type: 'dataset', - // updated: '2022-10-06T20:30:01Z' + // updated: '2022-10-06T21:31:05Z' // }, // nft: { - // address: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', - // created: '2022-10-06T20:30:36', + // address: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', + // created: '2022-10-06T21:31:12', // name: 'Ocean Data NFT', // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', // state: 0, // symbol: 'OCEAN-NFT', // tokenURI: - // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjZiNDMxNGJkNzM0NWQwN2ExMGJhMmM4MmEzNTI2NTUyNzNiMDBjZGNlYjJlZWRkMzFjOGUwZDJiNTg4MWViMTYiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6NmI0MzE0YmQ3MzQ1ZDA3YTEwYmEyYzgyYTM1MjY1NTI3M2IwMGNkY2ViMmVlZGQzMWM4ZTBkMmI1ODgxZWIxNiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDMTIsMjYgMjQsMjcgMzUsMjhDNDUsMjggNTIsMjggNjMsMjhDNzMsMjcgODYsMjYgOTksMjVMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDQ4QzExLDQ3IDIzLDQ2IDM0LDQ3QzQ0LDQ3IDU1LDQ4IDY2LDQ5Qzc2LDQ5IDg3LDQ5IDk5LDQ5TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsODBDOCw3NCAxNyw2OCAyOCw3MEMzOCw3MSA1MSw3OSA2NCw4MEM3Niw4MCA4Nyw3NCA5OSw2OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmZjZmFmZmVhYjAzOWZkNDQwNmI0NTQ2ZGFiNTdhMDM4MGQ5NzFmNmEyNzQ2ZjU4OGJiZWFmZWIzOGZjNDA2YzkiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6ZmNmYWZmZWFiMDM5ZmQ0NDA2YjQ1NDZkYWI1N2EwMzgwZDk3MWY2YTI3NDZmNTg4YmJlYWZlYjM4ZmM0MDZjOSIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDNywyNyAxNSwyOSAyMywyN0MzMCwyNCAzNywxNyA0NywxOEM1NiwxOCA2NywyNCA3NiwyN0M4NCwyOSA5MSwyNiA5OSwyNEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDhDOCw0OCAxNyw0OSAyNiw1MUMzNCw1MiA0Miw1NSA1MCw1NkM1Nyw1NiA2Myw1NCA3Miw1NEM4MCw1MyA4OSw1MyA5OSw1M0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDcxQzksNzMgMTgsNzUgMjcsNzdDMzUsNzggNDMsODAgNTEsODBDNTgsNzkgNjUsNzcgNzMsNzZDODAsNzQgODksNzMgOTksNzNMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' // }, - // nftAddress: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', + // nftAddress: '0xca3cCFc6CEcf459200AADA1d4a51024F0EAAC230', // purgatory: { // state: false, // reason: '' // }, // services: [ // { - // compute: { - // allowNetworkAccess: true, - // allowRawAlgorithm: false, - // publisherTrustedAlgorithmPublishers: [], - // publisherTrustedAlgorithms: [ - // { - // containerSectionChecksum: - // '54eb02210bad8a5fbe229e1d131a68e80fe32709a196c6ce49f33e5d378b1195', - // did: 'did:op:f86dedf3c872f79f788627025685a680eaac9f8bd7b6e622164fd8563e21e836', - // filesChecksum: - // '2f8afee0a35fbeb72a447c7d1437b6c83f937e6d65a6c7d1990548cc21ff254c' - // } - // ] - // }, - // datatokenAddress: '0x0A9CFaFf200efb1d6F125E342Dfc78Fb3edD28A4', + // datatokenAddress: '0x57201e593912f4abBB62fEaa4479598c3Ad0010B', // files: - // '0x0479c75f624d86700c6b33deb392b2d60bd66a5bd92778851eb124bf3785f270b356ce42a228f5a5eb4dead55fc7892a3f4a9f114dfa5493f480146af72ccdcca5816996b0ff002a69e113509256494d64ad39b86be92c7668baa5060c98f402f60fcf7acd0d25e923cecaa5f483fd14a8568a782023b164f8424a95b43c165e813fd031c7b5887ac467af76d94d2ca8b45e34951694cc60ead2c15137eebc60703b9a12a4a4643ecd343de8d0326abb87e093abacf55ba83c06b2840284e8f17d9c498f02dcfd74239371c25ad0fcac703be994065b7ffa12f3a47ba3d363d31f475e6519e7cc5a65e74cafdf029a1d73a007e886206f4b4e36251721866f399076dd2435c314cdfdc42638a570fe57bb33f2935861c01ec708f80acd738d2a45dd64d374278dc63026ac7f4f8dba979e7cdc4e24e5f39aef4550b1cbf190525bdfa0e30900084aef223863e54bd0866ab958', - // id: '383b0e1b8dc3e816af394bfae899eb0c9826f2383602c0fbcd70705e1e9c1302', + // '0x043776dfd05df01a140bc2a622625902ce3c50e676801dace92a7a43ea1c35eff5d4970a25b35f4fc13285abe9512d695ad7eceaf3db0b47dbc438566dc165038a5deafb6570f390c4b80afef3d042f57cd3fb664bfc503baf6a772c191dbd458f4ba0d7bd69a738b141d80009b8cb89fcd32c6a90b73a8164445fe34fce90fbc17ca9a6f0f158dd995d1392ad7b821f162eae9b0410bbc452f65b301bb273cf0987e38cf9315ae92af2ed65ac3c0b31e876c2abd7c14b6c7927e85420d62c28ab88b639800d98137d84d8f86f53e43434a322d2db34c175337d57b99015b9fab0be0c026eaa6c334a2d664162ad966cfcdb91cf4aa4499aa4f480a46b2523f83b7c430586f04c89012851b2b0f6e179e95279478d5f12403362e976002257608aa9db50c7673628f1c150b3d1c6f7c660ab3f1851009121003483e4242d6d28563c07b0238e337391ec5cb887000533afda5846e0d9fe5c4b9efd92802409e4f532875dbc14d7dbece876f9d616a11a0ce53c220ba9bda9', + // id: '9325f8ff50ff3a46f757e7d819379b4d69fc73e4496880210c8fef8e587addbe', // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', // timeout: 86400, - // type: 'compute' + // type: 'access' // } // ], // stats: { @@ -580,83 +496,189 @@ export const assets: AssetExtended[] = [ // tokenSymbol: 'OCEAN' // } // }, - // version: '4.1.0' + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0x6f09253bd70ed45e9e5d807e80319b71c0f444a27360cf51be749c520d0bbc9b', + // price: '7', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0x57201e593912f4abbb62feaa4479598c3ad0010b', + // name: 'Delighted Anchovy Token', + // symbol: 'DELANC-21' + // }, + // isOwned: false, + // validOrderTx: null + // } // }, // { // '@context': ['https://w3id.org/did/v1'], // chainId: 5, // datatokens: [ // { - // address: '0x7626dE49a774c18E0f7Fc658821a87E103f80fab', - // name: 'Lovely Prawn Token', + // address: '0xC48934b7FfE9a061039e8a2a0DAe303D2b1b68AF', + // name: 'Arcadian Shell Token', // serviceId: - // 'be48353fe208e765c24b0a344c2cc826ff0ea18582a162d67f6ad23078595d59', - // symbol: 'LOVPRA-51' + // 'f0e61512966f65e3198fc3caecf198a1f20ff3ca781437e15fe9edc7a00745a4', + // symbol: 'ARCSHE-59' // } // ], // event: { - // block: 7723861, - // contract: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', - // datetime: '2022-10-06T20:24:24', + // block: 7724103, + // contract: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', + // datetime: '2022-10-06T21:27:36', // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - // tx: '0xdca6494d123c796443c6ce46bb4c02938526a03f86661941eaddcb76377f5825' + // tx: '0xba3eacfddb57f41e383fa3d6b581ebca4a42a4aa1d751e661636f100a4142a23' // }, - // id: 'did:op:f86dedf3c872f79f788627025685a680eaac9f8bd7b6e622164fd8563e21e836', + // id: 'did:op:16cf424daaa8cf763c0a753c4fe9045981fdc728571b95021514450d2160bbb8', // metadata: { // additionalInformation: { // termsAndConditions: true // }, - // algorithm: { - // container: { - // checksum: - // 'sha256:a981ed6282271fc5492c382cd11d5045641880f738c05a855ed6de8d0eecea8f', - // entrypoint: 'python3.8 $ALGO', - // image: 'anmu06/c2d_neuradao', - // tag: 'latest' - // }, - // language: 'py', - // version: '0.1' - // }, - // author: 'Nilearn ', - // created: '2022-10-06T20:24:15Z', + // author: + // 'Haxby, J., Gobbini, M., Furey, M., Ishai, A., Schouten, J., and Pietrini, P.', + // created: '2022-10-06T21:25:49Z', // description: - // 'Plot cuts of an EPI image (by default 3 cuts: Frontal, Axial, and Lateral)\n\nUsing [nilearn.plotting.plot_epi](https://nilearn.github.io/stable/modules/generated/nilearn.plotting.plot_epi.html) to compute and plot EPI. ', + // 'This dataset was gathered between 2017 and 2018 for as part of the "First-in-human evaluation of [ 11 C]PS13, a novel PET radioligand, to quantify cyclooxygenase-1 in the brain". This dataset consists of 17 subjects and their imaging data as a first release. The second release of this dataset will include blood data for each of the the 17 subjects involved in this study.', // license: 'https://market.oceanprotocol.com/terms', - // name: 'fMRI Time-Averaged EPI Visualization ', - // tags: ['epi', 'bold', 'fmri'], - // type: 'algorithm', - // updated: '2022-10-06T20:24:15Z' + // name: 'Novel PET radioligand, [11C]PS13 Quantifying Cyclooxygenase-1 in the Brain (PET)', + // tags: ['pet', 'radiogland', 'biomarker'], + // type: 'dataset', + // updated: '2022-10-06T21:25:49Z' // }, // nft: { - // address: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', - // created: '2022-10-06T20:24:24', + // address: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', + // created: '2022-10-06T21:27:36', // name: 'Ocean Data NFT', // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', // state: 0, // symbol: 'OCEAN-NFT', // tokenURI: - // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmY4NmRlZGYzYzg3MmY3OWY3ODg2MjcwMjU2ODVhNjgwZWFhYzlmOGJkN2I2ZTYyMjE2NGZkODU2M2UyMWU4MzYiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6Zjg2ZGVkZjNjODcyZjc5Zjc4ODYyNzAyNTY4NWE2ODBlYWFjOWY4YmQ3YjZlNjIyMTY0ZmQ4NTYzZTIxZTgzNiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDOCwyNCAxNiwyMyAyNCwyNEMzMSwyNCAzOCwyNyA0NywyOEM1NSwyOCA2NiwyOCA3NSwyOEM4MywyNyA5MSwyNyA5OSwyN0w5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNTRDOCw1MiAxNiw1MSAyNSw1MEMzMyw0OCA0MSw0NyA0OSw0NkM1Niw0NCA2NCw0MSA3Myw0M0M4MSw0NCA5MCw0OSA5OSw1NUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDczQzcsNzIgMTUsNzEgMjUsNzBDMzQsNjggNDQsNjcgNTIsNjlDNTksNzAgNjQsNzQgNzIsNzVDNzksNzUgODksNzIgOTksNzBMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjE2Y2Y0MjRkYWFhOGNmNzYzYzBhNzUzYzRmZTkwNDU5ODFmZGM3Mjg1NzFiOTUwMjE1MTQ0NTBkMjE2MGJiYjgiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6MTZjZjQyNGRhYWE4Y2Y3NjNjMGE3NTNjNGZlOTA0NTk4MWZkYzcyODU3MWI5NTAyMTUxNDQ1MGQyMTYwYmJiOCIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMzFDMTIsMjUgMjQsMjAgMzUsMTlDNDUsMTcgNTUsMjAgNjYsMjFDNzYsMjEgODcsMjEgOTksMjFMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDQ2QzgsNTAgMTYsNTQgMjksNTRDNDEsNTMgNTYsNDYgNjksNDVDODEsNDMgOTAsNDUgOTksNDhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw2N0MxMSw2OSAyMiw3MiAzNCw3M0M0NSw3MyA1Niw3MSA2Nyw3MUM3Nyw3MCA4OCw3MSA5OSw3M0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' // }, - // nftAddress: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', + // nftAddress: '0x59E27Aa74275E2373A965C0a9dca8f112b82D785', // purgatory: { // state: false, // reason: '' // }, // services: [ // { - // compute: { - // allowNetworkAccess: true, - // allowRawAlgorithm: false, - // publisherTrustedAlgorithmPublishers: [], - // publisherTrustedAlgorithms: [] - // }, - // datatokenAddress: '0x7626dE49a774c18E0f7Fc658821a87E103f80fab', + // datatokenAddress: '0xC48934b7FfE9a061039e8a2a0DAe303D2b1b68AF', // files: - // '0x0498ac38d3ac04dc4f33b5a91358b8e121fa5bc86bcb20b8bc1c27ce1f47db491efda1bf90ab4d4c893a636d570f8fdc29eae7e010f846a34cfc24bc751b64f9d104afcc7f22c82a8cffb412886ba9649b73c2b6fe95e5fab0882bc8174823db08af64c14177bfafad0fc43bb9c9db95df61dabeb0ac1fbb27c07d3705cdf6f8fdd5cb37fc2c50ae0db6bf778b7f9f5475ce1730edacd8e48aa99548184ece9df8fabca2bd7535caf9107b3312f15aaaf6bbc2143782824aac54a04a5136bd1af2121b579b8eaa71abccff4bc4147b592e2b7b7a6d928870861996e67b69277ef60128d7cf86ce5abbf860194ab5ebd8dcbc2a29fbddf5f2482510736de7e9427b4f61306df121a1bd757f0c7d0ae7c702bdff2c85f9b9c7956ced9561693da910ac211e3f35a295981a443695be9e8854554c87fd4747a709a3e43a220e380b4c36f4de92f4b0e2a6301b33c9b22356de1fec345b268e632673e3c70bc5eb', - // id: 'be48353fe208e765c24b0a344c2cc826ff0ea18582a162d67f6ad23078595d59', + // '0x043e6b925b876905ec72df9e7db50b155b748e6145ca69d27c8c2af814a9e0cd8ade58cbfea27de7d4823ee30c192b0d73260d605f985edf6dfe51c68e8645425d1097d6e204ad3fab1fce3bed78c720df1e875c653b3c0103f8d2e5b1c24946f2c215ad8e365a9b8ff19dd70451540991008447fd103a0b015392675d5e57ddcca093fc5792b45f5ea9f782a94b57f3111e2e5efe2134422985a29387bd8237ad9f5c83630cd2d5afe01a54decf2ce070a446a827e53d015da04ac3d623988ea78a51fd456f5b2ef6049aebdd36065b12bbdbac1879721beaef3ec0e140842299459afc28cb9a1ac805db3cf93849de5d91cff5ab655daf59569621743f5551240b0298d765b3425609e6c864aeace8c91ee40e53e18c30344b901aa8164a975ca0f23e5db8d8a2693ec79f6bfe357cadbe28c3f3023b312161ad32c132d4b867ab51ca8361539c147798ded00845664c2566bf10cfa7ed3afbd91c960ceca43d20611d7d23c1e14816aefe2712052bf2b74fee56efc1f15ab98d8aa6134120651422902d10d5a523ae3a2c6dc9e561', + // id: 'f0e61512966f65e3198fc3caecf198a1f20ff3ca781437e15fe9edc7a00745a4', // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - // timeout: 0, - // type: 'compute' + // timeout: 86400, + // type: 'access' + // } + // ], + // stats: { + // allocated: 50.2051887512, + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xcaf28ecd5a5a3674f7f7b2d61d9546fa50d16607d55ba7a8f9a4ac818f35f311', + // price: '10', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0xc48934b7ffe9a061039e8a2a0dae303d2b1b68af', + // name: 'Arcadian Shell Token', + // symbol: 'ARCSHE-59' + // }, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0x1FC8dB81E8b68EB1891f83e742377827b56a0663', + // name: 'Querulous Plankton Token', + // serviceId: + // '9a3135912010f6b27a6c1511c0221853136b3cbc1a55c62ce2b147512300402f', + // symbol: 'QUEPLA-8' + // } + // ], + // event: { + // block: 7724073, + // contract: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', + // datetime: '2022-10-06T21:20:36', + // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // tx: '0x3b4114e150106247ac71ff96c22604993eae1c0c58725eb8df217aaa3d716238' + // }, + // id: 'did:op:930b016ea9790156593e016ba2a4fe7a8bd276c8043320f8ba34d9b36395069e', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: + // 'Gaël Varoquaux, Alexandre Gramfort, Fabian Pedregosa, Vincent Michel, Bertrand Thirion, Richardson, Hilary, Lisandrelli, Grace, Riobueno-Naylor, Alexa, Saxe, Rebecca', + // created: '2022-10-06T21:19:37Z', + // description: + // 'Brain functional networks and parcels can extracted from resting-state fMRI. For this purpose we use a multi-subject version of sparse dictionary learning and estimate a group-level atlas of brain networks. This can be understand as a variant of ICA based on the assumption of sparsity rather than independence.\n\nExperiment Details\nParticipants watched Disney Pixar’s “Partly Cloudy” while lying in the scanner. There was no task; participants were simply instructed to lie still and watch the movie. The movie began after 10s of rest (black screen; TRs 1-5). The first 10s of the movie are the opening credits (disney castle, pixar logo; TRs 6-10). \n\nIPS = 168 TRs\nTR = 2s\nExperiment length: 5.6 minutes\n\nPixar Movie Reverse Correlation Events\nEvents defined by conducting reverse correlation analysis in two separate adult samples, using the average response in ToM brain regions (ToM events) and in the pain matrix (Pain events). Events listed are those that replicated across the two samples. Onsets and Durations are noted in TRs (1 TR = 2s); scanner trigger = TR 1.\n\nEvent types: Theory of Mind (ToM), Physical Sensation/Pain (Pain)\nTRs identified by RC analysis, as reported in Richardson et al. 2018\nToM Event Onsets; Durations \n46; 2\n52; 3\n63; 2\n91; 8\n122; 3\n129; 4\n153; 3\n\nPain Event Onsets; Durations\n38; 2\n49; 1\n56; 2\n71; 5\n100; 2\n108; 6\n117; 3\n134; 3\n159; 2\n\n\nTIMING OF EVENTS FOR MODELING (taking into account hemodynamic lag (4s), scanner trigger = 0):\nAll timings assume 10s from trigger until movie begins to play.\n\nIn seconds:\nMental Event Onsets; Durations\n86; 4\n98; 6\n120; 4\n176; 16\n238; 6\n252; 8\n300; 6\n\nPain Event Onsets; Durations\n70; 4\n92; 2\n106; 4\n136; 10\n194; 4\n210; 12\n228; 6\n262; 6\n312; 4\n\nIn TRs when TR=2:\nMental Event Onsets; Durations\n43; 2\n49; 3\n60; 2\n88; 8\n119; 3\n126; 4\n150; 3\n\nPain Event Onsets; Durations\n35; 2\n46; 1\n53; 2\n68; 5\n97; 2\n105; 6\n114; 3\n131; 3\n156; 2', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Probabilistic Atlas of Functional Regions in Movie-Watching ', + // tags: [ + // 'msdl', + // 'probabilistic-atlas', + // 'resting-state', + // 'fmri', + // 'visual-stimuli' + // ], + // type: 'dataset', + // updated: '2022-10-06T21:19:37Z' + // }, + // nft: { + // address: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', + // created: '2022-10-06T21:20:36', + // name: 'Ocean Data NFT', + // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjkzMGIwMTZlYTk3OTAxNTY1OTNlMDE2YmEyYTRmZTdhOGJkMjc2YzgwNDMzMjBmOGJhMzRkOWIzNjM5NTA2OWUiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6OTMwYjAxNmVhOTc5MDE1NjU5M2UwMTZiYTJhNGZlN2E4YmQyNzZjODA0MzMyMGY4YmEzNGQ5YjM2Mzk1MDY5ZSIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjRDNywyNSAxNSwyNiAyNywyN0MzOCwyNyA1NCwyNiA2NywyNkM3OSwyNSA4OSwyNCA5OSwyNEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDFDOSw0NyAxOCw1MyAyOSw1NUM0MCw1NiA1Myw1NCA2NSw1M0M3Nyw1MSA4OCw1MSA5OSw1Mkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDc5QzEzLDc5IDI3LDgwIDM3LDc3QzQ2LDczIDUyLDY2IDYyLDY3QzcxLDY3IDg1LDc0IDk5LDgxTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' + // }, + // nftAddress: '0x9293919ED1362e6e0572900B2595a2A0bA1cc77C', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x1FC8dB81E8b68EB1891f83e742377827b56a0663', + // files: + // '0x0421fc24dc6b2bbe70ec05954eeda9e60156fc62e4a90aff80d1bd34ff647324bef394500adc3b202bf4d2a22af48cccd414c599579fb054876ccc631ad4fa39eb76bde29c7bde581b6954334891bffef4c4a9d5e08369ec12b26964a552b9f9d0796f053705a71737f692d74be64fa21db0a06811a6eedc4d7b3a4416cddca0aaacaeda4f327e2e7579bdf40c6b894adb72c33c41d181b52b4100a3381f4b7ae0c83effb9edbf025630a6691804b1911560d6d15934ae5ae79e548e72e325173d0a8c8920981367cf1e7ba9126f5be6a756a5e4508e614ed78a15f97f39c5a317fa65de1e2481d144db2802fcdeff77a1b43db7d6ad45a82d7cf375b629387335495d93b63bb78a45219ba0e9ee7c0ab85713d4bd315ccb46eed6c0a87d45e01a9c4cb278f988e1e05f7b24ab25bc9bca3763457116e0c4c8e7336d5fcbed697aa2ec0c13a224a800bb0ce7693d421ff833', + // id: '9a3135912010f6b27a6c1511c0221853136b3cbc1a55c62ce2b147512300402f', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 86400, + // type: 'access' // } // ], // stats: { @@ -674,8 +696,8 @@ export const assets: AssetExtended[] = [ // publisherMarketOrderFee: '0', // type: 'fixed', // addressOrId: - // '0x1c4f156e06d1b9eeb5aa367869c9d14386918aa12ef4969c3bf242ef6bcba7c8', - // price: '5', + // '0x938802c3fe89c54a0e6b1cd47fa5263817282185a2e0f78fa2957ec1aff970fc', + // price: '6', // isPurchasable: true, // baseToken: { // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', @@ -684,888 +706,1106 @@ export const assets: AssetExtended[] = [ // decimals: 18 // }, // datatoken: { - // address: '0x7626de49a774c18e0f7fc658821a87e103f80fab', - // name: 'Lovely Prawn Token', - // symbol: 'LOVPRA-51' + // address: '0x1fc8db81e8b68eb1891f83e742377827b56a0663', + // name: 'Querulous Plankton Token', + // symbol: 'QUEPLA-8' // }, // isOwned: false, // validOrderTx: null // } // }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0x40C929B5265F13E668A3e81c4289A279bd2f7452', - name: 'Fecund Anchovy Token', - serviceId: - '440cdd2f76cd72803ca478fd432d087d6213711ac35163591afe22bbc77a0154', - symbol: 'FECANC-54' - } - ], - event: { - block: 7723800, - contract: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', - datetime: '2022-10-06T20:10:12', - from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - tx: '0x5ea85c7bc0998a42896a7011d0595f01159647399e1fd008353ac9bb95339a25' - }, - id: 'did:op:2f9cf3eba8ff21db32350aa6d48db89ca86beab7adf729a40a5debdcef8cd7cb', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: - 'Haxby, J. V., Gobbini, M. I., Furey, M. L., Ishai, A., Schouten, J. L. & Pietrini, P.', - created: '2022-10-06T20:09:49Z', - description: - 'This is a block-design fMRI dataset from a study on face and object representation in human ventral temporal cortex. It consists of 6 subjects with 12 runs per subject. In each run, the subjects passively viewed greyscale images of eight object categories, grouped in 24s blocks separated by rest periods. Each image was shown for 500ms and was followed by a 1500ms inter-stimulus interval. Full-brain fMRI data were recorded with a volume repetition time of 2.5s, thus, a stimulus block was covered by roughly 9 volumes. This dataset has been repeatedly reanalyzed. For a complete description of the experimental design, fMRI acquisition parameters, and previously obtained results see the [references](http://www.pymvpa.org/datadb/haxby2001.html#references) below.\n\n', - license: 'https://market.oceanprotocol.com/terms', - name: 'Faces and Objects in Ventral Temporal Cortex (fMRI)', - tags: ['fmri', 'bold', '4d', 'functional', 'visual-stimuli'], - type: 'dataset', - updated: '2022-10-06T20:09:49Z' - }, - nft: { - address: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', - created: '2022-10-06T20:10:12', - name: 'Ocean Data NFT', - owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjJmOWNmM2ViYThmZjIxZGIzMjM1MGFhNmQ0OGRiODljYTg2YmVhYjdhZGY3MjlhNDBhNWRlYmRjZWY4Y2Q3Y2IiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6MmY5Y2YzZWJhOGZmMjFkYjMyMzUwYWE2ZDQ4ZGI4OWNhODZiZWFiN2FkZjcyOWE0MGE1ZGViZGNlZjhjZDdjYiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjRDOSwyNSAxOCwyNyAyOSwyOEMzOSwyOCA1MSwyOCA2MywyOEM3NCwyNyA4NiwyNyA5OSwyOEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDlDMTIsNDcgMjUsNDUgMzUsNDVDNDQsNDQgNTEsNDQgNjIsNDVDNzIsNDUgODUsNDcgOTksNTBMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw3NEMxMSw3NCAyMyw3NSAzNCw3NkM0NCw3NiA1Myw3OCA2NCw3OEM3NCw3NyA4Niw3NSA5OSw3NEw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' - }, - nftAddress: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x40C929B5265F13E668A3e81c4289A279bd2f7452', - files: - '0x04766f8cb6306eed4cd0fb6938c68a946a2f299525890afac89fab0e3e697748961e5072136e0ae57f20a7b6a6bc8ef12760b2c774e7feea28dcc099c7d52b77201a1f57b0e0d345ec0b51b5beb13af6c2a2a72ab5fb610de8a194f6fa0ef7f0fd84b0b868ed63ff820813c72c6d228fc093e299490a2f8a95cbd43f69e0bcdba524457191f812977ce6239db432641c13442caac3594d962fd3410bd829aea7cc82483473f42417922b12c9f8871a60be7d33ebc5bed37d2416defb59dbd3b63330ab33acea402f1d09145f05504d031cdc53c0120ce5704bad4721af2f71175ac19c7d3d0cde0830d9f59c90a0e8b94e162b025f86171e6145486afeb06b5409ff1e867f32c9191bf7063180f9d883e9fa7d64acb30bd3c5f6cb43c8249ed740859955a6f9036130b2c0832d433f58bfde1267c883c98065168080bba055a4f1d4e394b80f606f81792ef1b8815fdc1184f6', - id: '440cdd2f76cd72803ca478fd432d087d6213711ac35163591afe22bbc77a0154', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - allocated: 0, - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 1, - publisherMarketOrderFee: '0', - type: 'fixed', - addressOrId: - '0xe6665bd4541c6584a3e31dbf73a74e91da6c791954ea3d61905e50b6e00e0b4e', - price: '5', - isPurchasable: true, - baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', - decimals: 18 - }, - datatoken: { - address: '0x40c929b5265f13e668a3e81c4289a279bd2f7452', - name: 'Fecund Anchovy Token', - symbol: 'FECANC-54' - }, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 137, - datatokens: [ - { - address: '0x0A81F1c69e5428067e6124817C7AFFE8bC0adF9f', - name: 'Fabulous Walrus Token', - serviceId: - '485bd67a4bdb69353b4500bb194c6a20c6be57337956cf2f699f3530847ef038', - symbol: 'FABWAL-60' - } - ], - event: { - block: 34000873, - contract: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', - datetime: '2022-10-06T11:16:48', - from: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', - tx: '0x8713e0f444dee5a79799d3037047a3463199164232250b056f8723b2402ea320' - }, - id: 'did:op:1ea697b447f0a0b3209048f144c0331ca1a8c10af27e233512a41623b93ff8ed', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'OPF', - created: '2022-10-06T11:16:17Z', - description: - 'Test asset wrt issue https://github.com/oceanprotocol/ocean.py/issues/990\n\nUrl is https://cexa.oceanprotocol.io/ohlc?exchange=binance&pair=ETH/USDT', - license: 'https://market.oceanprotocol.com/terms', - name: 'CEXA test ocean.py#990 (4)', - tags: ['defi'], - type: 'dataset', - updated: '2022-10-06T11:16:17Z' - }, - nft: { - address: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', - created: '2022-10-06T11:16:48', - name: 'Ocean Data NFT', - owner: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDoxZWE2OTdiNDQ3ZjBhMGIzMjA5MDQ4ZjE0NGMwMzMxY2ExYThjMTBhZjI3ZTIzMzUxMmE0MTYyM2I5M2ZmOGVkIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjFlYTY5N2I0NDdmMGEwYjMyMDkwNDhmMTQ0YzAzMzFjYTFhOGMxMGFmMjdlMjMzNTEyYTQxNjIzYjkzZmY4ZWQiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI4QzEwLDI0IDIwLDIxIDI3LDIxQzMzLDIwIDM3LDIyIDQ2LDI0QzU0LDI1IDY2LDI3IDc2LDI4Qzg1LDI4IDkyLDI3IDk5LDI2TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1NkM4LDU1IDE3LDU0IDI1LDUxQzMyLDQ3IDQwLDQwIDQ5LDQyQzU3LDQzIDY4LDUyIDc3LDU0Qzg1LDU1IDkyLDUwIDk5LDQ2TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNzdDNiw3OCAxMyw4MCAyMSw4MEMyOCw3OSAzNyw3NiA0Niw3NUM1NCw3MyA2NCw3MSA3Myw3MkM4MSw3MiA5MCw3NCA5OSw3Nkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' - }, - nftAddress: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x0A81F1c69e5428067e6124817C7AFFE8bC0adF9f', - files: - '0x04c5f0ebee297a2121d3f37e46d93ac2c0fc5d642e4c4c4eae152754047ae4b10e0445b4e908166a47c3e98b636cbf9791d0ee1caf37d6f6fa7da539abc52df7e2d55b2b33b0378a38dbaf3e489b830d57e8db8dbc6deff94476eda055f0a5152869e8cee2eae42692070f98aa9b99025a1a4887e84f34176a27b65e6cec455ba60e6628e496c91bd1b222612ed1f530a3976f0fe5ae55afad194fa947fef19b97522ca45c6268afff22d610d1fd6f11d10f02fb42d66d566fca66544537feb717d6c8d6281408c9d4e29905bdac106e7f94750631082fcae42929b3a389d298fac48513397a8e3c235a81acd9675e92dd776f37a762d7a1b706abf26a46e571e9513c4ee9119a8f60d51995fcdcc76a9e048d16bae1e4cfe50824f9b71104e5485b1ef784e95195d3bbed2b604fc24c8f8f4e780e1837aac1cc0194b2db1b91a56671b998f32ffba6d43482cc6cc6e33c1296865d1f4fbe', - id: '485bd67a4bdb69353b4500bb194c6a20c6be57337956cf2f699f3530847ef038', - serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', - timeout: 604800, - type: 'access' - } - ], - stats: { - allocated: 114.1658859253, - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 1, - publisherMarketOrderFee: '0', - type: 'free', - addressOrId: '0x0a81f1c69e5428067e6124817c7affe8bc0adf9f', - price: '0', - isPurchasable: true, - datatoken: { - address: '0x0a81f1c69e5428067e6124817c7affe8bc0adf9f', - name: 'Fabulous Walrus Token', - symbol: 'FABWAL-60' - }, - baseToken: null, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0xbadac447bF4868aeCa6A9c7448DDAdfe6632509a', - name: 'Tactful Shark Token', - serviceId: - 'c02b30d8930ac5d2561d4c391c74c06a39d6060802be2534218bd3449d9387ce', - symbol: 'TACSHA-14' - } - ], - event: { - block: 7717509, - contract: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', - datetime: '2022-10-05T18:25:48', - from: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', - tx: '0xe3e87b83e0f687dceb8db1eb4d3b8053522a6b722e376e472e71e337ad64c0a2' - }, - id: 'did:op:d1563919dd61c8ea5790b85f3a569fa69e46c84a600290ca377a1cb009bb7694', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'aaa', - created: '2022-10-05T18:25:38Z', - description: 'Template template moneeey', - license: 'https://market.oceanprotocol.com/terms', - name: 'Template template moneeey', - tags: [], - type: 'dataset', - updated: '2022-10-05T18:25:38Z' - }, - nft: { - address: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', - created: '2022-10-05T18:25:48', - name: 'Ocean Data NFT', - owner: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkMTU2MzkxOWRkNjFjOGVhNTc5MGI4NWYzYTU2OWZhNjllNDZjODRhNjAwMjkwY2EzNzdhMWNiMDA5YmI3Njk0IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmQxNTYzOTE5ZGQ2MWM4ZWE1NzkwYjg1ZjNhNTY5ZmE2OWU0NmM4NGE2MDAyOTBjYTM3N2ExY2IwMDliYjc2OTQiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzUsMjkgMTEsMjkgMjAsMzBDMjgsMzAgMzgsMzEgNDgsMjlDNTcsMjYgNjUsMjEgNzQsMjBDODIsMTggOTAsMTkgOTksMjBMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU3QzksNTcgMTgsNTggMjYsNTVDMzMsNTEgMzksNDIgNDcsNDJDNTQsNDEgNjQsNTAgNzQsNTNDODMsNTUgOTEsNTEgOTksNDdMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw3NEMxMCw3MiAyMCw3MCAyOCw2OUMzNSw2NyAzOCw2NiA0Niw3MEM1Myw3MyA2NCw3OSA3NCw4MEM4Myw4MCA5MSw3MyA5OSw2N0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' - }, - nftAddress: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0xbadac447bF4868aeCa6A9c7448DDAdfe6632509a', - files: - '0x048db0b48ee8f19f3e163cef39095799876e84ad5a2dd3e5140b2ed0f33f13351d078b07b5e1d38f2427ff0a2a21a24dc0f02756bb51603b384adc83b936621a8861fd5e56d9d51122f391cf1f823ae417a56dc8a0f3f26e85eafad124500175be7c732aec90cc5cc88c83378e3a503334f0e0589ca0f48328bda961dcf26dae6ea209143918f201a81be982bbcfd0294f7d97a4d54e7982b995c4329c5d3c29e084c4d4aaeeeccc9b70f353de7fdc38a70dbcbd0425d9c696e8fefa9ea7a3d4aa4f28c8dcba7536e7afc5aa8d64c5b9b949657aed2249440a80f46b2b84317530a35888ccbc259de8a4c77f91c25d0c507b67e7998143b0e9b0068b72f93a2195a1c5b9260684fa554bdd15721a34cad1308c45483ab935ba9ac1f391b89f10158fb39b712af5f37d135591c21a', - id: 'c02b30d8930ac5d2561d4c391c74c06a39d6060802be2534218bd3449d9387ce', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 1, - publisherMarketOrderFee: '0', - type: 'fixed', - addressOrId: - '0xdbfa14546d4f2caa1e0d59cbf8ae775c65b0d34369f8c62990c0b0d0bc73ff10', - price: '2', - isPurchasable: true, - baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', - decimals: 18 - }, - datatoken: { - address: '0xbadac447bf4868aeca6a9c7448ddadfe6632509a', - name: 'Tactful Shark Token', - symbol: 'TACSHA-14' - }, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0x772224c2C2bddb88A55b3905aAaf8C7188b02ce3', - name: 'Rebarbative Barnacle Token', - serviceId: - '42e244808872c9f4ad96db99d9877abbf3cae9988dec9bd52ab2e336d7ac83af', - symbol: 'REBBAR-99' - } - ], - event: { - block: 7717490, - contract: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', - datetime: '2022-10-05T18:21:24', - from: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', - tx: '0xa38677962c1c83faad8365fbd924b3ca35fb2c0f07af504d7438eec6e54c9918' - }, - id: 'did:op:aeb9faad199e79eb21cddc15557fa42fe95a02e03c493be8e849594aae60221a', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'aaaa', - created: '2022-10-05T18:21:13Z', - description: 'Template template ', - license: 'https://market.oceanprotocol.com/terms', - name: 'Template template ', - tags: ['aaa'], - type: 'dataset', - updated: '2022-10-05T18:21:13Z' - }, - nft: { - address: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', - created: '2022-10-05T18:21:24', - name: 'Ocean Data NFT', - owner: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDphZWI5ZmFhZDE5OWU3OWViMjFjZGRjMTU1NTdmYTQyZmU5NWEwMmUwM2M0OTNiZThlODQ5NTk0YWFlNjAyMjFhIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmFlYjlmYWFkMTk5ZTc5ZWIyMWNkZGMxNTU1N2ZhNDJmZTk1YTAyZTAzYzQ5M2JlOGU4NDk1OTRhYWU2MDIyMWEiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDE4QzEwLDE3IDIwLDE2IDI4LDE5QzM1LDIxIDM5LDI4IDQ4LDI5QzU2LDI5IDY3LDI0IDc3LDIyQzg2LDE5IDkyLDE4IDk5LDE4TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0OEM2LDUwIDEzLDUyIDIzLDU1QzMyLDU3IDQ0LDU4IDUzLDU2QzYxLDUzIDY3LDQ1IDc1LDQzQzgyLDQwIDkwLDQxIDk5LDQzTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNzVDOSw3NCAxOSw3MyAyOCw3NEMzNiw3NCA0NCw3NSA1Miw3NUM1OSw3NCA2Nyw3MyA3NSw3M0M4Miw3MiA5MCw3MSA5OSw3MUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' - }, - nftAddress: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x772224c2C2bddb88A55b3905aAaf8C7188b02ce3', - files: - '0x0435d6273c00013a79d50a8b4fd8e65b7ccbde5fcb99726d52fb222282f5e80a18873a27908c5ed07fc808175784b162792c4946a735fbbe338c5ce7579ae46451f88c5eda573ae7c7764337d8d165a0fe715aab96f416c606b84f3b2dba9dbd8d7c00ce8ffe67d644ce88a4c9d842a149a93f3e6135b94b448db76960f5375dc661fb9a75b424d28b43553b58af31b02eab5b1e928f71c699eb9a4114284fe0b9eeeaccb3d02848c16a544160e68b18db5cc214f9d56b6c5aa775853248e5a0164045da6b30ccc7a13a45396bf2cf6bc10d31feb3bb9b2c40b3a6c8c97cde85de13b56d2f2d09aee13180b63423b7d30d4c6fd03d8d5ab15395463038c12b2da1ca86f9317011dc215750dd5c16f4360b658aa39f5e2e93b0ff1de9e7a88c5afb23daa5122160c463b973fb9bf8', - id: '42e244808872c9f4ad96db99d9877abbf3cae9988dec9bd52ab2e336d7ac83af', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'free', - addressOrId: '0x772224c2c2bddb88a55b3905aaaf8c7188b02ce3', - price: '0', - isPurchasable: true, - datatoken: { - address: '0x772224c2c2bddb88a55b3905aaaf8c7188b02ce3', - name: 'Rebarbative Barnacle Token', - symbol: 'REBBAR-99' - }, - baseToken: null, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 137, - datatokens: [ - { - address: '0x89A0170556BB80438081D69F43d8C07a90e9Aa24', - name: 'Invidious Octopus Token', - serviceId: - '8573fbf5e2e5a90631e26bef416f140f815570b5124b8ad52812443d110a57c2', - symbol: 'INVOCT-85' - } - ], - event: { - block: 33956932, - contract: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', - datetime: '2022-10-05T09:49:12', - from: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', - tx: '0xe656b9d934ba1f8c98eb9372fd03709c880486fff0b50476450ef458694b1529' - }, - id: 'did:op:191af71e271d4eb6f9ac582b2a6a78e8d79167da7a13a30878c7b699842aa421', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'OPF', - created: '2022-10-05T09:42:06Z', - description: - 'Test asset wrt issue https://github.com/oceanprotocol/ocean.py/issues/990\n\nUrl is https://cexa.oceanprotocol.io/ohlc?exchange=binance&pair=ETH/USDT', - license: 'https://market.oceanprotocol.com/terms', - name: 'CEXA test ocean.py#990 (3)', - tags: ['defi'], - type: 'dataset', - updated: '2022-10-05T09:42:06Z' - }, - nft: { - address: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', - created: '2022-10-05T09:49:12', - name: 'Ocean Data NFT', - owner: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDoxOTFhZjcxZTI3MWQ0ZWI2ZjlhYzU4MmIyYTZhNzhlOGQ3OTE2N2RhN2ExM2EzMDg3OGM3YjY5OTg0MmFhNDIxIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjE5MWFmNzFlMjcxZDRlYjZmOWFjNTgyYjJhNmE3OGU4ZDc5MTY3ZGE3YTEzYTMwODc4YzdiNjk5ODQyYWE0MjEiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI4QzEwLDI1IDIxLDIyIDMzLDIzQzQ0LDIzIDU3LDI4IDY5LDI5QzgwLDI5IDg5LDI0IDk5LDIwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0OCAyNSw1MiAzNyw1NEM0OCw1NSA1OCw1MiA2OSw1MUM3OSw0OSA4OSw0OCA5OSw0OEw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDc3QzksNzQgMTgsNzEgMjksNzBDMzksNjggNTIsNjcgNjQsNjlDNzUsNzAgODcsNzMgOTksNzdMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' - }, - nftAddress: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x89A0170556BB80438081D69F43d8C07a90e9Aa24', - files: - '0x040948a7677383b0c920458a6e1eca981061a9e4bf2b34a187d6fea73a21c568f9be5cb92233fc81e986e20b32c20d38a149ab45340b4a8ef9db0c8c000c7b2838b7a7496b5a4e670d97e3b6ed19af64635ba4ad737b2a90f377e5856ade60c0dad8375033d4a134cbff122234bb60e6e3e282e5dbdd6d3b0f9d5a7910e6a77d62c617f08120ac5b5ec88aec6609f22e0e24fe558e87865dc42278d09d5f4a2a30ac869f48221c481feee2dc0d39dc001c09e898964ccee99d16a24b4f41c3391dedc2f71140165541639c3d19385967347352be9c97fa8e7d9db842ab77eca21abf94edc422f83bd8017706d51791f2e282b5a0ec3a23521d898110aa66fa12a0ec6fa4258ca2cf4d7a6d1450b86eda81a936788fcd92f9754efa3fba4e69729e90d88bff58f12e5a1c76a24c57200a35f7bf71b9f525580e1f6ff7139c6c8f04fd4c59650dbfebaf5f5f1dccf4c3bc5d3a65b33c1d9107', - id: '8573fbf5e2e5a90631e26bef416f140f815570b5124b8ad52812443d110a57c2', - serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', - timeout: 604800, - type: 'access' - } - ], - stats: { - allocated: 11159.279296875, - orders: 1, - price: { - value: 0 - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'free', - addressOrId: '0x89a0170556bb80438081d69f43d8c07a90e9aa24', - price: '0', - isPurchasable: true, - datatoken: { - address: '0x89a0170556bb80438081d69f43d8c07a90e9aa24', - name: 'Invidious Octopus Token', - symbol: 'INVOCT-85' - }, - baseToken: null, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0xAd42c7AfEe47140B5CD87F05d5846c418145f43A', - name: 'Zealous Clam Token', - serviceId: - '081b597131102e14ea5f16d6ba49f46889fb700f88f9430d03ec64441280a894', - symbol: 'ZEACLA-28' - } - ], - event: { - block: 7714916, - contract: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', - datetime: '2022-10-05T07:41:24', - from: '0x3e81AA994f774eE914D57946DDF2486EA7d42D65', - tx: '0x20e01c84928b5432216cb7046dc81b50e2902e3e65d1a9b0c93fb7b772e2d979' - }, - id: 'did:op:50c60ce0810bf8f8b1c6ca421e5231b106cf4de784945037498c84147e11dbc5', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'aaa', - created: '2022-10-05T07:40:44Z', - description: 'asda asda dsadadada', - license: 'https://market.oceanprotocol.com/terms', - name: 'Free testing', - tags: ['aaa'], - type: 'dataset', - updated: '2022-10-05T07:40:44Z' - }, - nft: { - address: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', - created: '2022-10-05T07:41:24', - name: 'Ocean Data NFT', - owner: '0x3e81AA994f774eE914D57946DDF2486EA7d42D65', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo1MGM2MGNlMDgxMGJmOGY4YjFjNmNhNDIxZTUyMzFiMTA2Y2Y0ZGU3ODQ5NDUwMzc0OThjODQxNDdlMTFkYmM1IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjUwYzYwY2UwODEwYmY4ZjhiMWM2Y2E0MjFlNTIzMWIxMDZjZjRkZTc4NDk0NTAzNzQ5OGM4NDE0N2UxMWRiYzUiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIwQzEzLDI0IDI3LDI4IDM3LDI3QzQ2LDI1IDUzLDE5IDYzLDE4QzcyLDE2IDg1LDIwIDk5LDI1TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1NkM4LDU0IDE3LDUzIDI5LDUzQzQwLDUyIDU0LDUxIDY3LDUyQzc5LDUyIDg5LDUzIDk5LDU1TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNjlDMTEsNzMgMjIsNzcgMzQsNzdDNDUsNzYgNTgsNzEgNjksNjlDNzksNjYgODksNjcgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' - }, - nftAddress: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0xAd42c7AfEe47140B5CD87F05d5846c418145f43A', - files: - '0x0431fb7120723def69d30ee6aede9846cf0578ae44e22459f7273e4b37f204832f4b87f0ea6cea7bbea820a35d0b18e6c599d3898368ddf03df6a5cd8003a0100274e8405f640815d18e63ce680c3a6fae28b71fc2e072d02c39618a85fa12528f0b740d9ea0f2b4d0795444794f1b614ef1a796deb2399ccaa5b709707a08d5a6b576eac811bfc35f9e02e8d778538dd989fe7d237e46bfffcd680cd9f70d30f5acbbcff33845a95aa1c310864ca95fb076a40174a307d3b71c3259bde027381460f02ff6bcdcfaee9edf6e74dc0adc465b4bcdaac74e6ca7f4181cec45cc5f2c925295b226e586935d7edd644ebe913c491ebfe6144bf605b330e42b7f35a88b55a1f7dc0b19851c0b032494e910b929831e9e5135d79134c2f3cd565a071327d7ba8b83357832603cec9aedc9', - id: '081b597131102e14ea5f16d6ba49f46889fb700f88f9430d03ec64441280a894', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - orders: 0, - price: { - value: 0 - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'free', - addressOrId: '0xad42c7afee47140b5cd87f05d5846c418145f43a', - price: '0', - isPurchasable: true, - datatoken: { - address: '0xad42c7afee47140b5cd87f05d5846c418145f43a', - name: 'Zealous Clam Token', - symbol: 'ZEACLA-28' - }, - baseToken: null, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 137, - credentials: { - allow: [], - deny: [] - }, - datatokens: [ - { - address: '0xf31b9c3EEE46249c29339319Bfd41167DE5980f1', - name: 'ETH predictions: DT1', - serviceId: '0', - symbol: 'DT1' - } - ], - event: { - block: 33937819, - contract: '0xaD244AC409cEfA155059890b425b83F6A4146d69', - datetime: '2022-10-04T22:43:00', - from: '0x7BA3d8551A6f2C70a5d47bb448BcF7EF69661822', - tx: '0xdef98b7863ca74caf4af17315942744bf8c1f909da9e4db1287c6acf2beba1d9' - }, - id: 'did:op:f4b49d04ee8c6973e4f844754805dbfe9e682812121131abbfc1bdf6d6b6eef1', - metadata: { - author: '0x7BA3d', - created: '2022-10-04T17:42:13.745633', - description: 'ETH predictions', - license: 'CC0: PublicDomain', - name: 'ETH predictions', - type: 'dataset', - updated: '2022-10-04T17:42:13.745633' - }, - nft: { - address: '0xaD244AC409cEfA155059890b425b83F6A4146d69', - created: '2022-10-04T22:43:00', - name: 'ETH predictions', - owner: '0x7BA3d8551A6f2C70a5d47bb448BcF7EF69661822', - state: 0, - symbol: 'ETH predictions', - tokenURI: 'https://oceanprotocol.com/nft/' - }, - nftAddress: '0xaD244AC409cEfA155059890b425b83F6A4146d69', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0xf31b9c3EEE46249c29339319Bfd41167DE5980f1', - description: 'Download service', - files: - '0x044c33205fb032624a234ddce8c8e84b8311ded47f43edbea93825f670145ba127237837013705e7e173f7673f7a7f87be292687e373f13cad812f273f86e293f8c78367b496664c9ea82c5095871b0404def05e719b567bea0f523daf5054c3e2894140b5e9072e075c9df9b8039c5d434bd0569daff8d27c2b9544823890e5072d36f5f417cfe4c8f9c0b3fd48ed546b16fea54fbfff12c8da77549f49dbae52a4894e9ebe08c29903cf458815d43da1fc1ca89322c0cbc7f69e20d4489cb69d9272de03a6f7e89793d0ceda6a7eb41dfbf1d942a47773b32c2df2c4d81ca2ee79043819230621a351bcf0f67f377c7885c3578e4a4f75f9e30f779ffb0b0af81c02a8b8359831bfe4ed7cc1a267a133e09a5264dec1695801b3b3b15a26cf9a24dcb50620abed35fafe45eae01a1681f0aa85ba4648b6574e760eeb414ee18a1de319b0d06fbab40e8ed193fc', - id: '0', - name: 'Download service', - serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', - timeout: 3600, - type: 'access' - } - ], - stats: { - allocated: 0, - orders: 0, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - type: 'NOT_SUPPORTED' - } as any - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0xf5dbd5a675248f92E3F37da98090144C1355ABb5', - name: 'Feckless Orca Token', - serviceId: - '9dec1b8dbf546767988ca98374631b7325a5c0ddb5b75e21e6da0f527cc45285', - symbol: 'FECORC-10' - } - ], - event: { - block: 7710252, - contract: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', - datetime: '2022-10-04T12:45:00', - from: '0x9c4e3CaE2B87180BEa0238b25bacf38473c39e11', - tx: '0x01d95a564f99e8c1e7cc585ed00435b405723751ad96e57e86851763f7222ce4' - }, - id: 'did:op:82698600c9f003bdfa97bf054b5bb9b0f83c18b4ea748ce1eddbab8110ff9ea9', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'Jamie', - created: '2022-10-04T12:44:40Z', - description: - 'Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data ', - license: 'https://market.oceanprotocol.com/terms', - name: 'Test Data', - tags: ['test'], - type: 'dataset', - updated: '2022-10-04T12:44:40Z' - }, - nft: { - address: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', - created: '2022-10-04T12:45:00', - name: 'Ocean Data NFT', - owner: '0x9c4e3CaE2B87180BEa0238b25bacf38473c39e11', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo4MjY5ODYwMGM5ZjAwM2JkZmE5N2JmMDU0YjViYjliMGY4M2MxOGI0ZWE3NDhjZTFlZGRiYWI4MTEwZmY5ZWE5IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjgyNjk4NjAwYzlmMDAzYmRmYTk3YmYwNTRiNWJiOWIwZjgzYzE4YjRlYTc0OGNlMWVkZGJhYjgxMTBmZjllYTkiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDE3QzYsMTYgMTMsMTYgMjIsMTdDMzAsMTcgNDAsMTkgNTAsMjBDNTksMjAgNjcsMjEgNzUsMjFDODIsMjAgOTAsMTkgOTksMTlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU0QzYsNTAgMTMsNDcgMjIsNDdDMzAsNDYgMzksNDkgNDksNTJDNTgsNTQgNjgsNTggNzcsNTdDODUsNTUgOTIsNDkgOTksNDNMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw4MkM3LDgwIDE1LDc5IDI0LDc2QzMyLDcyIDQwLDY2IDQ5LDY4QzU3LDY5IDY0LDc4IDczLDgxQzgxLDgzIDkwLDgwIDk5LDc4TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' - }, - nftAddress: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0xf5dbd5a675248f92E3F37da98090144C1355ABb5', - files: - '0x044434dfd2c80154b1a0641420a12d694ea9c762f9a7ca79ca467b5e1995ed2ee5cfe3460a368840ba290dfdec634c72e4204f12cb17a3f4f7108a253d11ed3a5294187b2bc7c8f24e39568a912914732bd2dd2707b0f416f1e729b2eb71f5656e10b33dba2ecd012dfbe01fa2c9dfb850a2386fc4962e5ccdc660b959fd00adef1c70c0f2b4a26df063a52197791bf9eed9136f1ad7b8a6073e196b2cbfb8b4d2a1dd023c15481b956c9419b47df921d72e3706820d4f5f26374fd0ee1bd6cfd9aead3e7168759419f404fac6f9779233c328a26ea41cb5c064cfb342d01fc7bc10a5766407dfc5a5dc3e0cbfc95f8b4cbe8f00895b02d4b42ccb2bbc465ef1e7026c0d922ef7877b1d6065e03922d9549f9aad490f07a03aa713d3028d489a11bcd3be12e2bf6a8d3d6c1a1108401786b5598c6c1411d9f562c137fd991fb2ebd6d1bbb7f46d5392387d0764bb', - id: '9dec1b8dbf546767988ca98374631b7325a5c0ddb5b75e21e6da0f527cc45285', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - orders: 1, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'fixed', - addressOrId: - '0xadd592e83c3830058bb3649e499b9066c681616ffe6ea12e28dc6adcc63dac16', - price: '1', - isPurchasable: true, - baseToken: { - address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', - name: 'Ocean Token', - symbol: 'OCEAN', - decimals: 18 - }, - datatoken: { - address: '0xf5dbd5a675248f92e3f37da98090144c1355abb5', - name: 'Feckless Orca Token', - symbol: 'FECORC-10' - }, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 5, - datatokens: [ - { - address: '0x23C1FD10DADCaF558fB7173b79CfD0D867568a3D', - name: 'Equanimous Barracuda Token', - serviceId: - '89d66d7e77abccb2899b224662a733b42edefeb769138d6562928c38f75b4caa', - symbol: 'EQUBAR-39' - } - ], - event: { - block: 7716390, - contract: '0x3A695322d631451474090F322eA3d8d2eC8c1562', - datetime: '2022-10-05T13:51:24', - from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', - tx: '0xcea2e02cb67c0c545976baf419a1cacbcad6fd2c4308eca93c49a3135a90e40c' - }, - id: 'did:op:9c1235050bcd51c8ec9a7058110102c9595136834911c315b4f739bc9a880b8e', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'Jelly', - created: '2022-10-04T11:38:49Z', - description: 'Testitestvwgre btewwgte', - license: 'https://market.oceanprotocol.com/terms', - name: 'Testitest', - tags: [], - type: 'dataset', - updated: '2022-10-04T11:38:49Z' - }, - nft: { - address: '0x3A695322d631451474090F322eA3d8d2eC8c1562', - created: '2022-10-04T11:39:12', - name: 'Ocean Data NFT', - owner: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo5YzEyMzUwNTBiY2Q1MWM4ZWM5YTcwNTgxMTAxMDJjOTU5NTEzNjgzNDkxMWMzMTViNGY3MzliYzlhODgwYjhlIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjljMTIzNTA1MGJjZDUxYzhlYzlhNzA1ODExMDEwMmM5NTk1MTM2ODM0OTExYzMxNWI0ZjczOWJjOWE4ODBiOGUiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIxQzExLDIwIDIyLDIwIDMzLDIxQzQzLDIxIDU0LDIyIDY1LDIzQzc1LDIzIDg3LDIyIDk5LDIyTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1M0MxMiw0OCAyNSw0NCAzNiw0NUM0Niw0NSA1NCw1MSA2NSw1M0M3NSw1NCA4Nyw1MSA5OSw0OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzEyLDczIDI1LDc4IDM2LDgwQzQ2LDgxIDU0LDc4IDY1LDc3Qzc1LDc1IDg3LDc1IDk5LDc2TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' - }, - nftAddress: '0x3A695322d631451474090F322eA3d8d2eC8c1562', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x23C1FD10DADCaF558fB7173b79CfD0D867568a3D', - files: - '0x042f150d201313fa28d6d4ecd45b65eab2a3f88eaae50570d9e6a903b071c74eca5c129d38b7c5adf871e70fc586daba5d8788c405208238a9974519f086a28c9366e049b07eae6ab20f2752ed382a6123a49d74c7f2134f14632393851ead2be2df2634f9b4db2126085cdc57d2e2d144c219bc7a546b2030d128e23c0056da8c26f6d7bffb389c31d76916dd5c6f94f5c7d9a532dd6d3c210bed0f7486e41411911f446a020628136efc3acfa39573dc54ab0b29fbd8985f64a88cc20d2f9a2e0688ff1b8458f8f1a46be4633045b5e9313b612e96dae44f4c9258c2420c13a2bac8082461141b036065c0187b119586c1ea7225e1599e520a34da5e4510d8bec879d982ebf951566ece9ef58c1eb43ac07570a6a8e542b29460bf52914a9f8f3dfd7e423d87dd618e2b04db54e5f7dcf91976cee59ddd63bb09a09ecc98ba44005a', - id: '89d66d7e77abccb2899b224662a733b42edefeb769138d6562928c38f75b4caa', - serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - orders: 0, - price: { - value: 0 - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'free', - addressOrId: '0x23c1fd10dadcaf558fb7173b79cfd0d867568a3d', - price: '0', - isPurchasable: true, - datatoken: { - address: '0x23c1fd10dadcaf558fb7173b79cfd0d867568a3d', - name: 'Equanimous Barracuda Token', - symbol: 'EQUBAR-39' - }, - baseToken: null, - isOwned: false, - validOrderTx: null - } - }, - { - '@context': ['https://w3id.org/did/v1'], - chainId: 1, - datatokens: [ - { - address: '0x98d87B273Ed411A5940a0C4a3717d58C81917Eb5', - name: 'Egregious Anchovy Token', - serviceId: - '60be64b7b7b10944c2b3eac740f476d85b2625a5db32bd0a3db1959f9a8100bb', - symbol: 'EGRANC-29' - } - ], - event: { - block: 15671852, - contract: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', - datetime: '2022-10-04T02:38:59', - from: '0x8542472a8De568cD3B09A53368C1962d8DfDBE2f', - tx: '0x9f717d0386598349b0e19c45f7dcf2ead5b219b25e1fc08902ebe651c48398fb' - }, - id: 'did:op:9442a55c25e9a0fd30231089ec34e430d0325ce0d3e03ab1aa27579eb56f7570', - metadata: { - additionalInformation: { - termsAndConditions: true - }, - author: 'Internet crawler', - created: '2022-10-04T02:38:44Z', - description: - 'Dataset contains personal info of USA citizen (around 157 criteria) such as: email, phone, name, address, geo location, household, real estate, salary, income, etc. Around 500k citizens. Dataset is helpful for financial, real estate companies who want to use it to train their AI/ML model. Or for marketing , sales purposes.', - license: 'https://market.oceanprotocol.com/terms', - links: [ - 'https://drive.google.com/file/d/1oPX-LHBBV6IkQ3kHD7-25jmMVx4ZMoFU/view?usp=sharing' - ], - name: '500k USA citizen dataset including PII, real estate info, salary, household, etc', - tags: [ - 'ai', - 'machine-learning', - 'real-estate', - 'finance', - 'usa-citizen', - 'pii' - ], - type: 'dataset', - updated: '2022-10-04T02:38:44Z' - }, - nft: { - address: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', - created: '2022-10-04T02:38:59', - name: 'Ocean Data NFT', - owner: '0x8542472a8De568cD3B09A53368C1962d8DfDBE2f', - state: 0, - symbol: 'OCEAN-NFT', - tokenURI: - 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo5NDQyYTU1YzI1ZTlhMGZkMzAyMzEwODllYzM0ZTQzMGQwMzI1Y2UwZDNlMDNhYjFhYTI3NTc5ZWI1NmY3NTcwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjk0NDJhNTVjMjVlOWEwZmQzMDIzMTA4OWVjMzRlNDMwZDAzMjVjZTBkM2UwM2FiMWFhMjc1NzllYjU2Zjc1NzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzEyLDIyIDI1LDIyIDM2LDIzQzQ2LDIzIDUzLDI1IDY0LDI2Qzc0LDI2IDg2LDI2IDk5LDI2TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NkM4LDQ3IDE3LDQ4IDI5LDQ4QzQwLDQ3IDU1LDQ2IDY4LDQ3QzgwLDQ3IDg5LDUwIDk5LDUzTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNjhDMTAsNzMgMjAsNzkgMzAsODBDMzksODAgNDksNzYgNjEsNzVDNzIsNzMgODUsNzUgOTksNzhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' - }, - nftAddress: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', - purgatory: { - state: false, - reason: '' - }, - services: [ - { - datatokenAddress: '0x98d87B273Ed411A5940a0C4a3717d58C81917Eb5', - files: - '0x04a233b66ca6261147f2729d818d4929a797565508daa51f8041bc07fb47d4374702d5cc0528e80d3a6d039df3ba155cdc251f719e8438f1788aed571b98bb301dfd17fe1b4756cd2652ea9f42ca2b3ec3bc40072215ce0dd9504a1d207a3582dee897597117c02013f8e8aefae8843415784db6e7870b6649f434d7eeed5d2adad1e874c18d826171da760fcfe4a3dfec1816bd494f969c290203707037d5e342d37713fef97ddc36b5e6c9a70e7085d841663705314451d3cbcb08dbc24f2baf365ea09160f4b581c93b415188f0e31aa1365a7be1cdbf8ea912aad046e94a801926b6576a47789dab193b28566b7b650c425b51c5c9865936c76c81e51a54986231d37aa518c2b3e629198f77b343d260a1c697f0ae168d405abd2e38e42a121ebaa3ccec8e8d562dcbadcabf5667aa48663e3ec34af9db86dfcc3dc5749ec4878e8fd643036a693ca4e7589d3e1fa93d936f80e4301ad06f30d9469a82ae3e94ebc94c5d19b708', - id: '60be64b7b7b10944c2b3eac740f476d85b2625a5db32bd0a3db1959f9a8100bb', - serviceEndpoint: 'https://v4.provider.mainnet.oceanprotocol.com', - timeout: 0, - type: 'access' - } - ], - stats: { - allocated: 422.9883117676, - orders: 0, - price: { - value: 3231343254, - tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', - tokenSymbol: 'OCEAN' - } - }, - version: '4.1.0', - accessDetails: { - templateId: 2, - publisherMarketOrderFee: '0', - type: 'fixed', - addressOrId: - '0xfcf20144a14c7b2f51319d938436e34041acbd65e1e29319549ed7923b9fd86e', - price: '1000000', - isPurchasable: true, - baseToken: { - address: '0x967da4048cd07ab37855c090aaf366e4ce1b9f48', - name: 'Ocean Token', - symbol: 'OCEAN', - decimals: 18 - }, - datatoken: { - address: '0x98d87b273ed411a5940a0c4a3717d58c81917eb5', - name: 'Egregious Anchovy Token', - symbol: 'EGRANC-29' - }, - isOwned: false, - validOrderTx: null - } - } + // { + // '@context': ['https://w3id.org/did/v1'], + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xb9060a712a494f584b072b0753dc275e1c531178510679ac085053ee38b5f742', + // price: '5', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0x0a9cfaff200efb1d6f125e342dfc78fb3edd28a4', + // name: 'Inspired Ling Token', + // symbol: 'INSLIN-54' + // }, + // isOwned: false, + // validOrderTx: null + // }, + // chainId: 5, + // datatokens: [ + // { + // address: '0x0A9CFaFf200efb1d6F125E342Dfc78Fb3edD28A4', + // name: 'Inspired Ling Token', + // serviceId: + // '383b0e1b8dc3e816af394bfae899eb0c9826f2383602c0fbcd70705e1e9c1302', + // symbol: 'INSLIN-54' + // } + // ], + // event: { + // block: 7723888, + // contract: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', + // datetime: '2022-10-06T20:31:36', + // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // tx: '0x18b1d0af634fab3196921a99618fd9333c4a2113a016bf4757d609ddfdb64432' + // }, + // id: 'did:op:6b4314bd7345d07a10ba2c82a352655273b00cdceb2eedd31c8e0d2b5881eb16', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: + // 'Haxby, J. V., Gobbini, M. I., Furey, M. L., Ishai, A., Schouten, J. L. & Pietrini, P. ', + // created: '2022-10-06T20:30:01Z', + // description: + // 'This is a block-design fMRI dataset from a study on face and object representation in human ventral temporal cortex. It consists of 6 subjects with 12 runs per subject. In each run, the subjects passively viewed greyscale images of eight object categories, grouped in 24s blocks separated by rest periods. Each image was shown for 500ms and was followed by a 1500ms inter-stimulus interval. Full-brain fMRI data were recorded with a volume repetition time of 2.5s, thus, a stimulus block was covered by roughly 9 volumes. This dataset has been repeatedly reanalyzed. For a complete description of the experimental design, fMRI acquisition parameters, and previously obtained results see the [references](http://www.pymvpa.org/datadb/haxby2001.html#references) below. \n\n', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Faces and Objects in Ventral Temporal Cortex (fMRI) (Compute) ', + // tags: ['fmri', 'bold', 'visual-stimuli', '4d', 'functional'], + // type: 'dataset', + // updated: '2022-10-06T20:30:01Z' + // }, + // nft: { + // address: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', + // created: '2022-10-06T20:30:36', + // name: 'Ocean Data NFT', + // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjZiNDMxNGJkNzM0NWQwN2ExMGJhMmM4MmEzNTI2NTUyNzNiMDBjZGNlYjJlZWRkMzFjOGUwZDJiNTg4MWViMTYiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6NmI0MzE0YmQ3MzQ1ZDA3YTEwYmEyYzgyYTM1MjY1NTI3M2IwMGNkY2ViMmVlZGQzMWM4ZTBkMmI1ODgxZWIxNiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDMTIsMjYgMjQsMjcgMzUsMjhDNDUsMjggNTIsMjggNjMsMjhDNzMsMjcgODYsMjYgOTksMjVMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDQ4QzExLDQ3IDIzLDQ2IDM0LDQ3QzQ0LDQ3IDU1LDQ4IDY2LDQ5Qzc2LDQ5IDg3LDQ5IDk5LDQ5TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsODBDOCw3NCAxNyw2OCAyOCw3MEMzOCw3MSA1MSw3OSA2NCw4MEM3Niw4MCA4Nyw3NCA5OSw2OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // }, + // nftAddress: '0xeB7eC160ce8F73bE2e7d542c2283F1aEa163C07B', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // compute: { + // allowNetworkAccess: true, + // allowRawAlgorithm: false, + // publisherTrustedAlgorithmPublishers: [], + // publisherTrustedAlgorithms: [ + // { + // containerSectionChecksum: + // '54eb02210bad8a5fbe229e1d131a68e80fe32709a196c6ce49f33e5d378b1195', + // did: 'did:op:f86dedf3c872f79f788627025685a680eaac9f8bd7b6e622164fd8563e21e836', + // filesChecksum: + // '2f8afee0a35fbeb72a447c7d1437b6c83f937e6d65a6c7d1990548cc21ff254c' + // } + // ] + // }, + // datatokenAddress: '0x0A9CFaFf200efb1d6F125E342Dfc78Fb3edD28A4', + // files: + // '0x0479c75f624d86700c6b33deb392b2d60bd66a5bd92778851eb124bf3785f270b356ce42a228f5a5eb4dead55fc7892a3f4a9f114dfa5493f480146af72ccdcca5816996b0ff002a69e113509256494d64ad39b86be92c7668baa5060c98f402f60fcf7acd0d25e923cecaa5f483fd14a8568a782023b164f8424a95b43c165e813fd031c7b5887ac467af76d94d2ca8b45e34951694cc60ead2c15137eebc60703b9a12a4a4643ecd343de8d0326abb87e093abacf55ba83c06b2840284e8f17d9c498f02dcfd74239371c25ad0fcac703be994065b7ffa12f3a47ba3d363d31f475e6519e7cc5a65e74cafdf029a1d73a007e886206f4b4e36251721866f399076dd2435c314cdfdc42638a570fe57bb33f2935861c01ec708f80acd738d2a45dd64d374278dc63026ac7f4f8dba979e7cdc4e24e5f39aef4550b1cbf190525bdfa0e30900084aef223863e54bd0866ab958', + // id: '383b0e1b8dc3e816af394bfae899eb0c9826f2383602c0fbcd70705e1e9c1302', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 86400, + // type: 'compute' + // } + // ], + // stats: { + // allocated: 0, + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0' + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0x7626dE49a774c18E0f7Fc658821a87E103f80fab', + // name: 'Lovely Prawn Token', + // serviceId: + // 'be48353fe208e765c24b0a344c2cc826ff0ea18582a162d67f6ad23078595d59', + // symbol: 'LOVPRA-51' + // } + // ], + // event: { + // block: 7723861, + // contract: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', + // datetime: '2022-10-06T20:24:24', + // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // tx: '0xdca6494d123c796443c6ce46bb4c02938526a03f86661941eaddcb76377f5825' + // }, + // id: 'did:op:f86dedf3c872f79f788627025685a680eaac9f8bd7b6e622164fd8563e21e836', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // algorithm: { + // container: { + // checksum: + // 'sha256:a981ed6282271fc5492c382cd11d5045641880f738c05a855ed6de8d0eecea8f', + // entrypoint: 'python3.8 $ALGO', + // image: 'anmu06/c2d_neuradao', + // tag: 'latest' + // }, + // language: 'py', + // version: '0.1' + // }, + // author: 'Nilearn ', + // created: '2022-10-06T20:24:15Z', + // description: + // 'Plot cuts of an EPI image (by default 3 cuts: Frontal, Axial, and Lateral)\n\nUsing [nilearn.plotting.plot_epi](https://nilearn.github.io/stable/modules/generated/nilearn.plotting.plot_epi.html) to compute and plot EPI. ', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'fMRI Time-Averaged EPI Visualization ', + // tags: ['epi', 'bold', 'fmri'], + // type: 'algorithm', + // updated: '2022-10-06T20:24:15Z' + // }, + // nft: { + // address: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', + // created: '2022-10-06T20:24:24', + // name: 'Ocean Data NFT', + // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmY4NmRlZGYzYzg3MmY3OWY3ODg2MjcwMjU2ODVhNjgwZWFhYzlmOGJkN2I2ZTYyMjE2NGZkODU2M2UyMWU4MzYiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6Zjg2ZGVkZjNjODcyZjc5Zjc4ODYyNzAyNTY4NWE2ODBlYWFjOWY4YmQ3YjZlNjIyMTY0ZmQ4NTYzZTIxZTgzNiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjVDOCwyNCAxNiwyMyAyNCwyNEMzMSwyNCAzOCwyNyA0NywyOEM1NSwyOCA2NiwyOCA3NSwyOEM4MywyNyA5MSwyNyA5OSwyN0w5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNTRDOCw1MiAxNiw1MSAyNSw1MEMzMyw0OCA0MSw0NyA0OSw0NkM1Niw0NCA2NCw0MSA3Myw0M0M4MSw0NCA5MCw0OSA5OSw1NUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDczQzcsNzIgMTUsNzEgMjUsNzBDMzQsNjggNDQsNjcgNTIsNjlDNTksNzAgNjQsNzQgNzIsNzVDNzksNzUgODksNzIgOTksNzBMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + // }, + // nftAddress: '0xACa9d4Df6a4dfF29913A111099bc4aC6363C124F', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // compute: { + // allowNetworkAccess: true, + // allowRawAlgorithm: false, + // publisherTrustedAlgorithmPublishers: [], + // publisherTrustedAlgorithms: [] + // }, + // datatokenAddress: '0x7626dE49a774c18E0f7Fc658821a87E103f80fab', + // files: + // '0x0498ac38d3ac04dc4f33b5a91358b8e121fa5bc86bcb20b8bc1c27ce1f47db491efda1bf90ab4d4c893a636d570f8fdc29eae7e010f846a34cfc24bc751b64f9d104afcc7f22c82a8cffb412886ba9649b73c2b6fe95e5fab0882bc8174823db08af64c14177bfafad0fc43bb9c9db95df61dabeb0ac1fbb27c07d3705cdf6f8fdd5cb37fc2c50ae0db6bf778b7f9f5475ce1730edacd8e48aa99548184ece9df8fabca2bd7535caf9107b3312f15aaaf6bbc2143782824aac54a04a5136bd1af2121b579b8eaa71abccff4bc4147b592e2b7b7a6d928870861996e67b69277ef60128d7cf86ce5abbf860194ab5ebd8dcbc2a29fbddf5f2482510736de7e9427b4f61306df121a1bd757f0c7d0ae7c702bdff2c85f9b9c7956ced9561693da910ac211e3f35a295981a443695be9e8854554c87fd4747a709a3e43a220e380b4c36f4de92f4b0e2a6301b33c9b22356de1fec345b268e632673e3c70bc5eb', + // id: 'be48353fe208e765c24b0a344c2cc826ff0ea18582a162d67f6ad23078595d59', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'compute' + // } + // ], + // stats: { + // allocated: 0, + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0x1c4f156e06d1b9eeb5aa367869c9d14386918aa12ef4969c3bf242ef6bcba7c8', + // price: '5', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0x7626de49a774c18e0f7fc658821a87e103f80fab', + // name: 'Lovely Prawn Token', + // symbol: 'LOVPRA-51' + // }, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0x40C929B5265F13E668A3e81c4289A279bd2f7452', + // name: 'Fecund Anchovy Token', + // serviceId: + // '440cdd2f76cd72803ca478fd432d087d6213711ac35163591afe22bbc77a0154', + // symbol: 'FECANC-54' + // } + // ], + // event: { + // block: 7723800, + // contract: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', + // datetime: '2022-10-06T20:10:12', + // from: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // tx: '0x5ea85c7bc0998a42896a7011d0595f01159647399e1fd008353ac9bb95339a25' + // }, + // id: 'did:op:2f9cf3eba8ff21db32350aa6d48db89ca86beab7adf729a40a5debdcef8cd7cb', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: + // 'Haxby, J. V., Gobbini, M. I., Furey, M. L., Ishai, A., Schouten, J. L. & Pietrini, P.', + // created: '2022-10-06T20:09:49Z', + // description: + // 'This is a block-design fMRI dataset from a study on face and object representation in human ventral temporal cortex. It consists of 6 subjects with 12 runs per subject. In each run, the subjects passively viewed greyscale images of eight object categories, grouped in 24s blocks separated by rest periods. Each image was shown for 500ms and was followed by a 1500ms inter-stimulus interval. Full-brain fMRI data were recorded with a volume repetition time of 2.5s, thus, a stimulus block was covered by roughly 9 volumes. This dataset has been repeatedly reanalyzed. For a complete description of the experimental design, fMRI acquisition parameters, and previously obtained results see the [references](http://www.pymvpa.org/datadb/haxby2001.html#references) below.\n\n', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Faces and Objects in Ventral Temporal Cortex (fMRI)', + // tags: ['fmri', 'bold', '4d', 'functional', 'visual-stimuli'], + // type: 'dataset', + // updated: '2022-10-06T20:09:49Z' + // }, + // nft: { + // address: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', + // created: '2022-10-06T20:10:12', + // name: 'Ocean Data NFT', + // owner: '0x7E0ad0B2CD0560Caf9a4Fc25904d2AB7238d140b', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBOZXVyYURBTyBNYXJrZXRwbGFjZTogaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjJmOWNmM2ViYThmZjIxZGIzMjM1MGFhNmQ0OGRiODljYTg2YmVhYjdhZGY3MjlhNDBhNWRlYmRjZWY4Y2Q3Y2IiLCJleHRlcm5hbF91cmwiOiJodHRwczovL21hcmtldC5vY2VhbnByb3RvY29sLmNvbS9hc3NldC9kaWQ6b3A6MmY5Y2YzZWJhOGZmMjFkYjMyMzUwYWE2ZDQ4ZGI4OWNhODZiZWFiN2FkZjcyOWE0MGE1ZGViZGNlZjhjZDdjYiIsImJhY2tncm91bmRfY29sb3IiOiIxNDE0MTQiLCJpbWFnZV9kYXRhIjoiZGF0YTppbWFnZS9zdmcreG1sLCUzQ3N2ZyB2aWV3Qm94PScwIDAgOTkgOTknIGZpbGw9J3VuZGVmaW5lZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyNzcnIGQ9J00wLDk5TDAsMjRDOSwyNSAxOCwyNyAyOSwyOEMzOSwyOCA1MSwyOCA2MywyOEM3NCwyNyA4NiwyNyA5OSwyOEw5OSw5OVonLyUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyYmInIGQ9J00wLDk5TDAsNDlDMTIsNDcgMjUsNDUgMzUsNDVDNDQsNDQgNTEsNDQgNjIsNDVDNzIsNDUgODUsNDcgOTksNTBMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw3NEMxMSw3NCAyMyw3NSAzNCw3NkM0NCw3NiA1Myw3OCA2NCw3OEM3NCw3NyA4Niw3NSA5OSw3NEw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // }, + // nftAddress: '0x9C725CADD67f67B5F755a30879945c3ECF6aAA46', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x40C929B5265F13E668A3e81c4289A279bd2f7452', + // files: + // '0x04766f8cb6306eed4cd0fb6938c68a946a2f299525890afac89fab0e3e697748961e5072136e0ae57f20a7b6a6bc8ef12760b2c774e7feea28dcc099c7d52b77201a1f57b0e0d345ec0b51b5beb13af6c2a2a72ab5fb610de8a194f6fa0ef7f0fd84b0b868ed63ff820813c72c6d228fc093e299490a2f8a95cbd43f69e0bcdba524457191f812977ce6239db432641c13442caac3594d962fd3410bd829aea7cc82483473f42417922b12c9f8871a60be7d33ebc5bed37d2416defb59dbd3b63330ab33acea402f1d09145f05504d031cdc53c0120ce5704bad4721af2f71175ac19c7d3d0cde0830d9f59c90a0e8b94e162b025f86171e6145486afeb06b5409ff1e867f32c9191bf7063180f9d883e9fa7d64acb30bd3c5f6cb43c8249ed740859955a6f9036130b2c0832d433f58bfde1267c883c98065168080bba055a4f1d4e394b80f606f81792ef1b8815fdc1184f6', + // id: '440cdd2f76cd72803ca478fd432d087d6213711ac35163591afe22bbc77a0154', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // allocated: 0, + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xe6665bd4541c6584a3e31dbf73a74e91da6c791954ea3d61905e50b6e00e0b4e', + // price: '5', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0x40c929b5265f13e668a3e81c4289a279bd2f7452', + // name: 'Fecund Anchovy Token', + // symbol: 'FECANC-54' + // }, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 137, + // datatokens: [ + // { + // address: '0x0A81F1c69e5428067e6124817C7AFFE8bC0adF9f', + // name: 'Fabulous Walrus Token', + // serviceId: + // '485bd67a4bdb69353b4500bb194c6a20c6be57337956cf2f699f3530847ef038', + // symbol: 'FABWAL-60' + // } + // ], + // event: { + // block: 34000873, + // contract: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', + // datetime: '2022-10-06T11:16:48', + // from: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', + // tx: '0x8713e0f444dee5a79799d3037047a3463199164232250b056f8723b2402ea320' + // }, + // id: 'did:op:1ea697b447f0a0b3209048f144c0331ca1a8c10af27e233512a41623b93ff8ed', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'OPF', + // created: '2022-10-06T11:16:17Z', + // description: + // 'Test asset wrt issue https://github.com/oceanprotocol/ocean.py/issues/990\n\nUrl is https://cexa.oceanprotocol.io/ohlc?exchange=binance&pair=ETH/USDT', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'CEXA test ocean.py#990 (4)', + // tags: ['defi'], + // type: 'dataset', + // updated: '2022-10-06T11:16:17Z' + // }, + // nft: { + // address: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', + // created: '2022-10-06T11:16:48', + // name: 'Ocean Data NFT', + // owner: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDoxZWE2OTdiNDQ3ZjBhMGIzMjA5MDQ4ZjE0NGMwMzMxY2ExYThjMTBhZjI3ZTIzMzUxMmE0MTYyM2I5M2ZmOGVkIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjFlYTY5N2I0NDdmMGEwYjMyMDkwNDhmMTQ0YzAzMzFjYTFhOGMxMGFmMjdlMjMzNTEyYTQxNjIzYjkzZmY4ZWQiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI4QzEwLDI0IDIwLDIxIDI3LDIxQzMzLDIwIDM3LDIyIDQ2LDI0QzU0LDI1IDY2LDI3IDc2LDI4Qzg1LDI4IDkyLDI3IDk5LDI2TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1NkM4LDU1IDE3LDU0IDI1LDUxQzMyLDQ3IDQwLDQwIDQ5LDQyQzU3LDQzIDY4LDUyIDc3LDU0Qzg1LDU1IDkyLDUwIDk5LDQ2TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNzdDNiw3OCAxMyw4MCAyMSw4MEMyOCw3OSAzNyw3NiA0Niw3NUM1NCw3MyA2NCw3MSA3Myw3MkM4MSw3MiA5MCw3NCA5OSw3Nkw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // }, + // nftAddress: '0x5f7D840050e008F91f9Fd3dba5fE0f91BbE4b14F', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x0A81F1c69e5428067e6124817C7AFFE8bC0adF9f', + // files: + // '0x04c5f0ebee297a2121d3f37e46d93ac2c0fc5d642e4c4c4eae152754047ae4b10e0445b4e908166a47c3e98b636cbf9791d0ee1caf37d6f6fa7da539abc52df7e2d55b2b33b0378a38dbaf3e489b830d57e8db8dbc6deff94476eda055f0a5152869e8cee2eae42692070f98aa9b99025a1a4887e84f34176a27b65e6cec455ba60e6628e496c91bd1b222612ed1f530a3976f0fe5ae55afad194fa947fef19b97522ca45c6268afff22d610d1fd6f11d10f02fb42d66d566fca66544537feb717d6c8d6281408c9d4e29905bdac106e7f94750631082fcae42929b3a389d298fac48513397a8e3c235a81acd9675e92dd776f37a762d7a1b706abf26a46e571e9513c4ee9119a8f60d51995fcdcc76a9e048d16bae1e4cfe50824f9b71104e5485b1ef784e95195d3bbed2b604fc24c8f8f4e780e1837aac1cc0194b2db1b91a56671b998f32ffba6d43482cc6cc6e33c1296865d1f4fbe', + // id: '485bd67a4bdb69353b4500bb194c6a20c6be57337956cf2f699f3530847ef038', + // serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + // timeout: 604800, + // type: 'access' + // } + // ], + // stats: { + // allocated: 114.1658859253, + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'free', + // addressOrId: '0x0a81f1c69e5428067e6124817c7affe8bc0adf9f', + // price: '0', + // isPurchasable: true, + // datatoken: { + // address: '0x0a81f1c69e5428067e6124817c7affe8bc0adf9f', + // name: 'Fabulous Walrus Token', + // symbol: 'FABWAL-60' + // }, + // baseToken: null, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0xbadac447bF4868aeCa6A9c7448DDAdfe6632509a', + // name: 'Tactful Shark Token', + // serviceId: + // 'c02b30d8930ac5d2561d4c391c74c06a39d6060802be2534218bd3449d9387ce', + // symbol: 'TACSHA-14' + // } + // ], + // event: { + // block: 7717509, + // contract: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', + // datetime: '2022-10-05T18:25:48', + // from: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', + // tx: '0xe3e87b83e0f687dceb8db1eb4d3b8053522a6b722e376e472e71e337ad64c0a2' + // }, + // id: 'did:op:d1563919dd61c8ea5790b85f3a569fa69e46c84a600290ca377a1cb009bb7694', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'aaa', + // created: '2022-10-05T18:25:38Z', + // description: 'Template template moneeey', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Template template moneeey', + // tags: [], + // type: 'dataset', + // updated: '2022-10-05T18:25:38Z' + // }, + // nft: { + // address: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', + // created: '2022-10-05T18:25:48', + // name: 'Ocean Data NFT', + // owner: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDpkMTU2MzkxOWRkNjFjOGVhNTc5MGI4NWYzYTU2OWZhNjllNDZjODRhNjAwMjkwY2EzNzdhMWNiMDA5YmI3Njk0IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmQxNTYzOTE5ZGQ2MWM4ZWE1NzkwYjg1ZjNhNTY5ZmE2OWU0NmM4NGE2MDAyOTBjYTM3N2ExY2IwMDliYjc2OTQiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI5QzUsMjkgMTEsMjkgMjAsMzBDMjgsMzAgMzgsMzEgNDgsMjlDNTcsMjYgNjUsMjEgNzQsMjBDODIsMTggOTAsMTkgOTksMjBMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU3QzksNTcgMTgsNTggMjYsNTVDMzMsNTEgMzksNDIgNDcsNDJDNTQsNDEgNjQsNTAgNzQsNTNDODMsNTUgOTEsNTEgOTksNDdMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw3NEMxMCw3MiAyMCw3MCAyOCw2OUMzNSw2NyAzOCw2NiA0Niw3MEM1Myw3MyA2NCw3OSA3NCw4MEM4Myw4MCA5MSw3MyA5OSw2N0w5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // }, + // nftAddress: '0x4eF0395f0319E6d919942ea3a98472cf957967Da', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0xbadac447bF4868aeCa6A9c7448DDAdfe6632509a', + // files: + // '0x048db0b48ee8f19f3e163cef39095799876e84ad5a2dd3e5140b2ed0f33f13351d078b07b5e1d38f2427ff0a2a21a24dc0f02756bb51603b384adc83b936621a8861fd5e56d9d51122f391cf1f823ae417a56dc8a0f3f26e85eafad124500175be7c732aec90cc5cc88c83378e3a503334f0e0589ca0f48328bda961dcf26dae6ea209143918f201a81be982bbcfd0294f7d97a4d54e7982b995c4329c5d3c29e084c4d4aaeeeccc9b70f353de7fdc38a70dbcbd0425d9c696e8fefa9ea7a3d4aa4f28c8dcba7536e7afc5aa8d64c5b9b949657aed2249440a80f46b2b84317530a35888ccbc259de8a4c77f91c25d0c507b67e7998143b0e9b0068b72f93a2195a1c5b9260684fa554bdd15721a34cad1308c45483ab935ba9ac1f391b89f10158fb39b712af5f37d135591c21a', + // id: 'c02b30d8930ac5d2561d4c391c74c06a39d6060802be2534218bd3449d9387ce', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 1, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xdbfa14546d4f2caa1e0d59cbf8ae775c65b0d34369f8c62990c0b0d0bc73ff10', + // price: '2', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0xbadac447bf4868aeca6a9c7448ddadfe6632509a', + // name: 'Tactful Shark Token', + // symbol: 'TACSHA-14' + // }, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0x772224c2C2bddb88A55b3905aAaf8C7188b02ce3', + // name: 'Rebarbative Barnacle Token', + // serviceId: + // '42e244808872c9f4ad96db99d9877abbf3cae9988dec9bd52ab2e336d7ac83af', + // symbol: 'REBBAR-99' + // } + // ], + // event: { + // block: 7717490, + // contract: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', + // datetime: '2022-10-05T18:21:24', + // from: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', + // tx: '0xa38677962c1c83faad8365fbd924b3ca35fb2c0f07af504d7438eec6e54c9918' + // }, + // id: 'did:op:aeb9faad199e79eb21cddc15557fa42fe95a02e03c493be8e849594aae60221a', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'aaaa', + // created: '2022-10-05T18:21:13Z', + // description: 'Template template ', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Template template ', + // tags: ['aaa'], + // type: 'dataset', + // updated: '2022-10-05T18:21:13Z' + // }, + // nft: { + // address: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', + // created: '2022-10-05T18:21:24', + // name: 'Ocean Data NFT', + // owner: '0x26D9690eD920682FbC4f3A05e480B8c6ff978ca8', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDphZWI5ZmFhZDE5OWU3OWViMjFjZGRjMTU1NTdmYTQyZmU5NWEwMmUwM2M0OTNiZThlODQ5NTk0YWFlNjAyMjFhIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOmFlYjlmYWFkMTk5ZTc5ZWIyMWNkZGMxNTU1N2ZhNDJmZTk1YTAyZTAzYzQ5M2JlOGU4NDk1OTRhYWU2MDIyMWEiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDE4QzEwLDE3IDIwLDE2IDI4LDE5QzM1LDIxIDM5LDI4IDQ4LDI5QzU2LDI5IDY3LDI0IDc3LDIyQzg2LDE5IDkyLDE4IDk5LDE4TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0OEM2LDUwIDEzLDUyIDIzLDU1QzMyLDU3IDQ0LDU4IDUzLDU2QzYxLDUzIDY3LDQ1IDc1LDQzQzgyLDQwIDkwLDQxIDk5LDQzTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNzVDOSw3NCAxOSw3MyAyOCw3NEMzNiw3NCA0NCw3NSA1Miw3NUM1OSw3NCA2Nyw3MyA3NSw3M0M4Miw3MiA5MCw3MSA5OSw3MUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0Mvc3ZnJTNFIn0=' + // }, + // nftAddress: '0xf919A3b0D1538CAA24Efe2BeaAbe43F776aE83ED', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x772224c2C2bddb88A55b3905aAaf8C7188b02ce3', + // files: + // '0x0435d6273c00013a79d50a8b4fd8e65b7ccbde5fcb99726d52fb222282f5e80a18873a27908c5ed07fc808175784b162792c4946a735fbbe338c5ce7579ae46451f88c5eda573ae7c7764337d8d165a0fe715aab96f416c606b84f3b2dba9dbd8d7c00ce8ffe67d644ce88a4c9d842a149a93f3e6135b94b448db76960f5375dc661fb9a75b424d28b43553b58af31b02eab5b1e928f71c699eb9a4114284fe0b9eeeaccb3d02848c16a544160e68b18db5cc214f9d56b6c5aa775853248e5a0164045da6b30ccc7a13a45396bf2cf6bc10d31feb3bb9b2c40b3a6c8c97cde85de13b56d2f2d09aee13180b63423b7d30d4c6fd03d8d5ab15395463038c12b2da1ca86f9317011dc215750dd5c16f4360b658aa39f5e2e93b0ff1de9e7a88c5afb23daa5122160c463b973fb9bf8', + // id: '42e244808872c9f4ad96db99d9877abbf3cae9988dec9bd52ab2e336d7ac83af', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'free', + // addressOrId: '0x772224c2c2bddb88a55b3905aaaf8c7188b02ce3', + // price: '0', + // isPurchasable: true, + // datatoken: { + // address: '0x772224c2c2bddb88a55b3905aaaf8c7188b02ce3', + // name: 'Rebarbative Barnacle Token', + // symbol: 'REBBAR-99' + // }, + // baseToken: null, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 137, + // datatokens: [ + // { + // address: '0x89A0170556BB80438081D69F43d8C07a90e9Aa24', + // name: 'Invidious Octopus Token', + // serviceId: + // '8573fbf5e2e5a90631e26bef416f140f815570b5124b8ad52812443d110a57c2', + // symbol: 'INVOCT-85' + // } + // ], + // event: { + // block: 33956932, + // contract: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', + // datetime: '2022-10-05T09:49:12', + // from: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', + // tx: '0xe656b9d934ba1f8c98eb9372fd03709c880486fff0b50476450ef458694b1529' + // }, + // id: 'did:op:191af71e271d4eb6f9ac582b2a6a78e8d79167da7a13a30878c7b699842aa421', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'OPF', + // created: '2022-10-05T09:42:06Z', + // description: + // 'Test asset wrt issue https://github.com/oceanprotocol/ocean.py/issues/990\n\nUrl is https://cexa.oceanprotocol.io/ohlc?exchange=binance&pair=ETH/USDT', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'CEXA test ocean.py#990 (3)', + // tags: ['defi'], + // type: 'dataset', + // updated: '2022-10-05T09:42:06Z' + // }, + // nft: { + // address: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', + // created: '2022-10-05T09:49:12', + // name: 'Ocean Data NFT', + // owner: '0xF5dcd98a1C99c2c65C62025Cb23cFB6f12F35497', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDoxOTFhZjcxZTI3MWQ0ZWI2ZjlhYzU4MmIyYTZhNzhlOGQ3OTE2N2RhN2ExM2EzMDg3OGM3YjY5OTg0MmFhNDIxIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjE5MWFmNzFlMjcxZDRlYjZmOWFjNTgyYjJhNmE3OGU4ZDc5MTY3ZGE3YTEzYTMwODc4YzdiNjk5ODQyYWE0MjEiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDI4QzEwLDI1IDIxLDIyIDMzLDIzQzQ0LDIzIDU3LDI4IDY5LDI5QzgwLDI5IDg5LDI0IDk5LDIwTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NEMxMiw0OCAyNSw1MiAzNyw1NEM0OCw1NSA1OCw1MiA2OSw1MUM3OSw0OSA4OSw0OCA5OSw0OEw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDc3QzksNzQgMTgsNzEgMjksNzBDMzksNjggNTIsNjcgNjQsNjlDNzUsNzAgODcsNzMgOTksNzdMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + // }, + // nftAddress: '0x0fb9814D744ed407878D6D7508649b8D43F6b30a', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x89A0170556BB80438081D69F43d8C07a90e9Aa24', + // files: + // '0x040948a7677383b0c920458a6e1eca981061a9e4bf2b34a187d6fea73a21c568f9be5cb92233fc81e986e20b32c20d38a149ab45340b4a8ef9db0c8c000c7b2838b7a7496b5a4e670d97e3b6ed19af64635ba4ad737b2a90f377e5856ade60c0dad8375033d4a134cbff122234bb60e6e3e282e5dbdd6d3b0f9d5a7910e6a77d62c617f08120ac5b5ec88aec6609f22e0e24fe558e87865dc42278d09d5f4a2a30ac869f48221c481feee2dc0d39dc001c09e898964ccee99d16a24b4f41c3391dedc2f71140165541639c3d19385967347352be9c97fa8e7d9db842ab77eca21abf94edc422f83bd8017706d51791f2e282b5a0ec3a23521d898110aa66fa12a0ec6fa4258ca2cf4d7a6d1450b86eda81a936788fcd92f9754efa3fba4e69729e90d88bff58f12e5a1c76a24c57200a35f7bf71b9f525580e1f6ff7139c6c8f04fd4c59650dbfebaf5f5f1dccf4c3bc5d3a65b33c1d9107', + // id: '8573fbf5e2e5a90631e26bef416f140f815570b5124b8ad52812443d110a57c2', + // serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + // timeout: 604800, + // type: 'access' + // } + // ], + // stats: { + // allocated: 11159.279296875, + // orders: 1, + // price: { + // value: 0 + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'free', + // addressOrId: '0x89a0170556bb80438081d69f43d8c07a90e9aa24', + // price: '0', + // isPurchasable: true, + // datatoken: { + // address: '0x89a0170556bb80438081d69f43d8c07a90e9aa24', + // name: 'Invidious Octopus Token', + // symbol: 'INVOCT-85' + // }, + // baseToken: null, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0xAd42c7AfEe47140B5CD87F05d5846c418145f43A', + // name: 'Zealous Clam Token', + // serviceId: + // '081b597131102e14ea5f16d6ba49f46889fb700f88f9430d03ec64441280a894', + // symbol: 'ZEACLA-28' + // } + // ], + // event: { + // block: 7714916, + // contract: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', + // datetime: '2022-10-05T07:41:24', + // from: '0x3e81AA994f774eE914D57946DDF2486EA7d42D65', + // tx: '0x20e01c84928b5432216cb7046dc81b50e2902e3e65d1a9b0c93fb7b772e2d979' + // }, + // id: 'did:op:50c60ce0810bf8f8b1c6ca421e5231b106cf4de784945037498c84147e11dbc5', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'aaa', + // created: '2022-10-05T07:40:44Z', + // description: 'asda asda dsadadada', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Free testing', + // tags: ['aaa'], + // type: 'dataset', + // updated: '2022-10-05T07:40:44Z' + // }, + // nft: { + // address: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', + // created: '2022-10-05T07:41:24', + // name: 'Ocean Data NFT', + // owner: '0x3e81AA994f774eE914D57946DDF2486EA7d42D65', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo1MGM2MGNlMDgxMGJmOGY4YjFjNmNhNDIxZTUyMzFiMTA2Y2Y0ZGU3ODQ5NDUwMzc0OThjODQxNDdlMTFkYmM1IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjUwYzYwY2UwODEwYmY4ZjhiMWM2Y2E0MjFlNTIzMWIxMDZjZjRkZTc4NDk0NTAzNzQ5OGM4NDE0N2UxMWRiYzUiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIwQzEzLDI0IDI3LDI4IDM3LDI3QzQ2LDI1IDUzLDE5IDYzLDE4QzcyLDE2IDg1LDIwIDk5LDI1TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1NkM4LDU0IDE3LDUzIDI5LDUzQzQwLDUyIDU0LDUxIDY3LDUyQzc5LDUyIDg5LDUzIDk5LDU1TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNjlDMTEsNzMgMjIsNzcgMzQsNzdDNDUsNzYgNTgsNzEgNjksNjlDNzksNjYgODksNjcgOTksNjhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + // }, + // nftAddress: '0xeE1c6bE384D3ee734E906443E9d893b03852bFC6', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0xAd42c7AfEe47140B5CD87F05d5846c418145f43A', + // files: + // '0x0431fb7120723def69d30ee6aede9846cf0578ae44e22459f7273e4b37f204832f4b87f0ea6cea7bbea820a35d0b18e6c599d3898368ddf03df6a5cd8003a0100274e8405f640815d18e63ce680c3a6fae28b71fc2e072d02c39618a85fa12528f0b740d9ea0f2b4d0795444794f1b614ef1a796deb2399ccaa5b709707a08d5a6b576eac811bfc35f9e02e8d778538dd989fe7d237e46bfffcd680cd9f70d30f5acbbcff33845a95aa1c310864ca95fb076a40174a307d3b71c3259bde027381460f02ff6bcdcfaee9edf6e74dc0adc465b4bcdaac74e6ca7f4181cec45cc5f2c925295b226e586935d7edd644ebe913c491ebfe6144bf605b330e42b7f35a88b55a1f7dc0b19851c0b032494e910b929831e9e5135d79134c2f3cd565a071327d7ba8b83357832603cec9aedc9', + // id: '081b597131102e14ea5f16d6ba49f46889fb700f88f9430d03ec64441280a894', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // orders: 0, + // price: { + // value: 0 + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'free', + // addressOrId: '0xad42c7afee47140b5cd87f05d5846c418145f43a', + // price: '0', + // isPurchasable: true, + // datatoken: { + // address: '0xad42c7afee47140b5cd87f05d5846c418145f43a', + // name: 'Zealous Clam Token', + // symbol: 'ZEACLA-28' + // }, + // baseToken: null, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 137, + // credentials: { + // allow: [], + // deny: [] + // }, + // datatokens: [ + // { + // address: '0xf31b9c3EEE46249c29339319Bfd41167DE5980f1', + // name: 'ETH predictions: DT1', + // serviceId: '0', + // symbol: 'DT1' + // } + // ], + // event: { + // block: 33937819, + // contract: '0xaD244AC409cEfA155059890b425b83F6A4146d69', + // datetime: '2022-10-04T22:43:00', + // from: '0x7BA3d8551A6f2C70a5d47bb448BcF7EF69661822', + // tx: '0xdef98b7863ca74caf4af17315942744bf8c1f909da9e4db1287c6acf2beba1d9' + // }, + // id: 'did:op:f4b49d04ee8c6973e4f844754805dbfe9e682812121131abbfc1bdf6d6b6eef1', + // metadata: { + // author: '0x7BA3d', + // created: '2022-10-04T17:42:13.745633', + // description: 'ETH predictions', + // license: 'CC0: PublicDomain', + // name: 'ETH predictions', + // type: 'dataset', + // updated: '2022-10-04T17:42:13.745633' + // }, + // nft: { + // address: '0xaD244AC409cEfA155059890b425b83F6A4146d69', + // created: '2022-10-04T22:43:00', + // name: 'ETH predictions', + // owner: '0x7BA3d8551A6f2C70a5d47bb448BcF7EF69661822', + // state: 0, + // symbol: 'ETH predictions', + // tokenURI: 'https://oceanprotocol.com/nft/' + // }, + // nftAddress: '0xaD244AC409cEfA155059890b425b83F6A4146d69', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0xf31b9c3EEE46249c29339319Bfd41167DE5980f1', + // description: 'Download service', + // files: + // '0x044c33205fb032624a234ddce8c8e84b8311ded47f43edbea93825f670145ba127237837013705e7e173f7673f7a7f87be292687e373f13cad812f273f86e293f8c78367b496664c9ea82c5095871b0404def05e719b567bea0f523daf5054c3e2894140b5e9072e075c9df9b8039c5d434bd0569daff8d27c2b9544823890e5072d36f5f417cfe4c8f9c0b3fd48ed546b16fea54fbfff12c8da77549f49dbae52a4894e9ebe08c29903cf458815d43da1fc1ca89322c0cbc7f69e20d4489cb69d9272de03a6f7e89793d0ceda6a7eb41dfbf1d942a47773b32c2df2c4d81ca2ee79043819230621a351bcf0f67f377c7885c3578e4a4f75f9e30f779ffb0b0af81c02a8b8359831bfe4ed7cc1a267a133e09a5264dec1695801b3b3b15a26cf9a24dcb50620abed35fafe45eae01a1681f0aa85ba4648b6574e760eeb414ee18a1de319b0d06fbab40e8ed193fc', + // id: '0', + // name: 'Download service', + // serviceEndpoint: 'https://v4.provider.polygon.oceanprotocol.com', + // timeout: 3600, + // type: 'access' + // } + // ], + // stats: { + // allocated: 0, + // orders: 0, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // type: 'NOT_SUPPORTED' + // } as any + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0xf5dbd5a675248f92E3F37da98090144C1355ABb5', + // name: 'Feckless Orca Token', + // serviceId: + // '9dec1b8dbf546767988ca98374631b7325a5c0ddb5b75e21e6da0f527cc45285', + // symbol: 'FECORC-10' + // } + // ], + // event: { + // block: 7710252, + // contract: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', + // datetime: '2022-10-04T12:45:00', + // from: '0x9c4e3CaE2B87180BEa0238b25bacf38473c39e11', + // tx: '0x01d95a564f99e8c1e7cc585ed00435b405723751ad96e57e86851763f7222ce4' + // }, + // id: 'did:op:82698600c9f003bdfa97bf054b5bb9b0f83c18b4ea748ce1eddbab8110ff9ea9', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'Jamie', + // created: '2022-10-04T12:44:40Z', + // description: + // 'Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data Test Data ', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Test Data', + // tags: ['test'], + // type: 'dataset', + // updated: '2022-10-04T12:44:40Z' + // }, + // nft: { + // address: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', + // created: '2022-10-04T12:45:00', + // name: 'Ocean Data NFT', + // owner: '0x9c4e3CaE2B87180BEa0238b25bacf38473c39e11', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo4MjY5ODYwMGM5ZjAwM2JkZmE5N2JmMDU0YjViYjliMGY4M2MxOGI0ZWE3NDhjZTFlZGRiYWI4MTEwZmY5ZWE5IiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjgyNjk4NjAwYzlmMDAzYmRmYTk3YmYwNTRiNWJiOWIwZjgzYzE4YjRlYTc0OGNlMWVkZGJhYjgxMTBmZjllYTkiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDE3QzYsMTYgMTMsMTYgMjIsMTdDMzAsMTcgNDAsMTkgNTAsMjBDNTksMjAgNjcsMjEgNzUsMjFDODIsMjAgOTAsMTkgOTksMTlMOTksOTlaJy8lM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmJiJyBkPSdNMCw5OUwwLDU0QzYsNTAgMTMsNDcgMjIsNDdDMzAsNDYgMzksNDkgNDksNTJDNTgsNTQgNjgsNTggNzcsNTdDODUsNTUgOTIsNDkgOTksNDNMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJmZicgZD0nTTAsOTlMMCw4MkM3LDgwIDE1LDc5IDI0LDc2QzMyLDcyIDQwLDY2IDQ5LDY4QzU3LDY5IDY0LDc4IDczLDgxQzgxLDgzIDkwLDgwIDk5LDc4TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' + // }, + // nftAddress: '0x4CA9EfCD6bbFC935FbBaaDAF65aA6f8Fc3504fe1', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0xf5dbd5a675248f92E3F37da98090144C1355ABb5', + // files: + // '0x044434dfd2c80154b1a0641420a12d694ea9c762f9a7ca79ca467b5e1995ed2ee5cfe3460a368840ba290dfdec634c72e4204f12cb17a3f4f7108a253d11ed3a5294187b2bc7c8f24e39568a912914732bd2dd2707b0f416f1e729b2eb71f5656e10b33dba2ecd012dfbe01fa2c9dfb850a2386fc4962e5ccdc660b959fd00adef1c70c0f2b4a26df063a52197791bf9eed9136f1ad7b8a6073e196b2cbfb8b4d2a1dd023c15481b956c9419b47df921d72e3706820d4f5f26374fd0ee1bd6cfd9aead3e7168759419f404fac6f9779233c328a26ea41cb5c064cfb342d01fc7bc10a5766407dfc5a5dc3e0cbfc95f8b4cbe8f00895b02d4b42ccb2bbc465ef1e7026c0d922ef7877b1d6065e03922d9549f9aad490f07a03aa713d3028d489a11bcd3be12e2bf6a8d3d6c1a1108401786b5598c6c1411d9f562c137fd991fb2ebd6d1bbb7f46d5392387d0764bb', + // id: '9dec1b8dbf546767988ca98374631b7325a5c0ddb5b75e21e6da0f527cc45285', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // orders: 1, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xadd592e83c3830058bb3649e499b9066c681616ffe6ea12e28dc6adcc63dac16', + // price: '1', + // isPurchasable: true, + // baseToken: { + // address: '0xcfdda22c9837ae76e0faa845354f33c62e03653a', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0xf5dbd5a675248f92e3f37da98090144c1355abb5', + // name: 'Feckless Orca Token', + // symbol: 'FECORC-10' + // }, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 5, + // datatokens: [ + // { + // address: '0x23C1FD10DADCaF558fB7173b79CfD0D867568a3D', + // name: 'Equanimous Barracuda Token', + // serviceId: + // '89d66d7e77abccb2899b224662a733b42edefeb769138d6562928c38f75b4caa', + // symbol: 'EQUBAR-39' + // } + // ], + // event: { + // block: 7716390, + // contract: '0x3A695322d631451474090F322eA3d8d2eC8c1562', + // datetime: '2022-10-05T13:51:24', + // from: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', + // tx: '0xcea2e02cb67c0c545976baf419a1cacbcad6fd2c4308eca93c49a3135a90e40c' + // }, + // id: 'did:op:9c1235050bcd51c8ec9a7058110102c9595136834911c315b4f739bc9a880b8e', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'Jelly', + // created: '2022-10-04T11:38:49Z', + // description: 'Testitestvwgre btewwgte', + // license: 'https://market.oceanprotocol.com/terms', + // name: 'Testitest', + // tags: [], + // type: 'dataset', + // updated: '2022-10-04T11:38:49Z' + // }, + // nft: { + // address: '0x3A695322d631451474090F322eA3d8d2eC8c1562', + // created: '2022-10-04T11:39:12', + // name: 'Ocean Data NFT', + // owner: '0x903322C7E45A60d7c8C3EA236c5beA9Af86310c7', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo5YzEyMzUwNTBiY2Q1MWM4ZWM5YTcwNTgxMTAxMDJjOTU5NTEzNjgzNDkxMWMzMTViNGY3MzliYzlhODgwYjhlIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjljMTIzNTA1MGJjZDUxYzhlYzlhNzA1ODExMDEwMmM5NTk1MTM2ODM0OTExYzMxNWI0ZjczOWJjOWE4ODBiOGUiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIxQzExLDIwIDIyLDIwIDMzLDIxQzQzLDIxIDU0LDIyIDY1LDIzQzc1LDIzIDg3LDIyIDk5LDIyTDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw1M0MxMiw0OCAyNSw0NCAzNiw0NUM0Niw0NSA1NCw1MSA2NSw1M0M3NSw1NCA4Nyw1MSA5OSw0OUw5OSw5OVonJTNFJTNDL3BhdGglM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5MmZmJyBkPSdNMCw5OUwwLDY4QzEyLDczIDI1LDc4IDM2LDgwQzQ2LDgxIDU0LDc4IDY1LDc3Qzc1LDc1IDg3LDc1IDk5LDc2TDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQy9zdmclM0UifQ==' + // }, + // nftAddress: '0x3A695322d631451474090F322eA3d8d2eC8c1562', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x23C1FD10DADCaF558fB7173b79CfD0D867568a3D', + // files: + // '0x042f150d201313fa28d6d4ecd45b65eab2a3f88eaae50570d9e6a903b071c74eca5c129d38b7c5adf871e70fc586daba5d8788c405208238a9974519f086a28c9366e049b07eae6ab20f2752ed382a6123a49d74c7f2134f14632393851ead2be2df2634f9b4db2126085cdc57d2e2d144c219bc7a546b2030d128e23c0056da8c26f6d7bffb389c31d76916dd5c6f94f5c7d9a532dd6d3c210bed0f7486e41411911f446a020628136efc3acfa39573dc54ab0b29fbd8985f64a88cc20d2f9a2e0688ff1b8458f8f1a46be4633045b5e9313b612e96dae44f4c9258c2420c13a2bac8082461141b036065c0187b119586c1ea7225e1599e520a34da5e4510d8bec879d982ebf951566ece9ef58c1eb43ac07570a6a8e542b29460bf52914a9f8f3dfd7e423d87dd618e2b04db54e5f7dcf91976cee59ddd63bb09a09ecc98ba44005a', + // id: '89d66d7e77abccb2899b224662a733b42edefeb769138d6562928c38f75b4caa', + // serviceEndpoint: 'https://v4.provider.goerli.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // orders: 0, + // price: { + // value: 0 + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'free', + // addressOrId: '0x23c1fd10dadcaf558fb7173b79cfd0d867568a3d', + // price: '0', + // isPurchasable: true, + // datatoken: { + // address: '0x23c1fd10dadcaf558fb7173b79cfd0d867568a3d', + // name: 'Equanimous Barracuda Token', + // symbol: 'EQUBAR-39' + // }, + // baseToken: null, + // isOwned: false, + // validOrderTx: null + // } + // }, + // { + // '@context': ['https://w3id.org/did/v1'], + // chainId: 1, + // datatokens: [ + // { + // address: '0x98d87B273Ed411A5940a0C4a3717d58C81917Eb5', + // name: 'Egregious Anchovy Token', + // serviceId: + // '60be64b7b7b10944c2b3eac740f476d85b2625a5db32bd0a3db1959f9a8100bb', + // symbol: 'EGRANC-29' + // } + // ], + // event: { + // block: 15671852, + // contract: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', + // datetime: '2022-10-04T02:38:59', + // from: '0x8542472a8De568cD3B09A53368C1962d8DfDBE2f', + // txid: '0x9f717d0386598349b0e19c45f7dcf2ead5b219b25e1fc08902ebe651c48398fb' + // }, + // id: 'did:op:9442a55c25e9a0fd30231089ec34e430d0325ce0d3e03ab1aa27579eb56f7570', + // metadata: { + // additionalInformation: { + // termsAndConditions: true + // }, + // author: 'Internet crawler', + // created: '2022-10-04T02:38:44Z', + // description: + // 'Dataset contains personal info of USA citizen (around 157 criteria) such as: email, phone, name, address, geo location, household, real estate, salary, income, etc. Around 500k citizens. Dataset is helpful for financial, real estate companies who want to use it to train their AI/ML model. Or for marketing , sales purposes.', + // license: 'https://market.oceanprotocol.com/terms', + // links: [ + // 'https://drive.google.com/file/d/1oPX-LHBBV6IkQ3kHD7-25jmMVx4ZMoFU/view?usp=sharing' + // ], + // name: '500k USA citizen dataset including PII, real estate info, salary, household, etc', + // tags: [ + // 'ai', + // 'machine-learning', + // 'real-estate', + // 'finance', + // 'usa-citizen', + // 'pii' + // ], + // type: 'dataset', + // updated: '2022-10-04T02:38:44Z' + // }, + // nft: { + // address: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', + // created: '2022-10-04T02:38:59', + // name: 'Ocean Data NFT', + // owner: '0x8542472a8De568cD3B09A53368C1962d8DfDBE2f', + // state: 0, + // symbol: 'OCEAN-NFT', + // tokenURI: + // 'data:application/json;base64,eyJuYW1lIjoiT2NlYW4gRGF0YSBORlQiLCJzeW1ib2wiOiJPQ0VBTi1ORlQiLCJkZXNjcmlwdGlvbiI6IlRoaXMgTkZUIHJlcHJlc2VudHMgYW4gYXNzZXQgaW4gdGhlIE9jZWFuIFByb3RvY29sIHY0IGVjb3N5c3RlbS5cblxuVmlldyBvbiBPY2VhbiBNYXJrZXQ6IGh0dHBzOi8vbWFya2V0Lm9jZWFucHJvdG9jb2wuY29tL2Fzc2V0L2RpZDpvcDo5NDQyYTU1YzI1ZTlhMGZkMzAyMzEwODllYzM0ZTQzMGQwMzI1Y2UwZDNlMDNhYjFhYTI3NTc5ZWI1NmY3NTcwIiwiZXh0ZXJuYWxfdXJsIjoiaHR0cHM6Ly9tYXJrZXQub2NlYW5wcm90b2NvbC5jb20vYXNzZXQvZGlkOm9wOjk0NDJhNTVjMjVlOWEwZmQzMDIzMTA4OWVjMzRlNDMwZDAzMjVjZTBkM2UwM2FiMWFhMjc1NzllYjU2Zjc1NzAiLCJiYWNrZ3JvdW5kX2NvbG9yIjoiMTQxNDE0IiwiaW1hZ2VfZGF0YSI6ImRhdGE6aW1hZ2Uvc3ZnK3htbCwlM0Nzdmcgdmlld0JveD0nMCAwIDk5IDk5JyBmaWxsPSd1bmRlZmluZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyclM0UlM0NwYXRoIGZpbGw9JyUyM2ZmNDA5Mjc3JyBkPSdNMCw5OUwwLDIyQzEyLDIyIDI1LDIyIDM2LDIzQzQ2LDIzIDUzLDI1IDY0LDI2Qzc0LDI2IDg2LDI2IDk5LDI2TDk5LDk5WicvJTNFJTNDcGF0aCBmaWxsPSclMjNmZjQwOTJiYicgZD0nTTAsOTlMMCw0NkM4LDQ3IDE3LDQ4IDI5LDQ4QzQwLDQ3IDU1LDQ2IDY4LDQ3QzgwLDQ3IDg5LDUwIDk5LDUzTDk5LDk5WiclM0UlM0MvcGF0aCUzRSUzQ3BhdGggZmlsbD0nJTIzZmY0MDkyZmYnIGQ9J00wLDk5TDAsNjhDMTAsNzMgMjAsNzkgMzAsODBDMzksODAgNDksNzYgNjEsNzVDNzIsNzMgODUsNzUgOTksNzhMOTksOTlaJyUzRSUzQy9wYXRoJTNFJTNDL3N2ZyUzRSJ9' + // }, + // nftAddress: '0x3a1deC08e0367D8eCCBa714DF23949c105B7D06B', + // purgatory: { + // state: false, + // reason: '' + // }, + // services: [ + // { + // datatokenAddress: '0x98d87B273Ed411A5940a0C4a3717d58C81917Eb5', + // files: + // '0x04a233b66ca6261147f2729d818d4929a797565508daa51f8041bc07fb47d4374702d5cc0528e80d3a6d039df3ba155cdc251f719e8438f1788aed571b98bb301dfd17fe1b4756cd2652ea9f42ca2b3ec3bc40072215ce0dd9504a1d207a3582dee897597117c02013f8e8aefae8843415784db6e7870b6649f434d7eeed5d2adad1e874c18d826171da760fcfe4a3dfec1816bd494f969c290203707037d5e342d37713fef97ddc36b5e6c9a70e7085d841663705314451d3cbcb08dbc24f2baf365ea09160f4b581c93b415188f0e31aa1365a7be1cdbf8ea912aad046e94a801926b6576a47789dab193b28566b7b650c425b51c5c9865936c76c81e51a54986231d37aa518c2b3e629198f77b343d260a1c697f0ae168d405abd2e38e42a121ebaa3ccec8e8d562dcbadcabf5667aa48663e3ec34af9db86dfcc3dc5749ec4878e8fd643036a693ca4e7589d3e1fa93d936f80e4301ad06f30d9469a82ae3e94ebc94c5d19b708', + // id: '60be64b7b7b10944c2b3eac740f476d85b2625a5db32bd0a3db1959f9a8100bb', + // serviceEndpoint: 'https://v4.provider.mainnet.oceanprotocol.com', + // timeout: 0, + // type: 'access' + // } + // ], + // stats: { + // allocated: 422.9883117676, + // orders: 0, + // price: { + // value: 3231343254, + // tokenAddress: '0xCfDdA22C9837aE76E0faA845354f33C62E03653a', + // tokenSymbol: 'OCEAN' + // } + // }, + // version: '4.1.0', + // accessDetails: { + // templateId: 2, + // publisherMarketOrderFee: '0', + // type: 'fixed', + // addressOrId: + // '0xfcf20144a14c7b2f51319d938436e34041acbd65e1e29319549ed7923b9fd86e', + // price: '1000000', + // isPurchasable: true, + // baseToken: { + // address: '0x967da4048cd07ab37855c090aaf366e4ce1b9f48', + // name: 'Ocean Token', + // symbol: 'OCEAN', + // decimals: 18 + // }, + // datatoken: { + // address: '0x98d87b273ed411a5940a0c4a3717d58c81917eb5', + // name: 'Egregious Anchovy Token', + // symbol: 'EGRANC-29' + // }, + // isOwned: false, + // validOrderTx: null + // } + // } ] diff --git a/.jest/__fixtures__/marketMetadata.ts b/.jest/__fixtures__/marketMetadata.ts index 1f8f92728d..fa3354774b 100644 --- a/.jest/__fixtures__/marketMetadata.ts +++ b/.jest/__fixtures__/marketMetadata.ts @@ -1,5 +1,5 @@ import siteContent from '../../content/site.json' -import appConfig from '../../app.config' +import appConfig from '../../app.config.cjs' export default { getOpcFeeForToken: jest.fn(), diff --git a/.jest/__fixtures__/prices.ts b/.jest/__fixtures__/prices.ts index dd5bc5967e..4284cc5622 100644 --- a/.jest/__fixtures__/prices.ts +++ b/.jest/__fixtures__/prices.ts @@ -1,20 +1,20 @@ export default { prices: { - h2o: { - btc: 0.00009013, - cad: 2.38, - cny: 12.36, - eth: 0.00132713, - eur: 1.78, - gbp: 1.55, - hkd: 13.53, - inr: 141.78, - jpy: 253.21, - link: 0.24050954, - rub: 109.81, - sgd: 2.47, - usd: 1.72 - }, + // h2o: { + // btc: 0.00009013, + // cad: 2.38, + // cny: 12.36, + // eth: 0.00132713, + // eur: 1.78, + // gbp: 1.55, + // hkd: 13.53, + // inr: 141.78, + // jpy: 253.21, + // link: 0.24050954, + // rub: 109.81, + // sgd: 2.47, + // usd: 1.72 + // }, 'matic-network': { btc: 0.0000414, cad: 1.093, diff --git a/address.config.cjs b/address.config.cjs new file mode 100644 index 0000000000..252b1d774f --- /dev/null +++ b/address.config.cjs @@ -0,0 +1,25 @@ +module.exports = { + whitelists: { + 'indexedMetadata.nft.owner': [], + 'datatokens.address': [] + }, + featured: [ + { + title: 'Smart Mobility, Automotive', + assets: [] + }, + { + title: 'Manufacturing, Industry 4.0', + assets: [] + }, + { + title: 'Text Analysis, Language Processing, and more', + assets: [] + }, + { + title: 'Finance, Business Analytics, and more', + assets: [] + } + ], + verifiedWallets: {} +} diff --git a/app.config.cjs b/app.config.cjs index 48982ee07f..d45b6949b3 100644 --- a/app.config.cjs +++ b/app.config.cjs @@ -6,20 +6,22 @@ module.exports = { // const { appConfig } = useMarketMetadata() // return appConfig.metadataCacheUri metadataCacheUri: - process.env.NEXT_PUBLIC_METADATACACHE_URI || - 'https://v4.aquarius.oceanprotocol.com', + process.env.NEXT_PUBLIC_NODE_URL || + 'https://2.c2d.nodes.oceanprotocol.com:8000', - // List of chainIds which metadata cache queries will return by default. // This preselects the Chains user preferences. - chainIds: [1, 137, 10], + chainIds: [11155111, 8996], - // List of all supported chainIds. Used to populate the Chains user preferences list. - chainIdsSupported: [1, 137, 10, 11155111], - - customProviderUrl: process.env.NEXT_PUBLIC_PROVIDER_URL, + chainIdsSupported: [11155111, 8996], + customProviderUrl: process.env.NEXT_PUBLIC_NODE_URL, + allowDynamicPricing: process.env.NEXT_PUBLIC_ALLOW_DYNAMIC_PRICING || 'false', infuraProjectId: process.env.NEXT_PUBLIC_INFURA_PROJECT_ID || 'xxx', + oceanTokenAddress: process.env.NEXT_PUBLIC_OCEAN_TOKEN_ADDRESS, + oceanTokenSymbol: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL || 'OCEAN', + defaultDatatokenCap: + '115792089237316195423570985008687907853269984665640564039457', defaultDatatokenTemplateIndex: 2, // The ETH address the marketplace fee will be sent to. marketFeeAddress: @@ -59,7 +61,7 @@ module.exports = { // Tokens to fetch the spot prices from coingecko, against above currencies. // Refers to Coingecko API tokenIds. - coingeckoTokenIds: ['ocean-protocol', 'h2o', 'ethereum', 'matic-network'], + coingeckoTokenIds: ['ocean-protocol', 'ethereum', 'matic-network'], // Config for https://github.com/oceanprotocol/use-dark-mode darkModeConfig: { diff --git a/chains.config.cjs b/chains.config.cjs new file mode 100644 index 0000000000..7793ca4c74 --- /dev/null +++ b/chains.config.cjs @@ -0,0 +1,70 @@ +// chain configs in ocean.js ConfigHelperConfig format +// see: https://github.com/oceanprotocol/ocean.js/blob/e07a7cb6ecea12b39ed96f994b4abe37806799a1/src/utils/ConfigHelper.ts#L8 + +const chains = [ + { + chainId: 11155111, + isDefault: false, + isCustom: true, + network: 'Eth Sepolia', + oceanTokenSymbol: 'OCEAN', + oceanTokenAddress: '0x1B083D8584dd3e6Ff37d04a6e7e82b5F622f3985', + nftFactoryAddress: '0xFdC4a5DEaCDfc6D82F66e894539461a269900E13', + fixedRateExchangeAddress: '0x8372715D834d286c9aECE1AcD51Da5755B32D505', + dispenserAddress: '0x5461b629E01f72E0A468931A36e039Eea394f9eA', + opfCommunityFeeCollector: '0x1f84fB438292269219f9396D57431eA9257C23d4', + startBlock: 57428, + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 1, + transactionPollingTimeout: 750, + gasFeeMultiplier: 1.1, + providerUri: 'https://provider.dev.pontus-x.eu', + providerAddress: '0x68C24FA5b2319C81b34f248d1f928601D2E5246B', + metadataCacheUri: 'https://aquarius.pontus-x.eu', + nodeUri: 'https://rpc.dev.pontus-x.eu', + subgraphUri: 'https://subgraph.dev.pontus-x.eu', + explorerUri: 'https://explorer.pontus-x.eu/devnet/pontusx' + }, + { + chainId: 8996, + isDefault: true, + isCustom: true, + network: 'pontusx-testnet', + oceanTokenSymbol: 'OCEAN', + oceanTokenAddress: '0x1B083D8584dd3e6Ff37d04a6e7e82b5F622f3985', + nftFactoryAddress: '0x2C4d542ff791890D9290Eec89C9348A4891A6Fd2', + fixedRateExchangeAddress: '0xcE0F39abB6DA2aE4d072DA78FA0A711cBB62764E', + dispenserAddress: '0xaB5B68F88Bc881CAA427007559E9bbF8818026dE', + opfCommunityFeeCollector: '0xACC8d1B2a0007951fb4ed622ACB1C4fcCAbe778D', + startBlock: 82191, + transactionBlockTimeout: 50, + transactionConfirmationBlocks: 1, + transactionPollingTimeout: 750, + gasFeeMultiplier: 1.1, + providerUri: 'https://provider.test.pontus-x.eu', + providerAddress: '0x9546d39CE3E48BC942f0be4AA9652cBe0Aff3592', + metadataCacheUri: 'https://aquarius.pontus-x.eu', + nodeUri: 'https://rpc.test.pontus-x.eu', + subgraphUri: 'https://subgraph.test.pontus-x.eu', + explorerUri: 'https://explorer.pontus-x.eu/testnet/pontusx' + } +] + +const getDefaultChainIds = () => { + return chains.filter((chain) => chain.isDefault).map((c) => c.chainId) +} + +const getSupportedChainIds = () => { + return chains.map((c) => c.chainId) +} + +const getCustomChainIds = () => { + return chains.filter((c) => c.isCustom).map((c) => c.chainId) +} + +module.exports = { + chains, + getDefaultChainIds, + getSupportedChainIds, + getCustomChainIds +} diff --git a/package-lock.json b/package-lock.json index d3d3758d07..79deaf946d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@loadable/component": "^5.16.4", "@next/third-parties": "^15.2.3", "@oceanprotocol/art": "^3.2.0", - "@oceanprotocol/lib": "^4.0.1", + "@oceanprotocol/lib": "^4.1.3", "@oceanprotocol/typographies": "^0.1.0", "@oceanprotocol/use-dark-mode": "^2.4.3", "@orbisclub/orbis-sdk": "^0.4.89", @@ -65,6 +65,7 @@ "slugify": "^1.6.6", "swr": "^1.3.0", "urql": "^3.0.4", + "use-debounce": "^9.0.4", "wagmi": "^0.12.19", "yup": "^0.32.11" }, @@ -7004,60 +7005,43 @@ "integrity": "sha512-aUQtg4m5hJlQ0u8C29O9TXJWcAenO3G9vP+vf6LNFkpTDOCMycN/F0SzHS89VNrvGUha8oTDEg7FAkfZBPv2WA==" }, "node_modules/@oceanprotocol/contracts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.3.0.tgz", - "integrity": "sha512-vRNj8Giibe22LRWTKk47ZrQs1HkrhLO2vOpSmwjLktqx6UB5JXpH4Tf1kQNpEIKMpoHF69/oHlCMOxjmc4r8ow==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.3.1.tgz", + "integrity": "sha512-43Vz+DJfoNZLteg91sYvNDR5tJLWcAXl78VoSTriw38j81p6FSLcPNCHzPZKwX9FxyMk3uQe9U4u9REUBEQUfw==", "license": "Apache-2.0" }, "node_modules/@oceanprotocol/ddo-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@oceanprotocol/ddo-js/-/ddo-js-0.0.1.tgz", - "integrity": "sha512-PoS7dG82+oqQ/StP05ObR2n4HGXYqf1KH3bR3lsrhi76JK5Ov866h0QTUN1oy3TVSvWqdtVrSjZRkacZyz2RWA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@oceanprotocol/ddo-js/-/ddo-js-0.0.8.tgz", + "integrity": "sha512-Rv/vbsWjMEmwsLX57TYmJ0nuV3lOnJ4C6IKFvW14lfsN72e6i8kBshpFx7tYjpuVyW+WgyHvGOGjQmf0WBj0Mw==", "license": "Apache-2.0", "dependencies": { - "@rdfjs/dataset": "^2.0.2", "@rdfjs/formats-common": "^3.1.0", - "@rdfjs/types": "^1.1.2", - "@types/rdfjs__data-model": "^2.0.8", - "@types/rdfjs__dataset": "^2.0.7", "@types/rdfjs__formats-common": "^3.1.5", - "@types/rdfjs__parser-jsonld": "^2.1.7", - "@types/rdfjs__to-ntriples": "^3.0.0", "@zazuko/env-node": "^2.1.4", - "axios": "^1.7.9", "chai": "^5.1.2", - "crypto": "^1.0.1", "ethers": "^5.7.2", - "jose": "^5.9.6", - "lodash": "^4.17.21", + "rdf-literal": "^2.0.0", "rdf-validate-shacl": "^0.5.6" } }, - "node_modules/@oceanprotocol/ddo-js/node_modules/@rdfjs/types": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", - "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@oceanprotocol/lib": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-4.0.1.tgz", - "integrity": "sha512-CgwoXSILBfPUAAwp6fCsdSa8LnYhauHtVrRgHN7ldGDXybadgC6tGf1QNsuq6M3UM3B0sF+dkQ0vbnjztVft0A==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-4.1.3.tgz", + "integrity": "sha512-PmMwrZPpWo/bBErK/LddVRXdWNBKdFqUgckMR2UukaftApBNqYukefodPOUoOSRAZyVBdAcsXh74MyeWvOff4w==", "license": "Apache-2.0", "dependencies": { "@oasisprotocol/sapphire-paratime": "^1.3.2", - "@oceanprotocol/contracts": "^2.2.0", - "@oceanprotocol/ddo-js": "^0.0.1-next.7", + "@oceanprotocol/contracts": "^2.3.0", + "@oceanprotocol/ddo-js": "^0.0.8", "@rdfjs/dataset": "^2.0.2", "@rdfjs/formats-common": "^3.1.0", "@zazuko/env-node": "^2.1.4", "cross-fetch": "^4.0.0", "crypto-js": "^4.1.1", "decimal.js": "^10.4.1", - "ethers": "^5.7.2" + "ethers": "^5.7.2", + "form-data": "^2.3.3" }, "peerDependencies": { "web3": "^1.8.0" @@ -7072,6 +7056,22 @@ "node-fetch": "^2.7.0" } }, + "node_modules/@oceanprotocol/lib/node_modules/form-data": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", + "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/@oceanprotocol/lib/node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -7092,6 +7092,26 @@ } } }, + "node_modules/@oceanprotocol/lib/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/@oceanprotocol/lib/node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -17468,6 +17488,7 @@ "resolved": "https://registry.npmjs.org/@types/rdfjs__data-model/-/rdfjs__data-model-2.0.9.tgz", "integrity": "sha512-rgQSlM9jr7XMZdC0xUIr0zsxf5FvdB4cxxzv+MlHm6uJGip5qi0q+BluNhakAzaM2I56nKLDqSE3I/XuOaHGnA==", "license": "MIT", + "peer": true, "dependencies": { "@rdfjs/types": "*" } @@ -17477,6 +17498,7 @@ "resolved": "https://registry.npmjs.org/@types/rdfjs__dataset/-/rdfjs__dataset-2.0.7.tgz", "integrity": "sha512-+GaYIL9C7N1N0HyH+obU4IXuL7DX+fXuf827aUQ2Vx2UghO47+OTxo2v3seEQj/1YHoHBfQFk5Y4P6Q7Ht4Hqw==", "license": "MIT", + "peer": true, "dependencies": { "@rdfjs/types": "*" } @@ -17648,15 +17670,6 @@ "@rdfjs/types": "*" } }, - "node_modules/@types/rdfjs__to-ntriples": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/rdfjs__to-ntriples/-/rdfjs__to-ntriples-3.0.0.tgz", - "integrity": "sha512-3qZGpe2L3s2fAwmLvDDrcPCVDQmmEsg1KpwDd6bLPcCWQ7BISWHIQX/k/l1VU9EZB8uNoEAcmRmeVJY2jnu7wA==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": ">=1.0.0" - } - }, "node_modules/@types/rdfjs__traverser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@types/rdfjs__traverser/-/rdfjs__traverser-0.1.5.tgz", @@ -25635,13 +25648,6 @@ } } }, - "node_modules/crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", - "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", - "license": "ISC" - }, "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -27357,7 +27363,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -35801,15 +35806,6 @@ "@sideway/pinpoint": "^2.0.0" } }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, "node_modules/js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -46015,31 +46011,16 @@ } }, "node_modules/rdf-literal": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", - "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", - "license": "MIT", - "dependencies": { - "@rdfjs/types": "*", - "rdf-data-factory": "^1.1.0" - } - }, - "node_modules/rdf-literal/node_modules/@rdfjs/types": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", - "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/rdf-literal/node_modules/rdf-data-factory": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", - "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-2.0.0.tgz", + "integrity": "sha512-jlQ+h7EvnXmncmk8OzOYR8T3gNfd4g0LQXbflHkEkancic8dh0Tdt5RiRq8vUFndjIeNHt1RWeA5TAj6rgrtng==", "license": "MIT", "dependencies": { - "@rdfjs/types": "^1.0.0" + "rdf-data-factory": "^2.0.0" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/rubensworks/" } }, "node_modules/rdf-validate-datatype": { @@ -46080,6 +46061,25 @@ "@types/node": "*" } }, + "node_modules/rdf-validate-shacl/node_modules/rdf-data-factory": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", + "license": "MIT", + "dependencies": { + "@rdfjs/types": "^1.0.0" + } + }, + "node_modules/rdf-validate-shacl/node_modules/rdf-literal": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", + "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", + "license": "MIT", + "dependencies": { + "@rdfjs/types": "*", + "rdf-data-factory": "^1.1.0" + } + }, "node_modules/rdfxml-streaming-parser": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-2.4.0.tgz", @@ -52727,6 +52727,18 @@ "node": ">=0.10.0" } }, + "node_modules/use-debounce": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-9.0.4.tgz", + "integrity": "sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", @@ -59632,58 +59644,40 @@ "integrity": "sha512-aUQtg4m5hJlQ0u8C29O9TXJWcAenO3G9vP+vf6LNFkpTDOCMycN/F0SzHS89VNrvGUha8oTDEg7FAkfZBPv2WA==" }, "@oceanprotocol/contracts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.3.0.tgz", - "integrity": "sha512-vRNj8Giibe22LRWTKk47ZrQs1HkrhLO2vOpSmwjLktqx6UB5JXpH4Tf1kQNpEIKMpoHF69/oHlCMOxjmc4r8ow==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@oceanprotocol/contracts/-/contracts-2.3.1.tgz", + "integrity": "sha512-43Vz+DJfoNZLteg91sYvNDR5tJLWcAXl78VoSTriw38j81p6FSLcPNCHzPZKwX9FxyMk3uQe9U4u9REUBEQUfw==" }, "@oceanprotocol/ddo-js": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@oceanprotocol/ddo-js/-/ddo-js-0.0.1.tgz", - "integrity": "sha512-PoS7dG82+oqQ/StP05ObR2n4HGXYqf1KH3bR3lsrhi76JK5Ov866h0QTUN1oy3TVSvWqdtVrSjZRkacZyz2RWA==", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/@oceanprotocol/ddo-js/-/ddo-js-0.0.8.tgz", + "integrity": "sha512-Rv/vbsWjMEmwsLX57TYmJ0nuV3lOnJ4C6IKFvW14lfsN72e6i8kBshpFx7tYjpuVyW+WgyHvGOGjQmf0WBj0Mw==", "requires": { - "@rdfjs/dataset": "^2.0.2", "@rdfjs/formats-common": "^3.1.0", - "@rdfjs/types": "^1.1.2", - "@types/rdfjs__data-model": "^2.0.8", - "@types/rdfjs__dataset": "^2.0.7", "@types/rdfjs__formats-common": "^3.1.5", - "@types/rdfjs__parser-jsonld": "^2.1.7", - "@types/rdfjs__to-ntriples": "^3.0.0", "@zazuko/env-node": "^2.1.4", - "axios": "^1.7.9", "chai": "^5.1.2", - "crypto": "^1.0.1", "ethers": "^5.7.2", - "jose": "^5.9.6", - "lodash": "^4.17.21", + "rdf-literal": "^2.0.0", "rdf-validate-shacl": "^0.5.6" - }, - "dependencies": { - "@rdfjs/types": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", - "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", - "requires": { - "@types/node": "*" - } - } } }, "@oceanprotocol/lib": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-4.0.1.tgz", - "integrity": "sha512-CgwoXSILBfPUAAwp6fCsdSa8LnYhauHtVrRgHN7ldGDXybadgC6tGf1QNsuq6M3UM3B0sF+dkQ0vbnjztVft0A==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-4.1.3.tgz", + "integrity": "sha512-PmMwrZPpWo/bBErK/LddVRXdWNBKdFqUgckMR2UukaftApBNqYukefodPOUoOSRAZyVBdAcsXh74MyeWvOff4w==", "requires": { "@oasisprotocol/sapphire-paratime": "^1.3.2", - "@oceanprotocol/contracts": "^2.2.0", - "@oceanprotocol/ddo-js": "^0.0.1-next.7", + "@oceanprotocol/contracts": "^2.3.0", + "@oceanprotocol/ddo-js": "^0.0.8", "@rdfjs/dataset": "^2.0.2", "@rdfjs/formats-common": "^3.1.0", "@zazuko/env-node": "^2.1.4", "cross-fetch": "^4.0.0", "crypto-js": "^4.1.1", "decimal.js": "^10.4.1", - "ethers": "^5.7.2" + "ethers": "^5.7.2", + "form-data": "^2.3.3" }, "dependencies": { "cross-fetch": { @@ -59694,6 +59688,18 @@ "node-fetch": "^2.7.0" } }, + "form-data": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz", + "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + } + }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -59702,6 +59708,11 @@ "whatwg-url": "^5.0.0" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -67612,6 +67623,7 @@ "version": "2.0.9", "resolved": "https://registry.npmjs.org/@types/rdfjs__data-model/-/rdfjs__data-model-2.0.9.tgz", "integrity": "sha512-rgQSlM9jr7XMZdC0xUIr0zsxf5FvdB4cxxzv+MlHm6uJGip5qi0q+BluNhakAzaM2I56nKLDqSE3I/XuOaHGnA==", + "peer": true, "requires": { "@rdfjs/types": "*" } @@ -67620,6 +67632,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/rdfjs__dataset/-/rdfjs__dataset-2.0.7.tgz", "integrity": "sha512-+GaYIL9C7N1N0HyH+obU4IXuL7DX+fXuf827aUQ2Vx2UghO47+OTxo2v3seEQj/1YHoHBfQFk5Y4P6Q7Ht4Hqw==", + "peer": true, "requires": { "@rdfjs/types": "*" } @@ -67776,14 +67789,6 @@ "@rdfjs/types": "*" } }, - "@types/rdfjs__to-ntriples": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/rdfjs__to-ntriples/-/rdfjs__to-ntriples-3.0.0.tgz", - "integrity": "sha512-3qZGpe2L3s2fAwmLvDDrcPCVDQmmEsg1KpwDd6bLPcCWQ7BISWHIQX/k/l1VU9EZB8uNoEAcmRmeVJY2jnu7wA==", - "requires": { - "@rdfjs/types": ">=1.0.0" - } - }, "@types/rdfjs__traverser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@types/rdfjs__traverser/-/rdfjs__traverser-0.1.5.tgz", @@ -74211,11 +74216,6 @@ "integrity": "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==", "requires": {} }, - "crypto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", - "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==" - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -75554,7 +75554,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "requires": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -81959,11 +81958,6 @@ "@sideway/pinpoint": "^2.0.0" } }, - "jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==" - }, "js-cookie": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", @@ -89513,30 +89507,11 @@ } }, "rdf-literal": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", - "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-2.0.0.tgz", + "integrity": "sha512-jlQ+h7EvnXmncmk8OzOYR8T3gNfd4g0LQXbflHkEkancic8dh0Tdt5RiRq8vUFndjIeNHt1RWeA5TAj6rgrtng==", "requires": { - "@rdfjs/types": "*", - "rdf-data-factory": "^1.1.0" - }, - "dependencies": { - "@rdfjs/types": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rdfjs/types/-/types-1.1.2.tgz", - "integrity": "sha512-wqpOJK1QCbmsGNtyzYnojPU8gRDPid2JO0Q0kMtb4j65xhCK880cnKAfEOwC+dX85VJcCByQx5zOwyyfCjDJsg==", - "requires": { - "@types/node": "*" - } - }, - "rdf-data-factory": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", - "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", - "requires": { - "@rdfjs/types": "^1.0.0" - } - } + "rdf-data-factory": "^2.0.0" } }, "rdf-validate-datatype": { @@ -89573,6 +89548,23 @@ "requires": { "@types/node": "*" } + }, + "rdf-data-factory": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/rdf-data-factory/-/rdf-data-factory-1.1.3.tgz", + "integrity": "sha512-ny6CI7m2bq4lfQQmDYvcb2l1F9KtGwz9chipX4oWu2aAtVoXjb7k3d8J1EsgAsEbMXnBipB/iuRen5H2fwRWWQ==", + "requires": { + "@rdfjs/types": "^1.0.0" + } + }, + "rdf-literal": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rdf-literal/-/rdf-literal-1.3.2.tgz", + "integrity": "sha512-79Stlu3sXy0kq9/decHFLf3xNPuY6sfhFPhd/diWErgaFr0Ekyg38Vh9bnVcqDYu48CFRi0t+hrFii49n92Hbw==", + "requires": { + "@rdfjs/types": "*", + "rdf-data-factory": "^1.1.0" + } } } }, @@ -94630,6 +94622,12 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, + "use-debounce": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-9.0.4.tgz", + "integrity": "sha512-6X8H/mikbrt0XE8e+JXRtZ8yYVvKkdYRfmIhWZYsP8rcNs9hk3APV8Ua2mFkKRLcJKVdnX2/Vwrmg2GWKUQEaQ==", + "requires": {} + }, "use-isomorphic-layout-effect": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", diff --git a/package.json b/package.json index 2b12697a6b..5dbf840fc0 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@loadable/component": "^5.16.4", "@next/third-parties": "^15.2.3", "@oceanprotocol/art": "^3.2.0", - "@oceanprotocol/lib": "^4.0.1", + "@oceanprotocol/lib": "^4.1.3", "@oceanprotocol/typographies": "^0.1.0", "@oceanprotocol/use-dark-mode": "^2.4.3", "@orbisclub/orbis-sdk": "^0.4.89", @@ -81,6 +81,7 @@ "slugify": "^1.6.6", "swr": "^1.3.0", "urql": "^3.0.4", + "use-debounce": "^9.0.4", "wagmi": "^0.12.19", "yup": "^0.32.11" }, diff --git a/src/@context/Asset.tsx b/src/@context/Asset.tsx index 28fe3b2b47..e09a7d5783 100644 --- a/src/@context/Asset.tsx +++ b/src/@context/Asset.tsx @@ -7,7 +7,8 @@ import React, { useCallback, ReactNode } from 'react' -import { Config, LoggerInstance, Purgatory } from '@oceanprotocol/lib' +import { Config, LoggerInstance } from '@oceanprotocol/lib' +import { Purgatory } from '@oceanprotocol/ddo-js' import { CancelToken } from 'axios' import { getAsset } from '@utils/aquarius' import { useCancelToken } from '@hooks/useCancelToken' @@ -89,30 +90,61 @@ function AssetProvider({ return } - if (asset.nft.state === (1 | 2 | 3)) { + if (asset.indexedMetadata.nft.state === (1 | 2 | 3)) { setTitle( `This asset has been set as "${assetStateToString( - asset.nft.state + asset.indexedMetadata.nft.state )}" by the publisher` ) - setError(`\`${did}\`` + `\n\nPublisher Address: ${asset.nft.owner}`) + setError( + `\`${did}\`` + + `\n\nPublisher Address: ${asset.indexedMetadata.nft.owner}` + ) LoggerInstance.error(`[asset] Failed getting asset for ${did}`, asset) return } - if (asset) { - setError(undefined) - setAsset((prevState) => ({ - ...prevState, - ...asset - })) - setTitle(asset.metadata?.name) - setOwner(asset.nft?.owner) - setIsInPurgatory(asset.purgatory?.state) - setPurgatoryData(asset.purgatory) - setAssetState(assetStateToString(asset.nft.state)) - LoggerInstance.log('[asset] Got asset', asset) + + let accessDetails: AccessDetails | undefined + // const services = asset?.services + const chainId = asset?.chainId + + if (chainId) { + try { + const accessDetails = await getAccessDetails( + asset.chainId, + asset.services[0], + accountId, + newCancelToken() + ) + setAsset((prevState) => ({ + ...prevState, + accessDetails + })) + LoggerInstance.log( + `[asset] Got access details for ${did}`, + accessDetails + ) + } catch (err) { + LoggerInstance.error( + `[asset] Error fetching access details for ${did}`, + err + ) + } } + setError(undefined) + setAsset((prevState) => ({ + ...prevState, + ...asset, + accessDetails + })) + setTitle(asset.metadata?.name) + setOwner(asset.indexedMetadata.nft?.owner) + setIsInPurgatory(asset.indexedMetadata.purgatory?.state) + setPurgatoryData(asset.indexedMetadata.purgatory) + setAssetState(assetStateToString(asset.indexedMetadata.nft.state)) + LoggerInstance.log('[asset] Got asset', asset) + setLoading(false) }, [did, accountId] @@ -126,9 +158,9 @@ function AssetProvider({ const accessDetails = await getAccessDetails( asset.chainId, - asset.services[0].datatokenAddress, - asset.services[0].timeout, - accountId + asset.services[0], + accountId, + newCancelToken() ) setAsset((prevState) => ({ ...prevState, @@ -196,8 +228,8 @@ function AssetProvider({ // Set Asset State as a string // ----------------------------------- useEffect(() => { - if (!asset?.nft) return - setAssetState(assetStateToString(asset.nft.state)) + if (!asset?.indexedMetadata.nft) return + setAssetState(assetStateToString(asset.indexedMetadata.nft.state)) }, [asset]) return ( diff --git a/src/@context/Filter.tsx b/src/@context/Filter.tsx new file mode 100644 index 0000000000..aee84b1ccd --- /dev/null +++ b/src/@context/Filter.tsx @@ -0,0 +1,69 @@ +import { + createContext, + useContext, + ReactElement, + ReactNode, + useState +} from 'react' +import { + SortDirectionOptions, + SortTermOptions +} from '../../src/@types/aquarius/SearchQuery' + +export interface Filters { + [key: string]: string[] +} + +export interface Sort { + sort: SortTermOptions + sortOrder: SortDirectionOptions +} + +interface FilterValue { + filters: Filters + setFilters: (filters: Filters) => void + ignorePurgatory: boolean + setIgnorePurgatory: (value: boolean) => void + sort: Sort + setSort: (sort: Sort) => void +} + +const FilterContext = createContext({} as FilterValue) + +function FilterProvider({ children }: { children: ReactNode }): ReactElement { + const [filters, setFilters] = useState({ + accessType: [], + serviceType: [], + filterSet: [], + filterTime: [], + assetState: [] + }) + const [ignorePurgatory, setIgnorePurgatory] = useState(true) + const [sort, setSort] = useState({ + sort: SortTermOptions.Created, + sortOrder: SortDirectionOptions.Descending + }) + + return ( + // eslint-disable-next-line react/react-in-jsx-scope + + {children} + + ) +} + +// Helper hook to access the provider values +const useFilter = (): FilterValue => useContext(FilterContext) + +export { FilterProvider, useFilter } diff --git a/src/@context/MarketMetadata/index.tsx b/src/@context/MarketMetadata/index.tsx index 7510ad7f52..715b3124e1 100644 --- a/src/@context/MarketMetadata/index.tsx +++ b/src/@context/MarketMetadata/index.tsx @@ -40,7 +40,7 @@ function MarketMetadataProvider({ if (signer) { getData() } - }, [getOpcData, signer]) + }, [signer]) const getOpcFeeForToken = useCallback( (tokenAddress: string, chainId: number): string => { @@ -59,7 +59,20 @@ function MarketMetadataProvider({ useEffect(() => { if (isLoading) return - setApprovedBaseTokens(approvedBaseTokens) + + const oceanToken: TokenInfo = { + address: appConfig.oceanTokenAddress, + name: 'OCEAN', + symbol: 'OCEAN', + decimals: 18 + } + + setApprovedBaseTokens((prevTokens = []) => { + const hasOceanToken = prevTokens.some( + (token) => token.address === oceanToken.address + ) + return hasOceanToken ? prevTokens : [...prevTokens, oceanToken] + }) }, [isLoading, approvedBaseTokens]) return ( diff --git a/src/@context/Prices/_utils.ts b/src/@context/Prices/_utils.ts index 67310f5eb4..4279c7d191 100644 --- a/src/@context/Prices/_utils.ts +++ b/src/@context/Prices/_utils.ts @@ -5,14 +5,12 @@ export function getCoingeckoTokenId(symbol: string) { // can be OCEAN or mOCEAN const isOcean = symbol?.toLowerCase().includes('ocean') // can be H2O or H20 - const isH2o = symbol?.toLowerCase().includes('h2') + // const isH2o = symbol?.toLowerCase().includes('h2') const isEth = symbol?.toLowerCase() === 'eth' const isMatic = symbol?.toLowerCase() === 'matic' const priceTokenId = isOcean ? 'ocean-protocol' - : isH2o - ? 'h2o' : isEth ? 'ethereum' : isMatic diff --git a/src/@context/Profile/index.tsx b/src/@context/Profile/index.tsx index f5ce43cf11..5230f2bce3 100644 --- a/src/@context/Profile/index.tsx +++ b/src/@context/Profile/index.tsx @@ -8,7 +8,7 @@ import React, { ReactNode } from 'react' import { useUserPreferences } from '../UserPreferences' -import { Asset, LoggerInstance } from '@oceanprotocol/lib' +import { LoggerInstance } from '@oceanprotocol/lib' import { getDownloadAssets, getPublishedAssets, @@ -19,6 +19,7 @@ import axios, { CancelToken } from 'axios' import { useMarketMetadata } from '../MarketMetadata' import { getEnsProfile } from '@utils/ens' import { isAddress } from 'ethers/lib/utils' +import { Asset } from '@oceanprotocol/ddo-js' interface ProfileProviderValue { profile: Profile @@ -35,7 +36,7 @@ interface ProfileProviderValue { const ProfileContext = createContext({} as ProfileProviderValue) -const refreshInterval = 10000 // 10 sec. +const refreshInterval = 30000 // 30 sec. const clearedProfile: Profile = { name: null, @@ -60,20 +61,22 @@ function ProfileProvider({ const { appConfig } = useMarketMetadata() const [isEthAddress, setIsEthAddress] = useState() - // - // Do nothing in all following effects - // when accountId is no ETH address - // + const [profile, setProfile] = useState({ name: accountEns }) + const [assets, setAssets] = useState() + const [assetsTotal, setAssetsTotal] = useState(0) + const [downloads, setDownloads] = useState() + const [downloadsTotal, setDownloadsTotal] = useState(0) + const [isDownloadsLoading, setIsDownloadsLoading] = useState() + const [currentPage, setCurrentPage] = useState(1) + const [sales, setSales] = useState(0) + + // Check if accountId is a valid Ethereum address useEffect(() => { const isEthAddress = isAddress(accountId) setIsEthAddress(isEthAddress) }, [accountId]) - // - // User profile: ENS - // - const [profile, setProfile] = useState({ name: accountEns }) - + // Fetch ENS profile useEffect(() => { if (!accountEns) return LoggerInstance.log(`[profile] ENS name found for ${accountId}:`, accountEns) @@ -97,13 +100,7 @@ function ProfileProvider({ getInfo() }, [accountId, isEthAddress]) - // - // PUBLISHED ASSETS - // - const [assets, setAssets] = useState() - const [assetsTotal, setAssetsTotal] = useState(0) - // const [assetsWithPrices, setAssetsWithPrices] = useState() - + // Fetch published assets useEffect(() => { if (!accountId || !isEthAddress) return @@ -123,12 +120,6 @@ function ProfileProvider({ `[profile] Fetched ${result.totalResults} assets.`, result.results ) - - // Hint: this would only make sense if we "search" in all subcomponents - // against this provider's state, meaning filtering via js rather then sending - // more queries to Aquarius. - // const assetsWithPrices = await getAssetsBestPrices(result.results) - // setAssetsWithPrices(assetsWithPrices) } catch (error) { LoggerInstance.error(error.message) } @@ -138,49 +129,52 @@ function ProfileProvider({ return () => { cancelTokenSource.cancel() } - }, [ - accountId, - appConfig.metadataCacheUri, - chainIds, - isEthAddress, - ownAccount - ]) - - // - // DOWNLOADS - // - const [downloads, setDownloads] = useState() - const [downloadsTotal, setDownloadsTotal] = useState(0) - const [isDownloadsLoading, setIsDownloadsLoading] = useState() - const [downloadsInterval, setDownloadsInterval] = useState() - const [currentPage, setCurrentPage] = useState(1) + }, [accountId, chainIds, isEthAddress, ownAccount]) + // Fetch downloads const fetchDownloads = useCallback( async (cancelToken: CancelToken, page = 1) => { if (!accountId || !chainIds) return const dtList: string[] = [] - const orders = await getUserOrders(accountId, cancelToken) - for (let i = 0; i < orders?.results?.length; i++) { - dtList.push(orders.results[i].datatokenAddress) - } + try { + const orders = await getUserOrders(accountId, cancelToken) + if (orders?.results?.length) { + dtList.push(...orders.results.map((order) => order.datatokenAddress)) + } - const { downloadedAssets, totalResults } = await getDownloadAssets( - dtList, - // tokenOrders, - chainIds, - cancelToken, - ownAccount, - page - ) - setDownloads(downloadedAssets) - setDownloadsTotal(totalResults) - LoggerInstance.log( - `[profile] Fetched ${downloadedAssets.length} download orders.`, - downloads - ) + const result = await getDownloadAssets( + dtList, + chainIds, + cancelToken, + ownAccount, + page + ) + if (!result) { + LoggerInstance.error('getDownloadAssets returned undefined') + setDownloads([]) + setDownloadsTotal(0) + return + } + + const { downloadedAssets, totalResults } = result + const sanitizedAssets = downloadedAssets.map((asset) => ({ + ...asset, + timestamp: isNaN(asset.timestamp) ? 0 : asset.timestamp + })) + setDownloads(sanitizedAssets) + setDownloadsTotal(totalResults) + LoggerInstance.log( + `[profile] Fetched ${sanitizedAssets.length} download orders.`, + sanitizedAssets + ) + } catch (error) { + LoggerInstance.error('Error in fetchDownloads:', error.message) + setDownloads([]) + setDownloadsTotal(0) + } }, - [accountId, chainIds, downloads, ownAccount] + [accountId, chainIds, ownAccount] ) const handlePageChange = (page: number) => { @@ -188,45 +182,42 @@ function ProfileProvider({ } useEffect(() => { - const cancelToken = axios.CancelToken.source() - fetchDownloads(cancelToken.token, currentPage) - - return () => cancelToken.cancel('Request cancelled.') - }, [currentPage, fetchDownloads]) + if (!accountId || !isEthAddress || !appConfig?.metadataCacheUri) { + setDownloads([]) + setDownloadsTotal(0) + setIsDownloadsLoading(false) + return + } - useEffect(() => { const cancelTokenSource = axios.CancelToken.source() - async function getDownloadAssets() { - if (!appConfig?.metadataCacheUri) return - + const fetchData = async () => { try { setIsDownloadsLoading(true) - await fetchDownloads(cancelTokenSource.token) + await fetchDownloads(cancelTokenSource.token, currentPage) } catch (err) { - LoggerInstance.log(err.message) + LoggerInstance.error('Error fetching downloads:', err.message) } finally { setIsDownloadsLoading(false) } } - getDownloadAssets() - if (downloadsInterval) return - const interval = setInterval(async () => { - await fetchDownloads(cancelTokenSource.token) - }, refreshInterval) - setDownloadsInterval(interval) + fetchData() + const interval = setInterval(fetchData, refreshInterval) return () => { - cancelTokenSource.cancel() - clearInterval(downloadsInterval) + cancelTokenSource.cancel('Cleanup: Request canceled') + clearInterval(interval) } - }, [fetchDownloads, appConfig.metadataCacheUri, downloadsInterval]) + }, [ + accountId, + isEthAddress, + appConfig?.metadataCacheUri, + currentPage, + fetchDownloads + ]) - // - // SALES NUMBER - // - const [sales, setSales] = useState(0) + // Fetch sales number useEffect(() => { if (!accountId || chainIds.length === 0) { setSales(0) @@ -264,7 +255,6 @@ function ProfileProvider({ ) } -// Helper hook to access the provider values const useProfile = (): ProfileProviderValue => useContext(ProfileContext) export { ProfileProvider, useProfile, ProfileContext } diff --git a/src/@context/UrqlProvider.tsx b/src/@context/UrqlProvider.tsx index d73ef871f2..d738c16213 100644 --- a/src/@context/UrqlProvider.tsx +++ b/src/@context/UrqlProvider.tsx @@ -13,6 +13,7 @@ import { getOceanConfig } from '@utils/ocean' let urqlClient: Client function createUrqlClient(subgraphUri: string) { + // for now let's keep this file const client = createClient({ url: `${subgraphUri}/subgraphs/name/oceanprotocol/ocean-subgraph`, exchanges: [dedupExchange, refocusExchange(), fetchExchange] @@ -40,17 +41,17 @@ export default function UrqlClientProvider({ useEffect(() => { const oceanConfig = getOceanConfig(1) - if (!oceanConfig?.subgraphUri) { + if (!oceanConfig?.nodeUri) { LoggerInstance.error( - 'No subgraphUri defined, preventing UrqlProvider from initialization.' + 'No NodeURI defined, preventing UrqlProvider from initialization.' ) return } - const newClient = createUrqlClient(oceanConfig.subgraphUri) + const newClient = createUrqlClient(oceanConfig.nodeUri) urqlClient = newClient setClient(newClient) - LoggerInstance.log(`[URQL] Client connected to ${oceanConfig.subgraphUri}`) + LoggerInstance.log(`[URQL] Client connected to ${oceanConfig.nodeUri}`) }, []) return client ? {children} : <> diff --git a/src/@hooks/useBalance.tsx b/src/@hooks/useBalance.tsx index 2c624c6ac6..a95ea35790 100644 --- a/src/@hooks/useBalance.tsx +++ b/src/@hooks/useBalance.tsx @@ -33,8 +33,15 @@ function useBalance(): BalanceProviderValue { !address || !chain?.id || !web3provider - ) + ) { + LoggerInstance.warn('[useBalance] Missing required data:', { + balanceNativeToken: balanceNativeToken?.formatted, + address, + chainId: chain?.id, + web3provider: !!web3provider + }) return + } try { const userBalance = balanceNativeToken?.formatted @@ -45,19 +52,30 @@ function useBalance(): BalanceProviderValue { await Promise.all( approvedBaseTokens.map(async (token) => { const { address: tokenAddress, decimals, symbol } = token - const tokenBalance = await getTokenBalance( - address, - decimals, - tokenAddress, - web3provider - ) - newBalance[symbol.toLocaleLowerCase()] = tokenBalance + try { + const tokenBalance = await getTokenBalance( + address, + decimals, + tokenAddress, + web3provider + ) + newBalance[symbol.toLocaleLowerCase()] = tokenBalance + } catch (error) { + LoggerInstance.error( + '[useBalance] Error fetching token balance:', + { + symbol, + tokenAddress, + error: error.message + } + ) + } }) ) + } else { + LoggerInstance.warn('[useBalance] No approved base tokens found') } - setBalance(newBalance) - LoggerInstance.log('[useBalance] Balance: ', newBalance) } catch (error) { LoggerInstance.error('[useBalance] Error: ', error.message) } diff --git a/src/@hooks/useGraphSyncStatus.ts b/src/@hooks/useGraphSyncStatus.ts deleted file mode 100644 index 816a3a6878..0000000000 --- a/src/@hooks/useGraphSyncStatus.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { useState, useEffect } from 'react' -import { Config, LoggerInstance } from '@oceanprotocol/lib' -import axios, { AxiosResponse } from 'axios' -import { getOceanConfig } from '@utils/ocean' -import { useBlockNumber } from 'wagmi' - -const blockDifferenceThreshold = 30 -const graphQueryBody = - '{"query": "query Meta { _meta { block { hash number } deployment hasIndexingErrors } }", "variables": {},"operationName":"Meta"}' - -export interface UseGraphSyncStatus { - isGraphSynced: boolean - blockHead: number - blockGraph: number -} - -async function fetchGraph( - url: string, - queryBody: string -): Promise { - try { - const response = await axios.post(url, { ...JSON.parse(queryBody) }) - return response - } catch (error) { - LoggerInstance.error('Error parsing json: ' + error.message) - } -} - -async function getBlockSubgraph(subgraphUri: string) { - const response: any = await fetchGraph( - `${subgraphUri}/subgraphs/name/oceanprotocol/ocean-subgraph`, - graphQueryBody - ) - const blockNumberGraph = Number(response?.data?.data?._meta?.block?.number) - return blockNumberGraph -} - -export function useGraphSyncStatus(networkId: number): UseGraphSyncStatus { - const { data: blockHead, isLoading } = useBlockNumber() - const [blockGraph, setBlockGraph] = useState() - const [isGraphSynced, setIsGraphSynced] = useState(true) - const [isSubgraphLoading, setIsSubgraphLoading] = useState(false) - const [oceanConfig, setOceanConfig] = useState() - - // Grab ocean config based on passed networkId - useEffect(() => { - if (!networkId) return - - const oceanConfig = getOceanConfig(networkId) - setOceanConfig(oceanConfig) - }, [networkId]) - - // Log head block - useEffect(() => { - if (!blockHead) return - LoggerInstance.log('[GraphStatus] Head block: ', blockHead) - }, [blockHead]) - - // Get and set subgraph block - useEffect(() => { - if (!oceanConfig?.subgraphUri) return - - async function initBlockSubgraph() { - setIsSubgraphLoading(true) - const blockGraph = await getBlockSubgraph(oceanConfig.subgraphUri) - setBlockGraph(blockGraph) - setIsSubgraphLoading(false) - LoggerInstance.log( - '[GraphStatus] Latest block from subgraph: ', - blockGraph - ) - } - initBlockSubgraph() - }, [oceanConfig]) - - // Set sync status - useEffect(() => { - if ((!blockGraph && !blockHead) || isLoading || isSubgraphLoading) return - - const difference = blockHead - blockGraph - - if (difference > blockDifferenceThreshold) { - setIsGraphSynced(false) - return - } - setIsGraphSynced(true) - }, [blockGraph, blockHead, isLoading, isSubgraphLoading]) - - return { blockHead, blockGraph, isGraphSynced } -} diff --git a/src/@hooks/useNftFactory.ts b/src/@hooks/useNftFactory.ts index 560abdef2b..49e5acf9a6 100644 --- a/src/@hooks/useNftFactory.ts +++ b/src/@hooks/useNftFactory.ts @@ -11,8 +11,16 @@ function useNftFactory(): NftFactory { useEffect(() => { if (!signer || !chain?.id) return + const networkId = chain.id + const config = getOceanConfig(chain.id) - const factory = new NftFactory(config?.nftFactoryAddress, signer) + + if (!config) { + console.error(`No config found for network ${networkId}`) + return + } + + const factory = new NftFactory(config.nftFactoryAddress, signer) setNftFactory(factory) }, [signer, chain?.id]) diff --git a/src/@hooks/useRouter.ts b/src/@hooks/useRouter.ts index 45ce8a5812..7c1f859b42 100644 --- a/src/@hooks/useRouter.ts +++ b/src/@hooks/useRouter.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react' -import { Router as FactoryRouter } from '@oceanprotocol/lib' +import { Router as FactoryRouter, LoggerInstance } from '@oceanprotocol/lib' import { getOceanConfig } from '@utils/ocean' import { useNetwork, useSigner } from 'wagmi' import { ethers } from 'ethers' @@ -21,7 +21,10 @@ function useFactoryRouter() { useEffect(() => { if (!signer || !chain?.id) return const config = getOceanConfig(chain.id) - setFactoryRouter(new FactoryRouter(config?.routerFactoryAddress, signer)) + if (!config) return + setFactoryRouter( + new FactoryRouter(config?.routerFactoryAddress, signer, config.chainId) + ) }, [signer, chain?.id]) const fetchFees = async (router: FactoryRouter) => { @@ -31,7 +34,6 @@ function useFactoryRouter() { router.contract.getOPCConsumeFee(), router.contract.getOPCProviderFee() ]) - return { swapOceanFee: ethers.utils.formatUnits(opcFees[0], 18), swapNonOceanFee: ethers.utils.formatUnits(opcFees[1], 18), @@ -92,35 +94,38 @@ function useFactoryRouter() { if (factoryRouter) { fetchApprovedTokens() } - }, [factoryRouter, fetchTokenDetails]) - + }, [factoryRouter]) const getOpcData = async (chainIds: number[]) => { - const validChainIds = chainIds.filter((chainId) => { - const config = getOceanConfig(chainId) - return !!config?.routerFactoryAddress - }) - const opcData = await Promise.all( - validChainIds.map(async (chainId) => { + const fetchOpcData = async (chainIds: number[]) => { + const validChainIds = chainIds.filter((chainId) => { const config = getOceanConfig(chainId) - const factory = new FactoryRouter(config?.routerFactoryAddress, signer) - const fees = await fetchFees(factory) - const approvedTokensAddresses = - await factory.contract.getApprovedTokens() - const tokenDetails: TokenDetails[] = await Promise.all( - approvedTokensAddresses.map((tokenAddress) => - fetchTokenDetails(tokenAddress) - ) - ) - return { - chainId, - approvedTokens: tokenDetails.map((token) => token.address), - swapApprovedFee: fees.swapOceanFee, - swapNotApprovedFee: fees.swapNonOceanFee - } + return !!config?.routerFactoryAddress }) - ) + const opcData = await Promise.all( + validChainIds.map(async (chainId) => { + const fees = await fetchFees(factoryRouter) + const approvedTokensAddresses = + await factoryRouter.contract.getApprovedTokens() + const tokenDetails: TokenDetails[] = await Promise.all( + approvedTokensAddresses.map((tokenAddress) => + fetchTokenDetails(tokenAddress) + ) + ) + return { + chainId, + approvedTokens: tokenDetails.map((token) => token.address), + swapApprovedFee: fees.swapOceanFee, + swapNotApprovedFee: fees.swapNonOceanFee + } + }) + ) + + return opcData as OpcFee[] + } - return opcData as OpcFee[] + if (factoryRouter) { + return fetchOpcData(chainIds) + } } return { approvedTokens, fees, signer, getOpcData } diff --git a/src/@types/AssetExtended.d.ts b/src/@types/AssetExtended.d.ts index 71d63e265e..bb06c66321 100644 --- a/src/@types/AssetExtended.d.ts +++ b/src/@types/AssetExtended.d.ts @@ -1,4 +1,4 @@ -import { Asset } from '@oceanprotocol/lib' +import { Asset, Event } from '@oceanprotocol/ddo-js' // declaring into global scope to be able to use this as // ambiant types despite the above imports @@ -6,7 +6,6 @@ declare global { interface AssetExtended extends Asset { accessDetails?: AccessDetails views?: number - metadata: MetadataExtended - services: ServiceExtended[] + datatokens?: Datatoken[] } } diff --git a/src/@types/Compute.d.ts b/src/@types/Compute.d.ts index f9674f13d9..58e97ff509 100644 --- a/src/@types/Compute.d.ts +++ b/src/@types/Compute.d.ts @@ -1,8 +1,16 @@ +import { ComputeEnvironment, ComputeJob } from '@oceanprotocol/lib' import { OrdersData_orders_datatoken as OrdersDatatoken } from '../@types/subgraph/OrdersData' // declaring into global scope to be able to use this as // ambiant types despite the above imports declare global { + interface ComputeJobMetaData extends ComputeJob { + assetName: string + assetDtSymbol: string + networkId: number + providerUrl?: string + } + interface AlgorithmOption { did: string name: string @@ -16,8 +24,21 @@ declare global { createdTimestamp: number } + interface ComputeResults { + computeJobs: ComputeJobMetaData[] + isLoaded: boolean + } + interface totalPriceMap { value: string symbol: string } + + interface ComputeJobExtended extends ComputeJob { + providerUrl: string + } + + interface ComputeEnvironmentExtended extends ComputeEnvironment { + feeToken: string + } } diff --git a/src/@types/Price.d.ts b/src/@types/Price.d.ts index 7d809e767b..64ae1b840c 100644 --- a/src/@types/Price.d.ts +++ b/src/@types/Price.d.ts @@ -48,6 +48,7 @@ declare global { validOrderTx: string publisherMarketOrderFee: string validProviderFees?: ProviderFees + paymentCollector?: string } interface PricePublishOptions { diff --git a/src/@types/aquarius/SearchQuery.ts b/src/@types/aquarius/SearchQuery.ts index 6d2eeca8d7..6b595d5a69 100644 --- a/src/@types/aquarius/SearchQuery.ts +++ b/src/@types/aquarius/SearchQuery.ts @@ -3,12 +3,14 @@ export enum SortDirectionOptions { Descending = 'desc' } +// todo update this export enum SortTermOptions { - Created = 'nft.created', + Created = 'indexedMetadata.event.block', Relevance = '_score', - Orders = 'stats.orders', - Allocated = 'stats.allocated', - Price = 'stats.price.value' + Orders = 'indexedMetadata.stats.orders', + Allocated = 'indexedMetadata.stats.allocated', + Price = 'indexedMetadata.stats.prices.price.keyword', + Sales = 'indexedMetadata.events.block' } // Note: could not figure out how to get `enum` to be ambiant @@ -30,15 +32,24 @@ declare global { sortDirection?: SortDirectionOptions } - interface FilterTerm { - [property: string]: { - [property: string]: string | number | boolean | number[] | string[] + export interface FilterTerm { + term?: { + [field: string]: string | number | boolean | number[] | string[] + } + range?: { + [field: string]: { + gt?: number + gte?: number + lt?: number + lte?: number + } } } type Filters = FilterByTypeOptions | FilterByAccessOptions interface SearchQuery { + // index?: string from?: number size?: number // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/@utils/accessDetailsAndPricing.ts b/src/@utils/accessDetailsAndPricing.ts index 2cfcdeb26e..d56d7044f5 100644 --- a/src/@utils/accessDetailsAndPricing.ts +++ b/src/@utils/accessDetailsAndPricing.ts @@ -1,16 +1,13 @@ -import { gql, OperationResult } from 'urql' -import { fetchData, getQueryContext } from './subgraph' import { - TokenPriceQuery, - TokenPriceQuery_token as TokenPrice -} from '../@types/subgraph/TokenPriceQuery' -import { - AssetPrice, + Datatoken, + FixedRateExchange, getErrorMessage, LoggerInstance, ProviderFees, - ProviderInstance + ProviderInstance, + ZERO_ADDRESS } from '@oceanprotocol/lib' +import { AssetPrice, Service } from '@oceanprotocol/ddo-js' import { getFixedBuyPrice } from './ocean/fixedRateExchange' import Decimal from 'decimal.js' import { @@ -20,157 +17,27 @@ import { } from '../../app.config.cjs' import { Signer } from 'ethers' import { toast } from 'react-toastify' - -const tokenPriceQuery = gql` - query TokenPriceQuery($datatokenId: ID!, $account: String) { - token(id: $datatokenId) { - id - symbol - name - templateId - publishMarketFeeAddress - publishMarketFeeToken - publishMarketFeeAmount - orders( - where: { payer: $account } - orderBy: createdTimestamp - orderDirection: desc - ) { - tx - serviceIndex - createdTimestamp - providerFee - reuses(orderBy: createdTimestamp, orderDirection: desc) { - id - caller - createdTimestamp - tx - block - } - } - dispensers { - id - active - isMinter - maxBalance - token { - id - name - symbol - } - } - fixedRateExchanges { - id - exchangeId - price - publishMarketSwapFee - baseToken { - symbol - name - address - decimals - } - datatoken { - symbol - name - address - } - active - } - } - } -` - -function getAccessDetailsFromTokenPrice( - tokenPrice: TokenPrice, - timeout?: number -): AccessDetails { - const accessDetails = {} as AccessDetails - // Return early when no supported pricing schema found. - if ( - tokenPrice?.dispensers?.length === 0 && - tokenPrice?.fixedRateExchanges?.length === 0 - ) { - accessDetails.type = 'NOT_SUPPORTED' - return accessDetails - } - - if (tokenPrice?.orders?.length > 0) { - const order = tokenPrice.orders[0] - const providerFees: ProviderFees = order?.providerFee - ? JSON.parse(order.providerFee) - : null - accessDetails.validProviderFees = - providerFees?.validUntil && - Date.now() / 1000 < Number(providerFees?.validUntil) - ? providerFees - : null - const reusedOrder = order?.reuses?.length > 0 ? order.reuses[0] : null - // asset is owned if there is an order and asset has timeout 0 (forever) or if the condition is valid - accessDetails.isOwned = - timeout === 0 || Date.now() / 1000 - order?.createdTimestamp < timeout - // the last valid order should be the last reuse order tx id if there is one - accessDetails.validOrderTx = reusedOrder?.tx || order?.tx - } - accessDetails.templateId = - typeof tokenPrice.templateId === 'string' - ? parseInt(tokenPrice.templateId) - : tokenPrice.templateId - // TODO: fetch order fee from sub query - accessDetails.publisherMarketOrderFee = tokenPrice?.publishMarketFeeAmount - - // free is always the best price - if (tokenPrice?.dispensers?.length > 0) { - const dispenser = tokenPrice.dispensers[0] - accessDetails.type = 'free' - accessDetails.addressOrId = dispenser.token.id - - accessDetails.price = '0' - accessDetails.isPurchasable = dispenser.active - accessDetails.datatoken = { - address: dispenser.token.id, - name: dispenser.token.name, - symbol: dispenser.token.symbol - } - } - - // checking for fixed price - if (tokenPrice?.fixedRateExchanges?.length > 0) { - const fixed = tokenPrice.fixedRateExchanges[0] - accessDetails.type = 'fixed' - accessDetails.addressOrId = fixed.exchangeId - accessDetails.price = fixed.price - // in theory we should check dt balance here, we can skip this because in the market we always create fre with minting capabilities. - accessDetails.isPurchasable = fixed.active - accessDetails.baseToken = { - address: fixed.baseToken.address, - name: fixed.baseToken.name, - symbol: fixed.baseToken.symbol, - decimals: fixed.baseToken.decimals - } - accessDetails.datatoken = { - address: fixed.datatoken.address, - name: fixed.datatoken.name, - symbol: fixed.datatoken.symbol - } - } - - return accessDetails -} +import { getDummySigner } from './wallet' +// import { Service } from 'src/@types/ddo/Service' +import AssetExtended from 'src/@types/AssetExtended' +import { CancelToken } from 'axios' +import { getUserOrders } from './aquarius' /** * This will be used to get price including fees before ordering * @param {AssetExtended} asset * @return {Promise} */ -export async function getOrderPriceAndFees( +export async function getOrderPriceAndFees( // this function give price asset: AssetExtended, + service: Service, + accessDetails: AccessDetails, accountId: string, signer?: Signer, providerFees?: ProviderFees ): Promise { const orderPriceAndFee = { - price: String(asset?.stats?.price?.value || '0'), + price: accessDetails.price || '0', publisherMarketOrderFee: publisherMarketOrderFee || '0', publisherMarketFixedSwapFee: '0', consumeMarketOrderFee: consumeMarketOrderFee || '0', @@ -183,86 +50,207 @@ export async function getOrderPriceAndFees( // fetch provider fee let initializeData try { - initializeData = - !providerFees && - (await ProviderInstance.initialize( - asset?.id, - asset?.services[0].id, - 0, - accountId, - customProviderUrl || asset?.services[0].serviceEndpoint - )) + const initialize = await ProviderInstance.initialize( + asset.id, + service.id, + 0, + accountId, + customProviderUrl || service.serviceEndpoint + ) + initializeData = !providerFees && initialize } catch (error) { + if (error.message.includes('Unexpected token')) { + // toast.error( + // `Use the initializeCompute endpoint to initialize compute jobs` + // ) + return + } const message = getErrorMessage(error.message) LoggerInstance.error('[Initialize Provider] Error:', message) + + // Customize error message for accountId non included in allow list + if ( + // TODO: verify if the error code is correctly resolved by the provider + message.includes('ConsumableCodes.CREDENTIAL_NOT_IN_ALLOW_LIST') || + message.includes('denied with code: 3') + ) { + if (accountId !== ZERO_ADDRESS) { + toast.error( + `Consumer address not found in allow list for service ${asset.id}. Access has been denied.` + ) + } + return + } + // Customize error message for accountId included in deny list + if ( + // TODO: verify if the error code is correctly resolved by the provider + message.includes('ConsumableCodes.CREDENTIAL_IN_DENY_LIST') || + message.includes('denied with code: 4') + ) { + if (accountId !== ZERO_ADDRESS) { + toast.error( + `Consumer address found in deny list for service ${asset.id}. Access has been denied.` + ) + } + return + } toast.error(message) } - orderPriceAndFee.providerFee = providerFees || initializeData.providerFee + orderPriceAndFee.providerFee = providerFees || initializeData?.providerFee // fetch price and swap fees - if (asset?.accessDetails?.type === 'fixed') { - const fixed = await getFixedBuyPrice( - asset?.accessDetails, - asset?.chainId, - signer - ) - orderPriceAndFee.price = fixed.baseTokenAmount + if (accessDetails.type === 'fixed') { + const fixed = await getFixedBuyPrice(accessDetails, asset.chainId, signer) + orderPriceAndFee.price = accessDetails.price orderPriceAndFee.opcFee = fixed.oceanFeeAmount orderPriceAndFee.publisherMarketFixedSwapFee = fixed.marketFeeAmount orderPriceAndFee.consumeMarketFixedSwapFee = fixed.consumeMarketFeeAmount } - // calculate full price, we assume that all the values are in ocean, otherwise this will be incorrect - orderPriceAndFee.price = new Decimal(+orderPriceAndFee.price || 0) - .add(new Decimal(+orderPriceAndFee?.consumeMarketOrderFee || 0)) - .add(new Decimal(+orderPriceAndFee?.publisherMarketOrderFee || 0)) - .toString() + const price = new Decimal(+accessDetails.price || 0) + const consumeMarketFeePercentage = + +orderPriceAndFee?.consumeMarketOrderFee || 0 + const publisherMarketFeePercentage = + +orderPriceAndFee?.publisherMarketOrderFee || 0 + + // Calculate percentage-based fees + const consumeMarketFee = price.mul(consumeMarketFeePercentage).div(100) + const publisherMarketFee = price.mul(publisherMarketFeePercentage).div(100) + // Calculate total + const result = price.add(consumeMarketFee).add(publisherMarketFee).toString() + orderPriceAndFee.price = result return orderPriceAndFee } /** * @param {number} chainId - * @param {string} datatokenAddress - * @param {number} timeout timout of the service, this is needed to return order details - * @param {string} account account that wants to buy, is needed to return order details + * @param {Service} service service of which you want access details to * @returns {Promise} */ export async function getAccessDetails( chainId: number, - datatokenAddress: string, - timeout?: number, - account = '' + service: Service, + accountId: string, + cancelToken: CancelToken ): Promise { + const signer = await getDummySigner(chainId) + + const datatoken = new Datatoken(signer, chainId) + const { datatokenAddress } = service + + const accessDetails: AccessDetails = { + type: 'NOT_SUPPORTED', + price: '0', + addressOrId: '', + baseToken: { + address: '', + name: '', + symbol: '', + decimals: 0 + }, + datatoken: { + address: datatokenAddress, + name: await datatoken.getName(datatokenAddress), + symbol: await datatoken.getSymbol(datatokenAddress), + decimals: 0 + }, + paymentCollector: await datatoken.getPaymentCollector(datatokenAddress), + templateId: await datatoken.getId(datatokenAddress), + // TODO these 4 records + isOwned: false, + validOrderTx: '', // should be possible to get from ocean-node - orders collection in typesense + isPurchasable: true, + publisherMarketOrderFee: '0' + } try { - const queryContext = getQueryContext(Number(chainId)) - const tokenQueryResult: OperationResult< - TokenPriceQuery, - { datatokenId: string; account: string } - > = await fetchData( - tokenPriceQuery, - { - datatokenId: datatokenAddress.toLowerCase(), - account: account?.toLowerCase() - }, - queryContext + // Check for past orders + let allOrders: any[] = [] + let page = 1 + let totalPages = 1 + + // Fetch all orders across all pages + while (page <= totalPages) { + const res = await getUserOrders(accountId, cancelToken, page) + + allOrders = allOrders.concat(res?.results || []) + const orderTotal = res?.totalPages || 0 + totalPages = orderTotal + page++ + } + + const order = allOrders.find( + (order) => + order.datatokenAddress.toLowerCase() === + datatokenAddress.toLowerCase() || + order.payer.toLowerCase() === datatokenAddress.toLowerCase() ) + if (order) { + const orderTimestamp = order.timestamp + const timeout = Number(service.timeout) + const now = Date.now() - const tokenPrice: TokenPrice = tokenQueryResult.data.token - const accessDetails = getAccessDetailsFromTokenPrice(tokenPrice, timeout) - return accessDetails - } catch (error) { - LoggerInstance.error('Error getting access details: ', error.message) + const isValid = + timeout === 0 || + (orderTimestamp && orderTimestamp * 1000 + timeout * 1000 > now) + accessDetails.isOwned = isValid + accessDetails.validOrderTx = isValid ? order.orderId : '' + } + } catch (err) { + LoggerInstance.error('[getAccessDetails] Failed to fetch user orders', err) + } + + // if there is at least 1 dispenser => service is free and use first dispenser + const dispensers = await datatoken.getDispensers(datatokenAddress) + if (dispensers.length > 0) { + return { + ...accessDetails, + type: 'free', + addressOrId: dispensers[0], + price: '0' + } } -} -export function getAvailablePrice(asset: AssetExtended): AssetPrice { - const price: AssetPrice = asset?.stats?.price?.value - ? asset?.stats?.price - : { - value: Number(asset?.accessDetails?.price), - tokenSymbol: asset?.accessDetails?.baseToken?.symbol, - tokenAddress: asset?.accessDetails?.baseToken?.address + // if there is 0 dispensers and at least 1 fixed rate => use first fixed rate to get the price details + const fixedRates = await datatoken.getFixedRates(datatokenAddress) + if (fixedRates.length > 0) { + try { + const freAddress = fixedRates[0].contractAddress + const exchangeId = fixedRates[0].id + const fre = new FixedRateExchange(freAddress, signer, chainId) + const exchange = await fre.getExchange(exchangeId) + return { + ...accessDetails, + type: 'fixed', + addressOrId: exchangeId, + price: exchange.fixedRate, + baseToken: { + address: exchange.baseToken, + name: await datatoken.getName(exchange.baseToken), // reuse the datatoken instance since it is ERC20 + symbol: await datatoken.getSymbol(exchange.baseToken), + decimals: parseInt(exchange.btDecimals) + } } + } catch (error) { + console.log('error in getAccessDetails', error) + } + } + + return accessDetails +} + +export function getAvailablePrice(accessDetails: AccessDetails): AssetPrice { + const price: AssetPrice = { + type: 'fixedrate', + price: Number(accessDetails?.price).toString(), + token: accessDetails?.baseToken?.symbol || '', + contract: accessDetails?.baseToken?.address || '' + } + + if (!accessDetails || accessDetails.price === undefined) { + console.warn('Missing price in accessDetails:', accessDetails) + return null + } + return price } diff --git a/src/@utils/aquarius/index.test.ts b/src/@utils/aquarius/index.test.ts index 2fbb3ca0a1..9124b5c014 100644 --- a/src/@utils/aquarius/index.test.ts +++ b/src/@utils/aquarius/index.test.ts @@ -2,25 +2,48 @@ import { SortDirectionOptions, SortTermOptions } from '../../@types/aquarius/SearchQuery' -import { escapeEsReservedCharacters, getFilterTerm, generateBaseQuery } from '.' +import { + escapeEsReservedCharacters, + getFilterTerm, + generateBaseQuery, + getWhitelistShould +} from '.' -const defaultBaseQueryReturn = { +const defaultBaseQueryReturn: SearchQuery = { from: 0, query: { bool: { filter: [ - { term: { _index: 'aquarius' } }, - { term: { 'services.type': 'access' } }, - { term: { 'metadata.type': 'dataset' } }, { terms: { chainId: [1, 3] } }, + { term: { _index: 'aquarius' } }, { term: { 'purgatory.state': false } }, - { bool: { must_not: [{ term: { 'nft.state': 5 } }] } } + { + bool: { + must_not: [ + { term: { 'indexedMetadata.nft.state': 5 } }, + { term: { 'indexedMetadata.stats.prices.price.type': 'pool' } } + ] + } + } ] } }, size: 1000 } +// add whitelist filtering +if (getWhitelistShould()?.length > 0) { + const whitelistQuery = { + bool: { + should: [...getWhitelistShould()], + minimum_should_match: 1 + } + } + Object.hasOwn(defaultBaseQueryReturn.query.bool, 'must') + ? defaultBaseQueryReturn.query.bool.must.push(whitelistQuery) + : (defaultBaseQueryReturn.query.bool.must = [whitelistQuery]) +} + describe('@utils/aquarius', () => { test('escapeEsReservedCharacters', () => { expect(escapeEsReservedCharacters('<')).toBe('\\<') @@ -65,7 +88,7 @@ describe('@utils/aquarius', () => { ).toStrictEqual({ ...defaultBaseQueryReturn, sort: { - 'nft.created': 'asc' + 'indexedMetadata.event.block': 'asc' } }) }) diff --git a/src/@utils/aquarius/index.ts b/src/@utils/aquarius/index.ts index d774d9a09a..1ce4e9ed82 100644 --- a/src/@utils/aquarius/index.ts +++ b/src/@utils/aquarius/index.ts @@ -1,11 +1,13 @@ -import { Asset, LoggerInstance } from '@oceanprotocol/lib' +import { LoggerInstance } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' import axios, { CancelToken, AxiosResponse } from 'axios' -import { OrdersData_orders as OrdersData } from '../../@types/subgraph/OrdersData' -import { metadataCacheUri } from '../../../app.config.cjs' +import { metadataCacheUri, allowDynamicPricing } from '../../../app.config.cjs' +import addressConfig from '../../../address.config.cjs' import { SortDirectionOptions, SortTermOptions } from '../../@types/aquarius/SearchQuery' +import { isValidDid } from '@utils/ddo' export interface UserSales { id: string @@ -25,44 +27,47 @@ export function escapeEsReservedCharacters(value: string): string { * @param value the value of the filter * @returns json structure of the es filter */ +type TFilterValue = string | number | boolean | number[] | string[] +type TFilterKey = 'terms' | 'term' | 'match' | 'match_phrase' export function getFilterTerm( filterField: string, - value: string | number | boolean | number[] | string[] + value: TFilterValue, + key: TFilterKey = 'term' ): FilterTerm { const isArray = Array.isArray(value) + const useKey = key === 'term' ? (isArray ? 'terms' : 'term') : key return { - [isArray ? 'terms' : 'term']: { + [useKey]: { [filterField]: value } } } +export function getDynamicPricingMustNot(): // eslint-disable-next-line camelcase +FilterTerm | undefined { + return allowDynamicPricing === 'true' + ? undefined + : getFilterTerm('indexedMetadata.stats.prices.type', 'pool') +} +export function getWhitelistShould(): FilterTerm[] { + const { whitelists } = addressConfig + + const whitelistFilterTerms = Object.entries(whitelists) + .filter(([field, whitelist]) => whitelist.length > 0) + .map(([field, whitelist]) => + whitelist.map((address) => getFilterTerm(field, address, 'match')) + ) + .reduce((prev, cur) => prev.concat(cur), []) + + return whitelistFilterTerms.length > 0 ? whitelistFilterTerms : [] +} + export function generateBaseQuery( - baseQueryParams: BaseQueryParams + baseQueryParams: BaseQueryParams, + index?: string ): SearchQuery { - const filters: unknown[] = [ - getFilterTerm('_index', 'aquarius'), - getFilterTerm('services.type', 'access'), - getFilterTerm('metadata.type', 'dataset') - ] - baseQueryParams.filters && filters.push(...baseQueryParams.filters) - baseQueryParams.chainIds && - filters.push(getFilterTerm('chainId', baseQueryParams.chainIds)) - !baseQueryParams.ignorePurgatory && - filters.push(getFilterTerm('purgatory.state', false)) - !baseQueryParams.ignoreState && - filters.push({ - bool: { - must_not: [ - { - term: { - 'nft.state': 5 - } - } - ] - } - }) const generatedQuery = { + index: index ?? 'op_ddo_v4.1.0', from: baseQueryParams.esPaginationOptions?.from || 0, size: baseQueryParams.esPaginationOptions?.size >= 0 @@ -71,7 +76,25 @@ export function generateBaseQuery( query: { bool: { ...baseQueryParams.nestedQuery, - filter: filters + filter: [ + ...(baseQueryParams.filters || []), + ...(baseQueryParams.chainIds + ? [getFilterTerm('chainId', baseQueryParams.chainIds)] + : []), + ...(baseQueryParams.ignorePurgatory + ? [] + : [getFilterTerm('indexedMetadata.purgatory.state', false)]), + { + bool: { + must_not: [ + getFilterTerm('chainId', 11155420), // remove this filter if you want 11155420 network later + !baseQueryParams.ignoreState && + getFilterTerm('indexedMetadata.nft.state', 5), + getDynamicPricingMustNot() + ] + } + } + ] } } } as SearchQuery @@ -80,41 +103,48 @@ export function generateBaseQuery( generatedQuery.aggs = baseQueryParams.aggs } - if (baseQueryParams.sortOptions !== undefined) + if (baseQueryParams.sortOptions !== undefined) { generatedQuery.sort = { - [baseQueryParams.sortOptions.sortBy]: + [`${baseQueryParams.sortOptions.sortBy}`]: baseQueryParams.sortOptions.sortDirection || SortDirectionOptions.Descending } + } + + // add whitelist filtering + if (getWhitelistShould()?.length > 0) { + const whitelistQuery = { + bool: { + should: [...getWhitelistShould()], + minimum_should_match: 1 + } + } + Object.hasOwn(generatedQuery.query.bool, 'must') + ? generatedQuery.query.bool.must.push(whitelistQuery) + : (generatedQuery.query.bool.must = [whitelistQuery]) + } + return generatedQuery } export function transformQueryResult( - queryResult: SearchResponse, + queryResult: any, from = 0, - size = 21 + size = Number.MAX_SAFE_INTEGER ): PagedAssets { - const result: PagedAssets = { - results: [], - page: 0, - totalPages: 0, - totalResults: 0, - aggregations: [] - } - - result.results = (queryResult.hits.hits || []).map( - (hit) => hit._source as Asset - ) + const rawResults = (queryResult || []).flat() + const aggregations = queryResult || {} - result.aggregations = queryResult.aggregations - result.totalResults = queryResult.hits.total.value - result.totalPages = - result.totalResults / size < 1 - ? Math.floor(result.totalResults / size) - : Math.ceil(result.totalResults / size) - result.page = from ? from / size + 1 : 1 + const effectiveSize = Math.max(size, rawResults.length + 1) + // const pagedResults = rawResults.slice(from, from + effectiveSize) - return result + return { + results: rawResults, + page: from ? Math.floor(from / effectiveSize) + 1 : 1, + totalPages: Math.ceil(rawResults.length / effectiveSize), + totalResults: rawResults.length, + aggregations + } } export async function queryMetadata( @@ -123,17 +153,170 @@ export async function queryMetadata( ): Promise { try { const response: AxiosResponse = await axios.post( - `${metadataCacheUri}/api/aquarius/assets/query`, + `${metadataCacheUri}/api/aquarius/assets/metadata/query`, { ...query }, { cancelToken } ) - if (!response || response.status !== 200 || !response.data) return - return transformQueryResult(response.data, query.from, query.size) + + if (!response || response.status !== 200 || !response.data[0]) { + console.log('Invalid response or empty data at index 0') + return + } + + const transformedResult = transformQueryResult( + response.data, + query.from, + query.size + ) + return transformedResult } catch (error) { if (axios.isCancel(error)) { - LoggerInstance.log(error.message) + LoggerInstance.log('⚠️ Request cancelled:', error.message) } else { - LoggerInstance.error(error.message) + LoggerInstance.error('❌ Error occurred:', error.message) + } + } +} + +export async function queryMetadataTags( + query: SearchQuery, + cancelToken: CancelToken +): Promise<{ tags: any; pagedAssets: PagedAssets }> { + try { + const response: AxiosResponse = await axios.post( + `${metadataCacheUri}/api/aquarius/assets/metadata/query`, + { ...query }, + { cancelToken } + ) + if (!response || response.status !== 200 || !response.data[0]) { + LoggerInstance.warn('Invalid response or no data') + return { + tags: [], + pagedAssets: { + results: [], + page: 1, + totalPages: 0, + totalResults: 0, + aggregations: {} + } + } + } + + const assets = response.data[0] + const uniqueTags = [ + ...new Set( + assets + .filter((asset: any) => { + // Check if metadata and tags exist, and tags is an array with length > 0 + const hasValidTags = + asset.metadata && + Array.isArray(asset.metadata.tags) && + asset.metadata.tags.length > 0 + // Check if asset has sales (orders > 0) + const hasSales = asset.indexedMetadata?.stats?.[0]?.orders > 0 + + if (!hasValidTags) { + LoggerInstance.warn( + `Asset skipped due to invalid tags: ${JSON.stringify({ + id: asset.id, + chainId: asset.chainId, + metadata: asset.metadata + })}` + ) + } else if (!hasSales) { + LoggerInstance.warn( + `Asset skipped due to zero sales: ${JSON.stringify({ + id: asset.id, + chainId: asset.chainId, + orders: asset.indexedMetadata?.stats?.[0]?.orders + })}` + ) + } + + return hasValidTags && hasSales + }) + .flatMap((asset: any) => asset.metadata.tags) + ) + ] + + const transformedResult = transformQueryResult( + response.data, + query.from, + query.size + ) + return { tags: uniqueTags, pagedAssets: transformedResult } + } catch (error) { + if (axios.isCancel(error)) { + LoggerInstance.log('Query canceled:', error.message) + } else { + LoggerInstance.error('Error in queryMetadataTags:', error.message) + } + return { + tags: [], + pagedAssets: { + results: [], + page: 1, + totalPages: 0, + totalResults: 0, + aggregations: {} + } + } + } +} +export async function queryStats( + query: SearchQuery, + cancelToken: CancelToken +): Promise<{ totalOrders: number; pagedAssets: PagedAssets }> { + try { + const response: AxiosResponse = await axios.post( + `${metadataCacheUri}/api/aquarius/assets/metadata/query`, + { ...query }, + { cancelToken } + ) + + if (!response || response.status !== 200 || !response.data[0]) { + LoggerInstance.warn('Invalid response or no data') + return { + totalOrders: 0, + pagedAssets: { + results: [], + page: 1, + totalPages: 0, + totalResults: 0, + aggregations: {} + } + } + } + + const assets = response.data[0] + + const totalOrders = assets.reduce((sum: number, asset: any) => { + const orders = asset.indexedMetadata?.stats?.[0]?.orders || 0 + return sum + (typeof orders === 'number' ? orders : 0) + }, 0) + + const transformedResult = transformQueryResult( + response.data, + query.from, + query.size + ) + + return { totalOrders, pagedAssets: transformedResult } + } catch (error) { + if (axios.isCancel(error)) { + LoggerInstance.log('Query canceled:', error.message) + } else { + LoggerInstance.error('Error in queryStats:', error.message) + } + return { + totalOrders: 0, + pagedAssets: { + results: [], + page: 1, + totalPages: 0, + totalResults: 0, + aggregations: {} + } } } } @@ -143,6 +326,10 @@ export async function getAsset( cancelToken: CancelToken ): Promise { try { + if (!isValidDid(did)) { + return + } + const response: AxiosResponse = await axios.get( `${metadataCacheUri}/api/aquarius/assets/ddo/${did}`, { cancelToken } @@ -150,6 +337,7 @@ export async function getAsset( if (!response || response.status !== 200 || !response.data) return const data = { ...response.data } + return data } catch (error) { if (axios.isCancel(error)) { @@ -212,20 +400,16 @@ export async function getPublishedAssets( accountId: string, chainIds: number[], cancelToken: CancelToken, + ignorePurgatory = false, ignoreState = false, - page?: number, - type?: string, - accesType?: string + page?: number ): Promise { if (!accountId) return - const filters: FilterTerm[] = [] - - filters.push(getFilterTerm('nft.state', [0, 4, 5])) - filters.push(getFilterTerm('nft.owner', accountId.toLowerCase())) - // filters.push(getFilterTerm('services.type', 'access')) - // filters.push(getFilterTerm('metadata.type', 'dataset')) - + filters.push(getFilterTerm('indexedMetadata.nft.state', [0, 4, 5])) + filters.push( + getFilterTerm('indexedMetadata.nft.owner', accountId.toLowerCase()) + ) const baseQueryParams = { chainIds, filters, @@ -240,16 +424,15 @@ export async function getPublishedAssets( } } }, - ignorePurgatory: true, + ignorePurgatory, ignoreState, esPaginationOptions: { - from: (Number(page) - 1 || 0) * 9, - size: 9 + from: page || 0, + size: 1000 } } as BaseQueryParams const query = generateBaseQuery(baseQueryParams) - try { const result = await queryMetadata(query, cancelToken) return result @@ -285,7 +468,7 @@ async function getTopPublishers( aggs: { topPublishers: { terms: { - field: 'nft.owner.keyword', + field: 'indexedMetadata.nft.owner.keyword', order: { totalSales: 'desc' } }, aggs: { @@ -299,7 +482,7 @@ async function getTopPublishers( }, esPaginationOptions: { from: (Number(page) - 1 || 0) * 9, - size: 9 + size: 1000 } } as BaseQueryParams @@ -323,19 +506,63 @@ export async function getTopAssetsPublishers( ): Promise { const publishers: UserSales[] = [] - const result = await getTopPublishers(chainIds, null) - const { topPublishers } = result.aggregations + try { + const result = await getTopPublishers(chainIds, null) + + if (result.aggregations?.topPublishers?.buckets) { + const { topPublishers } = result.aggregations + for (const bucket of topPublishers.buckets) { + publishers.push({ + id: bucket.key, + totalSales: parseInt(bucket.totalSales.value) + }) + } + } else if (result.results && Array.isArray(result.results)) { + const publisherMap: { [key: string]: number } = {} + + for (const asset of result.results) { + // Extract owner from indexedMetadata.nft.owner + const owner = asset.indexedMetadata?.nft?.owner + if (!owner) { + console.warn('Asset missing owner:', { + id: asset.id, + nftAddress: asset.nftAddress, + indexedMetadata: asset.indexedMetadata + }) + continue + } + + // Extract orders from indexedMetadata.stats[0].orders + const orders = asset.indexedMetadata?.stats?.[0]?.orders || 0 + if (typeof orders !== 'number') { + console.warn('Invalid orders value for asset:', { + id: asset.id, + owner, + orders: asset.indexedMetadata?.stats?.[0]?.orders + }) + continue + } - for (let i = 0; i < topPublishers.buckets.length; i++) { - publishers.push({ - id: topPublishers.buckets[i].key, - totalSales: parseInt(topPublishers.buckets[i].totalSales.value) - }) - } + // Accumulate sales for the owner + publisherMap[owner] = (publisherMap[owner] || 0) + orders + } - publishers.sort((a, b) => b.totalSales - a.totalSales) + // Convert publisherMap to UserSales array + for (const [id, totalSales] of Object.entries(publisherMap)) { + publishers.push({ id, totalSales }) + } + } else { + console.warn('Unexpected response format from getTopPublishers:', result) + return [] + } - return publishers.slice(0, nrItems) + // Sort by totalSales (descending) and take top nrItems + publishers.sort((a, b) => b.totalSales - a.totalSales) + return publishers.slice(0, nrItems) + } catch (error) { + console.error('Error in getTopAssetsPublishers:', error.message) + return [] + } } export async function getUserSales( @@ -343,11 +570,40 @@ export async function getUserSales( chainIds: number[] ): Promise { try { - const result = await getPublishedAssets(accountId, chainIds, null) - const { totalOrders } = result.aggregations - return totalOrders.value + let page = 1 + let totalOrders = 0 + let assets: PagedAssets + const allResults: Asset[] = [] + + do { + assets = await getPublishedAssets( + accountId, + chainIds, + null, + false, + false, + page + ) + // TODO stats is not in ddo + if (assets && assets.results) { + assets.results.forEach((asset) => { + const orders = asset?.indexedMetadata?.stats[0]?.orders || 0 + totalOrders += orders + }) + allResults.push(...assets.results) + } + page++ + } while ( + assets && + assets.results && + assets.results?.length > 0 && + page <= assets.totalPages + ) + + return totalOrders } catch (error) { - LoggerInstance.error('Error getUserSales', error.message) + LoggerInstance.error('Error in getUserSales', error.message) + return 0 } } @@ -358,20 +614,15 @@ export async function getUserOrders( ): Promise { const filters: FilterTerm[] = [] filters.push(getFilterTerm('consumer.keyword', accountId)) - filters.push({ - exists: { - field: 'datatokenAddress' - } - }) const baseQueryparams = { filters, ignorePurgatory: true, esPaginationOptions: { - from: Number(page) - 1 || 0, - size: 9 + from: page || 0, + size: 1000 } } as BaseQueryParams - const query = generateBaseQuery(baseQueryparams) + const query = generateBaseQuery(baseQueryparams, 'order') try { return queryMetadata(query, cancelToken) } catch (error) { @@ -406,9 +657,12 @@ export async function getDownloadAssets( const query = generateBaseQuery(baseQueryparams) try { const result = await queryMetadata(query, cancelToken) + const downloadedAssets: DownloadedAsset[] = result.results .map((asset) => { - const timestamp = new Date(asset.event.datetime).getTime() + const timestamp = new Date( + asset?.indexedMetadata?.event?.datetime + ).getTime() return { asset, @@ -426,6 +680,7 @@ export async function getDownloadAssets( } else { LoggerInstance.error(error.message) } + return undefined } } @@ -450,20 +705,22 @@ export async function getTagsList( } try { - const response: AxiosResponse = await axios.post( - `${metadataCacheUri}/api/aquarius/assets/query`, + const response: AxiosResponse = await axios.post( + `${metadataCacheUri}/api/aquarius/assets/metadata/query`, { ...query }, { cancelToken } ) if (response?.status !== 200 || !response?.data) return - const { buckets }: { buckets: AggregatedTag[] } = - response.data.aggregations.tags - - const tagsList = buckets - .filter((tag) => tag.key !== '') - .map((tag) => tag.key) - - return tagsList.sort() + const tagsSet: Set = new Set() + response.data.forEach((items) => { + items?.forEach((item) => { + item?.metadata?.tags + ?.filter((tag: string) => tag !== '') + ?.forEach((tag: string) => tagsSet.add(tag)) + }) + }) + const uniqueTagsList = Array.from(tagsSet).sort() + return uniqueTagsList } catch (error) { if (axios.isCancel(error)) { LoggerInstance.log(error.message) diff --git a/src/@utils/assetConvertor.ts b/src/@utils/assetConvertor.ts index 4370e617ca..6614048ff6 100644 --- a/src/@utils/assetConvertor.ts +++ b/src/@utils/assetConvertor.ts @@ -1,4 +1,4 @@ -import { PublisherTrustedAlgorithm, Asset } from '@oceanprotocol/lib' +import { PublisherTrustedAlgorithm, Asset } from '@oceanprotocol/ddo-js' import { AssetSelectionAsset } from '@shared/FormInput/InputElement/AssetSelection' import { getServiceByName } from './ddo' import normalizeUrl from 'normalize-url' @@ -14,7 +14,7 @@ export async function transformAssetToAssetSelection( const algoService = getServiceByName(asset, 'access') if ( - asset?.stats?.price?.value >= 0 && + Number(asset?.indexedMetadata?.stats[0]?.prices[0]?.price) >= 0 && normalizeUrl(algoService?.serviceEndpoint) === normalizeUrl(datasetProviderEndpoint) ) { @@ -27,9 +27,9 @@ export async function transformAssetToAssetSelection( const algorithmAsset: AssetSelectionAsset = { did: asset.id, name: asset.metadata.name, - price: asset.stats.price.value, + price: Number(asset.indexedMetadata?.stats[0]?.prices[0]?.price), checked: selected, - symbol: asset.datatokens[0].symbol + symbol: asset.indexedMetadata.stats[0].symbol } selected ? algorithmList.unshift(algorithmAsset) diff --git a/src/@utils/ddo.ts b/src/@utils/ddo.ts index 10f7998e22..89d8a525a0 100644 --- a/src/@utils/ddo.ts +++ b/src/@utils/ddo.ts @@ -3,18 +3,8 @@ import { FormConsumerParameter, FormPublishData } from '@components/Publish/_types' -import { - Arweave, - Asset, - ConsumerParameter, - DDO, - FileInfo, - GraphqlQuery, - Ipfs, - Service, - Smartcontract, - UrlFile -} from '@oceanprotocol/lib' +import { Arweave, FileInfo, Ipfs, UrlFile } from '@oceanprotocol/lib' +import { Asset, ConsumerParameter, DDO, Service } from '@oceanprotocol/ddo-js' import { checkJson } from './codemirror' export function isValidDid(did: string): boolean { @@ -129,34 +119,34 @@ export function normalizeFile( } as Arweave break } - case 'graphql': { - fileObj = { - type: storageType, - url: file[0]?.url || file?.url, - query: file[0]?.query || file?.query, - headers: headersProvider - } as GraphqlQuery - break - } - case 'smartcontract': { - // clean obj - fileObj = { - chainId, - type: storageType, - address: file[0]?.address || file?.address || file[0]?.url || file?.url, - abi: checkJson(file[0]?.abi || file?.abi) - ? JSON.parse(file[0]?.abi || file?.abi) - : file[0]?.abi || file?.abi - } as Smartcontract - break - } + // case 'graphql': { + // fileObj = { + // type: storageType, + // url: file[0]?.url || file?.url, + // query: file[0]?.query || file?.query, + // headers: headersProvider + // } as GraphqlQuery + // break + // } + // case 'smartcontract': { + // // clean obj + // fileObj = { + // chainId, + // type: storageType, + // address: file[0]?.address || file?.address || file[0]?.url || file?.url, + // abi: checkJson(file[0]?.abi || file?.abi) + // ? JSON.parse(file[0]?.abi || file?.abi) + // : file[0]?.abi || file?.abi + // } as Smartcontract + // break + // } default: { fileObj = { type: 'url', index: 0, url: file ? file[0]?.url || file?.url : null, headers: headersProvider, - method: file.method + method: file.method ? file.method : 'GET' } as UrlFile break } diff --git a/src/@utils/index.ts b/src/@utils/index.ts index 5777f65f33..c21c9e35a0 100644 --- a/src/@utils/index.ts +++ b/src/@utils/index.ts @@ -1,4 +1,4 @@ -import { Asset } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' // Boolean value that will be true if we are inside a browser, false otherwise export const isBrowser = typeof window !== 'undefined' diff --git a/src/@utils/nft.ts b/src/@utils/nft.ts index aaeed292ec..eb3c92a966 100644 --- a/src/@utils/nft.ts +++ b/src/@utils/nft.ts @@ -1,14 +1,13 @@ import { LoggerInstance, - Asset, getHash, Nft, ProviderInstance, - DDO, MetadataAndTokenURI, NftCreateData, getErrorMessage } from '@oceanprotocol/lib' +import { Asset, DDO } from '@oceanprotocol/ddo-js' import { SvgWaves } from './SvgWaves' import { customProviderUrl } from '../../app.config.cjs' import { Signer, ethers } from 'ethers' @@ -175,9 +174,8 @@ export async function setNFTMetadataAndTokenURI( external_url: externalUrl }) ).toString('base64') - const nft = new Nft(signer) + const nft = new Nft(signer, asset.chainId) - // theoretically used by aquarius or provider, not implemented yet, will remain hardcoded const flags = '0x02' const metadataAndTokenURI: MetadataAndTokenURI = { diff --git a/src/@utils/ocean/index.ts b/src/@utils/ocean/index.ts index 9335834a35..160cf69eb7 100644 --- a/src/@utils/ocean/index.ts +++ b/src/@utils/ocean/index.ts @@ -1,4 +1,5 @@ import { ConfigHelper, Config } from '@oceanprotocol/lib' +// import { Config } from '@oceanprotocol/ddo-js' import { ethers } from 'ethers' import abiDatatoken from '@oceanprotocol/contracts/artifacts/contracts/templates/ERC20TemplateEnterprise.sol/ERC20TemplateEnterprise.json' @@ -11,21 +12,24 @@ import abiDatatoken from '@oceanprotocol/contracts/artifacts/contracts/templates */ export function sanitizeDevelopmentConfig(config: Config): Config { return { - subgraphUri: process.env.NEXT_PUBLIC_SUBGRAPH_URI || config.subgraphUri, - metadataCacheUri: - process.env.NEXT_PUBLIC_METADATACACHE_URI || config.metadataCacheUri, - providerUri: process.env.NEXT_PUBLIC_PROVIDER_URL || config.providerUri, - nodeUri: process.env.NEXT_PUBLIC_RPC_URL || config.nodeUri, + nodeUri: process.env.NEXT_PUBLIC_NODE_URI || config.nodeUri, + oceanNodeUri: process.env.NEXT_PUBLIC_PROVIDER_URL || config.oceanNodeUri, fixedRateExchangeAddress: process.env.NEXT_PUBLIC_FIXED_RATE_EXCHANGE_ADDRESS, dispenserAddress: process.env.NEXT_PUBLIC_DISPENSER_ADDRESS, oceanTokenAddress: process.env.NEXT_PUBLIC_OCEAN_TOKEN_ADDRESS, + oceanTokenSymbol: process.env.NEXT_PUBLIC_OCEAN_TOKEN_SYMBOL || 'OCEAN', nftFactoryAddress: process.env.NEXT_PUBLIC_NFT_FACTORY_ADDRESS, - routerFactoryAddress: process.env.NEXT_PUBLIC_ROUTER_FACTORY_ADDRESS + routerFactoryAddress: process.env.NEXT_PUBLIC_ROUTER_FACTORY_ADDRESS, + accessListFactory: process.env.NEXT_PUBLIC_ACCESS_LIST_FACTORY_ADDRESS } as Config } export function getOceanConfig(network: string | number): Config { + if (!network) { + console.warn('getOceanConfig: called with undefined network') + return undefined + } let config = new ConfigHelper().getConfig( network, network === 'polygon' || @@ -33,8 +37,6 @@ export function getOceanConfig(network: string | number): Config { network === 1287 || network === 'bsc' || network === 56 || - network === 'gaiaxtestnet' || - network === 2021000 || network === 8996 ? undefined : process.env.NEXT_PUBLIC_INFURA_PROJECT_ID @@ -42,6 +44,13 @@ export function getOceanConfig(network: string | number): Config { if (network === 8996) { config = { ...config, ...sanitizeDevelopmentConfig(config) } } + + // Override RPC URL for Sepolia if it's set (the reason is ocean.js supports only infura) + if (network === 11155111 && process.env.NEXT_PUBLIC_NODE_URI) { + config.nodeUri = process.env.NEXT_PUBLIC_NODE_URI + // config.oceanNodeUri = process.env.NEXT_PUBLIC_NODE_URL + } + return config as Config } @@ -52,8 +61,8 @@ export function getDevelopmentConfig(): Config { // fixedRateExchangeAddress: contractAddresses.development?.FixedRateExchange, // metadataContractAddress: contractAddresses.development?.Metadata, // oceanTokenAddress: contractAddresses.development?.Ocean, - // There is no subgraph in barge so we hardcode the Polygon Mumbai one for now - subgraphUri: 'https://v4.subgraph.sepolia.oceanprotocol.com' + // There is no subgraph in barge so we hardcode the Sepolia one for now + // subgraphUri: 'https://v4.subgraph.sepolia.oceanprotocol.com' } as Config } diff --git a/src/@utils/order.ts b/src/@utils/order.ts index e18888557e..3e5bffc073 100644 --- a/src/@utils/order.ts +++ b/src/@utils/order.ts @@ -85,8 +85,6 @@ export async function order( switch (asset.accessDetails?.type) { case 'fixed': { - // this assumes all fees are in ocean - const freParams = { exchangeContract: config.fixedRateExchangeAddress, exchangeId: asset.accessDetails.addressOrId, @@ -135,13 +133,20 @@ export async function order( ) } if (asset.accessDetails?.templateId === 2) { + freParams.maxBaseTokenAmount = ( + Number(freParams.maxBaseTokenAmount) + + (Number(freParams.maxBaseTokenAmount) + + Number(orderPriceAndFees.opcFee)) + ).toString() const tx: any = await approve( signer, config, accountId, asset.accessDetails.baseToken.address, asset.accessDetails.datatoken.address, - orderPriceAndFees.price, + ( + Number(orderPriceAndFees.price) + Number(orderPriceAndFees.opcFee) + ).toString(), false ) diff --git a/src/@utils/provider.ts b/src/@utils/provider.ts index 0c4940ae6b..b41e03e936 100644 --- a/src/@utils/provider.ts +++ b/src/@utils/provider.ts @@ -1,7 +1,5 @@ import { Arweave, - GraphqlQuery, - Smartcontract, downloadFileBrowser, FileInfo, Ipfs, @@ -69,7 +67,8 @@ export async function getFileInfo( headers?: KeyValuePair[], abi?: string, chainId?: number, - method?: string + method?: string, + withChecksum = false ): Promise { let response const headersProvider = {} @@ -89,7 +88,8 @@ export async function getFileInfo( try { response = await ProviderInstance.getFileInfo( fileIPFS, - customProviderUrl || providerUrl + customProviderUrl || providerUrl, + withChecksum ) } catch (error) { const message = getErrorMessage(error.message) @@ -106,46 +106,8 @@ export async function getFileInfo( try { response = await ProviderInstance.getFileInfo( fileArweave, - customProviderUrl || providerUrl - ) - } catch (error) { - const message = getErrorMessage(error.message) - LoggerInstance.error('[Provider Get File info] Error:', message) - toast.error(message) - } - break - } - case 'graphql': { - const fileGraphql: GraphqlQuery = { - type: storageType, - url: file, - headers: headersProvider, - query - } - try { - response = await ProviderInstance.getFileInfo( - fileGraphql, - customProviderUrl || providerUrl - ) - } catch (error) { - const message = getErrorMessage(error.message) - LoggerInstance.error('[Provider Get File info] Error:', message) - toast.error(message) - } - break - } - case 'smartcontract': { - // clean obj - const fileSmartContract: Smartcontract = { - chainId, - type: storageType, - address: file, - abi: JSON.parse(abi) as AbiItem - } - try { - response = await ProviderInstance.getFileInfo( - fileSmartContract, - customProviderUrl || providerUrl + customProviderUrl || providerUrl, + withChecksum ) } catch (error) { const message = getErrorMessage(error.message) @@ -165,7 +127,8 @@ export async function getFileInfo( try { response = await ProviderInstance.getFileInfo( fileUrl, - customProviderUrl || providerUrl + customProviderUrl || providerUrl, + withChecksum ) } catch (error) { const message = getErrorMessage(error.message) @@ -182,11 +145,14 @@ export async function downloadFile( signer: Signer, asset: AssetExtended, accountId: string, + // verifierSessionId: string, validOrderTx?: string, userCustomParameters?: UserCustomParameters ) { let downloadUrl try { + userCustomParameters = userCustomParameters || undefined + downloadUrl = await ProviderInstance.getDownloadUrl( asset.id, asset.services[0].id, @@ -197,6 +163,7 @@ export async function downloadFile( userCustomParameters ) } catch (error) { + console.log('Error ', error) const message = getErrorMessage(error.message) LoggerInstance.error('[Provider Get download url] Error:', message) toast.error(message) diff --git a/src/@utils/subgraph.ts b/src/@utils/subgraph.ts deleted file mode 100644 index 6033796f73..0000000000 --- a/src/@utils/subgraph.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { gql, OperationResult, TypedDocumentNode, OperationContext } from 'urql' -import { LoggerInstance } from '@oceanprotocol/lib' -import { getUrqlClientInstance } from '@context/UrqlProvider' -import { getOceanConfig } from './ocean' -import { OrdersData_orders as OrdersData } from '../@types/subgraph/OrdersData' -import { OpcFeesQuery as OpcFeesData } from '../@types/subgraph/OpcFeesQuery' -import appConfig from '../../app.config.cjs' - -const UserTokenOrders = gql` - query OrdersData($user: String!) { - orders( - orderBy: createdTimestamp - orderDirection: desc - where: { consumer: $user } - ) { - consumer { - id - } - datatoken { - id - address - symbol - } - consumerMarketToken { - address - symbol - } - createdTimestamp - tx - } - } -` - -const OpcFeesQuery = gql` - query OpcFeesQuery($id: ID!) { - opc(id: $id) { - swapOceanFee - swapNonOceanFee - orderFee - providerFee - } - } -` - -const OpcsApprovedTokensQuery = gql` - query OpcsApprovedTokensQuery { - opcs { - approvedTokens { - address: id - symbol - name - decimals - } - } - } -` - -export function getSubgraphUri(chainId: number): string { - const config = getOceanConfig(chainId) - return config.subgraphUri -} - -export function getQueryContext(chainId: number): OperationContext { - try { - if (!appConfig.chainIdsSupported.includes(chainId)) - throw Object.assign( - new Error('network not supported, query context cancelled') - ) - - const queryContext: OperationContext = { - url: `${getSubgraphUri( - Number(chainId) - )}/subgraphs/name/oceanprotocol/ocean-subgraph`, - requestPolicy: 'network-only' - } - return queryContext - } catch (error) { - LoggerInstance.error('Get query context error: ', error.message) - } -} - -export async function fetchData( - query: TypedDocumentNode, - variables: any, - context: OperationContext -): Promise { - try { - const client = getUrqlClientInstance() - - const response = await client.query(query, variables, context).toPromise() - return response - } catch (error) { - LoggerInstance.error('Error fetchData: ', error.message) - } - return null -} - -export async function fetchDataForMultipleChains( - query: TypedDocumentNode, - variables: any, - chainIds: number[] -): Promise { - let datas: any[] = [] - try { - for (const chainId of chainIds) { - const context: OperationContext = getQueryContext(chainId) - const response = await fetchData(query, variables, context) - if (!response || response.error) continue - datas = datas.concat(response?.data) - } - return datas - } catch (error) { - LoggerInstance.error('Error fetchDataForMultipleChains: ', error.message) - } -} - -export async function getOpcFees(chainId: number) { - let opcFees - const variables = { - id: 1 - } - const context = getQueryContext(chainId) - try { - const response: OperationResult = await fetchData( - OpcFeesQuery, - variables, - context - ) - opcFees = response?.data?.opc - } catch (error) { - LoggerInstance.error('Error getOpcFees: ', error.message) - throw Error(error.message) - } - return opcFees -} - -export async function getUserTokenOrders( - accountId: string, - chainIds: number[] -): Promise { - const data: OrdersData[] = [] - const variables = { user: accountId?.toLowerCase() } - - try { - const tokenOrders = await fetchDataForMultipleChains( - UserTokenOrders, - variables, - chainIds - ) - for (let i = 0; i < tokenOrders?.length; i++) { - tokenOrders[i].orders.forEach((tokenOrder: OrdersData) => { - data.push(tokenOrder) - }) - } - - return data - } catch (error) { - LoggerInstance.error('Error getUserTokenOrders', error.message) - } -} - -export async function getOpcsApprovedTokens( - chainId: number -): Promise { - const context = getQueryContext(chainId) - - try { - const response = await fetchData(OpcsApprovedTokensQuery, null, context) - return response?.data?.opcs[0].approvedTokens - } catch (error) { - LoggerInstance.error('Error getOpcsApprovedTokens: ', error.message) - throw Error(error.message) - } -} diff --git a/src/@utils/wallet/chains.ts b/src/@utils/wallet/chains.ts new file mode 100644 index 0000000000..fd7db4b4d6 --- /dev/null +++ b/src/@utils/wallet/chains.ts @@ -0,0 +1,29 @@ +import { Chain } from 'wagmi' +import * as wagmiChains from 'wagmi/chains' + +export const getSupportedChains = (chainIdsSupported: number[]): Chain[] => { + const supportedChains = [wagmiChains] + .map((chain) => { + return Object.values(chain).filter((chain) => + chainIdsSupported.includes(chain.id) + ) + }) + .flat() + + // Current version of wagmi doesn't support custom RPCs (e.g blastapi) + // Override RPC URLs for chains if it's set in env + const chains = supportedChains.map((chain) => { + if (chain.id === 11155111 && process.env.NEXT_PUBLIC_NODE_URI) { + return { + ...chain, + rpcUrls: { + public: { http: [process.env.NEXT_PUBLIC_NODE_URI] }, + default: { http: [process.env.NEXT_PUBLIC_NODE_URI] } + } + } + } + return chain + }) + + return chains +} diff --git a/src/@utils/wallet/index.ts b/src/@utils/wallet/index.ts index 12f6b74f44..7c3d559d46 100644 --- a/src/@utils/wallet/index.ts +++ b/src/@utils/wallet/index.ts @@ -1,11 +1,14 @@ import { LoggerInstance } from '@oceanprotocol/lib' import { createClient, erc20ABI } from 'wagmi' import { mainnet, polygon, optimism, sepolia } from 'wagmi/chains' +import { localhost } from '@wagmi/core/chains' import { ethers, Contract, Signer } from 'ethers' import { formatEther } from 'ethers/lib/utils' import { getDefaultClient } from 'connectkit' import { getNetworkDisplayName } from '@hooks/useNetworkMetadata' import { getOceanConfig } from '../ocean' +import { getSupportedChains } from './chains' +import { chainIdsSupported } from '../../../app.config.cjs' export async function getDummySigner(chainId: number): Promise { if (typeof chainId !== 'number') { @@ -25,12 +28,15 @@ export async function getDummySigner(chainId: number): Promise { } // Wagmi client +const chains = [...getSupportedChains(chainIdsSupported)] +if (process.env.NEXT_PUBLIC_MARKET_DEVELOPMENT === 'true') { + chains.push({ ...localhost, id: 8996 }) +} export const wagmiClient = createClient( getDefaultClient({ appName: 'Ocean Market', infuraId: process.env.NEXT_PUBLIC_INFURA_PROJECT_ID, - // TODO: mapping between appConfig.chainIdsSupported and wagmi chainId - chains: [mainnet, polygon, optimism, sepolia], + chains, walletConnectProjectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID }) ) diff --git a/src/components/@shared/AssetListTitle/index.tsx b/src/components/@shared/AssetListTitle/index.tsx index e8b705ffe7..e60413083c 100644 --- a/src/components/@shared/AssetListTitle/index.tsx +++ b/src/components/@shared/AssetListTitle/index.tsx @@ -3,7 +3,7 @@ import React, { ReactElement, useEffect, useState } from 'react' import { getAssetsNames } from '@utils/aquarius' import styles from './index.module.css' import axios from 'axios' -import { Asset } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' import { useMarketMetadata } from '@context/MarketMetadata' export default function AssetListTitle({ diff --git a/src/components/@shared/AssetTeaser/index.tsx b/src/components/@shared/AssetTeaser/index.tsx index bd35ffacdb..14e9f5f160 100644 --- a/src/components/@shared/AssetTeaser/index.tsx +++ b/src/components/@shared/AssetTeaser/index.tsx @@ -25,14 +25,14 @@ export default function AssetTeaser({ const { name, type, description } = asset.metadata const { datatokens } = asset const accessType = 'access' - const { owner } = asset.nft - const { orders, allocated, price } = asset.stats + const owner = asset.indexedMetadata?.nft?.owner + const orders = asset.indexedMetadata?.stats[0]?.orders + const price = asset.indexedMetadata?.stats[0]?.prices[0] const isUnsupportedPricing = !asset.services.length || - price.value === undefined || + price === undefined || asset?.accessDetails?.type === 'NOT_SUPPORTED' const { locale } = useUserPreferences() - return (
diff --git a/src/components/@shared/DirectMessages/DmButton.tsx b/src/components/@shared/DirectMessages/DmButton.tsx index 461f9a4e02..0939129c72 100644 --- a/src/components/@shared/DirectMessages/DmButton.tsx +++ b/src/components/@shared/DirectMessages/DmButton.tsx @@ -1,7 +1,6 @@ import React, { useEffect, useState } from 'react' import Button from '@shared/atoms/Button' -import styles from './DmButton.module.css' -import { useAccount, useConnect } from 'wagmi' +import { useAccount } from 'wagmi' import { useOrbis } from '@context/DirectMessages' export default function DmButton({ diff --git a/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx b/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx index 37bd5f8d5b..9d38037e52 100644 --- a/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx +++ b/src/components/@shared/FormInput/InputElement/FilesInput/index.tsx @@ -32,7 +32,7 @@ export default function FilesInput(props: InputProps): ReactElement { const query = field.value[0].query || undefined const abi = field.value[0].abi || undefined const headers = field.value[0].headers || undefined - const method = field.value[0].method || undefined + const method = field.value[0].method || 'GET' async function handleValidation(e: React.SyntheticEvent, url: string) { // File example 'https://oceanprotocol.com/tech-whitepaper.pdf' diff --git a/src/components/@shared/FormInput/InputElement/Provider/index.tsx b/src/components/@shared/FormInput/InputElement/Provider/index.tsx index 78c844c57e..3704da8ed5 100644 --- a/src/components/@shared/FormInput/InputElement/Provider/index.tsx +++ b/src/components/@shared/FormInput/InputElement/Provider/index.tsx @@ -1,4 +1,4 @@ -import React, { ReactElement, useState } from 'react' +import React, { ReactElement, useEffect, useState } from 'react' import { useField, useFormikContext } from 'formik' import UrlInput from '../URLInput' import { InputProps } from '@shared/FormInput' @@ -16,6 +16,7 @@ import axios from 'axios' import { useCancelToken } from '@hooks/useCancelToken' import { useNetwork } from 'wagmi' import { toast } from 'react-toastify' +import { customProviderUrl } from 'app.config.cjs' export default function CustomProvider(props: InputProps): ReactElement { const { chain } = useNetwork() @@ -24,6 +25,10 @@ export default function CustomProvider(props: InputProps): ReactElement { const [field, meta, helpers] = useField(props.name) const [isLoading, setIsLoading] = useState(false) + useEffect(() => { + helpers.setValue({ url: customProviderUrl, valid: true, custom: true }) + }, []) + async function handleValidation(e: React.SyntheticEvent) { e.preventDefault() @@ -52,7 +57,7 @@ export default function CustomProvider(props: InputProps): ReactElement { const providerResponse = await axios.get(field.value.url, { cancelToken: newCancelToken() }) - const userChainId = chain?.id || 1 + const userChainId = String(chain?.id) || 1 const providerChain = providerResponse?.data?.chainId || providerResponse?.data?.chainIds @@ -91,12 +96,12 @@ export default function CustomProvider(props: InputProps): ReactElement { function handleDefault(e: React.SyntheticEvent) { e.preventDefault() - - const oceanConfig = getOceanConfig(chain?.id) + const oceanConfig = getOceanConfig(chain?.id || 100) const providerUrl = - oceanConfig?.providerUri || initialValues.services[0].providerUrl.url - - helpers.setValue({ url: providerUrl, valid: true, custom: false }) + customProviderUrl || + oceanConfig?.oceanNodeUri || + initialValues.services[0].providerUrl.url + helpers.setValue({ url: providerUrl, valid: true, custom: true }) } return field?.value?.valid === true ? ( diff --git a/src/components/@shared/Price/PriceUnit.tsx b/src/components/@shared/Price/PriceUnit.tsx index 7b551f84ef..1c8149defa 100644 --- a/src/components/@shared/Price/PriceUnit.tsx +++ b/src/components/@shared/Price/PriceUnit.tsx @@ -21,21 +21,29 @@ export default function PriceUnit({ }): ReactElement { const { locale } = useUserPreferences() + if (price === 0) { + return ( +
Free
+ ) + } + + if (isNaN(price)) { + return ( +
+ Invalid Price +
+ ) + } + return (
- {price === 0 ? ( -
Free
- ) : !price || Number.isNaN(price) ? ( -
-
- ) : ( - <> -
- {formatNumber(price, locale, decimals)} - {symbol} -
- {conversion && } - - )} + <> +
+ {formatNumber(price, locale, decimals)} + {symbol} +
+ {conversion && } +
) } diff --git a/src/components/@shared/Price/index.test.tsx b/src/components/@shared/Price/index.test.tsx index 112c1f6e33..14989150b8 100644 --- a/src/components/@shared/Price/index.test.tsx +++ b/src/components/@shared/Price/index.test.tsx @@ -13,25 +13,51 @@ describe('@shared/Price', () => { it('renders fixed price', () => { render( ) expect(screen.getByText('10')).toBeInTheDocument() }) it('renders free price', () => { - render() + render( + + ) expect(screen.getByText('Free')).toBeInTheDocument() }) - it('renders null price', () => { - render() - expect(screen.getByText('-')).toBeInTheDocument() - }) + // it('renders null price', () => { + // render() + // expect(screen.getByText('-')).toBeInTheDocument() + // }) it('renders conversion', async () => { - render() + render( + + ) expect(await screen.findByText('≈')).toBeInTheDocument() }) it('renders no conversion when no price defined', async () => { - render() + render( + + ) expect(screen.queryByText('≈')).not.toBeInTheDocument() }) }) diff --git a/src/components/@shared/Price/index.tsx b/src/components/@shared/Price/index.tsx index f70673ad9c..e6010458f3 100644 --- a/src/components/@shared/Price/index.tsx +++ b/src/components/@shared/Price/index.tsx @@ -1,6 +1,8 @@ import React, { ReactElement } from 'react' -import { AssetPrice } from '@oceanprotocol/lib' +import { AssetPrice } from '@oceanprotocol/ddo-js' import PriceUnit from './PriceUnit' +import { getOceanConfig } from '@utils/ocean' +import Loader from '@shared/atoms/Loader' export default function Price({ price, @@ -16,11 +18,26 @@ export default function Price({ conversion?: boolean size?: 'small' | 'mini' | 'large' }): ReactElement { + const oceanConfig = getOceanConfig(11155111) + const symbol = oceanConfig.oceanTokenSymbol + if (!price && !orderPriceAndFees) return + if (!price || price.price === undefined || price.price === null) { + return + } + + const rawPrice = price?.price + console.log('Raw price', rawPrice) + const parsedPrice = + rawPrice === null || rawPrice === undefined + ? null + : isNaN(Number(rawPrice)) + ? NaN + : Number(rawPrice) return ( - {!asset?.stats || asset?.stats?.orders < 0 ? ( + {!asset?.indexedMetadata.stats || + asset?.indexedMetadata.stats[0]?.orders < 0 ? ( N/A - ) : asset?.stats?.orders === 0 ? ( + ) : asset?.indexedMetadata?.stats[0]?.orders === 0 ? ( No sales yet ) : ( - {asset.stats.orders} sale - {asset.stats.orders === 1 ? '' : 's'} + + {asset.indexedMetadata?.stats[0].orders} + {' '} + sale + {asset?.indexedMetadata?.stats[0]?.orders === 1 ? '' : 's'} )} diff --git a/src/components/Asset/AssetActions/ButtonBuy/index.tsx b/src/components/Asset/AssetActions/ButtonBuy/index.tsx index d25eb2ca64..9ed1957ac7 100644 --- a/src/components/Asset/AssetActions/ButtonBuy/index.tsx +++ b/src/components/Asset/AssetActions/ButtonBuy/index.tsx @@ -54,7 +54,7 @@ function getConsumeHelpText( : hasPreviousOrder && isAccountConnected && isSupportedOceanNetwork ? `You bought this ${assetType} already allowing you to use it without paying again.` : hasDatatoken - ? `You own ${dtBalance} ${dtSymbol} allowing you to use this dataset by spending 1 ${dtSymbol}, but without paying ${btSymbol} again.` + ? `To use this dataset, you will buy 1 ${dtSymbol} and immediately send it back to the publisher.` : isBalanceSufficient === false ? `You do not have enough ${btSymbol} in your wallet to purchase this asset.` : priceType === 'free' diff --git a/src/components/Asset/AssetActions/ConsumerParameters/FormConsumerParameters.tsx b/src/components/Asset/AssetActions/ConsumerParameters/FormConsumerParameters.tsx index 11298f33a0..e58efb1de4 100644 --- a/src/components/Asset/AssetActions/ConsumerParameters/FormConsumerParameters.tsx +++ b/src/components/Asset/AssetActions/ConsumerParameters/FormConsumerParameters.tsx @@ -3,7 +3,8 @@ import Input from '@shared/FormInput' import Label from '@shared/FormInput/Label' import { Field, useField } from 'formik' import styles from './FormConsumerParameters.module.css' -import { ConsumerParameter, UserCustomParameters } from '@oceanprotocol/lib' +import { UserCustomParameters } from '@oceanprotocol/lib' +import { ConsumerParameter } from '@oceanprotocol/ddo-js' export function getDefaultValues( parameters: ConsumerParameter[] diff --git a/src/components/Asset/AssetActions/ConsumerParameters/_validation.ts b/src/components/Asset/AssetActions/ConsumerParameters/_validation.ts index 3f60af0b72..203012b07c 100644 --- a/src/components/Asset/AssetActions/ConsumerParameters/_validation.ts +++ b/src/components/Asset/AssetActions/ConsumerParameters/_validation.ts @@ -1,4 +1,4 @@ -import { ConsumerParameter } from '@oceanprotocol/lib' +import { ConsumerParameter } from '@oceanprotocol/ddo-js' import * as Yup from 'yup' import { SchemaLike } from 'yup/lib/types' diff --git a/src/components/Asset/AssetActions/ConsumerParameters/index.tsx b/src/components/Asset/AssetActions/ConsumerParameters/index.tsx index ebf3b3077d..e60955d9ec 100644 --- a/src/components/Asset/AssetActions/ConsumerParameters/index.tsx +++ b/src/components/Asset/AssetActions/ConsumerParameters/index.tsx @@ -2,7 +2,8 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react' import FormConsumerParameters from './FormConsumerParameters' import styles from './index.module.css' import Tabs, { TabsItem } from '@shared/atoms/Tabs' -import { ConsumerParameter, UserCustomParameters } from '@oceanprotocol/lib' +import { UserCustomParameters } from '@oceanprotocol/lib' +import { ConsumerParameter } from '@oceanprotocol/ddo-js' export function parseConsumerParameterValues( formValues?: UserCustomParameters, diff --git a/src/components/Asset/AssetActions/Download/_validation.ts b/src/components/Asset/AssetActions/Download/_validation.ts index 12bfdade2b..53616867f3 100644 --- a/src/components/Asset/AssetActions/Download/_validation.ts +++ b/src/components/Asset/AssetActions/Download/_validation.ts @@ -1,6 +1,6 @@ import * as Yup from 'yup' import { getUserCustomParameterValidationSchema } from '../ConsumerParameters/_validation' -import { ConsumerParameter } from '@oceanprotocol/lib' +import { ConsumerParameter } from '@oceanprotocol/ddo-js' export function getDownloadValidationSchema( parameters: ConsumerParameter[] diff --git a/src/components/Asset/AssetActions/Download/index.tsx b/src/components/Asset/AssetActions/Download/index.tsx index 72db7c1616..9a1314d7cf 100644 --- a/src/components/Asset/AssetActions/Download/index.tsx +++ b/src/components/Asset/AssetActions/Download/index.tsx @@ -6,12 +6,12 @@ import ButtonBuy from '../ButtonBuy' import { secondsToString } from '@utils/ddo' import styles from './index.module.css' import { - AssetPrice, FileInfo, LoggerInstance, UserCustomParameters, ZERO_ADDRESS } from '@oceanprotocol/lib' +import { AssetPrice, Service } from '@oceanprotocol/ddo-js' import { order } from '@utils/order' import { downloadFile } from '@utils/provider' import { getOrderFeedback } from '@utils/feedback' @@ -39,9 +39,14 @@ export default function Download({ isBalanceSufficient, dtBalance, fileIsLoading, - consumableFeedback + consumableFeedback, + service, + accessDetails }: { asset: AssetExtended + service?: Service + accessDetails?: AccessDetails + serviceIndex?: number file: FileInfo isBalanceSufficient: boolean dtBalance: string @@ -63,11 +68,11 @@ export default function Download({ const [isOwned, setIsOwned] = useState(false) const [validOrderTx, setValidOrderTx] = useState('') const [isOrderDisabled, setIsOrderDisabled] = useState(false) + const [assetPrice, setAssetPrice] = useState(null) const [orderPriceAndFees, setOrderPriceAndFees] = useState() const [retry, setRetry] = useState(false) - const price: AssetPrice = getAvailablePrice(asset) const isUnsupportedPricing = !asset?.accessDetails || !asset.services.length || @@ -76,8 +81,12 @@ export default function Download({ !asset?.accessDetails?.baseToken?.symbol) useEffect(() => { - Number(asset?.nft.state) === 4 && setIsOrderDisabled(true) - }, [asset?.nft.state]) + const price: AssetPrice = getAvailablePrice(accessDetails) + setAssetPrice(price) + }, [accessDetails]) + useEffect(() => { + Number(asset?.indexedMetadata?.nft.state) === 4 && setIsOrderDisabled(true) + }, [asset?.indexedMetadata?.nft.state]) useEffect(() => { if (isUnsupportedPricing) return @@ -95,9 +104,10 @@ export default function Download({ try { !orderPriceAndFees && setIsPriceLoading(true) - const _orderPriceAndFees = await getOrderPriceAndFees( asset, + service || asset.services[0], + accessDetails, ZERO_ADDRESS ) setOrderPriceAndFees(_orderPriceAndFees) @@ -108,7 +118,7 @@ export default function Download({ } } - init() + if (!orderPriceAndFees) init() /** * we listen to the assets' changes to get the most updated price @@ -208,7 +218,7 @@ export default function Download({ hasPreviousOrder={isOwned} hasDatatoken={hasDatatoken} btSymbol={asset?.accessDetails?.baseToken?.symbol} - dtSymbol={asset?.datatokens[0]?.symbol} + dtSymbol={asset?.indexedMetadata?.stats[0]?.symbol} dtBalance={dtBalance} type="submit" assetTimeout={secondsToString(asset?.services?.[0]?.timeout)} @@ -227,6 +237,9 @@ export default function Download({ const AssetAction = ({ asset }: { asset: AssetExtended }) => { const { isValid } = useFormikContext() + const isPricingLoaded = + asset?.accessDetails?.type === 'free' || + (!isPriceLoading && orderPriceAndFees) return (
@@ -236,23 +249,21 @@ export default function Download({ state="info" text={`The publisher temporarily disabled ordering for this asset`} /> + ) : !isPricingLoaded ? ( + + ) : isUnsupportedPricing ? ( + ) : ( <> - {isUnsupportedPricing ? ( - - ) : ( - <> - {asset && } - {!isInPurgatory && ( -
- -
- )} - + {asset && } + {!isInPurgatory && ( +
+ +
)} )} @@ -275,7 +286,6 @@ export default function Download({ values?.dataServiceParams, asset.services[0].consumerParameters ) - await handleOrderOrDownload(dataServiceParams) }} > @@ -290,7 +300,11 @@ export default function Download({ ) : ( { - if (!web3Provider || !accountId || !isAssetNetwork) return + const isReady = + web3Provider && + accountId && + asset?.accessDetails?.baseToken?.address && + isAssetNetwork + + if (!isReady) return async function init() { try { const datatokenInstance = new Datatoken(web3Provider as any) const dtBalance = await datatokenInstance.balance( - asset.services[0].datatokenAddress, + asset.accessDetails.baseToken.address, accountId ) setDtBalance(dtBalance) - } catch (e) { - LoggerInstance.error(e.message) + } catch (e: any) { + LoggerInstance.error('[DT Balance Error]', e.message || e) } } + init() }, [web3Provider, accountId, asset, isAssetNetwork]) @@ -151,6 +158,7 @@ export default function AssetActions({ isBalanceSufficient={isBalanceSufficient} file={fileMetadata} fileIsLoading={fileIsLoading} + accessDetails={asset.accessDetails} // Ensure this is passed />
diff --git a/src/components/Asset/AssetContent/EditHistory.tsx b/src/components/Asset/AssetContent/EditHistory.tsx deleted file mode 100644 index e6c7bcdcb0..0000000000 --- a/src/components/Asset/AssetContent/EditHistory.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import React, { ReactElement, useEffect, useState } from 'react' -import { useAsset } from '@context/Asset' -import ExplorerLink from '@shared/ExplorerLink' -import Time from '@shared/atoms/Time' -import { gql, OperationContext, useQuery } from 'urql' -import { NftUpdate_nftUpdates as NftUpdate } from '../../../@types/subgraph/NftUpdate' -import { getQueryContext } from '@utils/subgraph' -import styles from './EditHistory.module.css' - -const getReceipts = gql` - query NftUpdate($address: String!) { - nftUpdates( - where: { nft: $address } - orderBy: timestamp - orderDirection: desc - ) { - id - nft { - address - } - tx - timestamp - type - } - } -` - -export default function EditHistory({ - receipts, - setReceipts -}: { - receipts: NftUpdate[] - setReceipts: (receipts: NftUpdate[]) => void -}): ReactElement { - const { asset } = useAsset() - - function getUpdateType(type: string): string { - switch (type) { - case 'METADATA_CREATED': - return 'published' - case 'METADATA_UPDATED': - return 'updated' - case 'STATE_UPDATED': - return 'state updated' - case 'TOKENURI_UPDATED': - return 'NFT metadata updated' - default: - return '' - } - } - // - // 1. Construct subgraph query based on DDO. - // Need to wait for it to avoid infinite rerender loop with useQuery. - // - const [queryContext, setQueryContext] = useState() - - useEffect(() => { - if (!asset) return - - const queryContext = getQueryContext(asset.chainId) - setQueryContext(queryContext) - }, [asset]) - - const [result] = useQuery({ - query: getReceipts, - variables: { address: asset?.nft.address.toLowerCase() }, - context: queryContext, - pause: !asset || !queryContext - }) - const { data } = result - - // - // 2. Construct display data based on fetched data. - // - useEffect(() => { - if (!data || data.nftUpdates.length === 0) return - const receiptCollection = data.nftUpdates - setReceipts(receiptCollection) - }, [data, setReceipts]) - - return ( - <> -

Metadata History

-
    - {receipts?.map((receipt) => ( -
  • - - {getUpdateType(receipt.type)}{' '} - -
  • - ))} -
- - ) -} diff --git a/src/components/Asset/AssetContent/MetaFull.tsx b/src/components/Asset/AssetContent/MetaFull.tsx index f30b840801..9e1aecb13d 100644 --- a/src/components/Asset/AssetContent/MetaFull.tsx +++ b/src/components/Asset/AssetContent/MetaFull.tsx @@ -3,25 +3,38 @@ import MetaItem from './MetaItem' import styles from './MetaFull.module.css' import Publisher from '@shared/Publisher' import { useAsset } from '@context/Asset' -import { Asset, LoggerInstance, Datatoken } from '@oceanprotocol/lib' -import { getPaymentCollector } from '@utils/ocean' -import { useProvider } from 'wagmi' +import { LoggerInstance, Datatoken } from '@oceanprotocol/lib' +// import { Asset } from '@oceanprotocol/ddo-js' import { getDummySigner } from '@utils/wallet' -export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement { +export default function MetaFull({ + ddo +}: { + ddo: AssetExtended +}): ReactElement { const { isInPurgatory, assetState } = useAsset() const [paymentCollector, setPaymentCollector] = useState() useEffect(() => { - if (!ddo) return + if (!ddo.datatokens[0]?.address) { + LoggerInstance.error('Datatoken address missing from DDO') + return + } async function getInitialPaymentCollector() { try { const signer = await getDummySigner(ddo.chainId) - const datatoken = new Datatoken(signer) + const datatoken = new Datatoken(signer, ddo.chainId) + const { address } = ddo.datatokens[0] + + LoggerInstance.log('[MetaFull] Using datatoken address:', address) + + // const collector = await datatoken.getPaymentCollector(address) setPaymentCollector( - await datatoken.getPaymentCollector(ddo.datatokens[0].address) + await datatoken.getPaymentCollector( + ddo.indexedMetadata.stats[0].datatokenAddress || '' + ) ) } catch (error) { LoggerInstance.error( @@ -30,6 +43,7 @@ export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement { ) } } + getInitialPaymentCollector() }, [ddo]) @@ -46,17 +60,18 @@ export default function MetaFull({ ddo }: { ddo: Asset }): ReactElement { )} } + content={} /> {assetState !== 'Active' && ( )} - {paymentCollector && paymentCollector !== ddo?.nft?.owner && ( - } - /> - )} + {paymentCollector && + paymentCollector !== ddo?.indexedMetadata.nft?.owner && ( + } + /> + )} {ddo?.metadata?.type === 'algorithm' && ddo?.metadata?.algorithm && ( } /> diff --git a/src/components/Asset/AssetContent/MetaMain/MetaAsset.tsx b/src/components/Asset/AssetContent/MetaMain/MetaAsset.tsx index d4f160622d..185698546e 100644 --- a/src/components/Asset/AssetContent/MetaMain/MetaAsset.tsx +++ b/src/components/Asset/AssetContent/MetaMain/MetaAsset.tsx @@ -1,11 +1,12 @@ import { useAsset } from '@context/Asset' -import { Asset } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' import AddToken from '@shared/AddToken' import ExplorerLink from '@shared/ExplorerLink' import Publisher from '@shared/Publisher' import React, { ReactElement } from 'react' import { useAccount } from 'wagmi' import styles from './MetaAsset.module.css' +import { getOceanConfig } from '@utils/ocean' export default function MetaAsset({ asset, @@ -14,6 +15,8 @@ export default function MetaAsset({ asset: AssetExtended isBlockscoutExplorer: boolean }): ReactElement { + const oceanConfig = getOceanConfig(11155111) // replace chainId with actual id + const symbol = oceanConfig.oceanTokenSymbol const { isAssetNetwork } = useAsset() const { connector: activeConnector } = useAccount() @@ -22,7 +25,7 @@ export default function MetaAsset({ return (
- Owned by + Owned by diff --git a/src/components/Asset/AssetContent/MetaMain/MetaInfo.tsx b/src/components/Asset/AssetContent/MetaMain/MetaInfo.tsx index 64b6bd1af9..9eebd5d987 100644 --- a/src/components/Asset/AssetContent/MetaMain/MetaInfo.tsx +++ b/src/components/Asset/AssetContent/MetaMain/MetaInfo.tsx @@ -12,7 +12,7 @@ export default function MetaInfo({ nftPublisher: string }): ReactElement { const accessType = 'access' - const nftOwner = asset?.nft?.owner + const nftOwner = asset?.indexedMetadata?.nft?.owner return (
diff --git a/src/components/Asset/AssetContent/MetaSecondary.tsx b/src/components/Asset/AssetContent/MetaSecondary.tsx index e3b58e2d93..f2fe941d99 100644 --- a/src/components/Asset/AssetContent/MetaSecondary.tsx +++ b/src/components/Asset/AssetContent/MetaSecondary.tsx @@ -3,7 +3,7 @@ import MetaItem from './MetaItem' import styles from './MetaSecondary.module.css' import Tags from '@shared/atoms/Tags' import Button from '@shared/atoms/Button' -import { Asset } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' const SampleButton = ({ url }: { url: string }) => (
@@ -92,7 +90,7 @@ export default function AssetContent({ isAssetNetwork={isAssetNetwork} />
- +
diff --git a/src/components/Asset/Edit/DebugEditMetadata.tsx b/src/components/Asset/Edit/DebugEditMetadata.tsx index 286d6ec4e2..5ad5ad7df1 100644 --- a/src/components/Asset/Edit/DebugEditMetadata.tsx +++ b/src/components/Asset/Edit/DebugEditMetadata.tsx @@ -1,4 +1,4 @@ -import { Asset, Metadata, Service } from '@oceanprotocol/lib' +import { Asset, Metadata, Service } from '@oceanprotocol/ddo-js' import React, { ReactElement, useEffect, useState } from 'react' import DebugOutput from '@shared/DebugOutput' import { MetadataEditForm } from './_types' diff --git a/src/components/Asset/Edit/EditMetadata.tsx b/src/components/Asset/Edit/EditMetadata.tsx index 1dcdccfd1c..bd7039655d 100644 --- a/src/components/Asset/Edit/EditMetadata.tsx +++ b/src/components/Asset/Edit/EditMetadata.tsx @@ -3,12 +3,10 @@ import { Formik } from 'formik' import { LoggerInstance, FixedRateExchange, - Asset, Datatoken, - Nft, - Metadata, - Service + Nft } from '@oceanprotocol/lib' +import { Asset, Metadata, Service } from '@oceanprotocol/ddo-js' import { validationSchema } from './_validation' import { getInitialValues } from './_constants' import { MetadataEditForm } from './_types' @@ -162,7 +160,7 @@ export default function Edit({ // delete custom helper properties injected in the market so we don't write them on chain delete (updatedAsset as AssetExtended).accessDetails delete (updatedAsset as AssetExtended).datatokens - delete (updatedAsset as AssetExtended).stats + delete (updatedAsset as AssetExtended).indexedMetadata?.stats const setMetadataTx = await setNftMetadata( updatedAsset, accountId, diff --git a/src/components/Asset/Edit/_constants.ts b/src/components/Asset/Edit/_constants.ts index 12f09b95ce..b3786c5271 100644 --- a/src/components/Asset/Edit/_constants.ts +++ b/src/components/Asset/Edit/_constants.ts @@ -1,4 +1,4 @@ -import { Metadata, Service } from '@oceanprotocol/lib' +import { Metadata, Service } from '@oceanprotocol/ddo-js' import { parseConsumerParameters, secondsToString } from '@utils/ddo' import { MetadataEditForm } from './_types' diff --git a/src/components/Asset/RelatedAssets/_utils.ts b/src/components/Asset/RelatedAssets/_utils.ts index 40232bdd8f..eae0cb3c56 100644 --- a/src/components/Asset/RelatedAssets/_utils.ts +++ b/src/components/Asset/RelatedAssets/_utils.ts @@ -22,10 +22,10 @@ export function generateQuery( tags && { terms: { 'metadata.tags.keyword': tags } }, - owner && { term: { 'nft.owner.keyword': owner } } + owner && { term: { 'indexedMetadata.nft.owner.keyword': owner } } ], sort: { - 'stats.orders': 'desc' + 'indexedMetadata.stats.orders': 'desc' }, sortOptions: { sortBy: SortTermOptions.Orders diff --git a/src/components/Asset/RelatedAssets/index.tsx b/src/components/Asset/RelatedAssets/index.tsx index 34f4c0fb69..de4a7c4cc3 100644 --- a/src/components/Asset/RelatedAssets/index.tsx +++ b/src/components/Asset/RelatedAssets/index.tsx @@ -1,5 +1,6 @@ import React, { ReactElement, useEffect, useState } from 'react' -import { Asset, LoggerInstance } from '@oceanprotocol/lib' +import { LoggerInstance } from '@oceanprotocol/lib' +import { Asset } from '@oceanprotocol/ddo-js' import { generateBaseQuery, queryMetadata } from '@utils/aquarius' import { useUserPreferences } from '@context/UserPreferences' import { useAsset } from '@context/Asset' @@ -20,7 +21,7 @@ export default function RelatedAssets(): ReactElement { if ( !chainIds?.length || !asset?.nftAddress || - !asset?.nft || + !asset?.indexedMetadata?.nft || !asset?.metadata ) { return @@ -51,7 +52,7 @@ export default function RelatedAssets(): ReactElement { asset.nftAddress, 4 - tagResults.length, null, - asset.nft.owner + asset.indexedMetadata.nft.owner ) ) diff --git a/src/components/Asset/index.tsx b/src/components/Asset/index.tsx index edc1cf761d..b732fd3233 100644 --- a/src/components/Asset/index.tsx +++ b/src/components/Asset/index.tsx @@ -9,6 +9,7 @@ import AssetContent from './AssetContent' export default function AssetDetails({ uri }: { uri: string }): ReactElement { const router = useRouter() const { asset, title, error, isInPurgatory, loading } = useAsset() + const [pageTitle, setPageTitle] = useState() useEffect(() => { diff --git a/src/components/Footer/MarketStats/Total.tsx b/src/components/Footer/MarketStats/Total.tsx index 34ee13b181..97fa1ba060 100644 --- a/src/components/Footer/MarketStats/Total.tsx +++ b/src/components/Footer/MarketStats/Total.tsx @@ -1,17 +1,74 @@ import PriceUnit from '@shared/Price/PriceUnit' -import React, { ReactElement } from 'react' +import React, { ReactElement, useEffect, useState, useCallback } from 'react' +import { useRouter } from 'next/router' import { StatsTotal } from './_types' +import { getResults, updateQueryStringParameter } from '../../Search/utils' +import { useDebouncedCallback } from 'use-debounce' +import queryString from 'query-string' +import { useCancelToken } from '@hooks/useCancelToken' +import { useUserPreferences } from '@context/UserPreferences' +import { generateBaseQuery, queryStats } from '@utils/aquarius' export default function MarketStatsTotal({ total }: { total: StatsTotal }): ReactElement { + const [parsed, setParsed] = useState>() + const { chainIds } = useUserPreferences() + const [totalOrders, setTotalOrders] = useState(0) + const [totalAssets, setTotalAssets] = useState(0) + const [queryResult, setQueryResult] = useState() + const [loading, setLoading] = useState(true) + const newCancelToken = useCancelToken() + + const baseQueryParams = { + chainIds, + query: {}, + esPaginationOptions: { from: 0, size: 0 } + } as BaseQueryParams + + const fetchAssets = useDebouncedCallback(async () => { + const query = generateBaseQuery(baseQueryParams) + + setLoading(true) + const result = await queryStats(query, newCancelToken()) + setTotalOrders(result.totalOrders) + setTotalAssets(result.pagedAssets.totalResults) + setLoading(false) + }, 500) + + useEffect(() => { + if (!chainIds) return + + fetchAssets() + }, [chainIds, fetchAssets]) + return ( <> - orders across{' '} - assets with{' '} - different datatokens. + {loading ? ( + Loading statistics... + ) : ( + <> + orders + across {' '} + assets + {/* with{' '} + {' '} + different datatokens. */} +
+ Debug info:{' '} + {JSON.stringify({ + queryResult, + parsed, + chainIds + })} +
+ + )} ) } diff --git a/src/components/Footer/MarketStats/index.tsx b/src/components/Footer/MarketStats/index.tsx index c0ddccf725..31e8c5af37 100644 --- a/src/components/Footer/MarketStats/index.tsx +++ b/src/components/Footer/MarketStats/index.tsx @@ -1,6 +1,6 @@ import React, { ReactElement, useCallback, useEffect, useState } from 'react' import { OperationContext } from 'urql' -import { fetchData, getSubgraphUri } from '@utils/subgraph' +// import { fetchData, getSubgraphUri } from '@utils/subgraph' import useNetworkMetadata, { filterNetworksByType } from '@hooks/useNetworkMetadata' @@ -17,9 +17,9 @@ import content from '../../../../content/footer.json' import Loader from '@components/@shared/atoms/Loader' const initialTotal: StatsTotal = { - nfts: 0, - datatokens: 0, - orders: 0 + nfts: 32, + datatokens: 12, + orders: 14 } function LoaderArea() { @@ -57,36 +57,36 @@ export default function MarketStats(): ReactElement { // // Helper: fetch data from subgraph // - const getMarketStats = useCallback(async () => { - if (!mainChainIds?.length) return - const newData: { - [chainId: number]: FooterStatsValuesGlobalStatistics - } = {} - for (const chainId of mainChainIds) { - const context: OperationContext = { - url: `${getSubgraphUri( - chainId - )}/subgraphs/name/oceanprotocol/ocean-subgraph`, - requestPolicy: 'network-only' - } + // const getMarketStats = useCallback(async () => { + // if (!mainChainIds?.length) return + // const newData: { + // [chainId: number]: FooterStatsValuesGlobalStatistics + // } = {} + // for (const chainId of mainChainIds) { + // const context: OperationContext = { + // url: `${getSubgraphUri( + // chainId + // )}/subgraphs/name/oceanprotocol/ocean-subgraph`, + // requestPolicy: 'network-only' + // } - try { - const response = await fetchData(queryGlobalStatistics, null, context) - if (!response?.data?.globalStatistics) return - newData[chainId] = response.data.globalStatistics[0] - } catch (error) { - LoggerInstance.error('Error fetching global stats: ', error.message) - } - } - setData(newData) - }, [mainChainIds]) + // try { + // const response = await fetchData(queryGlobalStatistics, null, context) + // if (!response?.data?.globalStatistics) return + // newData[chainId] = response.data.globalStatistics[0] + // } catch (error) { + // LoggerInstance.error('Error fetching global stats: ', error.message) + // } + // } + // setData(newData) + // }, [mainChainIds]) // // 1. Fetch Data // - useEffect(() => { - getMarketStats() - }, [getMarketStats]) + // useEffect(() => { + // getMarketStats() + // }, [getMarketStats]) // // 2. Data Manipulation @@ -121,7 +121,7 @@ export default function MarketStats(): ReactElement { ) : (
- {' '} + {' '} ) { + async function startSearch(e: React.SyntheticEvent) { e.preventDefault() if (value === '') setValue(' ') diff --git a/src/components/Header/Wallet/Details.tsx b/src/components/Header/Wallet/Details.tsx index cb14579bf5..d241176de0 100644 --- a/src/components/Header/Wallet/Details.tsx +++ b/src/components/Header/Wallet/Details.tsx @@ -57,11 +57,11 @@ export default function Details(): ReactElement { significantFigures: 4 })} - + /> */} ))} diff --git a/src/components/Home/Bookmarks.tsx b/src/components/Home/Bookmarks.tsx index a34f7175cf..b2138c83c7 100644 --- a/src/components/Home/Bookmarks.tsx +++ b/src/components/Home/Bookmarks.tsx @@ -31,7 +31,9 @@ const columns: TableOceanColumn[] = [ }, { name: 'Price', - selector: (row) => , + selector: (row) => ( + + ), right: true } ] diff --git a/src/components/Home/TopTags/_utils.ts b/src/components/Home/TopTags/_utils.ts index 31094fd1a1..74a498db06 100644 --- a/src/components/Home/TopTags/_utils.ts +++ b/src/components/Home/TopTags/_utils.ts @@ -1,19 +1,29 @@ import { LoggerInstance } from '@oceanprotocol/lib' -import { generateBaseQuery, queryMetadata } from '@utils/aquarius' +import { generateBaseQuery, queryMetadataTags } from '@utils/aquarius' import axios, { CancelToken } from 'axios' import { SortTermOptions } from '../../../../src/@types/aquarius/SearchQuery' export async function getTopTags( chainIds: number[], - cancelToken: CancelToken + cancelToken: CancelToken, + size = 20 ): Promise { const baseQueryParams = { chainIds, + query: { + bool: { + filter: [ + { terms: { chainId: chainIds } }, + { exists: { field: 'indexedMetadata.stats.orders' } }, + { exists: { field: 'metadata.tags' } } + ] + } + }, aggs: { topTags: { terms: { field: 'metadata.tags.keyword', - size: 20, + size, order: { totalSales: 'desc' } }, aggs: { @@ -28,18 +38,23 @@ export async function getTopTags( esPaginationOptions: { from: 0, size: 0 } } as BaseQueryParams - const query = generateBaseQuery(baseQueryParams) try { - const result = await queryMetadata(query, cancelToken) - const tagsList = result?.aggregations?.topTags?.buckets.map( - (x: { key: string }) => x.key - ) + const query = generateBaseQuery(baseQueryParams) + const result = await queryMetadataTags(query, cancelToken) + + const tagsList = result?.tags || [] + + if (tagsList.length === 0) { + LoggerInstance.warn('No tags found in aggregation results') + } + return tagsList } catch (error) { if (axios.isCancel(error)) { - LoggerInstance.log(error.message) + LoggerInstance.log('Query canceled:', error.message) } else { - LoggerInstance.error(error.message) + LoggerInstance.error('Error fetching top tags:', error.message) } + return [] } } diff --git a/src/components/Home/index.tsx b/src/components/Home/index.tsx index c233312253..e49e6da0b0 100644 --- a/src/components/Home/index.tsx +++ b/src/components/Home/index.tsx @@ -17,6 +17,8 @@ export default function HomePage(): ReactElement { const [queryMostAllocation, setQueryMostAllocation] = useState() const filterDatasets: unknown[] = [] + const now = Date.now() + const thirtyDaysAgo = now - 30 * 24 * 60 * 60 * 1000 useEffect(() => { const baseParams = { @@ -24,9 +26,19 @@ export default function HomePage(): ReactElement { esPaginationOptions: { size: 6 }, - filters: filterDatasets, + filters: [ + { + range: { + 'indexedMetadata.event.block': { + gte: 0 + } + } + } + ], sortOptions: { - sortBy: SortTermOptions.Created + sortBy: SortTermOptions.Created, + sortOrder: 'desc', + missing: '_last' } as SortOptions } as BaseQueryParams setQueryLatest(generateBaseQuery(baseParams)) @@ -36,9 +48,20 @@ export default function HomePage(): ReactElement { esPaginationOptions: { size: 6 }, + filters: [ + { + range: { + 'indexedMetadata.stats.orders': { + gt: 0 + } + } + } + ], sortOptions: { - sortBy: SortTermOptions.Orders - } as SortOptions + sortBy: SortTermOptions.Orders, + sortOrder: 'asc', + missing: '_last' + } } as BaseQueryParams setQueryMostSales(generateBaseQuery(baseParamsSales)) }, [chainIds]) @@ -59,7 +82,10 @@ export default function HomePage(): ReactElement { title="Recently Published" query={queryLatest} action={ - } diff --git a/src/components/Profile/Header/Stats.tsx b/src/components/Profile/Header/Stats.tsx index c7e22e3bfc..5f5fae1963 100644 --- a/src/components/Profile/Header/Stats.tsx +++ b/src/components/Profile/Header/Stats.tsx @@ -23,8 +23,13 @@ export default function Stats({ try { let count = 0 for (const priceInfo of assets) { - if (priceInfo?.stats?.price?.value && priceInfo.stats.orders > 0) { - count += priceInfo.stats.price.value * priceInfo.stats.orders + if ( + priceInfo?.indexedMetadata?.stats[0]?.prices[0]?.price && + priceInfo.indexedMetadata?.stats[0]?.orders > 0 + ) { + count += + Number(priceInfo.indexedMetadata?.stats[0]?.prices[0].price) * + priceInfo.indexedMetadata?.stats[0]?.orders } } setTotalSales(count) diff --git a/src/components/Profile/History/PublishedList.tsx b/src/components/Profile/History/PublishedList.tsx index f4a0147ab2..cadefdce0d 100644 --- a/src/components/Profile/History/PublishedList.tsx +++ b/src/components/Profile/History/PublishedList.tsx @@ -41,9 +41,8 @@ export default function PublishedList({ chainIds, cancelToken, ownAccount, - page, - service, - access + ownAccount, + page ) setQueryResult(result) } catch (error) { diff --git a/src/components/Publish/Debug/index.tsx b/src/components/Publish/Debug/index.tsx index 64676c969d..03e1dca6c6 100644 --- a/src/components/Publish/Debug/index.tsx +++ b/src/components/Publish/Debug/index.tsx @@ -4,7 +4,7 @@ import { FormPublishData } from '../_types' import { useFormikContext } from 'formik' import { transformPublishFormToDdo } from '../_utils' import styles from './index.module.css' -import { DDO } from '@oceanprotocol/lib' +import { DDO } from '@oceanprotocol/ddo-js' import { previewDebugPatch } from '@utils/ddo' import { useNetwork } from 'wagmi' diff --git a/src/components/Publish/Preview/index.tsx b/src/components/Publish/Preview/index.tsx index c45fb4f6b3..3cdf5a95f4 100644 --- a/src/components/Publish/Preview/index.tsx +++ b/src/components/Publish/Preview/index.tsx @@ -14,32 +14,26 @@ export default function Preview(): ReactElement { async function makeDdo() { const asset = (await transformPublishFormToDdo(values)) as AssetExtended // dummy BestPrice to trigger certain AssetActions - asset.accessDetails = { - type: values.pricing.type, - addressOrId: ZERO_ADDRESS, - templateId: 1, - price: `${values.pricing.price}`, - baseToken: { - address: ZERO_ADDRESS, - name: values.pricing?.baseToken?.symbol || 'OCEAN', - symbol: values.pricing?.baseToken?.symbol || 'OCEAN' - }, - datatoken: { - address: ZERO_ADDRESS, - name: '', - symbol: '' - }, - isPurchasable: true, - isOwned: false, - validOrderTx: '', - publisherMarketOrderFee: '0' - } - asset.stats = { - orders: null, - price: { - value: values.pricing.type === 'free' ? 0 : values.pricing.price, - tokenSymbol: values.pricing?.baseToken?.symbol || 'OCEAN', - tokenAddress: ZERO_ADDRESS + if (values.pricing.type === 'fixed') { + asset.accessDetails = { + type: values.pricing.type, + addressOrId: ZERO_ADDRESS, + templateId: 1, + price: `${values.pricing.price}`, + baseToken: { + address: ZERO_ADDRESS, + name: values.pricing?.baseToken?.symbol || 'OCEAN', + symbol: values.pricing?.baseToken?.symbol || 'OCEAN' + }, + datatoken: { + address: ZERO_ADDRESS, + name: '', + symbol: '' + }, + isPurchasable: true, + isOwned: false, + validOrderTx: '', + publisherMarketOrderFee: '0' } } setAsset(asset) diff --git a/src/components/Publish/Steps.tsx b/src/components/Publish/Steps.tsx index 5c6b845e88..317162b21c 100644 --- a/src/components/Publish/Steps.tsx +++ b/src/components/Publish/Steps.tsx @@ -66,7 +66,7 @@ export function Steps({ const config = getOceanConfig(values.user.chainId) if (config) { setFieldValue('services[0].providerUrl', { - url: config.providerUri, + url: config.oceanNodeUri, valid: true, custom: false }) diff --git a/src/components/Publish/_types.ts b/src/components/Publish/_types.ts index 2c359646a5..e22512ef0c 100644 --- a/src/components/Publish/_types.ts +++ b/src/components/Publish/_types.ts @@ -1,4 +1,5 @@ -import { FileInfo, ServiceComputeOptions } from '@oceanprotocol/lib' +import { FileInfo } from '@oceanprotocol/lib' +import { ServiceComputeOptions } from '@oceanprotocol/ddo-js' import { NftMetadata } from '@utils/nft' import { ReactElement } from 'react' export interface FormPublishService { diff --git a/src/components/Publish/_utils.ts b/src/components/Publish/_utils.ts index 5a4c45a067..219923ffa1 100644 --- a/src/components/Publish/_utils.ts +++ b/src/components/Publish/_utils.ts @@ -1,6 +1,5 @@ import { Config, - DDO, FreCreationParams, generateDid, DatatokenCreateParams, @@ -10,11 +9,14 @@ import { NftCreateData, NftFactory, ZERO_ADDRESS, - getEventFromTx, + getEventFromTx +} from '@oceanprotocol/lib' +import { ConsumerParameter, Metadata, - Service -} from '@oceanprotocol/lib' + Service, + DDO +} from '@oceanprotocol/ddo-js' import { mapTimeoutStringToSeconds, normalizeFile } from '@utils/ddo' import { generateNftCreateData } from '@utils/nft' import { getEncryptedFiles } from '@utils/provider' @@ -290,7 +292,6 @@ export async function createTokensAndPricing( ercParams, freParams ) - const trxReceipt = await result.wait() const nftCreatedEvent = getEventFromTx(trxReceipt, 'NFTCreated') const tokenCreatedEvent = getEventFromTx(trxReceipt, 'TokenCreated') diff --git a/src/components/Publish/index.tsx b/src/components/Publish/index.tsx index b2f49929b9..b053c7632b 100644 --- a/src/components/Publish/index.tsx +++ b/src/components/Publish/index.tsx @@ -16,9 +16,9 @@ import useNftFactory from '@hooks/useNftFactory' import { ProviderInstance, LoggerInstance, - DDO, getErrorMessage } from '@oceanprotocol/lib' +import { DDO } from '@oceanprotocol/ddo-js' import { getOceanConfig } from '@utils/ocean' import { validationSchema } from './_validation' import { useAbortController } from '@hooks/useAbortController' @@ -69,6 +69,7 @@ export default function PublishPage({ try { const config = getOceanConfig(chain?.id) + LoggerInstance.log('[publish] using config: ', config) const { erc721Address, datatokenAddress, txHash } = diff --git a/src/components/Search/utils.ts b/src/components/Search/utils.ts index cdc23b1b3c..834f1c3e9e 100644 --- a/src/components/Search/utils.ts +++ b/src/components/Search/utils.ts @@ -1,4 +1,5 @@ import { LoggerInstance } from '@oceanprotocol/lib' +import { State } from '@oceanprotocol/ddo-js' import { escapeEsReservedCharacters, generateBaseQuery, @@ -42,6 +43,11 @@ export function getSearchQuery( text = escapeEsReservedCharacters(text) const emptySearchTerm = text === undefined || text === '' const filters: FilterTerm[] = [] + filters.push({ + term: { + 'indexedMetadata.nft.state': State.Active + } + }) let searchTerm = text || '' let nestedQuery if (tags) { @@ -59,10 +65,10 @@ export function getSearchQuery( : '**' const searchFields = [ 'id', - 'nft.owner', - 'datatokens.address', - 'datatokens.name', - 'datatokens.symbol', + 'indexedMetadata.nft.owner', + 'indexedMetadata.stats.datatokenAddress', + 'indexedMetadata.stats.name', + 'indexedMetadata.stats.symbol', 'metadata.name^10', 'metadata.author', 'metadata.description', @@ -121,8 +127,8 @@ export function getSearchQuery( chainIds, nestedQuery, esPaginationOptions: { - from: (Number(page) - 1 || 0) * (Number(offset) || 21), - size: Number(offset) || 21 + from: page || 0, + size: Number(offset) || 1000 }, sortOptions: { sortBy: sort, sortDirection }, filters