PATINA docs

Reading your artifact

Every field on the page comes from one API call, and every field can be checked against the chain without trusting the page.

What you will know after this page
  • What every field in the artifact record means, including why depth is computed when you ask and never stored per block.
  • Why the birth fields never change and the carrier does, and which one to protect.
  • How to recompute the artifact id in one command and compare it against the id you were handed.
  • What ALIVE and RELIC mean, and which of the two is terminal.
  • Why a share card without the block height it was taken at is a card nobody can check.

The record

This is the shape of one artifact record, with placeholders where the hashes go. Read it once now, because the rest of the page walks the same fields in the same order.

{
  "artifact_id": "...",
  "birth_txid": "...",
  "birth_height": 0,
  "birth_vout": 0,
  "endowment_sats": "100000",
  "founding": true,
  "status": "ALIVE",
  "carrier": { "txid": "...", "vout": 0, "height": 0, "value": "100000" },
  "depth": 0,
  "tier": 0,
  "tier_name": "Raw",
  "next_tier": 1,
  "blocks_to_next_tier": 1008,
  "rings": []
}

Satoshi values are decimal strings so that large numbers survive JSON parsers. Heights are numbers. See API conventions.

Field by field

artifact_id
The permanent id, lowercase hex. Derived from your reveal transaction and the carrier index at birth. It never changes, not even when the artifact moves to a new carrier.
birth_txid, birth_height, birth_vout
Where the artifact was created. This is history, not location. After a move, the carrier changes but these do not.
endowment_sats
The value the carrier held at birth. It is your bitcoin. For founding Seals it is at least 100000 sats. It never changes, whatever a later carrier holds. What the current carrier holds is carrier.value.
founding
True only for Firstlight Seals: the commit output confirmed inside the founding window and the reveal landed before the grace period ended. Nothing can flip this later.
status
ALIVE means a carrier exists and depth is accumulating. RELIC means the last carrier was spent with no eligible successor. Relic is terminal.
carrier
The outpoint the artifact is riding right now, with the height it was created and its value. This is the output to protect. It is null for a relic.
depth
tip_height - carrier.height, computed when you ask. It is not stored per block and it is not cumulative across rings. A fresh carrier is depth zero even if the artifact is five years old.
tier, tier_name
The highest tier whose threshold is not greater than the current depth, and its name. Raw through Elder. See Depth and tiers.
next_tier, blocks_to_next_tier
The next threshold up and how many blocks away it is. At Elder there is no next tier, and both fields are null.
rings
Completed stretches, oldest first. Empty for an artifact that has never moved.

Verify it yourself

Nothing here requires trusting the indexer. Three checks with a block explorer or your own node:

  1. Carrier is unspent. Look up carrier.txid and confirm output carrier.vout has not been spent. If it has, the indexer is behind or wrong.
  2. Depth arithmetic. Subtract carrier.height from the current block height. It should match depth, allowing for blocks found while you were reading.
  3. Artifact id. Take birth_txid, reverse the bytes, append birth_vout as four little endian bytes, prefix the tag, hash once with SHA-256. It should equal artifact_id.
node -e '
const { createHash } = require("crypto");
const txid = "1d29e5ba13cecf357a9218518914617f872eeaa83a33bf6be6fd78dfdd1ce9c6";
const vout = 1;
const wire = Buffer.from(txid, "hex").reverse();
const le = Buffer.alloc(4); le.writeUInt32LE(vout, 0);
const pre = Buffer.concat([Buffer.from("PTNA/artifact", "ascii"), wire, le]);
console.log(createHash("sha256").update(pre).digest("hex"));
'
# d3b8d3013c23dd3df76882034df80935ba55aa75772007f0b142b63adce5eff0

Reading the rings

Each ring is one completed stretch. Read them oldest to newest to see the artifact's life. The public page on how depth works shows a stretch closing into a ring if you want the picture before the field names.

How to read a ring entry.
FieldReads as
start_height and end_heightThe blocks the stretch ran between
depthHow deep it got before it ended, in blocks
carried_valueWhat the carrier held during that stretch
successor_txid and successor_voutThe transaction that ended it and where the artifact went next
relicTrue on the final ring of an artifact that ended

A deep ring in the past and a shallow current depth is a normal, honest picture. It says the holder went deep once, then moved. That is information, not a flaw.

What the page will not show you

  • A holder name, a profile, or a history of owners. The indexer does not know any of that.
  • A price or an estimated value.
  • A rank or a rarity score invented by us.
  • A countdown that implies scarcity. The only countdowns are real ones: blocks to the next tier, and blocks remaining in the window while it is open.

If the artifact record cannot be fetched, the page says so and shows nothing rather than showing a stale or invented number.

Share cards

GET /patina/artifacts/:id/card returns the payload behind a share image: id, tier, depth, ring count, and the block height the numbers were taken at. The height matters. A card without the height it was generated at is a card you cannot check.