{"what":"how an item's attributes are computed. The chain stores a 32-byte mintRef and nothing else; every attribute below is a pure function of it, so a buyer can recompute the whole item without asking us.","recompute":{"hash":"keccak256(mintRef_32_bytes ‖ utf8(field_tag))","solidity":"keccak256(abi.encodePacked(mintRef, tag))","python":"int.from_bytes(keccak256(mint_ref + tag.encode()), 'big')","why_keccak":"ScryItem hashes its merkle leaves and proof pairs with keccak and a mintRef is itself a keccak — one hash across the object means the renderer, the page, the verifier and any future tokenURI agree by construction","kinds":{"unit":"a uniform in [0,1) — H/2**256, the primitive the others are cut from","range":"unit mapped onto [min,max); optional `bands` name the sub-intervals","index":"H mod n — uniform over 0..n-1, e.g. a pattern index","pick":"one entry of a declared weighted list, by cumulative weight over H"},"unit":"H / 2**256","range":"min + unit*(max-min); bands are half-open [lo,hi) so a boundary value belongs to exactly one band","index":"H mod n","pick":"cumulative weight over (H mod sum_of_weights)","mint_kinds":{"0":"play","1":"case","2":"store","3":"craft"},"mint_ref_preimages":{"play":"keccak(shard_id ‖ wal_hash ‖ tick ‖ entity_id)","case":"keccak(series_id ‖ case_token_id)","store":"keccak(catalogId ‖ edition)","craft":"keccak(setId ‖ wallet ‖ level) — minted by ScryKiln"},"not_derived":{"stattrak":"a COUNT recomputed from recognized shards' WALs, never a function of the mint — deriving it from a hash would invent the number it claims to prove. Waits on the WAL adapter (GATES.md §10 #4).","float_of_a_store_copy":"a store-shaped entitlement declares no derived fields at all (ITEM-CONTRACT.md §0), so every copy renders identically. An empty `derived` is the correct answer, not a missing one."}},"catalogs":[{"catalog_id":1,"name":"Placeholder Crate","shape":"entitlement","title":null,"derived":[],"bands":{}},{"catalog_id":9001,"name":"Shape Example — instance","shape":"instance","title":null,"derived":[{"tag":"float","kind":"range","min":0.0,"max":1.0,"places":6,"about":"wear. Bands are half-open [min,max) so a value on a boundary is in exactly one grade — CS quotes its own table closed on both ends, which puts 0.07 in two grades at once."},{"tag":"pattern","kind":"index","n":1000,"about":"the pattern index — uniform over 0..999. What a 'blue gem' is, is a claim about particular indices and belongs to the catalog's own content, never to this engine."},{"tag":"finish","kind":"pick","about":"a weighted pick. Weights are counts, not percentages, so adding an option never silently reweights the others.","options":[{"name":"standard","weight":850},{"name":"polished","weight":130},{"name":"gilt","weight":20}]}],"bands":{"float":[{"name":"factory new","min":0.0,"max":0.07},{"name":"minimal wear","min":0.07,"max":0.15},{"name":"field-tested","min":0.15,"max":0.38},{"name":"well-worn","min":0.38,"max":0.45},{"name":"battle-scarred","min":0.45,"max":1.0}]}}],"catalogs_error":null,"declared_where":"an operator-authored file this service can only READ. Adding or changing a catalog is a commit, never a request — a schema the server could write would be a trait somebody could move.","verify":{"one_item":"GET /api/items/derive?mint_ref=0x…&catalog_id=…","by_hand":"take the mintRef off chain with ScryItem.mintRefOf(tokenId), keccak it with the field tag appended, and apply the mapping above. No value this service prints is authoritative over that.","vectors":"GET /api/items/vectors — fixed inputs and their exact outputs"},"scope":"An item's attributes are a function of its mintRef and nothing else — not of who owns it, what it sold for, or when you asked. The spec below is the whole algorithm; anyone can recompute every field without us, and a value that disagrees with the recomputation is wrong no matter which side printed it."}