How do I look up a SmartMetal token?

Look up a SmartMetal token

Given a SmartMetal token id, read its series with tokenSeries(id) and its metadata URI with uri(id) on the token contract, fetch the metadata JSON from any IPFS gateway, and ask SeriesActivation whether it is activated with tokenStatus(id); veri.how also serves the indexed answer at /smartmetal/tokens/<id>.json.

Veri SmartMetal

Standard#
ERC-1155
Transactions#
All transactions
Last verified#
13 Oct 2026

SeriesActivation

Transactions#
All transactions
Last verified#
13 Oct 2026

You need a token id and curl. Nothing to install, no API key, no wallet. The id is the serial number on the piece and in its QR code; veri.vip shows it as #<id>. The examples use token 7777, from the Limited Edition Azure Dragon series; replace it with yours. In calldata, the id is a 32-byte word: 7777 is 0x1e61, left-padded with zeros to 64 hex characters.

1. Find its series#

Call tokenSeries(id), selector 0x44bdde08, on the token contract. The answer is the series id, which SmartMetal series maps to a name and a metadata folder:

# tokenSeries(7777): 0x2d3e0395…b9d6, the Azure Dragon series
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x44bdde080000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'

With Foundry installed, its cast command runs the same call and decodes the answers:

export ETH_RPC_URL=https://mainnet.base.org

# 0x2d3e0395c9e91e036ad74f6010443210c6a13260c88e93fc7c2fecc2d577b9d6
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'tokenSeries(uint256)(bytes32)' 7777

cast takes the id in decimal, so there is no padding to do. Later steps show cast the same way.

An id that was never minted answers all zeros. Without a call, the rule in /facts.json gives the same answer: ids 1 to 6566 are the 2024 series, and the 16 repdigit ids from 7777 to 88888888888 are the Azure Dragon series.

2. Read its metadata#

uri(id), selector 0x0e89341c, returns an ABI-encoded string of the form ipfs://<series CID>/<id>.json:

# uri(7777): "ipfs://QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json"
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x0e89341c0000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
export ETH_RPC_URL=https://mainnet.base.org

# "ipfs://QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json"
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'uri(uint256)(string)' 7777

Fetch the file from a public IPFS gateway by replacing ipfs:// with the gateway’s /ipfs/ path:

curl -s https://gateway.pinata.cloud/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json
curl -s https://dweb.link/ipfs/QmSijK1oR1TAGhGeeZrrVrjEoQAyGYGB1Vph3qvSSzT3Ht/7777.json

veri.vip links the same file on its own gateway, ipfs.veridao.io, which answers browsers but turns crawlers away in its robots.txt.

The file for token 7777, as served on 13 Oct 2026:

{
  "name": "Veri SmartMetal Limited Edition Azure Dragon #7777",
  "description": "The Azure Dragon of Ancient Chinese Mythology",
  "image": "ipfs://QmR2coRJYva1ACFU3gMzZRX2LaZztWTFcPrDKvG3FimH6S",
  "external_url": "https://veri.vip/7777",
  "attributes": [
    { "key": "metal", "trait_type": "Metal", "value": "Silver" },
    { "key": "purity", "trait_type": "Purity", "value": 0.999, "display_type": "number" },
    { "key": "weight_oz", "trait_type": "Weight (oz)", "value": 1, "display_type": "number" },
    { "key": "year", "trait_type": "Year", "value": 2026, "display_type": "date" },
    { "key": "mint", "trait_type": "Mint", "value": "Veritaseum" },
    {
      "key": "serial_number",
      "trait_type": "Serial Number",
      "value": 7777,
      "display_type": "number"
    },
    { "key": "ai_agent_access", "trait_type": "AI Agent Access", "value": true },
    { "key": "p2p_trading", "trait_type": "P2P Trading", "value": true },
    { "key": "derivatives", "trait_type": "Derivatives", "value": true }
  ],
  "properties": {
    "metal": "Silver",
    "purity": { "name": "Purity", "value": 0.999, "display_value": "99.9%" },
    "weight_oz": { "name": "Weight (oz)", "value": 1, "display_value": "1oz" },
    "year": 2026,
    "mint": "Veritaseum",
    "serial_number": { "name": "Serial Number", "value": 7777, "display_value": "7777" },
    "ai_agent_access": true,
    "p2p_trading": true,
    "derivatives": true
  }
}

The fields, which both series share:

Field Meaning
name, description, image, external_url The usual ERC-1155 metadata. image is an ipfs:// CID; external_url is the token’s page on veri.vip.
attributes[] One entry per trait with key, trait_type, value and, for numbers and dates, display_type. The shape marketplaces read.
properties{} The same values keyed by name, with a display_value string where the number needs a unit (“99.9%”, “1oz”).
ai_agent_access, p2p_trading, derivatives Boolean flags, true on every token seen. veri.vip shows their labels with no value.

A 2024 token’s file has the same shape with name Veri SmartMetal Silver Round #<id>, description “This is a Veri SmartMetal token.”, year 2024, display_value “1 oz” and one shared image, ipfs://QmYsiGSYWx6mn3TgLZfoZVRqqNjuyvTLziWscfjme3tmAK. The year is a label from the metadata, not the date the token was minted; the on-chain dates are in SmartMetal series.

3. Check whether it is activated#

Ask SeriesActivation, 0x412E962bbAE0bB97CE98e74f3424543651a21ce3. tokenStatus(id), selector 0xb01ce31f, returns one byte:

Value Meaning
0 Registered and waiting for activation; SeriesActivation holds it.
1 No registration for this id: it is not a SmartMetal token.
2 Activated: the token has left for its activator’s wallet.
# tokenStatus(7777): 0x…00 on 13 Oct 2026, not yet activated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0xb01ce31f0000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'

# activatedTokens(7777): the same answer as a boolean, 0x…00
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x4e0619c00000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'

# tokenHolders(7777): the registered holder address while it waits; all zeros once activated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x412e962bbae0bb97ce98e74f3424543651a21ce3","data":"0x923108d90000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
export ETH_RPC_URL=https://mainnet.base.org

# 0, false, then the registered holder address
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenStatus(uint256)(uint8)' 7777
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'activatedTokens(uint256)(bool)' 7777
cast call 0x412e962bbae0bb97ce98e74f3424543651a21ce3 'tokenHolders(uint256)(address)' 7777

tokenHolders(id) is the ephemeral address whose key is in the token’s QR code, not the owner of the piece. It is cleared on activation, so it says nothing about who holds an activated token. For that, read balanceOf(address, id) on the token contract (selector 0x00fdd58e), or the TransferSingle log of the activation transaction; how the transfer happens is in Activate a SmartMetal.

# balanceOf(SeriesActivation, 7777): 0x…01 while the token is unactivated
curl -s https://mainnet.base.org -X POST -H 'content-type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"0x4516a5d613c30a36d157d3b579813734cbb929a4","data":"0x00fdd58e000000000000000000000000412e962bbae0bb97ce98e74f3424543651a21ce30000000000000000000000000000000000000000000000000000000000001e61"},"latest"]}'
export ETH_RPC_URL=https://mainnet.base.org

# 1
cast call 0x4516a5d613c30a36d157d3b579813734cbb929a4 'balanceOf(address,uint256)(uint256)' 0x412e962bbae0bb97ce98e74f3424543651a21ce3 7777

The indexed answer#

veri.how indexes the activation and transfer logs of both contracts about every 15 minutes and serves one JSON file per token:

curl -s https://veri.how/smartmetal/tokens/7777.json

It returns the series, whether the token is activated and when (time, block and transaction), the current holder, the metadata CID, asOfBlock (the last Base block the answer includes) and check, a curl command that asks SeriesActivation directly, as in step 3. /smartmetal/tokens.json lists every token the same way, and an id in no series answers 404. The data files page lists the site’s data files. The file is a convenience: when it matters, re-check on chain, since the snapshot can be up to 15 minutes and a few blocks behind.

Without curl#

  • BaseScan shows a token at https://basescan.org/token/0x4516a5d613c30a36d157d3b579813734cbb929a4?a=<id>, with its transfers, and the contract’s Read as Proxy view runs uri and tokenSeries. The activation contract’s Read Contract view runs tokenStatus.
  • veri.vip shows one page per token at https://veri.vip/<id>, with each value tagged by its source.

For agents and tools#

The committed ABIs decode every call above: /abi/series1155v1.json for the token (call it at the proxy address) and /abi/smartmetal-activation.json for SeriesActivation. /facts.json carries both addresses, the series with their id ranges and CIDs, and the metadata lookup rule, so a tool can go from an id to a metadata URL without a call.

Sources#

  1. Veri SmartMetal token on BaseScan
  2. Metadata of token 7777, IPFS
  3. Metadata of token 1, IPFS
  4. QRToken contract reference, SeriesActivation
  5. EIP-1155: Multi Token Standard, metadata