{"rid":"storage/farcaster-hubs-snapchain-storage-rent-actively-metered","card":{"rid":"storage/farcaster-hubs-snapchain-storage-rent-actively-metered","eid":"github-farcasterxyz","topic":"storage","slug":"farcaster-hubs-snapchain-storage-rent-actively-metered","provider":"Farcaster hubs / Snapchain — storage RENT, actively metered","url":"https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md","domain":"github.com","category":"farcaster","tier":null,"verdict":"fails-quota","vorder":6,"grp":"rejected","confidence":"reported","binding":"none","identity_kind":"email","identity_basis":"defaulted","needs_card":null,"needs_phone":null,"needs_id":null,"needs_institution":null,"country":null,"crypto":null,"interfaces":null,"egress_metered":0,"per_object_bytes":null,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":2,"usd_month":null,"usd_per_tb_month":null,"summary":"Storage is allocated in integer units per fid and must be BOUGHT from the Storage Registry contract on Optimism (0x00000000fcCe7f938e7aE6D3c335bD6a1a7c593D)....","duplicate_of":null,"n_unknown":9},"record":{"topic":"storage","slug":"farcaster-hubs-snapchain-storage-rent-actively-metered","provider":"Farcaster hubs / Snapchain — storage RENT, actively metered","url":"https://github.com/farcasterxyz/protocol/blob/main/docs/SPECIFICATION.md","category":"farcaster","free_tier":{"stated":"Storage is allocated in integer units per fid and must be BOUGHT from the Storage Registry contract on Optimism (0x00000000fcCe7f938e7aE6D3c335bD6a1a7c593D). Each CRDT specifies messages-per-unit, so the unit is a message count, not bytes.","unit":"mixed","metered_on":"stored-bytes","source_url":"https://raw.githubusercontent.com/farcasterxyz/protocol/main/docs/SPECIFICATION.md","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"not stated","source_url":"https://raw.githubusercontent.com/farcasterxyz/protocol/main/docs/SPECIFICATION.md","notes":"not stated"},"retention":{"stated":"not stated","source_url":"https://raw.githubusercontent.com/farcasterxyz/protocol/main/docs/SPECIFICATION.md","notes":"not stated"},"egress":{"terms":"n/a — hubs replicate messages, media is a URL in the cast body pointing at an external host (often Cloudflare Images / imgur).","metered":false},"interface":["unknown"],"interface_detail":"grpc","tooling":"gRPC hub API (submitMessage); `@farcaster/hub-nodejs`. Storage must be purchased on-chain before a message is accepted.","chaining":"None. Media is never stored by the protocol — a cast embed is a plain URL. Farcaster is a message log with paid rent, not a file store.","limits":[],"limits_note":"per-object-cap not applicable; the binding limit is storage units paid for on Optimism plus per-CRDT message-count accounting. Free tier = whatever 1 storage unit covers (a few hundred casts).","identity_cost":{"kind":"email","detail":null,"country":null},"reliability_note":"Rent model means capacity is explicitly priced, which is the opposite of the brief. Snapchain (2025 rewrite) preserves the rent model.","confidence":"reported","confidence_note":"One page read moves it to documented.","evidence":[{"url":"https://raw.githubusercontent.com/farcasterxyz/protocol/main/docs/SPECIFICATION.md","date":"2026-10-21","proved":"'The Storage registry contract keeps track of the storage allocated to each fid. The storage for an fid is denominated in integer units. Each CRDT specifies the number of messages it can store per unit.'; 'For a message to be accepted, the fid must be registered in the Id registry, and signed with a valid signer present in the Key registry, and the fid must have enough storage allocated in the Storage registry.'"},{"url":"https://docs.farcaster.xyz/learn/architecture/storage","date":"2026-10-21","proved":"probe: GET -> 404 (moved); docs.farcaster.xyz is a Next.js shell with no server-rendered quota table"}],"verdict":"fails-quota","verified_at":"2026-10-21T00:00:00.000Z","notes":"Storage is allocated in integer units per fid and must be BOUGHT from the Storage Registry contract on Optimism (0x00000000fcCe7f938e7aE6D3c335bD6a1a7c593D). Each CRDT specifies messages-per-unit, so the unit is a message count, not bytes.","extras":{"verdict_note":"PLAN.md §3.2 rules fails-quota by default, because no row in this set clears 500 GiB per unit for a user.","dead_end":{"failure_class":"quota","why":"Storage is allocated in integer units per fid and must be BOUGHT from the Storage Registry contract on Optimism (0x00000000fcCe7f938e7aE6D3c335bD6a1a7c593D). Each CRDT specifies messages-per-unit, so the unit is a message count, not bytes.","retry_when":null,"first_recorded":"2026-10-21"}},"binding":"none","binding_note":"no constraint of a named kind was recorded; the verdict rests on the quota sentence rather than on a named limit"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":null,"unit":null,"per":null,"currency":null,"usd":null,"fx_date":null,"parse":"unparsed"}],"unknown":[["$.extras.dead_end.retry_when","process"],["$.free_tier.notes","process"],["$.identity_cost.detail","defaulted"],["$.identity_cost.kind","identity-defaulted"],["$.interface","interface-unknown"],["$.per_object_cap.notes","not-extracted"],["$.per_object_cap.stated","not-extracted"],["$.retention.notes","not-extracted"],["$.retention.stated","not-extracted"]],"history":[],"drift":[]}