Asset Tree

Asset Tree

An asset within the Asset Tree is defined by a structured JSON-LD (JavaScript Object Notation for Linked Data) format that includes metadata, links to other assets, and specific relationships between parts, such as which accessories or enhancements are equipped. For instance, an "ASM Brain" can be equipped with "Memory" as a sub-component, or a "Boxer" asset might have various accessories like gloves or hairstyle, each represented by an ID.

Each asset and its relationships are described in terms of:

  • Context: The vocabulary and schema that define the asset attributes.

  • Graph: A collection of nodes, where each node represents an asset and its properties.

  • Paths: Specific routes that detail the type of connection between assets, such as equippedWith_hairStyle or equippedWith_leftGlove.

Example

{
  "@context": {
    "@vocab": "http://schema.futureverse.com#",
    "schema": "http://schema.org/",
    "fvp": "http://schema.futureverse.com/fvp#",
    "fv": "http://schema.futureverse.com/fv#",
    "tnl": "http://schema.futureverse.com/tnl#"
  },
  "@graph": [
    {
      "@id": "did:fv-asset:1:evm:0x6bca6de2dbdc4e0d41f7273011785ea16ba47182:1211",
      "@type": "tnl:Boxer",
      "fv:equippedWith_brain": {
        "@id": "did:fv-asset:1:evm:0xd0318da435dbce0b347cc6faa330b5a9889e3585:1211"
      },
      "fv:equippedWith_hairStyle": {
        "@id": "did:fv-asset:off-chain:60163ecf-ae7b-4eb5-a78c-31d825322613:2:2"
      },
      "tnl:equippedWith_leftGlove": {
        "@id": "did:fv-asset:7668:10420:2"
      },
      "tnl:equippedWith_rightGlove": {
        "@id": "did:fv-asset:7668:10420:1"
      }
    },
    {
      "@id": "did:fv-asset:1:evm:0xd0318da435dbce0b347cc6faa330b5a9889e3585:1211",
      "@type": "fv:ASMBrain",
      "fv:equippedWith_memory": {
        "@id": "did:fv-asset:off-chain:60163ecf-ae7b-4eb5-a78c-31d825322613:1:10"
      }
    },
    {
      "@id": "did:fv-asset:off-chain:60163ecf-ae7b-4eb5-a78c-31d825322613:1:10",
      "@type": "fv:ASMMemory"
    },
    {
      "@id": "did:fv-asset:off-chain:60163ecf-ae7b-4eb5-a78c-31d825322613:2:2",
      "@type": "tnl:HairStyle"
    },
    {
      "@id": "did:fv-asset:7668:10420:1",
      "@type": "tnl:Glove",
    },
    {
      "@id": "did:fv-asset:7668:10420:2",
      "@type": "tnl:Glove",
    }
  ]
}

Visualization

Each NFT (ERC721) token is unique and indivisible, representing a one-of-a-kind digital asset like artwork, collectibles, or in-game items. NFT assets are linked within the Asset Tree and can connect to other assets through specified paths. The structure includes details like the asset's ID, type, and links to other assets.

{
  "asset": {
    "id": "QXNzZXQ6NzY3Mjpyb290OjI4Mzc0ODo1",
    "assetType": "ERC721"
  },
  "id": "TGluazpodHRwOi8vc2NoZW1hLmZ1dHVyZXZlcnNlLmNvbS9wYXRoI2h0dHA6Ly9zY2hlbWEuZnV0dXJldmVyc2UuZGV2L3RubCNlcXVpcFdpdGhfYXNtQnJhaW46NzY3Mjpyb290OjI4Mzc0ODo1",
  "path": "http://schema.futureverse.com/path#http://schema.futureverse.dev/tnl#equipWith_asmBrain"
}

This SFT (ERC1155) is an extension of NFT, offering more flexibility. It allows for the creation of both fungible and non-fungible tokens within a single smart contract. Fungible tokens are like regular currency; they can be divided and are interchangeable.

eg.

{
  "asset": {
    "id": "QXNzZXQ6NzY3Mjpyb290OjI5MTk0MDow",
    "assetType": "ERC1155"
  },
  "id": "TGluazpodHRwOi8vc2NoZW1hLmZ1dHVyZXZlcnNlLmNvbS9wYXRoI2VxdWlwV2l0aF9zaG91bGRlcnM6NzY3Mjpyb290OjI5MTk0MDow",
  "path": "http://schema.futureverse.com/path#equipWith_shoulders"
}

Properties

addresses

A list of addresses used to query the linked SFT Assets.

eg.

[
    "0x2D2438C6281B5115733287fC279f854c868D3ee2",
    "0xFFFFFfFF00000000000000000000000000000417"
]

collectionId

A collection ID to query the asset.

e.g. 7672:root:303204

tokenId

A token ID to query the asset.

eg. 232

import { AssetModel } from '@futureverse/asset-register'
import { useGetAssetTree } from '@futureverse/asset-register-react/v2'
import { CollectionId } from '@futureverse/asset-register/types/collection'
import { AssetTreePath } from '@futureverse/asset-register/v2/lib/AssetTreePath'

const collectionId = '7672:root:303204' as CollectionId
const tokenId = '232'

export const AssetTree = async () => {
  const { assetTrees: assetTree } = useGetAssetTree({ tokenId, collectionId })

  // you should get some paths from the assetTree
  // [
  //   'http://schema.futureverse.com#equippedWith_accessoryClothing',
  //   'http://schema.futureverse.com#equippedWith_accessoryEyewear',
  //   'http://schema.futureverse.com#equippedWith_accessoryHead',
  //   'http://schema.futureverse.com#equippedWith_accessoryMouth',
  //   'http://schema.futureverse.com#equippedWith_accessoryNose',
  //   'http://schema.futureverse.com/fvp#sft_link_owner_0x225b5333c2d8ec41f40d6463d44141786c2c4463',
  // ]
  const paths = assetTree?.paths

  const assetTreePath = (await assetTree?.getPath(
    'http://schema.futureverse.com#equippedWith_accessoryClothing',
  )) as AssetTreePath

  // get the asset from the path
  const asset = (await assetTreePath.getAsset()) as AssetModel

  return <Asset asset={asset} />
}

Last updated

© 2023 -> ♾️